Make Writer interface methods public: Allow other implementations

This commit is contained in:
Niklas Fasching 2019-01-01 19:08:17 +01:00
parent fb39e59e6b
commit 348f697b41
3 changed files with 41 additions and 41 deletions

View file

@ -25,9 +25,9 @@ type Document struct {
} }
type Writer interface { type Writer interface {
before(*Document) Before(*Document)
after(*Document) After(*Document)
writeNodes(...Node) WriteNodes(...Node)
String() string String() string
} }
@ -101,9 +101,9 @@ func (d *Document) Write(w Writer) (out string, err error) {
} else if d.Nodes == nil { } else if d.Nodes == nil {
return "", fmt.Errorf("could not write output: parse was not called") return "", fmt.Errorf("could not write output: parse was not called")
} }
w.before(d) w.Before(d)
w.writeNodes(d.Nodes...) w.WriteNodes(d.Nodes...)
w.after(d) w.After(d)
return w.String(), err return w.String(), err
} }

View file

@ -62,21 +62,21 @@ func (w *HTMLWriter) emptyClone() *HTMLWriter {
func (w *HTMLWriter) nodesAsString(nodes ...Node) string { func (w *HTMLWriter) nodesAsString(nodes ...Node) string {
tmp := w.emptyClone() tmp := w.emptyClone()
tmp.writeNodes(nodes...) tmp.WriteNodes(nodes...)
return tmp.String() return tmp.String()
} }
func (w *HTMLWriter) before(d *Document) { func (w *HTMLWriter) Before(d *Document) {
w.document = d w.document = d
w.log = d.Log w.log = d.Log
w.writeOutline(d) w.writeOutline(d)
} }
func (w *HTMLWriter) after(d *Document) { func (w *HTMLWriter) After(d *Document) {
w.writeFootnotes(d) w.writeFootnotes(d)
} }
func (w *HTMLWriter) writeNodes(ns ...Node) { func (w *HTMLWriter) WriteNodes(ns ...Node) {
for _, n := range ns { for _, n := range ns {
switch n := n.(type) { switch n := n.(type) {
case Keyword: case Keyword:
@ -142,7 +142,7 @@ func (w *HTMLWriter) writeBlock(b Block) {
if isRawTextBlock(b.Name) { if isRawTextBlock(b.Name) {
exportWriter := w.emptyClone() exportWriter := w.emptyClone()
exportWriter.htmlEscape = false exportWriter.htmlEscape = false
exportWriter.writeNodes(b.Children...) exportWriter.WriteNodes(b.Children...)
content = strings.TrimRightFunc(exportWriter.String(), unicode.IsSpace) content = strings.TrimRightFunc(exportWriter.String(), unicode.IsSpace)
} else { } else {
content = w.nodesAsString(b.Children...) content = w.nodesAsString(b.Children...)
@ -170,7 +170,7 @@ func (w *HTMLWriter) writeBlock(b Block) {
} }
func (w *HTMLWriter) writeDrawer(d Drawer) { func (w *HTMLWriter) writeDrawer(d Drawer) {
w.writeNodes(d.Children...) w.WriteNodes(d.Children...)
} }
func (w *HTMLWriter) writeKeyword(k Keyword) { func (w *HTMLWriter) writeKeyword(k Keyword) {
@ -180,7 +180,7 @@ func (w *HTMLWriter) writeKeyword(k Keyword) {
} }
func (w *HTMLWriter) writeInclude(i Include) { func (w *HTMLWriter) writeInclude(i Include) {
w.writeNodes(i.Resolve()) w.WriteNodes(i.Resolve())
} }
func (w *HTMLWriter) writeFootnoteDefinition(f FootnoteDefinition) { func (w *HTMLWriter) writeFootnoteDefinition(f FootnoteDefinition) {
@ -188,7 +188,7 @@ func (w *HTMLWriter) writeFootnoteDefinition(f FootnoteDefinition) {
w.WriteString(`<div class="footnote-definition">` + "\n") w.WriteString(`<div class="footnote-definition">` + "\n")
w.WriteString(fmt.Sprintf(`<sup id="footnote-%s"><a href="#footnote-reference-%s">%s</a></sup>`, n, n, n) + "\n") w.WriteString(fmt.Sprintf(`<sup id="footnote-%s"><a href="#footnote-reference-%s">%s</a></sup>`, n, n, n) + "\n")
w.WriteString(`<div class="footnote-body">` + "\n") w.WriteString(`<div class="footnote-body">` + "\n")
w.writeNodes(f.Children...) w.WriteNodes(f.Children...)
w.WriteString("</div>\n</div>\n") w.WriteString("</div>\n</div>\n")
} }
@ -248,7 +248,7 @@ func (w *HTMLWriter) writeHeadline(h Headline) {
w.WriteString(fmt.Sprintf(`<span class="priority">[%s]</span>`, h.Priority) + "\n") w.WriteString(fmt.Sprintf(`<span class="priority">[%s]</span>`, h.Priority) + "\n")
} }
w.writeNodes(h.Title...) w.WriteNodes(h.Title...)
if w.document.GetOption("tags") && len(h.Tags) != 0 { if w.document.GetOption("tags") && len(h.Tags) != 0 {
tags := make([]string, len(h.Tags)) tags := make([]string, len(h.Tags))
for i, tag := range h.Tags { for i, tag := range h.Tags {
@ -258,7 +258,7 @@ func (w *HTMLWriter) writeHeadline(h Headline) {
w.WriteString(fmt.Sprintf(`<span class="tags">%s</span>`, strings.Join(tags, "&#xa0;"))) w.WriteString(fmt.Sprintf(`<span class="tags">%s</span>`, strings.Join(tags, "&#xa0;")))
} }
w.WriteString(fmt.Sprintf("\n</h%d>\n", h.Lvl)) w.WriteString(fmt.Sprintf("\n</h%d>\n", h.Lvl))
w.writeNodes(h.Children...) w.WriteNodes(h.Children...)
} }
func (w *HTMLWriter) writeText(t Text) { func (w *HTMLWriter) writeText(t Text) {
@ -277,7 +277,7 @@ func (w *HTMLWriter) writeEmphasis(e Emphasis) {
panic(fmt.Sprintf("bad emphasis %#v", e)) panic(fmt.Sprintf("bad emphasis %#v", e))
} }
w.WriteString(tags[0]) w.WriteString(tags[0])
w.writeNodes(e.Content...) w.WriteNodes(e.Content...)
w.WriteString(tags[1]) w.WriteString(tags[1])
} }
@ -326,7 +326,7 @@ func (w *HTMLWriter) writeList(l List) {
panic(fmt.Sprintf("bad list kind %#v", l)) panic(fmt.Sprintf("bad list kind %#v", l))
} }
w.WriteString(tags[0] + "\n") w.WriteString(tags[0] + "\n")
w.writeNodes(l.Items...) w.WriteNodes(l.Items...)
w.WriteString(tags[1] + "\n") w.WriteString(tags[1] + "\n")
} }
@ -336,7 +336,7 @@ func (w *HTMLWriter) writeListItem(li ListItem) {
} else { } else {
w.WriteString("<li>\n") w.WriteString("<li>\n")
} }
w.writeNodes(li.Children...) w.WriteNodes(li.Children...)
w.WriteString("</li>\n") w.WriteString("</li>\n")
} }
@ -348,12 +348,12 @@ func (w *HTMLWriter) writeDescriptiveListItem(di DescriptiveListItem) {
} }
if len(di.Term) != 0 { if len(di.Term) != 0 {
w.writeNodes(di.Term...) w.WriteNodes(di.Term...)
} else { } else {
w.WriteString("?") w.WriteString("?")
} }
w.WriteString("<dd>\n") w.WriteString("<dd>\n")
w.writeNodes(di.Details...) w.WriteNodes(di.Details...)
w.WriteString("<dd>\n") w.WriteString("<dd>\n")
} }
@ -365,7 +365,7 @@ func (w *HTMLWriter) writeParagraph(p Paragraph) {
if _, ok := p.Children[0].(LineBreak); !ok { if _, ok := p.Children[0].(LineBreak); !ok {
w.WriteString("\n") w.WriteString("\n")
} }
w.writeNodes(p.Children...) w.WriteNodes(p.Children...)
w.WriteString("\n</p>\n") w.WriteString("\n</p>\n")
} }
@ -373,7 +373,7 @@ func (w *HTMLWriter) writeExample(e Example) {
w.WriteString(`<pre class="example">` + "\n") w.WriteString(`<pre class="example">` + "\n")
if len(e.Children) != 0 { if len(e.Children) != 0 {
for _, n := range e.Children { for _, n := range e.Children {
w.writeNodes(n) w.WriteNodes(n)
w.WriteString("\n") w.WriteString("\n")
} }
} }
@ -438,7 +438,7 @@ func (w *HTMLWriter) writeTableColumns(columns []Column, tag string) {
} else { } else {
w.WriteString(fmt.Sprintf(`<%s class="align-%s">`, tag, column.Align)) w.WriteString(fmt.Sprintf(`<%s class="align-%s">`, tag, column.Align))
} }
w.writeNodes(column.Children...) w.WriteNodes(column.Children...)
w.WriteString(fmt.Sprintf("</%s>\n", tag)) w.WriteString(fmt.Sprintf("</%s>\n", tag))
} }
w.WriteString("</tr>\n") w.WriteString("</tr>\n")

View file

@ -32,8 +32,8 @@ func NewOrgWriter() *OrgWriter {
} }
} }
func (w *OrgWriter) before(d *Document) {} func (w *OrgWriter) Before(d *Document) {}
func (w *OrgWriter) after(d *Document) {} func (w *OrgWriter) After(d *Document) {}
func (w *OrgWriter) emptyClone() *OrgWriter { func (w *OrgWriter) emptyClone() *OrgWriter {
wcopy := *w wcopy := *w
@ -43,11 +43,11 @@ func (w *OrgWriter) emptyClone() *OrgWriter {
func (w *OrgWriter) nodesAsString(nodes ...Node) string { func (w *OrgWriter) nodesAsString(nodes ...Node) string {
tmp := w.emptyClone() tmp := w.emptyClone()
tmp.writeNodes(nodes...) tmp.WriteNodes(nodes...)
return tmp.String() return tmp.String()
} }
func (w *OrgWriter) writeNodes(ns ...Node) { func (w *OrgWriter) WriteNodes(ns ...Node) {
for _, n := range ns { for _, n := range ns {
switch n := n.(type) { switch n := n.(type) {
case Comment: case Comment:
@ -118,7 +118,7 @@ func (w *OrgWriter) writeHeadline(h Headline) {
tmp.WriteString(" [#" + h.Priority + "]") tmp.WriteString(" [#" + h.Priority + "]")
} }
tmp.WriteString(" ") tmp.WriteString(" ")
tmp.writeNodes(h.Title...) tmp.WriteNodes(h.Title...)
hString := tmp.String() hString := tmp.String()
if len(h.Tags) != 0 { if len(h.Tags) != 0 {
tString := ":" + strings.Join(h.Tags, ":") + ":" tString := ":" + strings.Join(h.Tags, ":") + ":"
@ -135,9 +135,9 @@ func (w *OrgWriter) writeHeadline(h Headline) {
w.WriteString(w.indent) w.WriteString(w.indent)
} }
if h.Properties != nil { if h.Properties != nil {
w.writeNodes(*h.Properties) w.WriteNodes(*h.Properties)
} }
w.writeNodes(h.Children...) w.WriteNodes(h.Children...)
} }
func (w *OrgWriter) writeBlock(b Block) { func (w *OrgWriter) writeBlock(b Block) {
@ -149,7 +149,7 @@ func (w *OrgWriter) writeBlock(b Block) {
if isRawTextBlock(b.Name) { if isRawTextBlock(b.Name) {
w.WriteString(w.indent) w.WriteString(w.indent)
} }
w.writeNodes(b.Children...) w.WriteNodes(b.Children...)
if !isRawTextBlock(b.Name) { if !isRawTextBlock(b.Name) {
w.WriteString(w.indent) w.WriteString(w.indent)
} }
@ -158,7 +158,7 @@ func (w *OrgWriter) writeBlock(b Block) {
func (w *OrgWriter) writeDrawer(d Drawer) { func (w *OrgWriter) writeDrawer(d Drawer) {
w.WriteString(w.indent + ":" + d.Name + ":\n") w.WriteString(w.indent + ":" + d.Name + ":\n")
w.writeNodes(d.Children...) w.WriteNodes(d.Children...)
w.WriteString(w.indent + ":END:\n") w.WriteString(w.indent + ":END:\n")
} }
@ -212,26 +212,26 @@ func (w *OrgWriter) writeKeyword(k Keyword) {
func (w *OrgWriter) writeNodeWithMeta(n NodeWithMeta) { func (w *OrgWriter) writeNodeWithMeta(n NodeWithMeta) {
for _, ns := range n.Meta.Caption { for _, ns := range n.Meta.Caption {
w.WriteString("#+CAPTION: ") w.WriteString("#+CAPTION: ")
w.writeNodes(ns...) w.WriteNodes(ns...)
w.WriteString("\n") w.WriteString("\n")
} }
for _, attributes := range n.Meta.HTMLAttributes { for _, attributes := range n.Meta.HTMLAttributes {
w.WriteString("#+ATTR_HTML: ") w.WriteString("#+ATTR_HTML: ")
w.WriteString(strings.Join(attributes, " ") + "\n") w.WriteString(strings.Join(attributes, " ") + "\n")
} }
w.writeNodes(n.Node) w.WriteNodes(n.Node)
} }
func (w *OrgWriter) writeComment(c Comment) { func (w *OrgWriter) writeComment(c Comment) {
w.WriteString(w.indent + "#" + c.Content + "\n") w.WriteString(w.indent + "#" + c.Content + "\n")
} }
func (w *OrgWriter) writeList(l List) { w.writeNodes(l.Items...) } func (w *OrgWriter) writeList(l List) { w.WriteNodes(l.Items...) }
func (w *OrgWriter) writeListItem(li ListItem) { func (w *OrgWriter) writeListItem(li ListItem) {
liWriter := w.emptyClone() liWriter := w.emptyClone()
liWriter.indent = w.indent + strings.Repeat(" ", len(li.Bullet)+1) liWriter.indent = w.indent + strings.Repeat(" ", len(li.Bullet)+1)
liWriter.writeNodes(li.Children...) liWriter.WriteNodes(li.Children...)
content := strings.TrimPrefix(liWriter.String(), liWriter.indent) content := strings.TrimPrefix(liWriter.String(), liWriter.indent)
w.WriteString(w.indent + li.Bullet) w.WriteString(w.indent + li.Bullet)
if li.Status != "" { if li.Status != "" {
@ -257,7 +257,7 @@ func (w *OrgWriter) writeDescriptiveListItem(di DescriptiveListItem) {
} }
diWriter := w.emptyClone() diWriter := w.emptyClone()
diWriter.indent = indent diWriter.indent = indent
diWriter.writeNodes(di.Details...) diWriter.WriteNodes(di.Details...)
details := strings.TrimPrefix(diWriter.String(), diWriter.indent) details := strings.TrimPrefix(diWriter.String(), diWriter.indent)
if len(details) > 0 && details[0] == '\n' { if len(details) > 0 && details[0] == '\n' {
w.WriteString(details) w.WriteString(details)
@ -320,7 +320,7 @@ func (w *OrgWriter) writeEmphasis(e Emphasis) {
panic(fmt.Sprintf("bad emphasis %#v", e)) panic(fmt.Sprintf("bad emphasis %#v", e))
} }
w.WriteString(borders[0]) w.WriteString(borders[0])
w.writeNodes(e.Content...) w.WriteNodes(e.Content...)
w.WriteString(borders[1]) w.WriteString(borders[1])
} }
@ -340,7 +340,7 @@ func (w *OrgWriter) writeFootnoteLink(l FootnoteLink) {
w.WriteString("[fn:" + l.Name) w.WriteString("[fn:" + l.Name)
if l.Definition != nil { if l.Definition != nil {
w.WriteString(":") w.WriteString(":")
w.writeNodes(l.Definition.Children[0].(Paragraph).Children...) w.WriteNodes(l.Definition.Children[0].(Paragraph).Children...)
} }
w.WriteString("]") w.WriteString("]")
} }
@ -352,7 +352,7 @@ func (w *OrgWriter) writeRegularLink(l RegularLink) {
w.WriteString(fmt.Sprintf("[[%s]]", l.URL)) w.WriteString(fmt.Sprintf("[[%s]]", l.URL))
} else { } else {
descriptionWriter := w.emptyClone() descriptionWriter := w.emptyClone()
descriptionWriter.writeNodes(l.Description...) descriptionWriter.WriteNodes(l.Description...)
description := descriptionWriter.String() description := descriptionWriter.String()
w.WriteString(fmt.Sprintf("[[%s][%s]]", l.URL, description)) w.WriteString(fmt.Sprintf("[[%s][%s]]", l.URL, description))
} }