12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package parser
- import (
- "bytes"
- "github.com/gomarkdown/markdown/ast"
- )
- // returns aisde prefix length
- func (p *Parser) asidePrefix(data []byte) int {
- i := 0
- n := len(data)
- for i < 3 && i < n && data[i] == ' ' {
- i++
- }
- if i+1 < n && data[i] == 'A' && data[i+1] == '>' {
- if i+2 < n && data[i+2] == ' ' {
- return i + 3
- }
- return i + 2
- }
- return 0
- }
- // aside ends with at least one blank line
- // followed by something without a aside prefix
- func (p *Parser) terminateAside(data []byte, beg, end int) bool {
- if IsEmpty(data[beg:]) <= 0 {
- return false
- }
- if end >= len(data) {
- return true
- }
- return p.asidePrefix(data[end:]) == 0 && IsEmpty(data[end:]) == 0
- }
- // parse a aside fragment
- func (p *Parser) aside(data []byte) int {
- var raw bytes.Buffer
- beg, end := 0, 0
- // identical to quote
- for beg < len(data) {
- end = beg
- // Step over whole lines, collecting them. While doing that, check for
- // fenced code and if one's found, incorporate it altogether,
- // irregardless of any contents inside it
- for end < len(data) && data[end] != '\n' {
- if p.extensions&FencedCode != 0 {
- if i := p.fencedCodeBlock(data[end:], false); i > 0 {
- // -1 to compensate for the extra end++ after the loop:
- end += i - 1
- break
- }
- }
- end++
- }
- end = skipCharN(data, end, '\n', 1)
- if pre := p.asidePrefix(data[beg:]); pre > 0 {
- // skip the prefix
- beg += pre
- } else if p.terminateAside(data, beg, end) {
- break
- }
- // this line is part of the aside
- raw.Write(data[beg:end])
- beg = end
- }
- block := p.AddBlock(&ast.Aside{})
- p.Block(raw.Bytes())
- p.Finalize(block)
- return end
- }
|