diff --git a/plugin/parser/gemini.go b/plugin/parser/gemini.go
index 68dbb26..5520109 100644
--- a/plugin/parser/gemini.go
+++ b/plugin/parser/gemini.go
@@ -1,7 +1,73 @@
package parser
-import ()
+import (
+ "bytes"
+ "strings"
+
+ "github.com/bouncepaw/mycorrhiza/util"
+)
+
+const (
+ linkToken = "=>"
+ headerToken = "#"
+ quoteToken = ">"
+ preformattedToken = "```"
+ listItemToken = "*"
+)
func GeminiToHtml(gemini []byte) string {
- return ""
+ 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)
+ }
+ return buffer.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))
+ }
+
+ switch token {
+ case linkToken:
+ res = makeLink(makeOutLink(content))
+ case quoteToken:
+ res = makeBlockQuote(LinesToString(content, " "))
+ case preformattedToken:
+ res = makePreformatted(LinesToString(content, " "))
+ case listItemToken:
+ res = makeListItem(LinesToString(content, " "))
+ default:
+ res = makeParagraph(line)
+ }
+ return res
+}
+
+func makeOutLink(arr []string) (source, content string) {
+ switch len(arr) {
+ case 0:
+ return "", ""
+ case 1:
+ return arr[0], arr[0]
+ default:
+ return arr[0], LinesToString(arr[1:], " ")
+ }
+}
+
+func makeOutHeader(arr []string) (level int, content string) {
+ level = len(arr[0])
+ content = LinesToString(arr[1:], " ")
+ return
}
diff --git a/plugin/parser/toHtml.go b/plugin/parser/toHtml.go
new file mode 100644
index 0000000..f6be2b5
--- /dev/null
+++ b/plugin/parser/toHtml.go
@@ -0,0 +1,53 @@
+package parser
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "strings"
+)
+
+const (
+ lineBreak = "
"
+)
+
+func makeLink(source, content string) string {
+ return fmt.Sprintf(`%v`, source, content)
+}
+
+func makeParagraph(content string) string {
+ return `
` + 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 "