diff --git a/org/html_writer.go b/org/html_writer.go
index 90a48c6..0db3be9 100644
--- a/org/html_writer.go
+++ b/org/html_writer.go
@@ -69,16 +69,13 @@ func NewHTMLWriter() *HTMLWriter {
}
}
-func (w *HTMLWriter) emptyClone() *HTMLWriter {
- wcopy := *w
- wcopy.Builder = strings.Builder{}
- return &wcopy
-}
-
func (w *HTMLWriter) nodesAsString(nodes ...Node) string {
- tmp := w.emptyClone()
- WriteNodes(tmp, nodes...)
- return tmp.String()
+ original := w.Builder
+ w.Builder = strings.Builder{}
+ WriteNodes(w, nodes...)
+ out := w.String()
+ w.Builder = original
+ return out
}
func (w *HTMLWriter) WriterWithExtensions() Writer {
@@ -104,10 +101,12 @@ func (w *HTMLWriter) WritePropertyDrawer(PropertyDrawer) {}
func (w *HTMLWriter) WriteBlock(b Block) {
content := ""
if isRawTextBlock(b.Name) {
- exportWriter := w.emptyClone()
- exportWriter.htmlEscape = false
- WriteNodes(exportWriter, b.Children...)
- content = strings.TrimRightFunc(exportWriter.String(), unicode.IsSpace)
+ builder, htmlEscape := w.Builder, w.htmlEscape
+ w.Builder, w.htmlEscape = strings.Builder{}, false
+ WriteNodes(w, b.Children...)
+ out := w.String()
+ w.Builder, w.htmlEscape = builder, htmlEscape
+ content = strings.TrimRightFunc(out, unicode.IsSpace)
} else {
content = w.nodesAsString(b.Children...)
}
diff --git a/org/org_writer.go b/org/org_writer.go
index d574cda..5005c51 100644
--- a/org/org_writer.go
+++ b/org/org_writer.go
@@ -43,39 +43,33 @@ func (w *OrgWriter) WriterWithExtensions() Writer {
func (w *OrgWriter) Before(d *Document) {}
func (w *OrgWriter) After(d *Document) {}
-func (w *OrgWriter) emptyClone() *OrgWriter {
- wcopy := *w
- wcopy.Builder = strings.Builder{}
- return &wcopy
-}
-
func (w *OrgWriter) nodesAsString(nodes ...Node) string {
- tmp := w.emptyClone()
- WriteNodes(tmp, nodes...)
- return tmp.String()
+ builder := w.Builder
+ w.Builder = strings.Builder{}
+ WriteNodes(w, nodes...)
+ out := w.String()
+ w.Builder = builder
+ return out
}
func (w *OrgWriter) WriteHeadline(h Headline) {
- tmp := w.emptyClone()
- tmp.WriteString(strings.Repeat("*", h.Lvl))
+ start := w.Len()
+ w.WriteString(strings.Repeat("*", h.Lvl))
if h.Status != "" {
- tmp.WriteString(" " + h.Status)
+ w.WriteString(" " + h.Status)
}
if h.Priority != "" {
- tmp.WriteString(" [#" + h.Priority + "]")
+ w.WriteString(" [#" + h.Priority + "]")
}
- tmp.WriteString(" ")
- WriteNodes(tmp, h.Title...)
- hString := tmp.String()
+ w.WriteString(" ")
+ WriteNodes(w, h.Title...)
if len(h.Tags) != 0 {
tString := ":" + strings.Join(h.Tags, ":") + ":"
- if n := w.TagsColumn - len(tString) - len(hString); n > 0 {
- w.WriteString(hString + strings.Repeat(" ", n) + tString)
+ if n := w.TagsColumn - len(tString) - (w.Len() - start); n > 0 {
+ w.WriteString(strings.Repeat(" ", n) + tString)
} else {
- w.WriteString(hString + " " + tString)
+ w.WriteString(" " + tString)
}
- } else {
- w.WriteString(hString)
}
w.WriteString("\n")
if len(h.Children) != 0 {
@@ -185,10 +179,11 @@ func (w *OrgWriter) WriteComment(c Comment) {
func (w *OrgWriter) WriteList(l List) { WriteNodes(w, l.Items...) }
func (w *OrgWriter) WriteListItem(li ListItem) {
- liWriter := w.emptyClone()
- liWriter.indent = w.indent + strings.Repeat(" ", len(li.Bullet)+1)
- WriteNodes(liWriter, li.Children...)
- content := strings.TrimPrefix(liWriter.String(), liWriter.indent)
+ originalBuilder, originalIndent := w.Builder, w.indent
+ w.Builder, w.indent = strings.Builder{}, w.indent+strings.Repeat(" ", len(li.Bullet)+1)
+ WriteNodes(w, li.Children...)
+ content := strings.TrimPrefix(w.String(), w.indent)
+ w.Builder, w.indent = originalBuilder, originalIndent
w.WriteString(w.indent + li.Bullet)
if li.Status != "" {
w.WriteString(fmt.Sprintf(" [%s]", li.Status))
@@ -211,10 +206,11 @@ func (w *OrgWriter) WriteDescriptiveListItem(di DescriptiveListItem) {
w.WriteString(" " + term + " ::")
indent = indent + strings.Repeat(" ", len(term)+4)
}
- diWriter := w.emptyClone()
- diWriter.indent = indent
- WriteNodes(diWriter, di.Details...)
- details := strings.TrimPrefix(diWriter.String(), diWriter.indent)
+ originalBuilder, originalIndent := w.Builder, w.indent
+ w.Builder, w.indent = strings.Builder{}, indent
+ WriteNodes(w, di.Details...)
+ details := strings.TrimPrefix(w.String(), w.indent)
+ w.Builder, w.indent = originalBuilder, originalIndent
if len(details) > 0 && details[0] == '\n' {
w.WriteString(details)
} else {
@@ -326,9 +322,6 @@ func (w *OrgWriter) WriteRegularLink(l RegularLink) {
} else if l.Description == nil {
w.WriteString(fmt.Sprintf("[[%s]]", l.URL))
} else {
- descriptionWriter := w.emptyClone()
- WriteNodes(descriptionWriter, l.Description...)
- description := descriptionWriter.String()
- w.WriteString(fmt.Sprintf("[[%s][%s]]", l.URL, description))
+ w.WriteString(fmt.Sprintf("[[%s][%s]]", l.URL, w.nodesAsString(l.Description...)))
}
}