forked from fabric8-services/fabric8-wit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
markdown.go
82 lines (71 loc) · 2.12 KB
/
markdown.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package rendering
import (
"bytes"
"strings"
"github.com/russross/blackfriday"
"github.com/sourcegraph/syntaxhighlight"
)
const (
commonHTMLFlags = 0 |
blackfriday.HTML_USE_XHTML |
blackfriday.HTML_USE_SMARTYPANTS |
blackfriday.HTML_SMARTYPANTS_FRACTIONS |
blackfriday.HTML_SMARTYPANTS_DASHES |
blackfriday.HTML_SMARTYPANTS_LATEX_DASHES
commonExtensions = 0 |
blackfriday.EXTENSION_NO_INTRA_EMPHASIS |
blackfriday.EXTENSION_TABLES |
blackfriday.EXTENSION_FENCED_CODE |
blackfriday.EXTENSION_AUTOLINK |
blackfriday.EXTENSION_STRIKETHROUGH |
blackfriday.EXTENSION_SPACE_HEADERS |
blackfriday.EXTENSION_HEADER_IDS |
blackfriday.EXTENSION_BACKSLASH_LINE_BREAK |
blackfriday.EXTENSION_DEFINITION_LISTS
)
// MarkdownCommonHighlighter uses the blackfriday.MarkdownCommon setup but also includes
// code-prettify formatting of BlockCode segments
func MarkdownCommonHighlighter(input []byte) []byte {
renderer := highlightHTMLRenderer{blackfriday.HtmlRenderer(commonHTMLFlags, "", "")}
return blackfriday.MarkdownOptions(input, renderer, blackfriday.Options{
Extensions: commonExtensions})
}
type highlightHTMLRenderer struct {
blackfriday.Renderer
}
// BlackCode overrides the standard Html Renderer to add support for prettify of source code within block
// If highlighter fail, normal Html.BlockCode is called
func (h highlightHTMLRenderer) BlockCode(out *bytes.Buffer, text []byte, lang string) {
highlighted, err := syntaxhighlight.AsHTML(text)
if err != nil {
h.Renderer.BlockCode(out, text, lang)
} else {
if out.Len() > 0 {
out.WriteByte('\n')
}
// parse out the language names/classes
count := 0
for _, elt := range strings.Fields(lang) {
if elt[0] == '.' {
elt = elt[1:]
}
if len(elt) == 0 {
continue
}
if count == 0 {
out.WriteString("<pre><code class=\"prettyprint language-")
} else {
out.WriteByte(' ')
}
out.Write([]byte(elt)) // attrEscape(out, []byte(elt))
count++
}
if count == 0 {
out.WriteString("<pre><code class=\"prettyprint\">")
} else {
out.WriteString("\">")
}
out.Write(highlighted)
out.WriteString("</code></pre>\n")
}
}