diff options
| author | adnano <[email protected]> | 2020-10-15 00:38:05 -0400 |
|---|---|---|
| committer | adnano <[email protected]> | 2020-10-15 00:38:05 -0400 |
| commit | 849e261dc65388610fb009f33a1320930acbc84e (patch) | |
| tree | e60311164373d1a114e66078a34643053867d15a /text.go | |
| parent | Rename rw to w (diff) | |
| download | go-gemini-849e261dc65388610fb009f33a1320930acbc84e.tar.xz go-gemini-849e261dc65388610fb009f33a1320930acbc84e.zip | |
Add (Text).HTML function to render text to HTML
Diffstat (limited to 'text.go')
| -rw-r--r-- | text.go | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -3,6 +3,7 @@ package gmi import ( "bufio" "fmt" + "html" "io" "strings" ) @@ -150,3 +151,70 @@ func (t Text) String() string { } return b.String() } + +// HTML returns the Gemini text response as HTML. +func (t Text) HTML() string { + var b strings.Builder + var pre bool + var list bool + for _, l := range t { + if _, ok := l.(LineListItem); ok { + if !list { + list = true + fmt.Fprint(&b, "<ul>\n") + } + } else if list { + list = false + fmt.Fprint(&b, "</ul>\n") + } + switch l.(type) { + case LineLink: + link := l.(LineLink) + url := html.EscapeString(link.URL) + name := html.EscapeString(link.Name) + if name == "" { + name = url + } + fmt.Fprintf(&b, "<p><a href='%s'>%s</a></p>\n", url, name) + case LinePreformattingToggle: + pre = !pre + if pre { + fmt.Fprint(&b, "<pre>\n") + } else { + fmt.Fprint(&b, "</pre>\n") + } + case LinePreformattedText: + text := string(l.(LinePreformattedText)) + fmt.Fprintf(&b, "%s\n", html.EscapeString(text)) + case LineHeading1: + text := string(l.(LineHeading1)) + fmt.Fprintf(&b, "<h1>%s</h1>\n", html.EscapeString(text)) + case LineHeading2: + text := string(l.(LineHeading2)) + fmt.Fprintf(&b, "<h2>%s</h2>\n", html.EscapeString(text)) + case LineHeading3: + text := string(l.(LineHeading3)) + fmt.Fprintf(&b, "<h3>%s</h3>\n", html.EscapeString(text)) + case LineListItem: + text := string(l.(LineListItem)) + fmt.Fprintf(&b, "<li>%s</li>\n", html.EscapeString(text)) + case LineQuote: + text := string(l.(LineQuote)) + fmt.Fprintf(&b, "<blockquote>%s</blockquote>\n", html.EscapeString(text)) + case LineText: + text := string(l.(LineText)) + if text == "" { + fmt.Fprint(&b, "<br>\n") + } else { + fmt.Fprintf(&b, "<p>%s</p>\n", html.EscapeString(text)) + } + } + } + if pre { + fmt.Fprint(&b, "</pre>\n") + } + if list { + fmt.Fprint(&b, "</ul>\n") + } + return b.String() +} |