diff --git a/org/html_writer.go b/org/html_writer.go index eb88b28..90a48c6 100644 --- a/org/html_writer.go +++ b/org/html_writer.go @@ -14,12 +14,14 @@ import ( // HTMLWriter exports an org document into a html document. type HTMLWriter struct { - strings.Builder - document *Document + ExtendingWriter Writer HighlightCodeBlock func(source, lang string) string - htmlEscape bool - log *log.Logger - footnotes *footnotes + + strings.Builder + document *Document + htmlEscape bool + log *log.Logger + footnotes *footnotes } type footnotes struct { @@ -79,6 +81,13 @@ func (w *HTMLWriter) nodesAsString(nodes ...Node) string { return tmp.String() } +func (w *HTMLWriter) WriterWithExtensions() Writer { + if w.ExtendingWriter != nil { + return w.ExtendingWriter + } + return w +} + func (w *HTMLWriter) Before(d *Document) { w.document = d w.log = d.Log diff --git a/org/html_writer_test.go b/org/html_writer_test.go index f1890d8..37f97a4 100644 --- a/org/html_writer_test.go +++ b/org/html_writer_test.go @@ -5,6 +5,16 @@ import ( "testing" ) +type ExtendedHTMLWriter struct { + *HTMLWriter + callCount int +} + +func (w *ExtendedHTMLWriter) WriteText(t Text) { + w.callCount++ + w.HTMLWriter.WriteText(t) +} + func TestHTMLWriter(t *testing.T) { for _, path := range orgTestFiles() { expected := fileString(path[:len(path)-len(".org")] + ".html") @@ -21,3 +31,14 @@ func TestHTMLWriter(t *testing.T) { } } } + +func TestExtendedHTMLWriter(t *testing.T) { + p := Paragraph{Children: []Node{Text{Content: "text"}, Text{Content: "more text"}}} + htmlWriter := NewHTMLWriter() + extendedWriter := &ExtendedHTMLWriter{htmlWriter, 0} + htmlWriter.ExtendingWriter = extendedWriter + WriteNodes(extendedWriter, p) + if extendedWriter.callCount != 2 { + t.Errorf("WriteText method of extending writer was not called: CallCount %d", extendedWriter.callCount) + } +} diff --git a/org/org_writer.go b/org/org_writer.go index 1abff16..d574cda 100644 --- a/org/org_writer.go +++ b/org/org_writer.go @@ -9,7 +9,9 @@ import ( // OrgWriter export an org document into pretty printed org document. type OrgWriter struct { - TagsColumn int + ExtendingWriter Writer + TagsColumn int + strings.Builder indent string } @@ -31,6 +33,13 @@ func NewOrgWriter() *OrgWriter { } } +func (w *OrgWriter) WriterWithExtensions() Writer { + if w.ExtendingWriter != nil { + return w.ExtendingWriter + } + return w +} + func (w *OrgWriter) Before(d *Document) {} func (w *OrgWriter) After(d *Document) {} diff --git a/org/org_writer_test.go b/org/org_writer_test.go index 6fe51af..9582152 100644 --- a/org/org_writer_test.go +++ b/org/org_writer_test.go @@ -10,6 +10,16 @@ import ( "github.com/pmezard/go-difflib/difflib" ) +type ExtendedOrgWriter struct { + *OrgWriter + callCount int +} + +func (w *ExtendedOrgWriter) WriteText(t Text) { + w.callCount++ + w.OrgWriter.WriteText(t) +} + func TestOrgWriter(t *testing.T) { for _, path := range orgTestFiles() { expected := fileString(path[:len(path)-len(".org")] + ".pretty_org") @@ -27,6 +37,17 @@ func TestOrgWriter(t *testing.T) { } } +func TestExtendedOrgWriter(t *testing.T) { + p := Paragraph{Children: []Node{Text{Content: "text"}, Text{Content: "more text"}}} + orgWriter := NewOrgWriter() + extendedWriter := &ExtendedOrgWriter{orgWriter, 0} + orgWriter.ExtendingWriter = extendedWriter + WriteNodes(extendedWriter, p) + if extendedWriter.callCount != 2 { + t.Errorf("WriteText method of extending writer was not called: CallCount %d", extendedWriter.callCount) + } +} + func orgTestFiles() []string { dir := "./testdata" files, err := ioutil.ReadDir(dir) diff --git a/org/writer.go b/org/writer.go index d3f622e..c4aebd6 100644 --- a/org/writer.go +++ b/org/writer.go @@ -8,6 +8,8 @@ type Writer interface { After(*Document) // After is called after all nodes have been passed to the writer. String() string // String is called at the very end to retrieve the final output. + WriterWithExtensions() Writer + WriteKeyword(Keyword) WriteInclude(Include) WriteComment(Comment) @@ -37,6 +39,7 @@ type Writer interface { } func WriteNodes(w Writer, nodes ...Node) { + w = w.WriterWithExtensions() for _, n := range nodes { switch n := n.(type) { case Keyword: