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}