package stdlib import ( "strings" "text/template" "github.com/kovetskiy/mark/pkg/confluence" "github.com/kovetskiy/mark/pkg/log" "github.com/kovetskiy/mark/pkg/mark/macro" "github.com/reconquest/karma-go" ) type Lib struct { Macros []macro.Macro Templates *template.Template } func New(api *confluence.API) (*Lib, error) { var ( lib Lib err error ) lib.Templates, err = templates(api) if err != nil { return nil, err } lib.Macros, err = macros(lib.Templates) if err != nil { return nil, err } return &lib, nil } func macros(templates *template.Template) ([]macro.Macro, error) { text := func(line ...string) []byte { return []byte(strings.Join(line, "\n")) } macros, _, err := macro.LoadMacros( []byte(text( ``, // TODO(seletskiy): more macros here )), templates, ) if err != nil { return nil, err } return macros, nil } func templates(api *confluence.API) (*template.Template, error) { text := func(line ...string) string { return strings.Join(line, ``) } templates := template.New(`stdlib`).Funcs( template.FuncMap{ "user": func(name string) *confluence.User { user, err := api.GetUserByName(name) if err != nil { log.Error(err) } return user }, // The only way to escape CDATA end marker ']]>' is to split it // into two CDATA sections. "cdata": func(data string) string { return strings.ReplaceAll( data, "]]>", "]]>", ) }, }, ) var err error for name, body := range map[string]string{ // This template is used to select whole article layout `ac:layout`: text( `{{ if eq .Layout "article" }}`, /**/ ``, /**/ ``, /**/ `{{ .Body }}`, /**/ ``, /**/ ``, /**/ ``, `{{ else }}`, /**/ `{{ .Body }}`, `{{ end }}`, ), // This template is used for rendering code in ``` `ac:code`: text( ``, `{{ .Language }}`, `false`, ``, ``, ), `ac:status`: text( ``, `{{ or .Color "Grey" }}`, `{{ or .Title .Color }}`, `{{ or .Subtle false }}`, ``, ), `ac:link:user`: text( `{{ with .Name | user }}`, /**/ ``, /**/ ``, /**/ ``, `{{ else }}`, /**/ `{{ .Name }}`, `{{ end }}`, ), `ac:jira:ticket`: text( ``, `{{ .Ticket }}`, ``, ), // TODO(seletskiy): more templates here } { templates, err = templates.New(name).Parse(body) if err != nil { return nil, karma. Describe("template", body). Format( err, "unable to parse template", ) } } return templates, nil }