Implemented tables

This commit is contained in:
2024-04-01 20:59:32 +02:00
parent 8e009702c2
commit e19a41c792
3 changed files with 68 additions and 5 deletions

View File

@ -11,10 +11,12 @@ var (
)
type renderer struct {
out strings.Builder
paragraphLevel int
quoteLevel int
listLevel int
out strings.Builder
paragraphLevel int
quoteLevel int
listLevel int
tableLevel int
tableHeaderWritten bool
}
// Render creates HTML from the supplied markdown text.
@ -104,6 +106,51 @@ func (r *renderer) processLine(line string) {
r.writeText(line)
r.out.WriteString("</li>")
return
case '|':
r.closeParagraphs()
line = line[1:]
if r.tableLevel == 0 {
r.out.WriteString("<table><thead>")
r.tableLevel++
}
column := 0
for {
pipe := strings.IndexByte(line, '|')
if pipe == -1 {
r.out.WriteString("</tr>")
return
}
content := strings.TrimSpace(line[:pipe])
if strings.HasPrefix(content, "---") {
r.out.WriteString("</thead><tbody>")
r.tableHeaderWritten = true
return
}
if column == 0 {
r.out.WriteString("<tr>")
}
if r.tableHeaderWritten {
r.out.WriteString("<td>")
r.writeText(content)
r.out.WriteString("</td>")
} else {
r.out.WriteString("<th>")
r.writeText(content)
r.out.WriteString("</th>")
}
line = line[pipe+1:]
column++
}
}
if r.paragraphLevel == 0 {
@ -121,6 +168,7 @@ func (r *renderer) processLine(line string) {
func (r *renderer) closeAll() {
r.closeLists()
r.closeParagraphs()
r.closeTables()
}
// closeParagraphs closes open paragraphs.
@ -141,6 +189,16 @@ func (r *renderer) closeLists() {
r.listLevel = 0
}
// closeTables closes open tables.
func (r *renderer) closeTables() {
for range r.tableLevel {
r.out.WriteString("</tbody></table>")
}
r.tableLevel = 0
r.tableHeaderWritten = false
}
// writeText converts inline markdown to HTML.
func (r *renderer) writeText(markdown string) {
var (