Implemented lists

This commit is contained in:
2024-04-01 20:04:20 +02:00
parent 133d01bd11
commit 8e009702c2
3 changed files with 48 additions and 6 deletions

View File

@ -14,6 +14,7 @@ type renderer struct {
out strings.Builder
paragraphLevel int
quoteLevel int
listLevel int
}
// Render creates HTML from the supplied markdown text.
@ -26,7 +27,7 @@ func Render(markdown string) string {
for {
if i > len(markdown) {
r.closeParagraphs()
r.closeAll()
for range r.quoteLevel {
r.out.WriteString("</blockquote>")
@ -72,8 +73,14 @@ func (r *renderer) processLine(line string) {
r.quoteLevel = newQuoteLevel
if strings.HasPrefix(line, "#") {
r.closeParagraphs()
if len(line) == 0 {
r.closeAll()
return
}
switch line[0] {
case '#':
r.closeAll()
space := strings.IndexByte(line, ' ')
if space > 0 && space <= 6 {
@ -83,10 +90,19 @@ func (r *renderer) processLine(line string) {
}
return
}
if len(line) == 0 {
case '-', '*':
r.closeParagraphs()
line = strings.TrimSpace(line[1:])
if r.listLevel == 0 {
r.out.WriteString("<ul>")
r.listLevel++
}
r.out.WriteString("<li>")
r.writeText(line)
r.out.WriteString("</li>")
return
}
@ -101,6 +117,12 @@ func (r *renderer) processLine(line string) {
r.writeText(line)
}
// closeAll closes all open tags.
func (r *renderer) closeAll() {
r.closeLists()
r.closeParagraphs()
}
// closeParagraphs closes open paragraphs.
func (r *renderer) closeParagraphs() {
for range r.paragraphLevel {
@ -110,6 +132,15 @@ func (r *renderer) closeParagraphs() {
r.paragraphLevel = 0
}
// closeLists closes open lists.
func (r *renderer) closeLists() {
for range r.listLevel {
r.out.WriteString("</ul>")
}
r.listLevel = 0
}
// writeText converts inline markdown to HTML.
func (r *renderer) writeText(markdown string) {
var (
@ -170,6 +201,7 @@ func (r *renderer) writeText(markdown string) {
}
}
// sanitizeURL makes a URL safe to use as the value for a `href` attribute.
func sanitizeURL(linkURL string) string {
linkURL = strings.TrimSpace(linkURL)