From 5af1acbd5403a9618b86d575492b46642a192d06 Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Fri, 18 Dec 2020 00:45:09 -0500 Subject: [PATCH] examples/html: Read from stdin and write to stdout --- examples/html.go | 129 ++++++++++++++++++++++++----------------------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git a/examples/html.go b/examples/html.go index bb99c56..bbef5f1 100644 --- a/examples/html.go +++ b/examples/html.go @@ -7,76 +7,77 @@ package main import ( "fmt" "html" - "strings" + "io" + "os" "git.sr.ht/~adnano/go-gemini" ) func main() { - text := gemini.Text{ - gemini.LineHeading1("Hello, world!"), - gemini.LineText("This is a gemini text document."), + hw := HTMLWriter{ + out: os.Stdout, } - - html := textToHTML(text) - fmt.Print(html) + gemini.ParseLines(os.Stdin, hw.Handle) + hw.Finish() } -// textToHTML returns the Gemini text response as HTML. -func textToHTML(text gemini.Text) string { - var b strings.Builder - var pre bool - var list bool - for _, l := range text { - if _, ok := l.(gemini.LineListItem); ok { - if !list { - list = true - fmt.Fprint(&b, "\n") - } - switch l := l.(type) { - case gemini.LineLink: - url := html.EscapeString(l.URL) - name := html.EscapeString(l.Name) - if name == "" { - name = url - } - fmt.Fprintf(&b, "

%s

\n", url, name) - case gemini.LinePreformattingToggle: - pre = !pre - if pre { - fmt.Fprint(&b, "
\n")
-			} else {
-				fmt.Fprint(&b, "
\n") - } - case gemini.LinePreformattedText: - fmt.Fprintf(&b, "%s\n", html.EscapeString(string(l))) - case gemini.LineHeading1: - fmt.Fprintf(&b, "

%s

\n", html.EscapeString(string(l))) - case gemini.LineHeading2: - fmt.Fprintf(&b, "

%s

\n", html.EscapeString(string(l))) - case gemini.LineHeading3: - fmt.Fprintf(&b, "

%s

\n", html.EscapeString(string(l))) - case gemini.LineListItem: - fmt.Fprintf(&b, "
  • %s
  • \n", html.EscapeString(string(l))) - case gemini.LineQuote: - fmt.Fprintf(&b, "
    %s
    \n", html.EscapeString(string(l))) - case gemini.LineText: - if l == "" { - fmt.Fprint(&b, "
    \n") - } else { - fmt.Fprintf(&b, "

    %s

    \n", html.EscapeString(string(l))) - } - } - } - if pre { - fmt.Fprint(&b, "\n") - } - if list { - fmt.Fprint(&b, "\n") - } - return b.String() +type HTMLWriter struct { + out io.Writer + pre bool + list bool +} + +func (h *HTMLWriter) Handle(line gemini.Line) { + if _, ok := line.(gemini.LineListItem); ok { + if !h.list { + h.list = true + fmt.Fprint(h.out, "\n") + } + switch line := line.(type) { + case gemini.LineLink: + url := html.EscapeString(line.URL) + name := html.EscapeString(line.Name) + if name == "" { + name = url + } + fmt.Fprintf(h.out, "

    %s

    \n", url, name) + case gemini.LinePreformattingToggle: + h.pre = !h.pre + if h.pre { + fmt.Fprint(h.out, "
    \n")
    +		} else {
    +			fmt.Fprint(h.out, "
    \n") + } + case gemini.LinePreformattedText: + fmt.Fprintf(h.out, "%s\n", html.EscapeString(string(line))) + case gemini.LineHeading1: + fmt.Fprintf(h.out, "

    %s

    \n", html.EscapeString(string(line))) + case gemini.LineHeading2: + fmt.Fprintf(h.out, "

    %s

    \n", html.EscapeString(string(line))) + case gemini.LineHeading3: + fmt.Fprintf(h.out, "

    %s

    \n", html.EscapeString(string(line))) + case gemini.LineListItem: + fmt.Fprintf(h.out, "
  • %s
  • \n", html.EscapeString(string(line))) + case gemini.LineQuote: + fmt.Fprintf(h.out, "
    %s
    \n", html.EscapeString(string(line))) + case gemini.LineText: + if line == "" { + fmt.Fprint(h.out, "
    \n") + } else { + fmt.Fprintf(h.out, "

    %s

    \n", html.EscapeString(string(line))) + } + } +} + +func (h *HTMLWriter) Finish() { + if h.pre { + fmt.Fprint(h.out, "\n") + } + if h.list { + fmt.Fprint(h.out, "\n") + } }