This repository was archived by the owner on Apr 18, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmarkdown.go
More file actions
120 lines (98 loc) · 2.33 KB
/
Copy pathmarkdown.go
File metadata and controls
120 lines (98 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package markdown
// https://github.com/alirezaudev
// https://linkedin.com/in/alireza-msv
import (
"fmt"
"strings"
)
func Render(markdown string) string {
markdown = applyInlineTags(markdown)
markdown = replaceHeaders(markdown)
markdown = replaceLists(markdown)
markdown = replaceParagraphs(markdown)
return markdown
}
func applyInlineTags(md string) string {
md = strings.Replace(md, "__", "<strong>", 1)
md = strings.Replace(md, "__", "</strong>", 1)
md = strings.Replace(md, "_", "<em>", 1)
md = strings.Replace(md, "_", "</em>", 1)
return md
}
func replaceHeaders(md string) string {
lines := strings.Split(md, "\n")
var result strings.Builder
for _, line := range lines {
if !strings.HasPrefix(line, "#") {
result.WriteString(line)
result.WriteString("\n")
continue
}
level := 0
for level < len(line) && line[level] == '#' {
level++
}
if level > 6 || level >= len(line) || line[level] != ' ' {
result.WriteString(line)
result.WriteString("\n")
continue
}
content := strings.TrimSpace(line[level:])
result.WriteString(fmt.Sprintf("<h%d>%s</h%d>", level, content, level))
result.WriteString("\n")
}
return result.String()
}
func replaceLists(md string) string {
lines := strings.Split(md, "\n")
var result strings.Builder
inList := false
for _, line := range lines {
if strings.HasPrefix(line, "* ") {
if !inList {
result.WriteString("<ul>")
inList = true
}
content := strings.TrimSpace(line[2:])
result.WriteString("<li>" + content + "</li>")
} else {
if inList {
result.WriteString("</ul>")
result.WriteString("\n")
inList = false
}
result.WriteString(line)
result.WriteString("\n")
}
}
if inList {
result.WriteString("</ul>")
result.WriteString("\n")
}
return result.String()
}
func replaceParagraphs(md string) string {
var result strings.Builder
htmlTags := []string{"<h", "<ul>", "<li>", "</ul>"}
lines := strings.Split(md, "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if line == "" {
continue
}
if stringHasPrefixes(line, htmlTags) {
result.WriteString(line)
continue
}
result.WriteString("<p>" + line + "</p>")
}
return result.String()
}
func stringHasPrefixes(s string, prs []string) bool {
for _, pr := range prs {
if strings.HasPrefix(s, pr) {
return true
}
}
return false
}