97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
package lib
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"html/template"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
)
|
|
|
|
const CONTENT_PATH string = "content"
|
|
|
|
type Content struct {
|
|
Dir string
|
|
Name string
|
|
|
|
Title string `json:"title"`
|
|
ID string `json:"id"`
|
|
|
|
Md string
|
|
HTML template.HTML
|
|
|
|
Date string `json:"date"`
|
|
Author string `json:"author"`
|
|
}
|
|
|
|
func ListContent(dir string) ([]Content, error) {
|
|
var res []Content
|
|
|
|
dirpath := path.Join(CONTENT_PATH, dir)
|
|
entries, err := os.ReadDir(dirpath)
|
|
if err != nil {
|
|
return nil, errors.New("Cannot readdir: " + dirpath)
|
|
}
|
|
|
|
for _, e := range entries {
|
|
if e.IsDir() {
|
|
subres, err := ListContent(path.Join(dir, e.Name()))
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
res = append(res, subres...)
|
|
}
|
|
|
|
if !strings.HasSuffix(e.Name(), ".json") {
|
|
continue
|
|
}
|
|
|
|
var con Content
|
|
jsonfile := path.Join(dirpath, e.Name())
|
|
jsoncon, err := os.ReadFile(jsonfile)
|
|
|
|
if err != nil {
|
|
return nil, errors.New("Cannot get JSON: " + jsonfile)
|
|
}
|
|
|
|
err = json.Unmarshal(jsoncon, &con)
|
|
if err != nil {
|
|
return nil, errors.New("Cannot parse JSON: " + jsonfile)
|
|
}
|
|
|
|
con.Dir = dir
|
|
con.Name = strings.Split(e.Name(), ".")[0]
|
|
res = append(res, con)
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
func GetContent(dir string, name string) (Content, error) {
|
|
var res Content
|
|
jsonfile := path.Join(CONTENT_PATH, dir, name+".json")
|
|
mdfile := path.Join(CONTENT_PATH, dir, name+".md")
|
|
|
|
res.Dir = dir
|
|
res.Name = name
|
|
|
|
jsoncontent, err := os.ReadFile(jsonfile)
|
|
if err != nil {
|
|
return res, errors.New("Cannot read JSON file: " + jsonfile)
|
|
}
|
|
|
|
rawcontent, err := os.ReadFile(mdfile)
|
|
if err != nil {
|
|
return res, errors.New("Cannot read markdown file: " + mdfile)
|
|
}
|
|
|
|
if json.Unmarshal(jsoncontent, &res) != nil {
|
|
return res, errors.New("Cannot parse JSON: " + jsonfile)
|
|
}
|
|
|
|
res.Md = string(rawcontent)
|
|
res.HTML = template.HTML(ParseMarkdown(res.Md))
|
|
return res, nil
|
|
}
|