diff --git a/plugin/parser/gemini.go b/plugin/parser/gemini.go
index 5520109..c3b41a9 100644
--- a/plugin/parser/gemini.go
+++ b/plugin/parser/gemini.go
@@ -1,7 +1,9 @@
package parser
import (
+ "bufio"
"bytes"
+ "fmt"
"strings"
"github.com/bouncepaw/mycorrhiza/util"
@@ -15,12 +17,17 @@ const (
listItemToken = "*"
)
+var preState bool
+var listState bool
+
func GeminiToHtml(gemini []byte) string {
lines, _ := StringToLines(string(util.NormalizeEOL(gemini)))
var html []string
+
for _, line := range lines {
html = append(html, geminiLineToHtml(line))
}
+
buffer := bytes.Buffer{}
for _, line := range html {
buffer.WriteString(line)
@@ -30,29 +37,40 @@ func GeminiToHtml(gemini []byte) string {
func geminiLineToHtml(line string) (res string) {
arr := strings.Fields(line)
- if len(arr) == 0 {
- return lineBreak
- }
-
- content := arr[1:]
- token := arr[0]
- if string(token[0]) == headerToken {
- return makeHeader(makeOutHeader(arr))
- }
+ token := checkLineType(arr)
switch token {
+ case headerToken:
+ level, content := makeOutHeader(arr)
+ res = fmt.Sprintf("
" + LinesToString(arr[1:], " ") + "" case preformattedToken: - res = makePreformatted(LinesToString(content, " ")) + preState = true + res = fmt.Sprintf(`
`, LinesToString(arr[1:], " ")) + case "pre/empty": + res = "\n" + case "pre/text": + res = line + "\n" + case "pre/end": + preState = false + res = "" + case "list/begin": + res = "
" + line + "
" } - return res + return } func makeOutLink(arr []string) (source, content string) { @@ -71,3 +89,46 @@ func makeOutHeader(arr []string) (level int, content string) { content = LinesToString(arr[1:], " ") return } + +func checkLineType(arr []string) (res string) { + isEmpty := len(arr) == 0 + if preState { + if isEmpty { + res = "pre/empty" + } else if arr[0] == preformattedToken { + res = "pre/end" + } else { + res = "pre/text" + } + } else if listState { + if arr[0] == listItemToken { + res = listItemToken + } else { + res = "list/end" + } + } else if isEmpty { + res = "linebreak" + } else if arr[0][0] == headerToken[0] { + res = headerToken + } else { + return arr[0] + } + return +} + +func StringToLines(s string) (lines []string, err error) { + scanner := bufio.NewScanner(strings.NewReader(s)) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + err = scanner.Err() + return +} + +func LinesToString(lines []string, separator string) string { + buffer := bytes.Buffer{} + for _, line := range lines { + buffer.WriteString(line + separator) + } + return buffer.String() +} diff --git a/plugin/parser/toHtml.go b/plugin/parser/toHtml.go deleted file mode 100644 index f6be2b5..0000000 --- a/plugin/parser/toHtml.go +++ /dev/null @@ -1,53 +0,0 @@ -package parser - -import ( - "bufio" - "bytes" - "fmt" - "strings" -) - -const ( - lineBreak = "` + content + `
` -} - -func makeBlockQuote(content string) string { - return `` + content + `` -} - -func makeHeader(level int, content string) string { - return fmt.Sprintf("
" + content + "" -} - -func makeListItem(content string) string { - return "