diff options
| author | Gab Virebent <gabriel1@virebent.art> | 2026-07-07 16:24:28 +0200 |
|---|---|---|
| committer | Gab Virebent <gabriel1@virebent.art> | 2026-07-07 16:24:28 +0200 |
| commit | 37f156c30e2a2b01c840d39f0dd2bdbf811732d6 (patch) | |
| tree | e2ce84dc7f88ce0eb312899448f91b7bb93ca8a3 /internal/cms/markdown.go | |
| download | gemcms-37f156c30e2a2b01c840d39f0dd2bdbf811732d6.tar.gz gemcms-37f156c30e2a2b01c840d39f0dd2bdbf811732d6.tar.xz gemcms-37f156c30e2a2b01c840d39f0dd2bdbf811732d6.zip | |
Diffstat (limited to 'internal/cms/markdown.go')
| -rw-r--r-- | internal/cms/markdown.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/internal/cms/markdown.go b/internal/cms/markdown.go new file mode 100644 index 0000000..49149b8 --- /dev/null +++ b/internal/cms/markdown.go @@ -0,0 +1,43 @@ +package cms + +import ( + "regexp" + "strings" +) + +var ( + standaloneMarkdownLink = regexp.MustCompile(`^\s*\[([^\]]+)\]\(([^)]+)\)\s*$`) + inlineMarkdownLink = regexp.MustCompile(`\[([^\]]+)\]\(([^)]+)\)`) +) + +func markdownToGemtext(body string) string { + var out []string + inFence := false + + for _, line := range strings.Split(strings.ReplaceAll(body, "\r\n", "\n"), "\n") { + trimmed := strings.TrimSpace(line) + if strings.HasPrefix(trimmed, "```") { + inFence = !inFence + out = append(out, line) + continue + } + if inFence { + out = append(out, line) + continue + } + if match := standaloneMarkdownLink.FindStringSubmatch(line); match != nil { + out = append(out, "=> "+match[2]+" "+match[1]) + continue + } + if strings.HasPrefix(trimmed, "- ") { + indent := line[:strings.Index(line, "-")] + line = indent + "* " + strings.TrimPrefix(trimmed, "- ") + } + line = inlineMarkdownLink.ReplaceAllString(line, "$1 ($2)") + line = strings.ReplaceAll(line, "**", "") + line = strings.ReplaceAll(line, "__", "") + out = append(out, line) + } + + return strings.TrimRight(strings.Join(out, "\n"), "\n") + "\n" +} |
