internal/library/org.go
34 lines · 938 bytes
1package library
2
3import (
4 "html/template"
5 "strings"
6
7 "github.com/niklasfasching/go-org/org"
8)
9
10// parseOrg splits "#+KEY: value" lines out as lower-cased keywords and
11// renders the rest of the document to HTML.
12func parseOrg(src []byte, path string) (map[string]string, template.HTML, error) {
13 kw := map[string]string{}
14 var body []string
15 for _, line := range strings.Split(string(src), "\n") {
16 t := strings.TrimSpace(line)
17 if rest, ok := strings.CutPrefix(t, "#+"); ok {
18 if k, v, ok := strings.Cut(rest, ":"); ok && k != "" && !strings.ContainsAny(k, " \t") {
19 kw[strings.ToLower(k)] = strings.TrimSpace(v)
20 continue
21 }
22 }
23 body = append(body, line)
24 }
25 text := strings.TrimSpace(strings.Join(body, "\n"))
26 if text == "" {
27 return kw, "", nil
28 }
29 out, err := org.New().Parse(strings.NewReader(text), path).Write(org.NewHTMLWriter())
30 if err != nil {
31 return nil, "", err
32 }
33 return kw, template.HTML(out), nil
34}