Use HTML5 recommended style of language on code blocks

For code blocks that contain a certain language of code, the recommended
attribute structure is <pre><code class="language-foo">. This also
corresponds to the behavior expected by various JS syntax highlighters.

The GitHub code block implementation was obsolete, and identical to the
normal implementation except for its attribute structure, so it was
removed.

Closes #108.
This commit is contained in:
tummychow 2014-08-27 23:26:20 -04:00
parent 2e7d690972
commit 67002b01b6

54
html.go
View File

@ -36,7 +36,6 @@ const (
HTML_TOC // generate a table of contents HTML_TOC // generate a table of contents
HTML_OMIT_CONTENTS // skip the main contents (for a standalone table of contents) HTML_OMIT_CONTENTS // skip the main contents (for a standalone table of contents)
HTML_COMPLETE_PAGE // generate a complete HTML page HTML_COMPLETE_PAGE // generate a complete HTML page
HTML_GITHUB_BLOCKCODE // use github fenced code rendering rules
HTML_USE_XHTML // generate XHTML output instead of HTML HTML_USE_XHTML // generate XHTML output instead of HTML
HTML_USE_SMARTYPANTS // enable smart punctuation substitutions HTML_USE_SMARTYPANTS // enable smart punctuation substitutions
HTML_SMARTYPANTS_FRACTIONS // enable smart fractions (with HTML_USE_SMARTYPANTS) HTML_SMARTYPANTS_FRACTIONS // enable smart fractions (with HTML_USE_SMARTYPANTS)
@ -232,14 +231,6 @@ func (options *Html) HRule(out *bytes.Buffer) {
} }
func (options *Html) BlockCode(out *bytes.Buffer, text []byte, lang string) { func (options *Html) BlockCode(out *bytes.Buffer, text []byte, lang string) {
if options.flags&HTML_GITHUB_BLOCKCODE != 0 {
options.BlockCodeGithub(out, text, lang)
} else {
options.BlockCodeNormal(out, text, lang)
}
}
func (options *Html) BlockCodeNormal(out *bytes.Buffer, text []byte, lang string) {
doubleSpace(out) doubleSpace(out)
// parse out the language names/classes // parse out the language names/classes
@ -252,7 +243,7 @@ func (options *Html) BlockCodeNormal(out *bytes.Buffer, text []byte, lang string
continue continue
} }
if count == 0 { if count == 0 {
out.WriteString("<pre><code class=\"") out.WriteString("<pre><code class=\"language-")
} else { } else {
out.WriteByte(' ') out.WriteByte(' ')
} }
@ -270,49 +261,6 @@ func (options *Html) BlockCodeNormal(out *bytes.Buffer, text []byte, lang string
out.WriteString("</code></pre>\n") out.WriteString("</code></pre>\n")
} }
// GitHub style code block:
//
// <pre lang="LANG"><code>
// ...
// </code></pre>
//
// Unlike other parsers, we store the language identifier in the <pre>,
// and don't let the user generate custom classes.
//
// The language identifier in the <pre> block gets postprocessed and all
// the code inside gets syntax highlighted with Pygments. This is much safer
// than letting the user specify a CSS class for highlighting.
//
// Note that we only generate HTML for the first specifier.
// E.g.
// ~~~~ {.python .numbered} => <pre lang="python"><code>
func (options *Html) BlockCodeGithub(out *bytes.Buffer, text []byte, lang string) {
doubleSpace(out)
// parse out the language name
count := 0
for _, elt := range strings.Fields(lang) {
if elt[0] == '.' {
elt = elt[1:]
}
if len(elt) == 0 {
continue
}
out.WriteString("<pre lang=\"")
attrEscape(out, []byte(elt))
out.WriteString("\"><code>")
count++
break
}
if count == 0 {
out.WriteString("<pre><code>")
}
attrEscape(out, text)
out.WriteString("</code></pre>\n")
}
func (options *Html) BlockQuote(out *bytes.Buffer, text []byte) { func (options *Html) BlockQuote(out *bytes.Buffer, text []byte) {
doubleSpace(out) doubleSpace(out)
out.WriteString("<blockquote>\n") out.WriteString("<blockquote>\n")