finish gemtext renderer for now

This commit is contained in:
Nico 2020-11-12 21:02:05 +00:00
parent e14436a8e9
commit d24c5846c4
2 changed files with 97 additions and 6 deletions

View File

@ -3,6 +3,7 @@ package gemtext
import (
"fmt"
"path/filepath"
"strings"
)
// addPrefix adds the prefix "pref" to a path if it is absolute
@ -17,11 +18,53 @@ func addPrefix(pref string, link string) string {
// RenderLink takes a GemtextObject and returns a gemini link as a string or an error if the object is not a link.
func RenderLink(obj GemtextObject) (string, error) {
if obj.Type != LINK {
return "", fmt.Errorf("Not a link!")
} else {
str := fmt.Sprintf("=> %s %s",obj.Path, obj.Text)
return str,nil
}
if obj.Type != LINK {
return "", fmt.Errorf("Invalid Link")
} else if obj.Path == "" {
return "", fmt.Errorf("Invalid Link")
}
str := fmt.Sprintf("=> %s %s",obj.Path, obj.Text)
return str,nil
}
// RenderHeading takes a GemtextObject and returns a gemini heading as a string or an error if the object is not a heading.
func RenderHeading(obj GemtextObject) (string, error) {
if obj.Type != HEADING {
return "", fmt.Errorf("Invalid Heading (Not a Heading)")
} else if obj.Level > 3 {
return "", fmt.Errorf("Invalid Heading (Invalid level)")
}
return strings.Repeat("#", obj.Level) + " " + obj.Text, nil
}
// RenderGemtext takes a GemtextPage and renders it into Gemtext.
func RenderGemtext(p GemtextPage) (string, error) {
str := ""
for _, o := range p {
switch {
case o.Type == TEXT:
str += o.Text + "\n"
case o.Type == LINK:
l, err := RenderLink(o)
if err != nil {
return "", err
}
str += l + "\n"
case o.Type == PREFORMATTED_TOGGLE:
str += "```" + o.Text + "\n"
case o.Type == PREFORMATTED_TEXT:
str += o.Text + "\n"
case o.Type == HEADING:
l, err := RenderHeading(o)
if err != nil {
return "", err
}
str += l + "\n"
case o.Type == LIST:
str += "* " + o.Text + "\n"
case o.Type == QUOTE:
str += ">" + o.Text + "\n"
}
}
return str, nil
}

48
render_test.go Normal file
View File

@ -0,0 +1,48 @@
package gemtext
import "testing"
type PrefixCase struct {
Prefix string
Link string
Want string
}
func TestAddPrefix(t *testing.T) {
cases := []PrefixCase{
PrefixCase{Prefix: "", Link: "/test/", Want: "/test"},
PrefixCase{Prefix:"https:itwont.work/", Link: "/test/stuff.gmi", Want: "https:itwont.work/test/stuff.gmi"},
PrefixCase{Prefix:"https:itwont.work/", Link: "test/stuff.gmi", Want: "test/stuff.gmi"},
PrefixCase{Prefix:"", Link: "", Want: ""},
PrefixCase{Prefix:"https:itwont.work/", Link: "", Want: ""},
}
for _, c := range cases {
got := addPrefix(c.Prefix,c.Link)
if got != c.Want {
t.Errorf("Case %#v, Got %#v", c, got)
}
}
}
type LineRenderCase struct {
In GemtextObject
Want string
}
func TestRenderHeading(t *testing.T) {
cases := []LineRenderCase{
LineRenderCase{In: GemtextObject{Type: HEADING, Level: 1, Text: "Hello"}, Want:"# Hello"}, // I'm not adding a Literal to these cases.
LineRenderCase{In: GemtextObject{Type: HEADING, Level: 2, Text: ""}, Want:"## "},
LineRenderCase{In: GemtextObject{Type: HEADING, Level: 2, Text: "Hello"}, Want:"## Hello"},
LineRenderCase{In: GemtextObject{Type: HEADING, Level: 3, Text: "This contains spaces"}, Want:"### This contains spaces"},
}
for _, c := range cases {
got, _ := RenderHeading(c.In)
if got != c.Want {
t.Errorf("Case %#v, Got %#v", c, got)
}
}
}