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
commit83e1f7a32c71db6c12cdab46d0ed699486107c61 (patch)
tree1b478f38ea3f7de7adbee95014790db4471fea60 /internal/cms/markdown.go
downloadgemcms-83e1f7a32c71db6c12cdab46d0ed699486107c61.tar.gz
gemcms-83e1f7a32c71db6c12cdab46d0ed699486107c61.tar.xz
gemcms-83e1f7a32c71db6c12cdab46d0ed699486107c61.zip
Initial commit
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"
+}