annotate vendor/github.com/russross/blackfriday/v2/html.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 // Blackfriday Markdown Processor
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 // Available at http://github.com/russross/blackfriday
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 // Copyright © 2011 Russ Ross <russ@russross.com>.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 // Distributed under the Simplified BSD License.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 // See README.md for details.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 // HTML rendering backend
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 package blackfriday
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 "bytes"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 "io"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 "regexp"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 // HTMLFlags control optional behavior of HTML renderer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 type HTMLFlags int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 // HTML renderer configuration options.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 HTMLFlagsNone HTMLFlags = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 SkipHTML HTMLFlags = 1 << iota // Skip preformatted HTML blocks
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 SkipImages // Skip embedded images
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 SkipLinks // Skip all links
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 Safelink // Only link to trusted protocols
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 NofollowLinks // Only link with rel="nofollow"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 NoreferrerLinks // Only link with rel="noreferrer"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 NoopenerLinks // Only link with rel="noopener"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 HrefTargetBlank // Add a blank target
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 CompletePage // Generate a complete HTML page
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 UseXHTML // Generate XHTML output instead of HTML
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 FootnoteReturnLinks // Generate a link at the end of a footnote to return to the source
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 Smartypants // Enable smart punctuation substitutions
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 SmartypantsFractions // Enable smart fractions (with Smartypants)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 SmartypantsDashes // Enable smart dashes (with Smartypants)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 SmartypantsLatexDashes // Enable LaTeX-style dashes (with Smartypants)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 SmartypantsAngledQuotes // Enable angled double quotes (with Smartypants) for double quotes rendering
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 SmartypantsQuotesNBSP // Enable « French guillemets » (with Smartypants)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 TOC // Generate a table of contents
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 htmlTagRe = regexp.MustCompile("(?i)^" + htmlTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 htmlTag = "(?:" + openTag + "|" + closeTag + "|" + htmlComment + "|" +
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 processingInstruction + "|" + declaration + "|" + cdata + ")"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 closeTag = "</" + tagName + "\\s*[>]"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 openTag = "<" + tagName + attribute + "*" + "\\s*/?>"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 attribute = "(?:" + "\\s+" + attributeName + attributeValueSpec + "?)"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 attributeValue = "(?:" + unquotedValue + "|" + singleQuotedValue + "|" + doubleQuotedValue + ")"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 attributeValueSpec = "(?:" + "\\s*=" + "\\s*" + attributeValue + ")"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 attributeName = "[a-zA-Z_:][a-zA-Z0-9:._-]*"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 cdata = "<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 declaration = "<![A-Z]+" + "\\s+[^>]*>"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 doubleQuotedValue = "\"[^\"]*\""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 htmlComment = "<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 processingInstruction = "[<][?].*?[?][>]"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 singleQuotedValue = "'[^']*'"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 tagName = "[A-Za-z][A-Za-z0-9-]*"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 unquotedValue = "[^\"'=<>`\\x00-\\x20]+"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 // HTMLRendererParameters is a collection of supplementary parameters tweaking
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 // the behavior of various parts of HTML renderer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 type HTMLRendererParameters struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 // Prepend this text to each relative URL.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 AbsolutePrefix string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 // Add this text to each footnote anchor, to ensure uniqueness.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 FootnoteAnchorPrefix string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 // Show this text inside the <a> tag for a footnote return link, if the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 // HTML_FOOTNOTE_RETURN_LINKS flag is enabled. If blank, the string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 // <sup>[return]</sup> is used.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 FootnoteReturnLinkContents string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 // If set, add this text to the front of each Heading ID, to ensure
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 // uniqueness.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 HeadingIDPrefix string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 // If set, add this text to the back of each Heading ID, to ensure uniqueness.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 HeadingIDSuffix string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 // Increase heading levels: if the offset is 1, <h1> becomes <h2> etc.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 // Negative offset is also valid.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 // Resulting levels are clipped between 1 and 6.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 HeadingLevelOffset int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 Title string // Document title (used if CompletePage is set)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 CSS string // Optional CSS file URL (used if CompletePage is set)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 Icon string // Optional icon file URL (used if CompletePage is set)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 Flags HTMLFlags // Flags allow customizing this renderer's behavior
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 // HTMLRenderer is a type that implements the Renderer interface for HTML output.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 // Do not create this directly, instead use the NewHTMLRenderer function.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 type HTMLRenderer struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 HTMLRendererParameters
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 closeTag string // how to end singleton tags: either " />" or ">"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 // Track heading IDs to prevent ID collision in a single generation.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 headingIDs map[string]int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 lastOutputLen int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 disableTags int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 sr *SPRenderer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 xhtmlClose = " />"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 htmlClose = ">"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 // NewHTMLRenderer creates and configures an HTMLRenderer object, which
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 // satisfies the Renderer interface.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 func NewHTMLRenderer(params HTMLRendererParameters) *HTMLRenderer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 // configure the rendering engine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 closeTag := htmlClose
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 if params.Flags&UseXHTML != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 closeTag = xhtmlClose
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 if params.FootnoteReturnLinkContents == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 // U+FE0E is VARIATION SELECTOR-15.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 // It suppresses automatic emoji presentation of the preceding
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 // U+21A9 LEFTWARDS ARROW WITH HOOK on iOS and iPadOS.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 params.FootnoteReturnLinkContents = "<span aria-label='Return'>↩\ufe0e</span>"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 return &HTMLRenderer{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 HTMLRendererParameters: params,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 closeTag: closeTag,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 headingIDs: make(map[string]int),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 sr: NewSmartypantsRenderer(params.Flags),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 func isHTMLTag(tag []byte, tagname string) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 found, _ := findHTMLTagPos(tag, tagname)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 return found
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 // Look for a character, but ignore it when it's in any kind of quotes, it
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 // might be JavaScript
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 func skipUntilCharIgnoreQuotes(html []byte, start int, char byte) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 inSingleQuote := false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 inDoubleQuote := false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 inGraveQuote := false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 i := start
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 for i < len(html) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 case html[i] == char && !inSingleQuote && !inDoubleQuote && !inGraveQuote:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 return i
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 case html[i] == '\'':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 inSingleQuote = !inSingleQuote
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 case html[i] == '"':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 inDoubleQuote = !inDoubleQuote
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 case html[i] == '`':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 inGraveQuote = !inGraveQuote
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 return start
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 func findHTMLTagPos(tag []byte, tagname string) (bool, int) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 i := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 if i < len(tag) && tag[0] != '<' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 return false, -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 i = skipSpace(tag, i)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 if i < len(tag) && tag[i] == '/' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 i = skipSpace(tag, i)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 j := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 for ; i < len(tag); i, j = i+1, j+1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 if j >= len(tagname) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 if strings.ToLower(string(tag[i]))[0] != tagname[j] {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 return false, -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 if i == len(tag) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 return false, -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 rightAngle := skipUntilCharIgnoreQuotes(tag, i, '>')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 if rightAngle >= i {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 return true, rightAngle
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 return false, -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 func skipSpace(tag []byte, i int) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 for i < len(tag) && isspace(tag[i]) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 return i
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 func isRelativeLink(link []byte) (yes bool) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 // a tag begin with '#'
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 if link[0] == '#' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 // link begin with '/' but not '//', the second maybe a protocol relative link
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 if len(link) >= 2 && link[0] == '/' && link[1] != '/' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 // only the root '/'
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 if len(link) == 1 && link[0] == '/' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 // current directory : begin with "./"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 if bytes.HasPrefix(link, []byte("./")) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 // parent directory : begin with "../"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 if bytes.HasPrefix(link, []byte("../")) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 func (r *HTMLRenderer) ensureUniqueHeadingID(id string) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 for count, found := r.headingIDs[id]; found; count, found = r.headingIDs[id] {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 tmp := fmt.Sprintf("%s-%d", id, count+1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 if _, tmpFound := r.headingIDs[tmp]; !tmpFound {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 r.headingIDs[id] = count + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 id = tmp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 id = id + "-1"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 if _, found := r.headingIDs[id]; !found {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 r.headingIDs[id] = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 return id
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 func (r *HTMLRenderer) addAbsPrefix(link []byte) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 if r.AbsolutePrefix != "" && isRelativeLink(link) && link[0] != '.' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 newDest := r.AbsolutePrefix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 if link[0] != '/' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 newDest += "/"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 newDest += string(link)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 return []byte(newDest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 return link
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282 func appendLinkAttrs(attrs []string, flags HTMLFlags, link []byte) []string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 if isRelativeLink(link) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 return attrs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286 val := []string{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 if flags&NofollowLinks != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288 val = append(val, "nofollow")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 if flags&NoreferrerLinks != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 val = append(val, "noreferrer")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 if flags&NoopenerLinks != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 val = append(val, "noopener")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 if flags&HrefTargetBlank != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297 attrs = append(attrs, "target=\"_blank\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 if len(val) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300 return attrs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 attr := fmt.Sprintf("rel=%q", strings.Join(val, " "))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 return append(attrs, attr)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 func isMailto(link []byte) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 return bytes.HasPrefix(link, []byte("mailto:"))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 func needSkipLink(flags HTMLFlags, dest []byte) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 if flags&SkipLinks != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314 return flags&Safelink != 0 && !isSafeLink(dest) && !isMailto(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 func isSmartypantable(node *Node) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318 pt := node.Parent.Type
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 return pt != Link && pt != CodeBlock && pt != Code
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 func appendLanguageAttr(attrs []string, info []byte) []string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 if len(info) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324 return attrs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 endOfLang := bytes.IndexAny(info, "\t ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327 if endOfLang < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 endOfLang = len(info)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 return append(attrs, fmt.Sprintf("class=\"language-%s\"", info[:endOfLang]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333 func (r *HTMLRenderer) tag(w io.Writer, name []byte, attrs []string) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 w.Write(name)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335 if len(attrs) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336 w.Write(spaceBytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 w.Write([]byte(strings.Join(attrs, " ")))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 w.Write(gtBytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340 r.lastOutputLen = 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 func footnoteRef(prefix string, node *Node) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 urlFrag := prefix + string(slugify(node.Destination))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 anchor := fmt.Sprintf(`<a href="#fn:%s">%d</a>`, urlFrag, node.NoteID)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346 return []byte(fmt.Sprintf(`<sup class="footnote-ref" id="fnref:%s">%s</sup>`, urlFrag, anchor))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349 func footnoteItem(prefix string, slug []byte) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 return []byte(fmt.Sprintf(`<li id="fn:%s%s">`, prefix, slug))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353 func footnoteReturnLink(prefix, returnLink string, slug []byte) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 const format = ` <a class="footnote-return" href="#fnref:%s%s">%s</a>`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355 return []byte(fmt.Sprintf(format, prefix, slug, returnLink))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358 func itemOpenCR(node *Node) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359 if node.Prev == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362 ld := node.Parent.ListData
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 return !ld.Tight && ld.ListFlags&ListTypeDefinition == 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366 func skipParagraphTags(node *Node) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367 grandparent := node.Parent.Parent
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 if grandparent == nil || grandparent.Type != List {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 tightOrTerm := grandparent.Tight || node.Parent.ListFlags&ListTypeTerm != 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372 return grandparent.Type == List && tightOrTerm
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 func cellAlignment(align CellAlignFlags) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376 switch align {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 case TableAlignmentLeft:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378 return "left"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379 case TableAlignmentRight:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 return "right"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381 case TableAlignmentCenter:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 return "center"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384 return ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 func (r *HTMLRenderer) out(w io.Writer, text []byte) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389 if r.disableTags > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 w.Write(htmlTagRe.ReplaceAll(text, []byte{}))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392 w.Write(text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 r.lastOutputLen = len(text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 func (r *HTMLRenderer) cr(w io.Writer) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398 if r.lastOutputLen > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 r.out(w, nlBytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404 nlBytes = []byte{'\n'}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 gtBytes = []byte{'>'}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406 spaceBytes = []byte{' '}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 brTag = []byte("<br>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411 brXHTMLTag = []byte("<br />")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 emTag = []byte("<em>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413 emCloseTag = []byte("</em>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414 strongTag = []byte("<strong>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 strongCloseTag = []byte("</strong>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416 delTag = []byte("<del>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417 delCloseTag = []byte("</del>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 ttTag = []byte("<tt>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 ttCloseTag = []byte("</tt>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420 aTag = []byte("<a")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421 aCloseTag = []byte("</a>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422 preTag = []byte("<pre>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 preCloseTag = []byte("</pre>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424 codeTag = []byte("<code>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 codeCloseTag = []byte("</code>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
426 pTag = []byte("<p>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
427 pCloseTag = []byte("</p>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
428 blockquoteTag = []byte("<blockquote>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
429 blockquoteCloseTag = []byte("</blockquote>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
430 hrTag = []byte("<hr>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
431 hrXHTMLTag = []byte("<hr />")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
432 ulTag = []byte("<ul>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433 ulCloseTag = []byte("</ul>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
434 olTag = []byte("<ol>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
435 olCloseTag = []byte("</ol>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
436 dlTag = []byte("<dl>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
437 dlCloseTag = []byte("</dl>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
438 liTag = []byte("<li>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
439 liCloseTag = []byte("</li>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
440 ddTag = []byte("<dd>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
441 ddCloseTag = []byte("</dd>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
442 dtTag = []byte("<dt>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
443 dtCloseTag = []byte("</dt>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
444 tableTag = []byte("<table>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
445 tableCloseTag = []byte("</table>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
446 tdTag = []byte("<td")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
447 tdCloseTag = []byte("</td>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
448 thTag = []byte("<th")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
449 thCloseTag = []byte("</th>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
450 theadTag = []byte("<thead>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
451 theadCloseTag = []byte("</thead>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
452 tbodyTag = []byte("<tbody>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
453 tbodyCloseTag = []byte("</tbody>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
454 trTag = []byte("<tr>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
455 trCloseTag = []byte("</tr>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
456 h1Tag = []byte("<h1")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
457 h1CloseTag = []byte("</h1>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
458 h2Tag = []byte("<h2")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
459 h2CloseTag = []byte("</h2>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
460 h3Tag = []byte("<h3")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
461 h3CloseTag = []byte("</h3>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
462 h4Tag = []byte("<h4")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
463 h4CloseTag = []byte("</h4>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
464 h5Tag = []byte("<h5")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
465 h5CloseTag = []byte("</h5>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
466 h6Tag = []byte("<h6")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
467 h6CloseTag = []byte("</h6>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
468
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
469 footnotesDivBytes = []byte("\n<div class=\"footnotes\">\n\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
470 footnotesCloseDivBytes = []byte("\n</div>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
471 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
472
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
473 func headingTagsFromLevel(level int) ([]byte, []byte) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
474 if level <= 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
475 return h1Tag, h1CloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
476 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
477 switch level {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
478 case 2:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
479 return h2Tag, h2CloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
480 case 3:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
481 return h3Tag, h3CloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
482 case 4:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
483 return h4Tag, h4CloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
484 case 5:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
485 return h5Tag, h5CloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
486 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
487 return h6Tag, h6CloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
488 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
489
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
490 func (r *HTMLRenderer) outHRTag(w io.Writer) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
491 if r.Flags&UseXHTML == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
492 r.out(w, hrTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
493 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
494 r.out(w, hrXHTMLTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
495 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
496 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
497
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
498 // RenderNode is a default renderer of a single node of a syntax tree. For
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
499 // block nodes it will be called twice: first time with entering=true, second
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
500 // time with entering=false, so that it could know when it's working on an open
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
501 // tag and when on close. It writes the result to w.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
502 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
503 // The return value is a way to tell the calling walker to adjust its walk
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
504 // pattern: e.g. it can terminate the traversal by returning Terminate. Or it
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
505 // can ask the walker to skip a subtree of this node by returning SkipChildren.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
506 // The typical behavior is to return GoToNext, which asks for the usual
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
507 // traversal to the next node.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
508 func (r *HTMLRenderer) RenderNode(w io.Writer, node *Node, entering bool) WalkStatus {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
509 attrs := []string{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
510 switch node.Type {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
511 case Text:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
512 if r.Flags&Smartypants != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
513 var tmp bytes.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
514 escapeHTML(&tmp, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
515 r.sr.Process(w, tmp.Bytes())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
516 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
517 if node.Parent.Type == Link {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
518 escLink(w, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
519 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
520 escapeHTML(w, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
521 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
522 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
523 case Softbreak:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
524 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
525 // TODO: make it configurable via out(renderer.softbreak)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
526 case Hardbreak:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
527 if r.Flags&UseXHTML == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
528 r.out(w, brTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
529 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
530 r.out(w, brXHTMLTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
531 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
532 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
533 case Emph:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
534 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
535 r.out(w, emTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
536 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
537 r.out(w, emCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
538 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
539 case Strong:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
540 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
541 r.out(w, strongTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
542 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
543 r.out(w, strongCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
544 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
545 case Del:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
546 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
547 r.out(w, delTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
548 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
549 r.out(w, delCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
550 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
551 case HTMLSpan:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
552 if r.Flags&SkipHTML != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
553 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
554 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
555 r.out(w, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
556 case Link:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
557 // mark it but don't link it if it is not a safe link: no smartypants
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
558 dest := node.LinkData.Destination
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
559 if needSkipLink(r.Flags, dest) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
560 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
561 r.out(w, ttTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
562 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
563 r.out(w, ttCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
564 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
565 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
566 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
567 dest = r.addAbsPrefix(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
568 var hrefBuf bytes.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
569 hrefBuf.WriteString("href=\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
570 escLink(&hrefBuf, dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
571 hrefBuf.WriteByte('"')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
572 attrs = append(attrs, hrefBuf.String())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
573 if node.NoteID != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
574 r.out(w, footnoteRef(r.FootnoteAnchorPrefix, node))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
575 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
576 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
577 attrs = appendLinkAttrs(attrs, r.Flags, dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
578 if len(node.LinkData.Title) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
579 var titleBuff bytes.Buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
580 titleBuff.WriteString("title=\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
581 escapeHTML(&titleBuff, node.LinkData.Title)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
582 titleBuff.WriteByte('"')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
583 attrs = append(attrs, titleBuff.String())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
584 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
585 r.tag(w, aTag, attrs)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
586 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
587 if node.NoteID != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
588 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
589 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
590 r.out(w, aCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
591 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
592 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
593 case Image:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
594 if r.Flags&SkipImages != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
595 return SkipChildren
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
596 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
597 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
598 dest := node.LinkData.Destination
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
599 dest = r.addAbsPrefix(dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
600 if r.disableTags == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
601 //if options.safe && potentiallyUnsafe(dest) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
602 //out(w, `<img src="" alt="`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
603 //} else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
604 r.out(w, []byte(`<img src="`))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
605 escLink(w, dest)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
606 r.out(w, []byte(`" alt="`))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
607 //}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
608 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
609 r.disableTags++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
610 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
611 r.disableTags--
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
612 if r.disableTags == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
613 if node.LinkData.Title != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
614 r.out(w, []byte(`" title="`))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
615 escapeHTML(w, node.LinkData.Title)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
616 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
617 r.out(w, []byte(`" />`))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
618 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
619 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
620 case Code:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
621 r.out(w, codeTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
622 escapeAllHTML(w, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
623 r.out(w, codeCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
624 case Document:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
625 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
626 case Paragraph:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
627 if skipParagraphTags(node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
628 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
629 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
630 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
631 // TODO: untangle this clusterfuck about when the newlines need
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
632 // to be added and when not.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
633 if node.Prev != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
634 switch node.Prev.Type {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
635 case HTMLBlock, List, Paragraph, Heading, CodeBlock, BlockQuote, HorizontalRule:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
636 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
637 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
638 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
639 if node.Parent.Type == BlockQuote && node.Prev == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
640 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
641 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
642 r.out(w, pTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
643 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
644 r.out(w, pCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
645 if !(node.Parent.Type == Item && node.Next == nil) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
646 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
647 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
648 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
649 case BlockQuote:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
650 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
651 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
652 r.out(w, blockquoteTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
653 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
654 r.out(w, blockquoteCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
655 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
656 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
657 case HTMLBlock:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
658 if r.Flags&SkipHTML != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
659 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
660 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
661 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
662 r.out(w, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
663 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
664 case Heading:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
665 headingLevel := r.HTMLRendererParameters.HeadingLevelOffset + node.Level
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
666 openTag, closeTag := headingTagsFromLevel(headingLevel)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
667 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
668 if node.IsTitleblock {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
669 attrs = append(attrs, `class="title"`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
670 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
671 if node.HeadingID != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
672 id := r.ensureUniqueHeadingID(node.HeadingID)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
673 if r.HeadingIDPrefix != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
674 id = r.HeadingIDPrefix + id
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
675 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
676 if r.HeadingIDSuffix != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
677 id = id + r.HeadingIDSuffix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
678 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
679 attrs = append(attrs, fmt.Sprintf(`id="%s"`, id))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
680 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
681 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
682 r.tag(w, openTag, attrs)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
683 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
684 r.out(w, closeTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
685 if !(node.Parent.Type == Item && node.Next == nil) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
686 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
687 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
688 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
689 case HorizontalRule:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
690 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
691 r.outHRTag(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
692 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
693 case List:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
694 openTag := ulTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
695 closeTag := ulCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
696 if node.ListFlags&ListTypeOrdered != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
697 openTag = olTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
698 closeTag = olCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
699 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
700 if node.ListFlags&ListTypeDefinition != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
701 openTag = dlTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
702 closeTag = dlCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
703 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
704 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
705 if node.IsFootnotesList {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
706 r.out(w, footnotesDivBytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
707 r.outHRTag(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
708 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
709 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
710 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
711 if node.Parent.Type == Item && node.Parent.Parent.Tight {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
712 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
713 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
714 r.tag(w, openTag[:len(openTag)-1], attrs)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
715 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
716 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
717 r.out(w, closeTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
718 //cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
719 //if node.parent.Type != Item {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
720 // cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
721 //}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
722 if node.Parent.Type == Item && node.Next != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
723 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
724 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
725 if node.Parent.Type == Document || node.Parent.Type == BlockQuote {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
726 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
727 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
728 if node.IsFootnotesList {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
729 r.out(w, footnotesCloseDivBytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
730 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
731 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
732 case Item:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
733 openTag := liTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
734 closeTag := liCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
735 if node.ListFlags&ListTypeDefinition != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
736 openTag = ddTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
737 closeTag = ddCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
738 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
739 if node.ListFlags&ListTypeTerm != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
740 openTag = dtTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
741 closeTag = dtCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
742 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
743 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
744 if itemOpenCR(node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
745 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
746 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
747 if node.ListData.RefLink != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
748 slug := slugify(node.ListData.RefLink)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
749 r.out(w, footnoteItem(r.FootnoteAnchorPrefix, slug))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
750 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
751 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
752 r.out(w, openTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
753 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
754 if node.ListData.RefLink != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
755 slug := slugify(node.ListData.RefLink)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
756 if r.Flags&FootnoteReturnLinks != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
757 r.out(w, footnoteReturnLink(r.FootnoteAnchorPrefix, r.FootnoteReturnLinkContents, slug))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
758 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
759 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
760 r.out(w, closeTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
761 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
762 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
763 case CodeBlock:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
764 attrs = appendLanguageAttr(attrs, node.Info)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
765 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
766 r.out(w, preTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
767 r.tag(w, codeTag[:len(codeTag)-1], attrs)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
768 escapeAllHTML(w, node.Literal)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
769 r.out(w, codeCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
770 r.out(w, preCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
771 if node.Parent.Type != Item {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
772 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
773 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
774 case Table:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
775 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
776 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
777 r.out(w, tableTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
778 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
779 r.out(w, tableCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
780 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
781 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
782 case TableCell:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
783 openTag := tdTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
784 closeTag := tdCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
785 if node.IsHeader {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
786 openTag = thTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
787 closeTag = thCloseTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
788 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
789 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
790 align := cellAlignment(node.Align)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
791 if align != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
792 attrs = append(attrs, fmt.Sprintf(`align="%s"`, align))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
793 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
794 if node.Prev == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
795 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
796 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
797 r.tag(w, openTag, attrs)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
798 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
799 r.out(w, closeTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
800 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
801 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
802 case TableHead:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
803 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
804 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
805 r.out(w, theadTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
806 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
807 r.out(w, theadCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
808 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
809 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
810 case TableBody:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
811 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
812 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
813 r.out(w, tbodyTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
814 // XXX: this is to adhere to a rather silly test. Should fix test.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
815 if node.FirstChild == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
816 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
817 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
818 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
819 r.out(w, tbodyCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
820 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
821 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
822 case TableRow:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
823 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
824 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
825 r.out(w, trTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
826 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
827 r.out(w, trCloseTag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
828 r.cr(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
829 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
830 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
831 panic("Unknown node type " + node.Type.String())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
832 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
833 return GoToNext
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
834 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
835
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
836 // RenderHeader writes HTML document preamble and TOC if requested.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
837 func (r *HTMLRenderer) RenderHeader(w io.Writer, ast *Node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
838 r.writeDocumentHeader(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
839 if r.Flags&TOC != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
840 r.writeTOC(w, ast)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
841 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
842 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
843
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
844 // RenderFooter writes HTML document footer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
845 func (r *HTMLRenderer) RenderFooter(w io.Writer, ast *Node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
846 if r.Flags&CompletePage == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
847 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
848 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
849 io.WriteString(w, "\n</body>\n</html>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
850 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
851
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
852 func (r *HTMLRenderer) writeDocumentHeader(w io.Writer) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
853 if r.Flags&CompletePage == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
854 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
855 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
856 ending := ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
857 if r.Flags&UseXHTML != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
858 io.WriteString(w, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
859 io.WriteString(w, "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
860 io.WriteString(w, "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
861 ending = " /"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
862 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
863 io.WriteString(w, "<!DOCTYPE html>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
864 io.WriteString(w, "<html>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
865 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
866 io.WriteString(w, "<head>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
867 io.WriteString(w, " <title>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
868 if r.Flags&Smartypants != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
869 r.sr.Process(w, []byte(r.Title))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
870 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
871 escapeHTML(w, []byte(r.Title))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
872 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
873 io.WriteString(w, "</title>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
874 io.WriteString(w, " <meta name=\"GENERATOR\" content=\"Blackfriday Markdown Processor v")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
875 io.WriteString(w, Version)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
876 io.WriteString(w, "\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
877 io.WriteString(w, ending)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
878 io.WriteString(w, ">\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
879 io.WriteString(w, " <meta charset=\"utf-8\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
880 io.WriteString(w, ending)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
881 io.WriteString(w, ">\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
882 if r.CSS != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
883 io.WriteString(w, " <link rel=\"stylesheet\" type=\"text/css\" href=\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
884 escapeHTML(w, []byte(r.CSS))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
885 io.WriteString(w, "\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
886 io.WriteString(w, ending)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
887 io.WriteString(w, ">\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
888 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
889 if r.Icon != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
890 io.WriteString(w, " <link rel=\"icon\" type=\"image/x-icon\" href=\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
891 escapeHTML(w, []byte(r.Icon))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
892 io.WriteString(w, "\"")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
893 io.WriteString(w, ending)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
894 io.WriteString(w, ">\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
895 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
896 io.WriteString(w, "</head>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
897 io.WriteString(w, "<body>\n\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
898 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
899
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
900 func (r *HTMLRenderer) writeTOC(w io.Writer, ast *Node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
901 buf := bytes.Buffer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
902
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
903 inHeading := false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
904 tocLevel := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
905 headingCount := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
906
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
907 ast.Walk(func(node *Node, entering bool) WalkStatus {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
908 if node.Type == Heading && !node.HeadingData.IsTitleblock {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
909 inHeading = entering
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
910 if entering {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
911 node.HeadingID = fmt.Sprintf("toc_%d", headingCount)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
912 if node.Level == tocLevel {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
913 buf.WriteString("</li>\n\n<li>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
914 } else if node.Level < tocLevel {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
915 for node.Level < tocLevel {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
916 tocLevel--
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
917 buf.WriteString("</li>\n</ul>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
918 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
919 buf.WriteString("</li>\n\n<li>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
920 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
921 for node.Level > tocLevel {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
922 tocLevel++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
923 buf.WriteString("\n<ul>\n<li>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
924 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
925 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
926
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
927 fmt.Fprintf(&buf, `<a href="#toc_%d">`, headingCount)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
928 headingCount++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
929 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
930 buf.WriteString("</a>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
931 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
932 return GoToNext
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
933 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
934
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
935 if inHeading {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
936 return r.RenderNode(&buf, node, entering)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
937 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
938
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
939 return GoToNext
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
940 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
941
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
942 for ; tocLevel > 0; tocLevel-- {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
943 buf.WriteString("</li>\n</ul>")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
944 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
945
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
946 if buf.Len() > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
947 io.WriteString(w, "<nav>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
948 w.Write(buf.Bytes())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
949 io.WriteString(w, "\n\n</nav>\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
950 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
951 r.lastOutputLen = buf.Len()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
952 }