mirror of
https://git.sr.ht/~adnano/kiln
synced 2024-10-30 01:13:08 +00:00
Add GeminiToHTML renderer
This commit is contained in:
parent
82a5490ff5
commit
8b811c4e23
89
render.go
Normal file
89
render.go
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GeminiToHTML reads Gemini from the provided reader and returns an HTML string.
|
||||||
|
func GeminiToHTML(r io.Reader) string {
|
||||||
|
const spacetab = " \t"
|
||||||
|
|
||||||
|
type parseCtx int
|
||||||
|
|
||||||
|
const (
|
||||||
|
parseCtxNone = iota
|
||||||
|
parseCtxPre
|
||||||
|
parseCtxList
|
||||||
|
)
|
||||||
|
|
||||||
|
var builder strings.Builder
|
||||||
|
var ctx parseCtx
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(r)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if len(line) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(line, "```") {
|
||||||
|
if ctx != parseCtxPre {
|
||||||
|
builder.WriteString("<pre>\n")
|
||||||
|
ctx = parseCtxPre
|
||||||
|
} else {
|
||||||
|
builder.WriteString("</pre>\n")
|
||||||
|
ctx = parseCtxNone
|
||||||
|
}
|
||||||
|
} else if ctx == parseCtxPre {
|
||||||
|
builder.WriteString(line)
|
||||||
|
builder.WriteString("\n")
|
||||||
|
} else if strings.HasPrefix(line, "*") {
|
||||||
|
if ctx != parseCtxList {
|
||||||
|
builder.WriteString("<ul>\n")
|
||||||
|
ctx = parseCtxList
|
||||||
|
}
|
||||||
|
builder.WriteString("<li>")
|
||||||
|
line = line[1:]
|
||||||
|
builder.WriteString(strings.TrimLeft(line, spacetab))
|
||||||
|
builder.WriteString("</li>\n")
|
||||||
|
} else if ctx == parseCtxList {
|
||||||
|
builder.WriteString("</ul>\n")
|
||||||
|
ctx = parseCtxNone
|
||||||
|
} else if strings.HasPrefix(line, "###") {
|
||||||
|
line = line[3:]
|
||||||
|
line = strings.TrimLeft(line, spacetab)
|
||||||
|
builder.WriteString("<h3>" + line + "</h3>\n")
|
||||||
|
} else if strings.HasPrefix(line, "##") {
|
||||||
|
line = line[2:]
|
||||||
|
line = strings.TrimLeft(line, spacetab)
|
||||||
|
builder.WriteString("<h2>" + line + "</h2>\n")
|
||||||
|
} else if strings.HasPrefix(line, "#") {
|
||||||
|
line = line[1:]
|
||||||
|
line = strings.TrimLeft(line, spacetab)
|
||||||
|
builder.WriteString("<h1>" + line + "</h1>\n")
|
||||||
|
} else if strings.HasPrefix(line, "=>") {
|
||||||
|
line = line[2:]
|
||||||
|
line = strings.TrimLeft(line, spacetab)
|
||||||
|
split := strings.IndexAny(line, spacetab)
|
||||||
|
url := line[:split]
|
||||||
|
name := line[split:]
|
||||||
|
name = strings.TrimLeft(name, spacetab)
|
||||||
|
builder.WriteString("<p><a href='" + url + "'>" + name + "</a></p>\n")
|
||||||
|
} else if strings.HasPrefix(line, ">") {
|
||||||
|
builder.WriteString("<blockquote>" + line + "</blockquote>")
|
||||||
|
} else {
|
||||||
|
builder.WriteString("<p>" + line + "</p>\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close any opened tags
|
||||||
|
switch ctx {
|
||||||
|
case parseCtxPre:
|
||||||
|
builder.WriteString("</pre>\n")
|
||||||
|
case parseCtxList:
|
||||||
|
builder.WriteString("</ul>\n")
|
||||||
|
}
|
||||||
|
return builder.String()
|
||||||
|
}
|
Loading…
Reference in a new issue