12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package parser
- import (
- "bytes"
- )
- // caption checks for a caption, it returns the caption data and a potential "headingID".
- func (p *Parser) caption(data, caption []byte) ([]byte, string, int) {
- if !bytes.HasPrefix(data, caption) {
- return nil, "", 0
- }
- j := len(caption)
- data = data[j:]
- end := LinesUntilEmpty(data)
- data = data[:end]
- id, start := captionID(data)
- if id != "" {
- return data[:start], id, end + j
- }
- return data, "", end + j
- }
- // LinesUntilEmpty scans lines up to the first empty line.
- func LinesUntilEmpty(data []byte) int {
- line, i := 0, 0
- for line < len(data) {
- i++
- // find the end of this line
- for i < len(data) && data[i-1] != '\n' {
- i++
- }
- if IsEmpty(data[line:i]) == 0 {
- line = i
- continue
- }
- break
- }
- return i
- }
- // captionID checks if the caption *ends* in {#....}. If so the text after {# is taken to be
- // the ID/anchor of the entire figure block.
- func captionID(data []byte) (string, int) {
- end := len(data)
- j, k := 0, 0
- // find start/end of heading id
- for j = 0; j < end-1 && (data[j] != '{' || data[j+1] != '#'); j++ {
- }
- for k = j + 1; k < end && data[k] != '}'; k++ {
- }
- // remains must be whitespace.
- for l := k + 1; l < end; l++ {
- if !IsSpace(data[l]) {
- return "", 0
- }
- }
- if j > 0 && k > 0 && j+2 < k {
- return string(data[j+2 : k]), j
- }
- return "", 0
- }
|