From 905648c34b5fabacb64c7d43e463ee41161b3faf Mon Sep 17 00:00:00 2001
From: Niklas Fasching
Date: Wed, 19 Dec 2018 12:21:25 +0100
Subject: [PATCH] org: Fix drawer & block
- drawer entries without value were printed as FOO rather than :FOO:
- account for differences between raw & non-raw block:
raw blocks are not wrapped in a further element, just raw text & line breaks:
-> the first line has to be indented manually
non raw blocks do not end in a linebreak newline -> the END_BLOCK line has to
be indented (rather they end with a manual newline from another element)
---
org/drawer.go | 2 +-
org/org.go | 19 ++++++++++++++-----
org/testdata/blocks.html | 15 +++++++++++++--
org/testdata/blocks.org | 13 +++++++++++--
org/testdata/blocks.pretty_org | 13 +++++++++++--
5 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/org/drawer.go b/org/drawer.go
index bf2b7ae..7010ce8 100644
--- a/org/drawer.go
+++ b/org/drawer.go
@@ -37,7 +37,7 @@ func (d *Document) parseDrawer(i int, parentStop stopFn) (int, Node) {
i += consumed
drawer.Children = append(drawer.Children, nodes...)
if i < len(d.tokens) && d.tokens[i].kind == "beginDrawer" {
- p := Paragraph{[]Node{Text{d.tokens[i].content, false}}}
+ p := Paragraph{[]Node{Text{":" + d.tokens[i].content + ":", false}}}
drawer.Children = append(drawer.Children, p)
i++
} else {
diff --git a/org/org.go b/org/org.go
index 070eedc..0e32898 100644
--- a/org/org.go
+++ b/org/org.go
@@ -117,12 +117,11 @@ func (w *OrgWriter) writeHeadline(h Headline) {
tmp.writeNodes(h.Title...)
hString := tmp.String()
if len(h.Tags) != 0 {
- hString += " "
tString := ":" + strings.Join(h.Tags, ":") + ":"
if n := w.TagsColumn - len(tString) - len(hString); n > 0 {
w.WriteString(hString + strings.Repeat(" ", n) + tString)
} else {
- w.WriteString(hString + tString)
+ w.WriteString(hString + " " + tString)
}
} else {
w.WriteString(hString)
@@ -142,8 +141,14 @@ func (w *OrgWriter) writeBlock(b Block) {
if len(b.Parameters) != 0 {
w.WriteString(" " + strings.Join(b.Parameters, " "))
}
- w.WriteString("\n" + w.indent)
+ w.WriteString("\n")
+ if isRawTextBlock(b.Name) {
+ w.WriteString(w.indent)
+ }
w.writeNodes(b.Children...)
+ if !isRawTextBlock(b.Name) {
+ w.WriteString(w.indent)
+ }
w.WriteString("#+END_" + b.Name + "\n")
}
@@ -178,7 +183,11 @@ func (w *OrgWriter) writeExample(e Example) {
}
func (w *OrgWriter) writeKeyword(k Keyword) {
- w.WriteString(w.indent + fmt.Sprintf("#+%s: %s\n", k.Key, k.Value))
+ w.WriteString(w.indent + "#+" + k.Key + ":")
+ if k.Value != "" {
+ w.WriteString(" " + k.Value)
+ }
+ w.WriteString("\n")
}
func (w *OrgWriter) writeNodeWithMeta(n NodeWithMeta) {
@@ -195,7 +204,7 @@ func (w *OrgWriter) writeNodeWithMeta(n NodeWithMeta) {
}
func (w *OrgWriter) writeComment(c Comment) {
- w.WriteString(w.indent + "#" + c.Content)
+ w.WriteString(w.indent + "#" + c.Content + "\n")
}
func (w *OrgWriter) writeList(l List) { w.writeNodes(l.Items...) }
diff --git a/org/testdata/blocks.html b/org/testdata/blocks.html
index a5d7a23..d4001e8 100644
--- a/org/testdata/blocks.html
+++ b/org/testdata/blocks.html
@@ -28,7 +28,9 @@ empty lines!
it also has multiple parameters
-note that /inline/ *markup* ignored
+src, example & export blocks treat their content as raw text
+/inline/ *markup* is ignored
+ and whitespace is honored and not removed
examples like this
@@ -40,7 +42,7 @@ note that /inline/ *markup* ignored
Mongodb is webscale. (source: mongodb-is-web-scale)
-blocks can contain other elements like
+blocks like the quote block parse their content and can contain
-
@@ -82,6 +84,10 @@ paragraphs
+
+also whitespace is not significant
+and superfluous whitespace (at the beginning of the line) is removed
+