-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmdhtml.go
75 lines (68 loc) · 2.34 KB
/
mdhtml.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
package main
import (
"fmt"
"hash/crc32"
"io"
"strconv"
"gopkg.in/russross/blackfriday.v2"
)
var extensions = blackfriday.WithExtensions(blackfriday.Footnotes |
blackfriday.CommonExtensions) /* |
blackfriday.NoEmptyLineBeforeBlock)*/
var render = blackfriday.WithRenderer(&htmlRender{
blackfriday.NewHTMLRenderer(
blackfriday.HTMLRendererParameters{
Flags: blackfriday.CommonHTMLFlags |
blackfriday.SmartypantsAngledQuotes,
}),
})
// Markdown преобразует данные из формата Markdown в HTML.
func Markdown(data []byte) []byte {
return blackfriday.Run(data, extensions, render)
}
// htmlRender переопределяет преобразование некоторых видов информации из Markdwon
// в HTML. В тех случаях, когда переопределение не требуется, используется стандартный
// конвертер Markdown.
type htmlRender struct {
*blackfriday.HTMLRenderer
}
func slug(text []byte) string {
return strconv.FormatUint(uint64(crc32.ChecksumIEEE(text)), 36)
}
// RenderNode переопределяет формирование сносок. Все остальное обрабатывается
// стандартным способом.
func (r *htmlRender) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
switch node.Type {
case blackfriday.Link:
if node.NoteID == 0 || !entering {
break
}
fmt.Fprintf(w,
"<sup><a rel=\"footnote\" href=\"#fn:%s\" epub:type=\"noteref\" id=\"fnref:%[1]s\">%d</a></sup>",
slug(node.Destination), node.LinkData.NoteID)
return blackfriday.GoToNext
case blackfriday.List:
if node.IsFootnotesList {
if entering {
io.WriteString(w, "\n<section class=\"endnotes\" epub:type=\"endnotes\">\n<hr/>\n<ol>\n")
} else {
io.WriteString(w, "</ol>\n</section>")
}
return blackfriday.GoToNext
}
case blackfriday.Item:
if node.ListData.RefLink != nil {
if entering {
fmt.Fprintf(w, "<li id=\"fn:%s\" epub:type=\"footnote\">",
slug(node.ListData.RefLink))
} else {
fmt.Fprintf(w,
" <a href=\"#fnref:%s\" class=\"reversefootnote\" hidden=\"hidden\">↩</a>",
slug(node.ListData.RefLink))
io.WriteString(w, "</li>\n")
}
return blackfriday.GoToNext
}
}
return r.HTMLRenderer.RenderNode(w, node, entering)
}