github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae // indirect | github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae // indirect | ||||
github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc | github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc | ||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 | github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 | ||||
github.com/niklasfasching/go-org v0.1.7 | |||||
github.com/niklasfasching/go-org v0.1.8 | |||||
github.com/oliamb/cutter v0.2.2 | github.com/oliamb/cutter v0.2.2 | ||||
github.com/philhofer/fwd v1.0.0 // indirect | github.com/philhofer/fwd v1.0.0 // indirect | ||||
github.com/pkg/errors v0.8.1 | github.com/pkg/errors v0.8.1 | ||||
github.com/willf/bitset v0.0.0-20180426185212-8ce1146b8621 // indirect | github.com/willf/bitset v0.0.0-20180426185212-8ce1146b8621 // indirect | ||||
github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53 | github.com/yohcop/openid-go v0.0.0-20160914080427-2c050d2dae53 | ||||
golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad | golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad | ||||
golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 | |||||
golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9 | |||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 | ||||
golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b | golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b | ||||
golang.org/x/text v0.3.2 | golang.org/x/text v0.3.2 |
github.com/niklasfasching/go-org v0.1.6/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU= | github.com/niklasfasching/go-org v0.1.6/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU= | ||||
github.com/niklasfasching/go-org v0.1.7 h1:t3V+3XnS/7BhKv/7SlMUa8FvAiq577/a1T3D7mLIRXE= | github.com/niklasfasching/go-org v0.1.7 h1:t3V+3XnS/7BhKv/7SlMUa8FvAiq577/a1T3D7mLIRXE= | ||||
github.com/niklasfasching/go-org v0.1.7/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU= | github.com/niklasfasching/go-org v0.1.7/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU= | ||||
github.com/niklasfasching/go-org v0.1.8 h1:Kjvs6lP+LIILHhc9zIJ4Gu90a/pVY483if2Qmu8v4Fg= | |||||
github.com/niklasfasching/go-org v0.1.8/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU= | |||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= | ||||
github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k= | github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k= | ||||
github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU= | github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU= | ||||
golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= | golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= | ||||
golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9 h1:DPz9iiH3YoKiKhX/ijjoZvT0VFwK2c6CWYWQ7Zyr8TU= | |||||
golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||||
golang.org/x/oauth2 v0.0.0-20180620175406-ef147856a6dd/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180620175406-ef147856a6dd/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= |
"bytes" | "bytes" | ||||
"fmt" | "fmt" | ||||
"html" | "html" | ||||
"strings" | |||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
"code.gitea.io/gitea/modules/markup" | "code.gitea.io/gitea/modules/markup" | ||||
description := string(link) | description := string(link) | ||||
if l.Description != nil { | if l.Description != nil { | ||||
description = r.nodesAsString(l.Description...) | |||||
description = r.WriteNodesAsString(l.Description...) | |||||
} | } | ||||
switch l.Kind() { | switch l.Kind() { | ||||
case "image": | case "image": | ||||
r.WriteString(fmt.Sprintf(`<a href="%s" title="%s">%s</a>`, link, description, description)) | r.WriteString(fmt.Sprintf(`<a href="%s" title="%s">%s</a>`, link, description, description)) | ||||
} | } | ||||
} | } | ||||
func (r *Renderer) emptyClone() *Renderer { | |||||
wcopy := *(r.HTMLWriter) | |||||
wcopy.Builder = strings.Builder{} | |||||
rcopy := *r | |||||
rcopy.HTMLWriter = &wcopy | |||||
wcopy.ExtendingWriter = &rcopy | |||||
return &rcopy | |||||
} | |||||
func (r *Renderer) nodesAsString(nodes ...org.Node) string { | |||||
tmp := r.emptyClone() | |||||
org.WriteNodes(tmp, nodes...) | |||||
return tmp.String() | |||||
} |
} | } | ||||
} | } | ||||
func (n Example) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Block) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Example) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n Block) String() string { return orgWriter.WriteNodesAsString(n) } |
} | } | ||||
// String returns the pretty printed Org mode string for the given nodes (see OrgWriter). | // String returns the pretty printed Org mode string for the given nodes (see OrgWriter). | ||||
func String(nodes []Node) string { return orgWriter.nodesAsString(nodes...) } | |||||
func String(nodes []Node) string { return orgWriter.WriteNodesAsString(nodes...) } | |||||
// Write is called after with an instance of the Writer interface to export a parsed Document into another format. | // Write is called after with an instance of the Writer interface to export a parsed Document into another format. | ||||
func (d *Document) Write(w Writer) (out string, err error) { | func (d *Document) Write(w Writer) (out string, err error) { |
return "", false | return "", false | ||||
} | } | ||||
func (n Drawer) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n PropertyDrawer) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Drawer) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n PropertyDrawer) String() string { return orgWriter.WriteNodesAsString(n) } |
return consumed, definition | return consumed, definition | ||||
} | } | ||||
func (n FootnoteDefinition) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n FootnoteDefinition) String() string { return orgWriter.WriteNodesAsString(n) } |
} | } | ||||
} | } | ||||
func (n Headline) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Headline) String() string { return orgWriter.WriteNodesAsString(n) } |
} | } | ||||
} | } | ||||
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() | |||||
func (w *HTMLWriter) WriteNodesAsString(nodes ...Node) string { | |||||
original := w.Builder | |||||
w.Builder = strings.Builder{} | |||||
WriteNodes(w, nodes...) | |||||
out := w.String() | |||||
w.Builder = original | |||||
return out | |||||
} | } | ||||
func (w *HTMLWriter) WriterWithExtensions() Writer { | func (w *HTMLWriter) WriterWithExtensions() Writer { | ||||
func (w *HTMLWriter) WriteBlock(b Block) { | func (w *HTMLWriter) WriteBlock(b Block) { | ||||
content := "" | content := "" | ||||
if isRawTextBlock(b.Name) { | 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 { | } else { | ||||
content = w.nodesAsString(b.Children...) | |||||
content = w.WriteNodesAsString(b.Children...) | |||||
} | } | ||||
switch name := b.Name; { | switch name := b.Name; { | ||||
case name == "SRC": | case name == "SRC": | ||||
// NOTE: To satisfy hugo ExtractTOC() check we cannot use `<li>\n` here. Doesn't really matter, just a note. | // NOTE: To satisfy hugo ExtractTOC() check we cannot use `<li>\n` here. Doesn't really matter, just a note. | ||||
w.WriteString("<li>") | w.WriteString("<li>") | ||||
h := section.Headline | h := section.Headline | ||||
title := cleanHeadlineTitleForHTMLAnchorRegexp.ReplaceAllString(w.nodesAsString(h.Title...), "") | |||||
title := cleanHeadlineTitleForHTMLAnchorRegexp.ReplaceAllString(w.WriteNodesAsString(h.Title...), "") | |||||
w.WriteString(fmt.Sprintf("<a href=\"#%s\">%s</a>\n", h.ID(), title)) | w.WriteString(fmt.Sprintf("<a href=\"#%s\">%s</a>\n", h.ID(), title)) | ||||
if len(section.Children) != 0 { | if len(section.Children) != 0 { | ||||
w.WriteString("<ul>\n") | w.WriteString("<ul>\n") | ||||
} | } | ||||
description := url | description := url | ||||
if l.Description != nil { | if l.Description != nil { | ||||
description = w.nodesAsString(l.Description...) | |||||
description = w.WriteNodesAsString(l.Description...) | |||||
} | } | ||||
switch l.Kind() { | switch l.Kind() { | ||||
case "image": | case "image": | ||||
} | } | ||||
func (w *HTMLWriter) WriteNodeWithMeta(n NodeWithMeta) { | func (w *HTMLWriter) WriteNodeWithMeta(n NodeWithMeta) { | ||||
out := w.nodesAsString(n.Node) | |||||
out := w.WriteNodesAsString(n.Node) | |||||
if p, ok := n.Node.(Paragraph); ok { | if p, ok := n.Node.(Paragraph); ok { | ||||
if len(p.Children) == 1 && isImageOrVideoLink(p.Children[0]) { | if len(p.Children) == 1 && isImageOrVideoLink(p.Children[0]) { | ||||
out = w.nodesAsString(p.Children[0]) | |||||
out = w.WriteNodesAsString(p.Children[0]) | |||||
} | } | ||||
} | } | ||||
for _, attributes := range n.Meta.HTMLAttributes { | for _, attributes := range n.Meta.HTMLAttributes { | ||||
if i != 0 { | if i != 0 { | ||||
caption += " " | caption += " " | ||||
} | } | ||||
caption += w.nodesAsString(ns...) | |||||
caption += w.WriteNodesAsString(ns...) | |||||
} | } | ||||
out = fmt.Sprintf("<figure>\n%s<figcaption>\n%s\n</figcaption>\n</figure>\n", out, caption) | out = fmt.Sprintf("<figure>\n%s<figcaption>\n%s\n</figcaption>\n</figure>\n", out, caption) | ||||
} | } |
switch { | switch { | ||||
case start+2 >= len(input): | case start+2 >= len(input): | ||||
case input[start+1] == '\\' && start != 0 && input[start-1] != '\n': | case input[start+1] == '\\' && start != 0 && input[start-1] != '\n': | ||||
for i := start + 2; unicode.IsSpace(rune(input[i])); i++ { | |||||
if i >= len(input) || input[i] == '\n' { | |||||
for i := start + 2; i <= len(input)-1 && unicode.IsSpace(rune(input[i])); i++ { | |||||
if input[i] == '\n' { | |||||
return i + 1 - start, ExplicitLineBreak{} | return i + 1 - start, ExplicitLineBreak{} | ||||
} | } | ||||
} | } | ||||
return "regular" | return "regular" | ||||
} | } | ||||
func (n Text) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n LineBreak) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n ExplicitLineBreak) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n StatisticToken) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Emphasis) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n LatexFragment) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n FootnoteLink) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n RegularLink) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Timestamp) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Text) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n LineBreak) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n ExplicitLineBreak) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n StatisticToken) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n Emphasis) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n LatexFragment) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n FootnoteLink) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n RegularLink) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n Timestamp) String() string { return orgWriter.WriteNodesAsString(n) } |
return 1, k | return 1, k | ||||
} | } | ||||
func (n Comment) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Keyword) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n NodeWithMeta) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n NodeWithName) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Include) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Comment) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n Keyword) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n NodeWithMeta) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n NodeWithName) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n Include) String() string { return orgWriter.WriteNodesAsString(n) } |
return i - start, ListItem{bullet, status, nodes} | return i - start, ListItem{bullet, status, nodes} | ||||
} | } | ||||
func (n List) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n ListItem) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n DescriptiveListItem) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n List) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n ListItem) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n DescriptiveListItem) String() string { return orgWriter.WriteNodesAsString(n) } |
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 { | |||||
wcopy := *w | |||||
wcopy.Builder = strings.Builder{} | |||||
return &wcopy | |||||
} | |||||
func (w *OrgWriter) nodesAsString(nodes ...Node) string { | |||||
tmp := w.emptyClone() | |||||
WriteNodes(tmp, nodes...) | |||||
return tmp.String() | |||||
func (w *OrgWriter) WriteNodesAsString(nodes ...Node) 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) { | 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 != "" { | if h.Status != "" { | ||||
tmp.WriteString(" " + h.Status) | |||||
w.WriteString(" " + h.Status) | |||||
} | } | ||||
if h.Priority != "" { | 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 { | if len(h.Tags) != 0 { | ||||
tString := ":" + strings.Join(h.Tags, ":") + ":" | 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 { | } else { | ||||
w.WriteString(hString + " " + tString) | |||||
w.WriteString(" " + tString) | |||||
} | } | ||||
} else { | |||||
w.WriteString(hString) | |||||
} | } | ||||
w.WriteString("\n") | w.WriteString("\n") | ||||
if len(h.Children) != 0 { | if len(h.Children) != 0 { | ||||
func (w *OrgWriter) WriteFootnoteDefinition(f FootnoteDefinition) { | func (w *OrgWriter) WriteFootnoteDefinition(f FootnoteDefinition) { | ||||
w.WriteString(fmt.Sprintf("[fn:%s]", f.Name)) | w.WriteString(fmt.Sprintf("[fn:%s]", f.Name)) | ||||
content := w.nodesAsString(f.Children...) | |||||
content := w.WriteNodesAsString(f.Children...) | |||||
if content != "" && !unicode.IsSpace(rune(content[0])) { | if content != "" && !unicode.IsSpace(rune(content[0])) { | ||||
w.WriteString(" ") | w.WriteString(" ") | ||||
} | } | ||||
} | } | ||||
func (w *OrgWriter) WriteParagraph(p Paragraph) { | func (w *OrgWriter) WriteParagraph(p Paragraph) { | ||||
content := w.nodesAsString(p.Children...) | |||||
content := w.WriteNodesAsString(p.Children...) | |||||
if len(content) > 0 && content[0] != '\n' { | if len(content) > 0 && content[0] != '\n' { | ||||
w.WriteString(w.indent) | w.WriteString(w.indent) | ||||
} | } | ||||
func (w *OrgWriter) WriteExample(e Example) { | func (w *OrgWriter) WriteExample(e Example) { | ||||
for _, n := range e.Children { | for _, n := range e.Children { | ||||
w.WriteString(w.indent + ":") | w.WriteString(w.indent + ":") | ||||
if content := w.nodesAsString(n); content != "" { | |||||
if content := w.WriteNodesAsString(n); content != "" { | |||||
w.WriteString(" " + content) | w.WriteString(" " + content) | ||||
} | } | ||||
w.WriteString("\n") | w.WriteString("\n") | ||||
func (w *OrgWriter) WriteList(l List) { WriteNodes(w, l.Items...) } | func (w *OrgWriter) WriteList(l List) { WriteNodes(w, l.Items...) } | ||||
func (w *OrgWriter) WriteListItem(li ListItem) { | 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) | w.WriteString(w.indent + li.Bullet) | ||||
if li.Status != "" { | if li.Status != "" { | ||||
w.WriteString(fmt.Sprintf(" [%s]", li.Status)) | w.WriteString(fmt.Sprintf(" [%s]", li.Status)) | ||||
} | } | ||||
indent := w.indent + strings.Repeat(" ", len(di.Bullet)+1) | indent := w.indent + strings.Repeat(" ", len(di.Bullet)+1) | ||||
if len(di.Term) != 0 { | if len(di.Term) != 0 { | ||||
term := w.nodesAsString(di.Term...) | |||||
term := w.WriteNodesAsString(di.Term...) | |||||
w.WriteString(" " + term + " ::") | w.WriteString(" " + term + " ::") | ||||
indent = indent + strings.Repeat(" ", len(term)+4) | 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' { | if len(details) > 0 && details[0] == '\n' { | ||||
w.WriteString(details) | w.WriteString(details) | ||||
} else { | } else { | ||||
w.WriteString(`|`) | w.WriteString(`|`) | ||||
for _, column := range row.Columns { | for _, column := range row.Columns { | ||||
w.WriteString(` `) | w.WriteString(` `) | ||||
content := w.nodesAsString(column.Children...) | |||||
content := w.WriteNodesAsString(column.Children...) | |||||
if content == "" { | if content == "" { | ||||
content = " " | content = " " | ||||
} | } | ||||
} else if l.Description == nil { | } else if l.Description == nil { | ||||
w.WriteString(fmt.Sprintf("[[%s]]", l.URL)) | w.WriteString(fmt.Sprintf("[[%s]]", l.URL)) | ||||
} else { | } 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.WriteNodesAsString(l.Description...))) | |||||
} | } | ||||
} | } |
return 1, HorizontalRule{} | return 1, HorizontalRule{} | ||||
} | } | ||||
func (n Paragraph) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n HorizontalRule) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Paragraph) String() string { return orgWriter.WriteNodesAsString(n) } | |||||
func (n HorizontalRule) String() string { return orgWriter.WriteNodesAsString(n) } |
return isAlignRow | return isAlignRow | ||||
} | } | ||||
func (n Table) String() string { return orgWriter.nodesAsString(n) } | |||||
func (n Table) String() string { return orgWriter.WriteNodesAsString(n) } |
String() string // String is called at the very end to retrieve the final output. | String() string // String is called at the very end to retrieve the final output. | ||||
WriterWithExtensions() Writer | WriterWithExtensions() Writer | ||||
WriteNodesAsString(...Node) string | |||||
WriteKeyword(Keyword) | WriteKeyword(Keyword) | ||||
WriteInclude(Include) | WriteInclude(Include) |
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | ||||
// +build go1.13 | |||||
// +build go1.13,!go1.14 | |||||
package idna | package idna | ||||
github.com/msteinert/pam | github.com/msteinert/pam | ||||
# github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 | # github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 | ||||
github.com/nfnt/resize | github.com/nfnt/resize | ||||
# github.com/niklasfasching/go-org v0.1.7 | |||||
# github.com/niklasfasching/go-org v0.1.8 | |||||
github.com/niklasfasching/go-org/org | github.com/niklasfasching/go-org/org | ||||
# github.com/oliamb/cutter v0.2.2 | # github.com/oliamb/cutter v0.2.2 | ||||
github.com/oliamb/cutter | github.com/oliamb/cutter | ||||
golang.org/x/crypto/ssh | golang.org/x/crypto/ssh | ||||
golang.org/x/crypto/ssh/agent | golang.org/x/crypto/ssh/agent | ||||
golang.org/x/crypto/ssh/knownhosts | golang.org/x/crypto/ssh/knownhosts | ||||
# golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 | |||||
# golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9 | |||||
golang.org/x/net/context | golang.org/x/net/context | ||||
golang.org/x/net/context/ctxhttp | golang.org/x/net/context/ctxhttp | ||||
golang.org/x/net/html | golang.org/x/net/html |