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