Implemented lists
This commit is contained in:
42
Render.go
42
Render.go
@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user