summaryrefslogtreecommitdiffstats
path: root/internal/cms/markdown.go
diff options
context:
space:
mode:
authorGab Virebent <gabriel1@virebent.art>2026-07-07 16:24:28 +0200
committerGab Virebent <gabriel1@virebent.art>2026-07-07 16:24:28 +0200
commit37f156c30e2a2b01c840d39f0dd2bdbf811732d6 (patch)
treee2ce84dc7f88ce0eb312899448f91b7bb93ca8a3 /internal/cms/markdown.go
downloadgemcms-37f156c30e2a2b01c840d39f0dd2bdbf811732d6.tar.gz
gemcms-37f156c30e2a2b01c840d39f0dd2bdbf811732d6.tar.xz
gemcms-37f156c30e2a2b01c840d39f0dd2bdbf811732d6.zip
Initial commitHEADmain
Diffstat (limited to 'internal/cms/markdown.go')
-rw-r--r--internal/cms/markdown.go43
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"
+}