118 lines
2.2 KiB
Go
118 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"log"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/PuerkitoBio/goquery"
|
|
)
|
|
|
|
type Post struct {
|
|
BlogTitle string
|
|
Lang string
|
|
Id string
|
|
Title string
|
|
Author string
|
|
Date string
|
|
DateTime time.Time
|
|
HTML template.HTML
|
|
ShortText template.HTML
|
|
Text string
|
|
}
|
|
|
|
type Blog struct {
|
|
Title string
|
|
Lang string
|
|
Posts []Post
|
|
mutex sync.Mutex
|
|
}
|
|
|
|
func (b *Blog) GetPost(Id string) (Post, bool) {
|
|
var ret Post
|
|
b.mutex.Lock()
|
|
defer b.mutex.Unlock()
|
|
for _, p := range b.Posts {
|
|
if p.Id == Id {
|
|
ret = p
|
|
ret.BlogTitle = b.Title
|
|
ret.Lang = b.Lang
|
|
return ret, true
|
|
}
|
|
}
|
|
return ret, false
|
|
}
|
|
func (p *Post) GenerateExcerpt() {
|
|
|
|
p.ShortText = ""
|
|
if len(p.HTML) > 0 {
|
|
heading, err := p.GetFirstHeading(string(p.HTML))
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
paragraph, err := p.GetFirstParagraphs(string(p.HTML))
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
if len(heading) > 0 {
|
|
p.ShortText += template.HTML(heading)
|
|
}
|
|
if len(paragraph) > 0 {
|
|
p.ShortText += template.HTML(paragraph)
|
|
}
|
|
} else {
|
|
p.ShortText = template.HTML(p.Text)
|
|
}
|
|
|
|
}
|
|
func (p *Post) GetFirstHeading(html string) (string, error) {
|
|
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// Chercher le premier titre (h1, h2, h3, h4, h5, h6)
|
|
firstHeading := doc.Find("h1, h2, h3, h4, h5, h6").First()
|
|
if firstHeading.Length() == 0 {
|
|
return "", fmt.Errorf("no heading found")
|
|
}
|
|
|
|
htmlContent, err := goquery.OuterHtml(firstHeading)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return htmlContent, nil
|
|
}
|
|
func (p *Post) GetFirstParagraphs(html string) (string, error) {
|
|
|
|
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var htmlContent string
|
|
var numberOfTextChars int
|
|
|
|
// Eventuellement trouver un moyen de ne plus examiner le reste du document
|
|
// si 200 caractères atteints
|
|
doc.Find("p,div,h1,h2,h3,h4,h5").Each(func(i int, s *goquery.Selection) {
|
|
|
|
if numberOfTextChars < 200 {
|
|
|
|
numberOfTextChars += len(s.Text())
|
|
|
|
content, err := goquery.OuterHtml(s)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
htmlContent += content
|
|
}
|
|
})
|
|
|
|
return htmlContent, nil
|
|
}
|