Initial release

This commit is contained in:
2021-12-16 10:08:34 +01:00
commit bc3ec64b3c
17 changed files with 684 additions and 0 deletions

66
article/article.go Normal file
View File

@@ -0,0 +1,66 @@
package article
import (
"TheAdversary/config"
"TheAdversary/parse"
"TheAdversary/schema"
"github.com/gomarkdown/markdown/ast"
"path/filepath"
"strings"
"time"
)
func LoadArticle(path string) (*schema.Article, error) {
node, err := parse.Parse(path)
if err != nil {
return nil, err
}
article := &schema.Article{
Name: ArticleName(path),
Added: time.Now().Unix(),
}
children := node.GetChildren()
to := 3
if len(children) < to {
to = len(children)
}
for _, child := range children[0:to] {
switch child.(type) {
case *ast.Heading:
if article.Title != "" {
article.Summary = extractText(child.(*ast.Heading).Container)
} else {
article.Title = extractText(child.(*ast.Heading).Container)
}
case *ast.Paragraph:
if article.Summary == "" {
article.Summary = extractText(child.(*ast.Paragraph).Container)
}
case *ast.BlockQuote:
if article.Summary == "" {
article.Summary = extractText(child.(*ast.BlockQuote).Container)
}
case *ast.Image:
article.Image = string(child.(*ast.Image).Destination)
}
}
if article.Title == "" {
article.Title = strings.ReplaceAll(strings.ReplaceAll(ArticleName(path), "-", " "), "_", " ")
}
return article, err
}
func extractText(container ast.Container) string {
return string(container.GetChildren()[0].(*ast.Text).Literal)
}
func ArticleName(path string) string {
ext := filepath.Ext(path)
if ext != ".md" {
return strings.TrimPrefix(path, config.ArticleRoot)
} else {
return strings.TrimSuffix(strings.TrimPrefix(path, config.ArticleRoot), filepath.Ext(path))
}
}

68
article/notify.go Normal file
View File

@@ -0,0 +1,68 @@
package article
import (
"TheAdversary/config"
"TheAdversary/database"
"database/sql"
"fmt"
"github.com/fsnotify/fsnotify"
"sync"
"time"
)
func Notify() error {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return err
}
err = watcher.Add(config.ArticleRoot)
if err != nil {
return err
}
db := database.GetDB()
var lock sync.Mutex
for {
select {
case event, ok := <-watcher.Events:
lock.Lock()
if !ok {
return fmt.Errorf("failed to catch event")
}
if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write {
_, err := db.GetArticleByName(ArticleName(event.Name))
if err != nil && err == sql.ErrNoRows {
article, err := LoadArticle(event.Name)
if err != nil {
return err
}
err = db.AddArticle(article)
if err != nil {
return err
}
} else if err != nil {
return err
} else {
article, err := LoadArticle(event.Name)
if err != nil {
return err
}
article.Modified = time.Now().Unix()
if err = db.UpdateArticle(ArticleName(event.Name), article); err != nil {
return err
}
}
} else if event.Op&fsnotify.Rename == fsnotify.Rename {
if err = db.DeleteArticlesByNames(ArticleName(event.Name)); err != nil {
return err
}
} else if event.Op&fsnotify.Remove == fsnotify.Remove {
if err = db.DeleteArticlesByNames(ArticleName(event.Name)); err != nil {
return err
}
}
lock.Unlock()
}
}
}