export all names from Renderer struct
This enables new back-ends that are not part of the package Basically a big search-and-replace for this commit
This commit is contained in:
parent
679e1686db
commit
9d23b68fa5
|
@ -52,8 +52,8 @@ All features of upskirt are supported, including:
|
|||
errors that were present in the C code).
|
||||
|
||||
* Good performance. I have not done rigorous benchmarking, but
|
||||
informal testing suggests it is around 8x slower than upskirt.
|
||||
This is still an ugly, direct translation from the C code, so
|
||||
informal testing suggests it is around 3.5x slower than upskirt.
|
||||
This is an ugly, direct translation from the C code, so
|
||||
the difference is unlikely to be related to differences in
|
||||
coding style. There is a lot of bounds checking that is
|
||||
duplicated (by user code for the application and again by code
|
||||
|
|
80
block.go
80
block.go
|
@ -26,7 +26,7 @@ func parseBlock(out *bytes.Buffer, rndr *render, data []byte) {
|
|||
data = data[blockPrefixHeader(out, rndr, data):]
|
||||
continue
|
||||
}
|
||||
if data[0] == '<' && rndr.mk.blockhtml != nil {
|
||||
if data[0] == '<' && rndr.mk.BlockHtml != nil {
|
||||
if i := blockHtml(out, rndr, data, true); i > 0 {
|
||||
data = data[i:]
|
||||
continue
|
||||
|
@ -36,9 +36,9 @@ func parseBlock(out *bytes.Buffer, rndr *render, data []byte) {
|
|||
data = data[i:]
|
||||
continue
|
||||
}
|
||||
if isHrule(data) {
|
||||
if rndr.mk.hrule != nil {
|
||||
rndr.mk.hrule(out, rndr.mk.opaque)
|
||||
if isHRule(data) {
|
||||
if rndr.mk.HRule != nil {
|
||||
rndr.mk.HRule(out, rndr.mk.Opaque)
|
||||
}
|
||||
var i int
|
||||
for i = 0; i < len(data) && data[i] != '\n'; i++ {
|
||||
|
@ -118,8 +118,8 @@ func blockPrefixHeader(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
if end > i {
|
||||
work := bytes.NewBuffer(nil)
|
||||
parseInline(work, rndr, data[i:end])
|
||||
if rndr.mk.header != nil {
|
||||
rndr.mk.header(out, work.Bytes(), level, rndr.mk.opaque)
|
||||
if rndr.mk.Header != nil {
|
||||
rndr.mk.Header(out, work.Bytes(), level, rndr.mk.Opaque)
|
||||
}
|
||||
}
|
||||
return skip
|
||||
|
@ -186,8 +186,8 @@ func blockHtml(out *bytes.Buffer, rndr *render, data []byte, do_render bool) int
|
|||
|
||||
if j > 0 {
|
||||
size := i + j
|
||||
if do_render && rndr.mk.blockhtml != nil {
|
||||
rndr.mk.blockhtml(out, data[:size], rndr.mk.opaque)
|
||||
if do_render && rndr.mk.BlockHtml != nil {
|
||||
rndr.mk.BlockHtml(out, data[:size], rndr.mk.Opaque)
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
@ -205,8 +205,8 @@ func blockHtml(out *bytes.Buffer, rndr *render, data []byte, do_render bool) int
|
|||
j = isEmpty(data[i:])
|
||||
if j > 0 {
|
||||
size := i + j
|
||||
if do_render && rndr.mk.blockhtml != nil {
|
||||
rndr.mk.blockhtml(out, data[:size], rndr.mk.opaque)
|
||||
if do_render && rndr.mk.BlockHtml != nil {
|
||||
rndr.mk.BlockHtml(out, data[:size], rndr.mk.Opaque)
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
@ -251,8 +251,8 @@ func blockHtml(out *bytes.Buffer, rndr *render, data []byte, do_render bool) int
|
|||
}
|
||||
|
||||
// the end of the block has been found
|
||||
if do_render && rndr.mk.blockhtml != nil {
|
||||
rndr.mk.blockhtml(out, data[:i], rndr.mk.opaque)
|
||||
if do_render && rndr.mk.BlockHtml != nil {
|
||||
rndr.mk.BlockHtml(out, data[:i], rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
return i
|
||||
|
@ -317,7 +317,7 @@ func isEmpty(data []byte) int {
|
|||
return i + 1
|
||||
}
|
||||
|
||||
func isHrule(data []byte) bool {
|
||||
func isHRule(data []byte) bool {
|
||||
// skip initial spaces
|
||||
if len(data) < 3 {
|
||||
return false
|
||||
|
@ -478,13 +478,13 @@ func blockFencedCode(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
work.WriteByte('\n')
|
||||
}
|
||||
|
||||
if rndr.mk.blockcode != nil {
|
||||
if rndr.mk.BlockCode != nil {
|
||||
syntax := ""
|
||||
if lang != nil {
|
||||
syntax = *lang
|
||||
}
|
||||
|
||||
rndr.mk.blockcode(out, work.Bytes(), syntax, rndr.mk.opaque)
|
||||
rndr.mk.BlockCode(out, work.Bytes(), syntax, rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
return beg
|
||||
|
@ -513,8 +513,8 @@ func blockTable(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
i++
|
||||
}
|
||||
|
||||
if rndr.mk.table != nil {
|
||||
rndr.mk.table(out, header_work.Bytes(), body_work.Bytes(), col_data, rndr.mk.opaque)
|
||||
if rndr.mk.Table != nil {
|
||||
rndr.mk.Table(out, header_work.Bytes(), body_work.Bytes(), col_data, rndr.mk.Opaque)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -635,12 +635,12 @@ func blockTableRow(out *bytes.Buffer, rndr *render, data []byte, columns int, co
|
|||
cell_work := bytes.NewBuffer(nil)
|
||||
parseInline(cell_work, rndr, data[cell_start:cell_end+1])
|
||||
|
||||
if rndr.mk.tableCell != nil {
|
||||
if rndr.mk.TableCell != nil {
|
||||
cdata := 0
|
||||
if col < len(col_data) {
|
||||
cdata = col_data[col]
|
||||
}
|
||||
rndr.mk.tableCell(row_work, cell_work.Bytes(), cdata, rndr.mk.opaque)
|
||||
rndr.mk.TableCell(row_work, cell_work.Bytes(), cdata, rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
i++
|
||||
|
@ -648,17 +648,17 @@ func blockTableRow(out *bytes.Buffer, rndr *render, data []byte, columns int, co
|
|||
|
||||
for ; col < columns; col++ {
|
||||
empty_cell := []byte{}
|
||||
if rndr.mk.tableCell != nil {
|
||||
if rndr.mk.TableCell != nil {
|
||||
cdata := 0
|
||||
if col < len(col_data) {
|
||||
cdata = col_data[col]
|
||||
}
|
||||
rndr.mk.tableCell(row_work, empty_cell, cdata, rndr.mk.opaque)
|
||||
rndr.mk.TableCell(row_work, empty_cell, cdata, rndr.mk.Opaque)
|
||||
}
|
||||
}
|
||||
|
||||
if rndr.mk.tableRow != nil {
|
||||
rndr.mk.tableRow(out, row_work.Bytes(), rndr.mk.opaque)
|
||||
if rndr.mk.TableRow != nil {
|
||||
rndr.mk.TableRow(out, row_work.Bytes(), rndr.mk.Opaque)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -702,8 +702,8 @@ func blockQuote(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
}
|
||||
|
||||
parseBlock(block, rndr, work.Bytes())
|
||||
if rndr.mk.blockquote != nil {
|
||||
rndr.mk.blockquote(out, block.Bytes(), rndr.mk.opaque)
|
||||
if rndr.mk.BlockQuote != nil {
|
||||
rndr.mk.BlockQuote(out, block.Bytes(), rndr.mk.Opaque)
|
||||
}
|
||||
return end
|
||||
}
|
||||
|
@ -759,8 +759,8 @@ func blockCode(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
|
||||
work.WriteByte('\n')
|
||||
|
||||
if rndr.mk.blockcode != nil {
|
||||
rndr.mk.blockcode(out, work.Bytes(), "", rndr.mk.opaque)
|
||||
if rndr.mk.BlockCode != nil {
|
||||
rndr.mk.BlockCode(out, work.Bytes(), "", rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
return beg
|
||||
|
@ -810,8 +810,8 @@ func blockList(out *bytes.Buffer, rndr *render, data []byte, flags int) int {
|
|||
}
|
||||
}
|
||||
|
||||
if rndr.mk.list != nil {
|
||||
rndr.mk.list(out, work.Bytes(), flags, rndr.mk.opaque)
|
||||
if rndr.mk.List != nil {
|
||||
rndr.mk.List(out, work.Bytes(), flags, rndr.mk.Opaque)
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
@ -883,7 +883,7 @@ func blockListItem(out *bytes.Buffer, rndr *render, data []byte, flags *int) int
|
|||
|
||||
// check for a new item
|
||||
chunk := data[beg+i : end]
|
||||
if (blockUliPrefix(chunk) > 0 && !isHrule(chunk)) || blockOliPrefix(chunk) > 0 {
|
||||
if (blockUliPrefix(chunk) > 0 && !isHRule(chunk)) || blockOliPrefix(chunk) > 0 {
|
||||
if in_empty {
|
||||
has_inside_empty = true
|
||||
}
|
||||
|
@ -940,8 +940,8 @@ func blockListItem(out *bytes.Buffer, rndr *render, data []byte, flags *int) int
|
|||
}
|
||||
|
||||
// render li itself
|
||||
if rndr.mk.listitem != nil {
|
||||
rndr.mk.listitem(out, inter.Bytes(), *flags, rndr.mk.opaque)
|
||||
if rndr.mk.ListItem != nil {
|
||||
rndr.mk.ListItem(out, inter.Bytes(), *flags, rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
return beg
|
||||
|
@ -962,13 +962,13 @@ func blockParagraph(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
}
|
||||
|
||||
if rndr.flags&EXTENSION_LAX_HTML_BLOCKS != 0 {
|
||||
if data[i] == '<' && rndr.mk.blockhtml != nil && blockHtml(out, rndr, data[i:], false) > 0 {
|
||||
if data[i] == '<' && rndr.mk.BlockHtml != nil && blockHtml(out, rndr, data[i:], false) > 0 {
|
||||
end = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if isPrefixHeader(rndr, data[i:]) || isHrule(data[i:]) {
|
||||
if isPrefixHeader(rndr, data[i:]) || isHRule(data[i:]) {
|
||||
end = i
|
||||
break
|
||||
}
|
||||
|
@ -985,8 +985,8 @@ func blockParagraph(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
if level == 0 {
|
||||
tmp := bytes.NewBuffer(nil)
|
||||
parseInline(tmp, rndr, work[:size])
|
||||
if rndr.mk.paragraph != nil {
|
||||
rndr.mk.paragraph(out, tmp.Bytes(), rndr.mk.opaque)
|
||||
if rndr.mk.Paragraph != nil {
|
||||
rndr.mk.Paragraph(out, tmp.Bytes(), rndr.mk.Opaque)
|
||||
}
|
||||
} else {
|
||||
if size > 0 {
|
||||
|
@ -1006,8 +1006,8 @@ func blockParagraph(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
if size > 0 {
|
||||
tmp := bytes.NewBuffer(nil)
|
||||
parseInline(tmp, rndr, work[:size])
|
||||
if rndr.mk.paragraph != nil {
|
||||
rndr.mk.paragraph(out, tmp.Bytes(), rndr.mk.opaque)
|
||||
if rndr.mk.Paragraph != nil {
|
||||
rndr.mk.Paragraph(out, tmp.Bytes(), rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
work = work[beg:]
|
||||
|
@ -1020,8 +1020,8 @@ func blockParagraph(out *bytes.Buffer, rndr *render, data []byte) int {
|
|||
header_work := bytes.NewBuffer(nil)
|
||||
parseInline(header_work, rndr, work[:size])
|
||||
|
||||
if rndr.mk.header != nil {
|
||||
rndr.mk.header(out, header_work.Bytes(), level, rndr.mk.opaque)
|
||||
if rndr.mk.Header != nil {
|
||||
rndr.mk.Header(out, header_work.Bytes(), level, rndr.mk.Opaque)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
138
html.go
138
html.go
|
@ -36,87 +36,87 @@ const (
|
|||
|
||||
type htmlOptions struct {
|
||||
flags int
|
||||
close_tag string // how to end singleton tags: usually " />\n", possibly ">\n"
|
||||
toc_data struct {
|
||||
header_count int
|
||||
current_level int
|
||||
closeTag string // how to end singleton tags: usually " />\n", possibly ">\n"
|
||||
tocData struct {
|
||||
headerCount int
|
||||
currentLevel int
|
||||
}
|
||||
smartypants *SmartypantsRenderer
|
||||
}
|
||||
|
||||
var xhtml_close = " />\n"
|
||||
var html_close = ">\n"
|
||||
var xhtmlClose = " />\n"
|
||||
var htmlClose = ">\n"
|
||||
|
||||
func HtmlRenderer(flags int) *Renderer {
|
||||
// configure the rendering engine
|
||||
r := new(Renderer)
|
||||
if flags&HTML_GITHUB_BLOCKCODE == 0 {
|
||||
r.blockcode = htmlBlockcode
|
||||
r.BlockCode = htmlBlockCode
|
||||
} else {
|
||||
r.blockcode = htmlBlockcodeGithub
|
||||
r.BlockCode = htmlBlockCodeGithub
|
||||
}
|
||||
r.blockquote = htmlBlockquote
|
||||
r.BlockQuote = htmlBlockQuote
|
||||
if flags&HTML_SKIP_HTML == 0 {
|
||||
r.blockhtml = htmlRawBlock
|
||||
r.BlockHtml = htmlRawBlock
|
||||
}
|
||||
r.header = htmlHeader
|
||||
r.hrule = htmlHrule
|
||||
r.list = htmlList
|
||||
r.listitem = htmlListitem
|
||||
r.paragraph = htmlParagraph
|
||||
r.table = htmlTable
|
||||
r.tableRow = htmlTableRow
|
||||
r.tableCell = htmlTableCell
|
||||
r.Header = htmlHeader
|
||||
r.HRule = htmlHRule
|
||||
r.List = htmlList
|
||||
r.ListItem = htmlListItem
|
||||
r.Paragraph = htmlParagraph
|
||||
r.Table = htmlTable
|
||||
r.TableRow = htmlTableRow
|
||||
r.TableCell = htmlTableCell
|
||||
|
||||
r.autolink = htmlAutolink
|
||||
r.codespan = htmlCodespan
|
||||
r.doubleEmphasis = htmlDoubleEmphasis
|
||||
r.emphasis = htmlEmphasis
|
||||
r.AutoLink = htmlAutoLink
|
||||
r.CodeSpan = htmlCodeSpan
|
||||
r.DoubleEmphasis = htmlDoubleEmphasis
|
||||
r.Emphasis = htmlEmphasis
|
||||
if flags&HTML_SKIP_IMAGES == 0 {
|
||||
r.image = htmlImage
|
||||
r.Image = htmlImage
|
||||
}
|
||||
r.linebreak = htmlLinebreak
|
||||
r.LineBreak = htmlLineBreak
|
||||
if flags&HTML_SKIP_LINKS == 0 {
|
||||
r.link = htmlLink
|
||||
r.Link = htmlLink
|
||||
}
|
||||
r.rawHtmlTag = htmlRawTag
|
||||
r.tripleEmphasis = htmlTripleEmphasis
|
||||
r.strikethrough = htmlStrikethrough
|
||||
r.RawHtmlTag = htmlRawTag
|
||||
r.TripleEmphasis = htmlTripleEmphasis
|
||||
r.StrikeThrough = htmlStrikeThrough
|
||||
|
||||
var cb *SmartypantsRenderer
|
||||
if flags&HTML_USE_SMARTYPANTS == 0 {
|
||||
r.normalText = htmlNormalText
|
||||
r.NormalText = htmlNormalText
|
||||
} else {
|
||||
cb = Smartypants(flags)
|
||||
r.normalText = htmlSmartypants
|
||||
r.NormalText = htmlSmartypants
|
||||
}
|
||||
|
||||
close_tag := html_close
|
||||
closeTag := htmlClose
|
||||
if flags&HTML_USE_XHTML != 0 {
|
||||
close_tag = xhtml_close
|
||||
closeTag = xhtmlClose
|
||||
}
|
||||
r.opaque = &htmlOptions{flags: flags, close_tag: close_tag, smartypants: cb}
|
||||
r.Opaque = &htmlOptions{flags: flags, closeTag: closeTag, smartypants: cb}
|
||||
return r
|
||||
}
|
||||
|
||||
func HtmlTocRenderer(flags int) *Renderer {
|
||||
// configure the rendering engine
|
||||
r := new(Renderer)
|
||||
r.header = htmlTocHeader
|
||||
r.Header = htmlTocHeader
|
||||
|
||||
r.codespan = htmlCodespan
|
||||
r.doubleEmphasis = htmlDoubleEmphasis
|
||||
r.emphasis = htmlEmphasis
|
||||
r.tripleEmphasis = htmlTripleEmphasis
|
||||
r.strikethrough = htmlStrikethrough
|
||||
r.CodeSpan = htmlCodeSpan
|
||||
r.DoubleEmphasis = htmlDoubleEmphasis
|
||||
r.Emphasis = htmlEmphasis
|
||||
r.TripleEmphasis = htmlTripleEmphasis
|
||||
r.StrikeThrough = htmlStrikeThrough
|
||||
|
||||
r.documentFooter = htmlTocFinalize
|
||||
r.DocumentFooter = htmlTocFinalize
|
||||
|
||||
close_tag := ">\n"
|
||||
closeTag := ">\n"
|
||||
if flags&HTML_USE_XHTML != 0 {
|
||||
close_tag = " />\n"
|
||||
closeTag = " />\n"
|
||||
}
|
||||
r.opaque = &htmlOptions{flags: flags | HTML_TOC, close_tag: close_tag}
|
||||
r.Opaque = &htmlOptions{flags: flags | HTML_TOC, closeTag: closeTag}
|
||||
return r
|
||||
}
|
||||
|
||||
|
@ -156,8 +156,8 @@ func htmlHeader(out *bytes.Buffer, text []byte, level int, opaque interface{}) {
|
|||
}
|
||||
|
||||
if options.flags&HTML_TOC != 0 {
|
||||
out.WriteString(fmt.Sprintf("<h%d id=\"toc_%d\">", level, options.toc_data.header_count))
|
||||
options.toc_data.header_count++
|
||||
out.WriteString(fmt.Sprintf("<h%d id=\"toc_%d\">", level, options.tocData.headerCount))
|
||||
options.tocData.headerCount++
|
||||
} else {
|
||||
out.WriteString(fmt.Sprintf("<h%d>", level))
|
||||
}
|
||||
|
@ -185,17 +185,17 @@ func htmlRawBlock(out *bytes.Buffer, text []byte, opaque interface{}) {
|
|||
out.WriteByte('\n')
|
||||
}
|
||||
|
||||
func htmlHrule(out *bytes.Buffer, opaque interface{}) {
|
||||
func htmlHRule(out *bytes.Buffer, opaque interface{}) {
|
||||
options := opaque.(*htmlOptions)
|
||||
|
||||
if out.Len() > 0 {
|
||||
out.WriteByte('\n')
|
||||
}
|
||||
out.WriteString("<hr")
|
||||
out.WriteString(options.close_tag)
|
||||
out.WriteString(options.closeTag)
|
||||
}
|
||||
|
||||
func htmlBlockcode(out *bytes.Buffer, text []byte, lang string, opaque interface{}) {
|
||||
func htmlBlockCode(out *bytes.Buffer, text []byte, lang string, opaque interface{}) {
|
||||
if out.Len() > 0 {
|
||||
out.WriteByte('\n')
|
||||
}
|
||||
|
@ -255,7 +255,7 @@ func htmlBlockcode(out *bytes.Buffer, text []byte, lang string, opaque interface
|
|||
* E.g.
|
||||
* ~~~~ {.python .numbered} => <pre lang="python"><code>
|
||||
*/
|
||||
func htmlBlockcodeGithub(out *bytes.Buffer, text []byte, lang string, opaque interface{}) {
|
||||
func htmlBlockCodeGithub(out *bytes.Buffer, text []byte, lang string, opaque interface{}) {
|
||||
if out.Len() > 0 {
|
||||
out.WriteByte('\n')
|
||||
}
|
||||
|
@ -287,7 +287,7 @@ func htmlBlockcodeGithub(out *bytes.Buffer, text []byte, lang string, opaque int
|
|||
}
|
||||
|
||||
|
||||
func htmlBlockquote(out *bytes.Buffer, text []byte, opaque interface{}) {
|
||||
func htmlBlockQuote(out *bytes.Buffer, text []byte, opaque interface{}) {
|
||||
out.WriteString("<blockquote>\n")
|
||||
out.Write(text)
|
||||
out.WriteString("</blockquote>")
|
||||
|
@ -349,7 +349,7 @@ func htmlList(out *bytes.Buffer, text []byte, flags int, opaque interface{}) {
|
|||
}
|
||||
}
|
||||
|
||||
func htmlListitem(out *bytes.Buffer, text []byte, flags int, opaque interface{}) {
|
||||
func htmlListItem(out *bytes.Buffer, text []byte, flags int, opaque interface{}) {
|
||||
out.WriteString("<li>")
|
||||
size := len(text)
|
||||
for size > 0 && text[size-1] == '\n' {
|
||||
|
@ -396,7 +396,7 @@ func htmlParagraph(out *bytes.Buffer, text []byte, opaque interface{}) {
|
|||
}
|
||||
|
||||
out.WriteString("<br>")
|
||||
out.WriteString(options.close_tag)
|
||||
out.WriteString(options.closeTag)
|
||||
i++
|
||||
}
|
||||
} else {
|
||||
|
@ -405,7 +405,7 @@ func htmlParagraph(out *bytes.Buffer, text []byte, opaque interface{}) {
|
|||
out.WriteString("</p>\n")
|
||||
}
|
||||
|
||||
func htmlAutolink(out *bytes.Buffer, link []byte, kind int, opaque interface{}) int {
|
||||
func htmlAutoLink(out *bytes.Buffer, link []byte, kind int, opaque interface{}) int {
|
||||
options := opaque.(*htmlOptions)
|
||||
|
||||
if len(link) == 0 {
|
||||
|
@ -441,7 +441,7 @@ func htmlAutolink(out *bytes.Buffer, link []byte, kind int, opaque interface{})
|
|||
return 1
|
||||
}
|
||||
|
||||
func htmlCodespan(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
func htmlCodeSpan(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
out.WriteString("<code>")
|
||||
attrEscape(out, text)
|
||||
out.WriteString("</code>")
|
||||
|
@ -485,14 +485,14 @@ func htmlImage(out *bytes.Buffer, link []byte, title []byte, alt []byte, opaque
|
|||
}
|
||||
|
||||
out.WriteByte('"')
|
||||
out.WriteString(options.close_tag)
|
||||
out.WriteString(options.closeTag)
|
||||
return 1
|
||||
}
|
||||
|
||||
func htmlLinebreak(out *bytes.Buffer, opaque interface{}) int {
|
||||
func htmlLineBreak(out *bytes.Buffer, opaque interface{}) int {
|
||||
options := opaque.(*htmlOptions)
|
||||
out.WriteString("<br")
|
||||
out.WriteString(options.close_tag)
|
||||
out.WriteString(options.closeTag)
|
||||
return 1
|
||||
}
|
||||
|
||||
|
@ -547,7 +547,7 @@ func htmlTripleEmphasis(out *bytes.Buffer, text []byte, opaque interface{}) int
|
|||
return 1
|
||||
}
|
||||
|
||||
func htmlStrikethrough(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
func htmlStrikeThrough(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
if len(text) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
@ -563,26 +563,26 @@ func htmlNormalText(out *bytes.Buffer, text []byte, opaque interface{}) {
|
|||
|
||||
func htmlTocHeader(out *bytes.Buffer, text []byte, level int, opaque interface{}) {
|
||||
options := opaque.(*htmlOptions)
|
||||
for level > options.toc_data.current_level {
|
||||
if options.toc_data.current_level > 0 {
|
||||
for level > options.tocData.currentLevel {
|
||||
if options.tocData.currentLevel > 0 {
|
||||
out.WriteString("<li>")
|
||||
}
|
||||
out.WriteString("<ul>\n")
|
||||
options.toc_data.current_level++
|
||||
options.tocData.currentLevel++
|
||||
}
|
||||
|
||||
for level < options.toc_data.current_level {
|
||||
for level < options.tocData.currentLevel {
|
||||
out.WriteString("</ul>")
|
||||
if options.toc_data.current_level > 1 {
|
||||
if options.tocData.currentLevel > 1 {
|
||||
out.WriteString("</li>\n")
|
||||
}
|
||||
options.toc_data.current_level--
|
||||
options.tocData.currentLevel--
|
||||
}
|
||||
|
||||
out.WriteString("<li><a href=\"#toc_")
|
||||
out.WriteString(strconv.Itoa(options.toc_data.header_count))
|
||||
out.WriteString(strconv.Itoa(options.tocData.headerCount))
|
||||
out.WriteString("\">")
|
||||
options.toc_data.header_count++
|
||||
options.tocData.headerCount++
|
||||
|
||||
if len(text) > 0 {
|
||||
out.Write(text)
|
||||
|
@ -592,12 +592,12 @@ func htmlTocHeader(out *bytes.Buffer, text []byte, level int, opaque interface{}
|
|||
|
||||
func htmlTocFinalize(out *bytes.Buffer, opaque interface{}) {
|
||||
options := opaque.(*htmlOptions)
|
||||
for options.toc_data.current_level > 1 {
|
||||
for options.tocData.currentLevel > 1 {
|
||||
out.WriteString("</ul></li>\n")
|
||||
options.toc_data.current_level--
|
||||
options.tocData.currentLevel--
|
||||
}
|
||||
|
||||
if options.toc_data.current_level > 0 {
|
||||
if options.tocData.currentLevel > 0 {
|
||||
out.WriteString("</ul>\n")
|
||||
}
|
||||
}
|
||||
|
|
66
inline.go
66
inline.go
|
@ -32,8 +32,8 @@ func parseInline(out *bytes.Buffer, rndr *render, data []byte) {
|
|||
end++
|
||||
}
|
||||
|
||||
if rndr.mk.normalText != nil {
|
||||
rndr.mk.normalText(out, data[i:end], rndr.mk.opaque)
|
||||
if rndr.mk.NormalText != nil {
|
||||
rndr.mk.NormalText(out, data[i:end], rndr.mk.Opaque)
|
||||
} else {
|
||||
out.Write(data[i:end])
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ func inlineEmphasis(out *bytes.Buffer, rndr *render, data []byte, offset int) in
|
|||
return 0
|
||||
}
|
||||
|
||||
func inlineCodespan(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
func inlineCodeSpan(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
data = data[offset:]
|
||||
|
||||
nb := 0
|
||||
|
@ -138,15 +138,15 @@ func inlineCodespan(out *bytes.Buffer, rndr *render, data []byte, offset int) in
|
|||
}
|
||||
|
||||
// real code span
|
||||
if rndr.mk.codespan == nil {
|
||||
if rndr.mk.CodeSpan == nil {
|
||||
return 0
|
||||
}
|
||||
if f_begin < f_end {
|
||||
if rndr.mk.codespan(out, data[f_begin:f_end], rndr.mk.opaque) == 0 {
|
||||
if rndr.mk.CodeSpan(out, data[f_begin:f_end], rndr.mk.Opaque) == 0 {
|
||||
end = 0
|
||||
}
|
||||
} else {
|
||||
if rndr.mk.codespan(out, nil, rndr.mk.opaque) == 0 {
|
||||
if rndr.mk.CodeSpan(out, nil, rndr.mk.Opaque) == 0 {
|
||||
end = 0
|
||||
}
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ func inlineCodespan(out *bytes.Buffer, rndr *render, data []byte, offset int) in
|
|||
}
|
||||
|
||||
// '\n' preceded by two spaces
|
||||
func inlineLinebreak(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
func inlineLineBreak(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
if offset < 2 || data[offset-1] != ' ' || data[offset-2] != ' ' {
|
||||
return 0
|
||||
}
|
||||
|
@ -169,10 +169,10 @@ func inlineLinebreak(out *bytes.Buffer, rndr *render, data []byte, offset int) i
|
|||
}
|
||||
out.Truncate(end)
|
||||
|
||||
if rndr.mk.linebreak == nil {
|
||||
if rndr.mk.LineBreak == nil {
|
||||
return 0
|
||||
}
|
||||
if rndr.mk.linebreak(out, rndr.mk.opaque) > 0 {
|
||||
if rndr.mk.LineBreak(out, rndr.mk.Opaque) > 0 {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
|
@ -192,7 +192,7 @@ func inlineLink(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
|||
text_has_nl := false
|
||||
|
||||
// check whether the correct renderer exists
|
||||
if (isImg && rndr.mk.image == nil) || (!isImg && rndr.mk.link == nil) {
|
||||
if (isImg && rndr.mk.Image == nil) || (!isImg && rndr.mk.Link == nil) {
|
||||
return 0
|
||||
}
|
||||
|
||||
|
@ -428,9 +428,9 @@ func inlineLink(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
|||
out.Truncate(outSize - 1)
|
||||
}
|
||||
|
||||
ret = rndr.mk.image(out, u_link, title, content.Bytes(), rndr.mk.opaque)
|
||||
ret = rndr.mk.Image(out, u_link, title, content.Bytes(), rndr.mk.Opaque)
|
||||
} else {
|
||||
ret = rndr.mk.link(out, u_link, title, content.Bytes(), rndr.mk.opaque)
|
||||
ret = rndr.mk.Link(out, u_link, title, content.Bytes(), rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
if ret > 0 {
|
||||
|
@ -440,7 +440,7 @@ func inlineLink(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
|||
}
|
||||
|
||||
// '<' when tags or autolinks are allowed
|
||||
func inlineLangle(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
func inlineLAngle(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
data = data[offset:]
|
||||
altype := LINK_TYPE_NOT_AUTOLINK
|
||||
end := tagLength(data, &altype)
|
||||
|
@ -448,12 +448,12 @@ func inlineLangle(out *bytes.Buffer, rndr *render, data []byte, offset int) int
|
|||
|
||||
if end > 2 {
|
||||
switch {
|
||||
case rndr.mk.autolink != nil && altype != LINK_TYPE_NOT_AUTOLINK:
|
||||
case rndr.mk.AutoLink != nil && altype != LINK_TYPE_NOT_AUTOLINK:
|
||||
u_link := bytes.NewBuffer(nil)
|
||||
unescapeText(u_link, data[1:end+1-2])
|
||||
ret = rndr.mk.autolink(out, u_link.Bytes(), altype, rndr.mk.opaque)
|
||||
case rndr.mk.rawHtmlTag != nil:
|
||||
ret = rndr.mk.rawHtmlTag(out, data[:end], rndr.mk.opaque)
|
||||
ret = rndr.mk.AutoLink(out, u_link.Bytes(), altype, rndr.mk.Opaque)
|
||||
case rndr.mk.RawHtmlTag != nil:
|
||||
ret = rndr.mk.RawHtmlTag(out, data[:end], rndr.mk.Opaque)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -474,8 +474,8 @@ func inlineEscape(out *bytes.Buffer, rndr *render, data []byte, offset int) int
|
|||
return 0
|
||||
}
|
||||
|
||||
if rndr.mk.normalText != nil {
|
||||
rndr.mk.normalText(out, data[1:2], rndr.mk.opaque)
|
||||
if rndr.mk.NormalText != nil {
|
||||
rndr.mk.NormalText(out, data[1:2], rndr.mk.Opaque)
|
||||
} else {
|
||||
out.WriteByte(data[1])
|
||||
}
|
||||
|
@ -526,8 +526,8 @@ func inlineEntity(out *bytes.Buffer, rndr *render, data []byte, offset int) int
|
|||
return 0 // lone '&'
|
||||
}
|
||||
|
||||
if rndr.mk.entity != nil {
|
||||
rndr.mk.entity(out, data[:end], rndr.mk.opaque)
|
||||
if rndr.mk.Entity != nil {
|
||||
rndr.mk.Entity(out, data[:end], rndr.mk.Opaque)
|
||||
} else {
|
||||
out.Write(data[:end])
|
||||
}
|
||||
|
@ -535,7 +535,7 @@ func inlineEntity(out *bytes.Buffer, rndr *render, data []byte, offset int) int
|
|||
return end
|
||||
}
|
||||
|
||||
func inlineAutolink(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
func inlineAutoLink(out *bytes.Buffer, rndr *render, data []byte, offset int) int {
|
||||
// quick check to rule out most false hits on ':'
|
||||
if len(data) < offset + 3 || data[offset+1] != '/' || data[offset+2] != '/' {
|
||||
return 0
|
||||
|
@ -631,11 +631,11 @@ func inlineAutolink(out *bytes.Buffer, rndr *render, data []byte, offset int) in
|
|||
out.Truncate(len(out.Bytes()) - rewind)
|
||||
}
|
||||
|
||||
if rndr.mk.autolink != nil {
|
||||
if rndr.mk.AutoLink != nil {
|
||||
u_link := bytes.NewBuffer(nil)
|
||||
unescapeText(u_link, data[:link_end])
|
||||
|
||||
rndr.mk.autolink(out, u_link.Bytes(), LINK_TYPE_NORMAL, rndr.mk.opaque)
|
||||
rndr.mk.AutoLink(out, u_link.Bytes(), LINK_TYPE_NORMAL, rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
return link_end - rewind
|
||||
|
@ -687,7 +687,7 @@ func tagLength(data []byte, autolink *int) int {
|
|||
}
|
||||
|
||||
if i > 1 && data[i] == '@' {
|
||||
if j = isMailtoAutolink(data[i:]); j != 0 {
|
||||
if j = isMailtoAutoLink(data[i:]); j != 0 {
|
||||
*autolink = LINK_TYPE_EMAIL
|
||||
return i + j
|
||||
}
|
||||
|
@ -741,7 +741,7 @@ func tagLength(data []byte, autolink *int) int {
|
|||
|
||||
// look for the address part of a mail autolink and '>'
|
||||
// this is less strict than the original markdown e-mail address matching
|
||||
func isMailtoAutolink(data []byte) int {
|
||||
func isMailtoAutoLink(data []byte) int {
|
||||
nb := 0
|
||||
|
||||
// address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@'
|
||||
|
@ -852,7 +852,7 @@ func inlineHelperFindEmphChar(data []byte, c byte) int {
|
|||
func inlineHelperEmph1(out *bytes.Buffer, rndr *render, data []byte, c byte) int {
|
||||
i := 0
|
||||
|
||||
if rndr.mk.emphasis == nil {
|
||||
if rndr.mk.Emphasis == nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
|
@ -886,7 +886,7 @@ func inlineHelperEmph1(out *bytes.Buffer, rndr *render, data []byte, c byte) int
|
|||
|
||||
work := bytes.NewBuffer(nil)
|
||||
parseInline(work, rndr, data[:i])
|
||||
r := rndr.mk.emphasis(out, work.Bytes(), rndr.mk.opaque)
|
||||
r := rndr.mk.Emphasis(out, work.Bytes(), rndr.mk.Opaque)
|
||||
if r > 0 {
|
||||
return i + 1
|
||||
} else {
|
||||
|
@ -899,9 +899,9 @@ func inlineHelperEmph1(out *bytes.Buffer, rndr *render, data []byte, c byte) int
|
|||
}
|
||||
|
||||
func inlineHelperEmph2(out *bytes.Buffer, rndr *render, data []byte, c byte) int {
|
||||
render_method := rndr.mk.doubleEmphasis
|
||||
render_method := rndr.mk.DoubleEmphasis
|
||||
if c == '~' {
|
||||
render_method = rndr.mk.strikethrough
|
||||
render_method = rndr.mk.StrikeThrough
|
||||
}
|
||||
|
||||
if render_method == nil {
|
||||
|
@ -920,7 +920,7 @@ func inlineHelperEmph2(out *bytes.Buffer, rndr *render, data []byte, c byte) int
|
|||
if i+1 < len(data) && data[i] == c && data[i+1] == c && i > 0 && !isspace(data[i-1]) {
|
||||
work := bytes.NewBuffer(nil)
|
||||
parseInline(work, rndr, data[:i])
|
||||
r := render_method(out, work.Bytes(), rndr.mk.opaque)
|
||||
r := render_method(out, work.Bytes(), rndr.mk.Opaque)
|
||||
if r > 0 {
|
||||
return i + 2
|
||||
} else {
|
||||
|
@ -950,12 +950,12 @@ func inlineHelperEmph3(out *bytes.Buffer, rndr *render, data []byte, offset int,
|
|||
}
|
||||
|
||||
switch {
|
||||
case (i+2 < len(data) && data[i+1] == c && data[i+2] == c && rndr.mk.tripleEmphasis != nil):
|
||||
case (i+2 < len(data) && data[i+1] == c && data[i+2] == c && rndr.mk.TripleEmphasis != nil):
|
||||
// triple symbol found
|
||||
work := bytes.NewBuffer(nil)
|
||||
|
||||
parseInline(work, rndr, data[:i])
|
||||
r := rndr.mk.tripleEmphasis(out, work.Bytes(), rndr.mk.opaque)
|
||||
r := rndr.mk.TripleEmphasis(out, work.Bytes(), rndr.mk.Opaque)
|
||||
if r > 0 {
|
||||
return i + 3
|
||||
} else {
|
||||
|
|
64
latex.go
64
latex.go
|
@ -19,40 +19,40 @@ import (
|
|||
func LatexRenderer(flags int) *Renderer {
|
||||
// block-level rendering
|
||||
r := new(Renderer)
|
||||
r.blockcode = latexBlockcode
|
||||
r.blockquote = latexBlockquote
|
||||
//r.blockhtml = ?
|
||||
r.header = latexHeader
|
||||
r.hrule = latexHrule
|
||||
r.list = latexList
|
||||
r.listitem = latexListitem
|
||||
r.paragraph = latexParagraph
|
||||
r.table = latexTable
|
||||
r.tableRow = latexTableRow
|
||||
r.tableCell = latexTableCell
|
||||
r.BlockCode = latexBlockCode
|
||||
r.BlockQuote = latexBlockQuote
|
||||
//r.BlockHtml = ?
|
||||
r.Header = latexHeader
|
||||
r.HRule = latexHRule
|
||||
r.List = latexList
|
||||
r.ListItem = latexListItem
|
||||
r.Paragraph = latexParagraph
|
||||
r.Table = latexTable
|
||||
r.TableRow = latexTableRow
|
||||
r.TableCell = latexTableCell
|
||||
|
||||
// inline rendering
|
||||
r.autolink = latexAutolink
|
||||
r.codespan = latexCodespan
|
||||
r.doubleEmphasis = latexDoubleEmphasis
|
||||
r.emphasis = latexEmphasis
|
||||
r.image = latexImage
|
||||
r.linebreak = latexLinebreak
|
||||
r.link = latexLink
|
||||
r.AutoLink = latexAutoLink
|
||||
r.CodeSpan = latexCodeSpan
|
||||
r.DoubleEmphasis = latexDoubleEmphasis
|
||||
r.Emphasis = latexEmphasis
|
||||
r.Image = latexImage
|
||||
r.LineBreak = latexLineBreak
|
||||
r.Link = latexLink
|
||||
//r.rawHtmlTag = ?
|
||||
r.strikethrough = latexStrikethrough
|
||||
r.StrikeThrough = latexStrikeThrough
|
||||
|
||||
r.normalText = latexNormalText
|
||||
r.NormalText = latexNormalText
|
||||
|
||||
r.documentHeader = latexDocumentHeader
|
||||
r.documentFooter = latexDocumentFooter
|
||||
r.DocumentHeader = latexDocumentHeader
|
||||
r.DocumentFooter = latexDocumentFooter
|
||||
|
||||
r.opaque = nil
|
||||
r.Opaque = nil
|
||||
return r
|
||||
}
|
||||
|
||||
// render code chunks using verbatim, or listings if we have a language
|
||||
func latexBlockcode(out *bytes.Buffer, text []byte, lang string, opaque interface{}) {
|
||||
func latexBlockCode(out *bytes.Buffer, text []byte, lang string, opaque interface{}) {
|
||||
if lang == "" {
|
||||
out.WriteString("\n\\begin{verbatim}\n")
|
||||
} else {
|
||||
|
@ -68,13 +68,13 @@ func latexBlockcode(out *bytes.Buffer, text []byte, lang string, opaque interfac
|
|||
}
|
||||
}
|
||||
|
||||
func latexBlockquote(out *bytes.Buffer, text []byte, opaque interface{}) {
|
||||
func latexBlockQuote(out *bytes.Buffer, text []byte, opaque interface{}) {
|
||||
out.WriteString("\n\\begin{quotation}\n")
|
||||
out.Write(text)
|
||||
out.WriteString("\n\\end{quotation}\n")
|
||||
}
|
||||
|
||||
//blockhtml func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
//BlockHtml func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
|
||||
func latexHeader(out *bytes.Buffer, text []byte, level int, opaque interface{}) {
|
||||
switch level {
|
||||
|
@ -95,7 +95,7 @@ func latexHeader(out *bytes.Buffer, text []byte, level int, opaque interface{})
|
|||
out.WriteString("}\n")
|
||||
}
|
||||
|
||||
func latexHrule(out *bytes.Buffer, opaque interface{}) {
|
||||
func latexHRule(out *bytes.Buffer, opaque interface{}) {
|
||||
out.WriteString("\n\\HRule\n")
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ func latexList(out *bytes.Buffer, text []byte, flags int, opaque interface{}) {
|
|||
}
|
||||
}
|
||||
|
||||
func latexListitem(out *bytes.Buffer, text []byte, flags int, opaque interface{}) {
|
||||
func latexListItem(out *bytes.Buffer, text []byte, flags int, opaque interface{}) {
|
||||
out.WriteString("\n\\item ")
|
||||
out.Write(text)
|
||||
}
|
||||
|
@ -157,7 +157,7 @@ func latexTableCell(out *bytes.Buffer, text []byte, align int, opaque interface{
|
|||
out.Write(text)
|
||||
}
|
||||
|
||||
func latexAutolink(out *bytes.Buffer, link []byte, kind int, opaque interface{}) int {
|
||||
func latexAutoLink(out *bytes.Buffer, link []byte, kind int, opaque interface{}) int {
|
||||
out.WriteString("\\href{")
|
||||
if kind == LINK_TYPE_EMAIL {
|
||||
out.WriteString("mailto:")
|
||||
|
@ -169,7 +169,7 @@ func latexAutolink(out *bytes.Buffer, link []byte, kind int, opaque interface{})
|
|||
return 1
|
||||
}
|
||||
|
||||
func latexCodespan(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
func latexCodeSpan(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
out.WriteString("\\texttt{")
|
||||
escapeSpecialChars(out, text)
|
||||
out.WriteString("}")
|
||||
|
@ -206,7 +206,7 @@ func latexImage(out *bytes.Buffer, link []byte, title []byte, alt []byte, opaque
|
|||
return 1
|
||||
}
|
||||
|
||||
func latexLinebreak(out *bytes.Buffer, opaque interface{}) int {
|
||||
func latexLineBreak(out *bytes.Buffer, opaque interface{}) int {
|
||||
out.WriteString(" \\\\\n")
|
||||
return 1
|
||||
}
|
||||
|
@ -231,7 +231,7 @@ func latexTripleEmphasis(out *bytes.Buffer, text []byte, opaque interface{}) int
|
|||
return 1
|
||||
}
|
||||
|
||||
func latexStrikethrough(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
func latexStrikeThrough(out *bytes.Buffer, text []byte, opaque interface{}) int {
|
||||
out.WriteString("\\sout{")
|
||||
out.Write(text)
|
||||
out.WriteString("}")
|
||||
|
|
84
markdown.go
84
markdown.go
|
@ -95,40 +95,40 @@ var block_tags = map[string]bool{
|
|||
// Most users will use the convenience functions to fill in this structure.
|
||||
type Renderer struct {
|
||||
// block-level callbacks---nil skips the block
|
||||
blockcode func(out *bytes.Buffer, text []byte, lang string, opaque interface{})
|
||||
blockquote func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
blockhtml func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
header func(out *bytes.Buffer, text []byte, level int, opaque interface{})
|
||||
hrule func(out *bytes.Buffer, opaque interface{})
|
||||
list func(out *bytes.Buffer, text []byte, flags int, opaque interface{})
|
||||
listitem func(out *bytes.Buffer, text []byte, flags int, opaque interface{})
|
||||
paragraph func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
table func(out *bytes.Buffer, header []byte, body []byte, columnData []int, opaque interface{})
|
||||
tableRow func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
tableCell func(out *bytes.Buffer, text []byte, flags int, opaque interface{})
|
||||
BlockCode func(out *bytes.Buffer, text []byte, lang string, opaque interface{})
|
||||
BlockQuote func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
BlockHtml func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
Header func(out *bytes.Buffer, text []byte, level int, opaque interface{})
|
||||
HRule func(out *bytes.Buffer, opaque interface{})
|
||||
List func(out *bytes.Buffer, text []byte, flags int, opaque interface{})
|
||||
ListItem func(out *bytes.Buffer, text []byte, flags int, opaque interface{})
|
||||
Paragraph func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
Table func(out *bytes.Buffer, header []byte, body []byte, columnData []int, opaque interface{})
|
||||
TableRow func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
TableCell func(out *bytes.Buffer, text []byte, flags int, opaque interface{})
|
||||
|
||||
// span-level callbacks---nil or return 0 prints the span verbatim
|
||||
autolink func(out *bytes.Buffer, link []byte, kind int, opaque interface{}) int
|
||||
codespan func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
doubleEmphasis func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
emphasis func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
image func(out *bytes.Buffer, link []byte, title []byte, alt []byte, opaque interface{}) int
|
||||
linebreak func(out *bytes.Buffer, opaque interface{}) int
|
||||
link func(out *bytes.Buffer, link []byte, title []byte, content []byte, opaque interface{}) int
|
||||
rawHtmlTag func(out *bytes.Buffer, tag []byte, opaque interface{}) int
|
||||
tripleEmphasis func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
strikethrough func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
// Span-level callbacks---nil or return 0 prints the span verbatim
|
||||
AutoLink func(out *bytes.Buffer, link []byte, kind int, opaque interface{}) int
|
||||
CodeSpan func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
DoubleEmphasis func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
Emphasis func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
Image func(out *bytes.Buffer, link []byte, title []byte, alt []byte, opaque interface{}) int
|
||||
LineBreak func(out *bytes.Buffer, opaque interface{}) int
|
||||
Link func(out *bytes.Buffer, link []byte, title []byte, content []byte, opaque interface{}) int
|
||||
RawHtmlTag func(out *bytes.Buffer, tag []byte, opaque interface{}) int
|
||||
TripleEmphasis func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
StrikeThrough func(out *bytes.Buffer, text []byte, opaque interface{}) int
|
||||
|
||||
// low-level callbacks---nil copies input directly into the output
|
||||
entity func(out *bytes.Buffer, entity []byte, opaque interface{})
|
||||
normalText func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
// Low-level callbacks---nil copies input directly into the output
|
||||
Entity func(out *bytes.Buffer, entity []byte, opaque interface{})
|
||||
NormalText func(out *bytes.Buffer, text []byte, opaque interface{})
|
||||
|
||||
// header and footer
|
||||
documentHeader func(out *bytes.Buffer, opaque interface{})
|
||||
documentFooter func(out *bytes.Buffer, opaque interface{})
|
||||
// Header and footer
|
||||
DocumentHeader func(out *bytes.Buffer, opaque interface{})
|
||||
DocumentFooter func(out *bytes.Buffer, opaque interface{})
|
||||
|
||||
// user data---passed back to every callback
|
||||
opaque interface{}
|
||||
// User data---passed back to every callback
|
||||
Opaque interface{}
|
||||
}
|
||||
|
||||
type inlineParser func(out *bytes.Buffer, rndr *render, data []byte, offset int) int
|
||||
|
@ -166,28 +166,28 @@ func Markdown(input []byte, renderer *Renderer, extensions uint32) []byte {
|
|||
rndr.maxNesting = 16
|
||||
|
||||
// register inline parsers
|
||||
if rndr.mk.emphasis != nil || rndr.mk.doubleEmphasis != nil || rndr.mk.tripleEmphasis != nil {
|
||||
if rndr.mk.Emphasis != nil || rndr.mk.DoubleEmphasis != nil || rndr.mk.TripleEmphasis != nil {
|
||||
rndr.inline['*'] = inlineEmphasis
|
||||
rndr.inline['_'] = inlineEmphasis
|
||||
if extensions&EXTENSION_STRIKETHROUGH != 0 {
|
||||
rndr.inline['~'] = inlineEmphasis
|
||||
}
|
||||
}
|
||||
if rndr.mk.codespan != nil {
|
||||
rndr.inline['`'] = inlineCodespan
|
||||
if rndr.mk.CodeSpan != nil {
|
||||
rndr.inline['`'] = inlineCodeSpan
|
||||
}
|
||||
if rndr.mk.linebreak != nil {
|
||||
rndr.inline['\n'] = inlineLinebreak
|
||||
if rndr.mk.LineBreak != nil {
|
||||
rndr.inline['\n'] = inlineLineBreak
|
||||
}
|
||||
if rndr.mk.image != nil || rndr.mk.link != nil {
|
||||
if rndr.mk.Image != nil || rndr.mk.Link != nil {
|
||||
rndr.inline['['] = inlineLink
|
||||
}
|
||||
rndr.inline['<'] = inlineLangle
|
||||
rndr.inline['<'] = inlineLAngle
|
||||
rndr.inline['\\'] = inlineEscape
|
||||
rndr.inline['&'] = inlineEntity
|
||||
|
||||
if extensions&EXTENSION_AUTOLINK != 0 {
|
||||
rndr.inline[':'] = inlineAutolink
|
||||
rndr.inline[':'] = inlineAutoLink
|
||||
}
|
||||
|
||||
// first pass: look for references, copy everything else
|
||||
|
@ -221,8 +221,8 @@ func Markdown(input []byte, renderer *Renderer, extensions uint32) []byte {
|
|||
|
||||
// second pass: actual rendering
|
||||
output := bytes.NewBuffer(nil)
|
||||
if rndr.mk.documentHeader != nil {
|
||||
rndr.mk.documentHeader(output, rndr.mk.opaque)
|
||||
if rndr.mk.DocumentHeader != nil {
|
||||
rndr.mk.DocumentHeader(output, rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
if text.Len() > 0 {
|
||||
|
@ -234,8 +234,8 @@ func Markdown(input []byte, renderer *Renderer, extensions uint32) []byte {
|
|||
parseBlock(output, rndr, text.Bytes())
|
||||
}
|
||||
|
||||
if rndr.mk.documentFooter != nil {
|
||||
rndr.mk.documentFooter(output, rndr.mk.opaque)
|
||||
if rndr.mk.DocumentFooter != nil {
|
||||
rndr.mk.DocumentFooter(output, rndr.mk.Opaque)
|
||||
}
|
||||
|
||||
if rndr.nesting != 0 {
|
||||
|
|
Loading…
Reference in New Issue