all repos

anpi @ 8769209

yaml to anki importer

anpi/main.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
add markdown support, 1 year ago
1
package main
2
3
import (
4
	"fmt"
5
	"log/slog"
6
	"os"
7
8
	"github.com/gomarkdown/markdown"
9
	"github.com/gomarkdown/markdown/html"
10
	mdParser "github.com/gomarkdown/markdown/parser"
11
12
	"github.com/olexsmir/anpi/anki"
13
	"github.com/olexsmir/anpi/parser"
14
)
15
16
const importFile = "import.yml"
17
18
func main() {
19
	if err := run(); err != nil {
20
		fmt.Fprintf(os.Stderr, "error: %v\n", err)
21
		os.Exit(1)
22
	}
23
}
24
25
func run() error {
26
	anki := anki.NewAnkiClient()
27
28
	f, err := os.ReadFile(importFile)
29
	if err != nil {
30
		return err
31
	}
32
33
	data, err := parser.Parse(f)
34
	if err != nil {
35
		return err
36
	}
37
38
	for _, deck := range data {
39
		for _, note := range deck.Notes {
40
			fields := make(map[string]string)
41
			for k, v := range note.Fields {
42
				fields[deck.FieldLookUp(k)] = fromMarkdown(v)
43
			}
44
45
			slog.Info("gotten fields", "fields", fields)
46
47
			tags := mergeTags(deck.Tags, note.Tags)
48
			if _, err := anki.AddNote(deck.Deck, deck.Type, fields, tags); err != nil {
49
				return err
50
			}
51
		}
52
	}
53
54
	return nil
55
}
56
57
func mergeTags(global, local []string) []string {
58
	unique := make(map[string]struct{})
59
60
	for _, tag := range global {
61
		unique[tag] = struct{}{}
62
	}
63
	for _, tag := range local {
64
		unique[tag] = struct{}{}
65
	}
66
67
	result := make([]string, 0, len(unique))
68
	for tag := range unique {
69
		result = append(result, tag)
70
	}
71
72
	return result
73
}
74
75
func fromMarkdown(inp string) string {
76
	extensions := mdParser.CommonExtensions | mdParser.AutoHeadingIDs | mdParser.NoEmptyLineBeforeBlock
77
78
	htmlFlags := html.CommonFlags | html.HrefTargetBlank
79
	opts := html.RendererOptions{Flags: htmlFlags}
80
81
	p := mdParser.NewWithExtensions(extensions)
82
	doc := p.Parse([]byte(inp))
83
84
	renderer := html.NewRenderer(opts)
85
	return string(markdown.Render(doc, renderer))
86
}