package app import ( "bytes" "embed" "fmt" "html/template" "net/http" "path" "regexp" "github.com/gomarkdown/markdown" "github.com/gomarkdown/markdown/html" "github.com/gomarkdown/markdown/parser" ) //go:embed embeded/markdown/*.md var markdownFS embed.FS const markdownEmbedPath = "embeded/markdown" const markdownTemplate = "markdown" var stratBoardRegex = regexp.MustCompile(`\[stgy:a.*\]`) func markdownInjectStrategyBoard(input []byte, created string) ([]byte, error) { for _, sb := range stratBoardRegex.FindAllSubmatch(input, -1) { record, err := processStrategyBoard(string(sb[0]), created) if err != nil { return input, err } boardURL := getStrategyBoardURL(record.ID) input = bytes.ReplaceAll(input, sb[0], fmt.Appendf(nil, "[![Strategy Board: %s](%s.png)](%s)", record.Name, boardURL, boardURL)) } return input, nil } func markdownToHTML(input []byte) string { extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock p := parser.NewWithExtensions(extensions) doc := p.Parse(input) htmlFlags := html.CommonFlags | html.HrefTargetBlank opts := html.RendererOptions{Flags: htmlFlags} renderer := html.NewRenderer(opts) return string(markdown.Render(doc, renderer)) } func markdownToHTMLStripTitle(input []byte) (string, string) { extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock p := parser.NewWithExtensions(extensions) doc := p.Parse(input) title := "" children := doc.AsContainer().GetChildren() if len(children) > 1 { leaf := children[0].AsContainer().GetChildren()[0].AsLeaf() if leaf != nil { title = string(leaf.Literal) } } if title == "" { title = "(Untitled)" } htmlFlags := html.CommonFlags | html.HrefTargetBlank opts := html.RendererOptions{Flags: htmlFlags} renderer := html.NewRenderer(opts) return title, string(markdown.Render(doc, renderer)) } func httpHandleMarkdown(w http.ResponseWriter, r *http.Request, name string) { rawMd, err := markdownFS.ReadFile(path.Join(markdownEmbedPath, name+".md")) if err != nil { httpHandleError(w, err) return } title, content := markdownToHTMLStripTitle(rawMd) if name == "home" { title = "Home" } httpHandleTemplate(w, markdownTemplate, map[string]any{ "title": title, "name": name, "content": template.HTML(content), "url": fmt.Sprintf("//%s%s", r.Host, r.URL.String()), }) }