all repos — flounder @ 8e2aeacaa3a8f9d86f032d657c9c390d55e1be72

A small site builder for the Gemini protocol

gmi2html.go (view raw)

 1package main
 2
 3import (
 4	"fmt"
 5	"html"
 6	"strings"
 7
 8	"git.sr.ht/~adnano/go-gemini"
 9)
10
11func textToHTML(text gemini.Text) string {
12	var b strings.Builder
13	var pre bool
14	var list bool
15	for _, l := range text {
16		if _, ok := l.(gemini.LineListItem); ok {
17			if !list {
18				list = true
19				fmt.Fprint(&b, "<ul>\n")
20			}
21		} else if list {
22			list = false
23			fmt.Fprint(&b, "</ul>\n")
24		}
25		switch l.(type) {
26		case gemini.LineLink:
27			link := l.(gemini.LineLink)
28			url := html.EscapeString(link.URL)
29			name := html.EscapeString(link.Name)
30			if name == "" {
31				name = url
32			}
33			fmt.Fprintf(&b, "<p><a href='%s'>%s</a></p>\n", url, name)
34		case gemini.LinePreformattingToggle:
35			pre = !pre
36			if pre {
37				altText := string(l.(gemini.LinePreformattingToggle))
38				if altText != "" {
39					altText = html.EscapeString(altText)
40					fmt.Fprintf(&b, "<pre title='%s'>\n", altText)
41				} else {
42					fmt.Fprint(&b, "<pre>\n")
43				}
44			} else {
45				fmt.Fprint(&b, "</pre>\n")
46			}
47		case gemini.LinePreformattedText:
48			text := string(l.(gemini.LinePreformattedText))
49			fmt.Fprintf(&b, "%s\n", html.EscapeString(text))
50		case gemini.LineHeading1:
51			text := string(l.(gemini.LineHeading1))
52			fmt.Fprintf(&b, "<h1>%s</h1>\n", html.EscapeString(text))
53		case gemini.LineHeading2:
54			text := string(l.(gemini.LineHeading2))
55			fmt.Fprintf(&b, "<h2>%s</h2>\n", html.EscapeString(text))
56		case gemini.LineHeading3:
57			text := string(l.(gemini.LineHeading3))
58			fmt.Fprintf(&b, "<h3>%s</h3>\n", html.EscapeString(text))
59		case gemini.LineListItem:
60			text := string(l.(gemini.LineListItem))
61			fmt.Fprintf(&b, "<li>%s</li>\n", html.EscapeString(text))
62		case gemini.LineQuote:
63			text := string(l.(gemini.LineQuote))
64			fmt.Fprintf(&b, "<blockquote>%s</blockquote>\n", html.EscapeString(text))
65		case gemini.LineText:
66			text := string(l.(gemini.LineText))
67			if text == "" {
68				fmt.Fprint(&b, "<br>\n")
69			} else {
70				fmt.Fprintf(&b, "<p>%s</p>\n", html.EscapeString(text))
71			}
72		}
73	}
74	if pre {
75		fmt.Fprint(&b, "</pre>\n")
76	}
77	if list {
78		fmt.Fprint(&b, "</ul>\n")
79	}
80	return b.String()
81}