187 lines
3.2 KiB
JavaScript
187 lines
3.2 KiB
JavaScript
|
|
'use strict'
|
||
|
|
|
||
|
|
var whitespace = require('is-whitespace-character')
|
||
|
|
var normalize = require('../util/normalize')
|
||
|
|
|
||
|
|
module.exports = footnoteDefinition
|
||
|
|
footnoteDefinition.notInList = true
|
||
|
|
footnoteDefinition.notInBlock = true
|
||
|
|
|
||
|
|
var backslash = '\\'
|
||
|
|
var lineFeed = '\n'
|
||
|
|
var tab = '\t'
|
||
|
|
var space = ' '
|
||
|
|
var leftSquareBracket = '['
|
||
|
|
var rightSquareBracket = ']'
|
||
|
|
var caret = '^'
|
||
|
|
var colon = ':'
|
||
|
|
|
||
|
|
var EXPRESSION_INITIAL_TAB = /^( {4}|\t)?/gm
|
||
|
|
|
||
|
|
function footnoteDefinition(eat, value, silent) {
|
||
|
|
var self = this
|
||
|
|
var offsets = self.offset
|
||
|
|
var index
|
||
|
|
var length
|
||
|
|
var subvalue
|
||
|
|
var now
|
||
|
|
var currentLine
|
||
|
|
var content
|
||
|
|
var queue
|
||
|
|
var subqueue
|
||
|
|
var character
|
||
|
|
var identifier
|
||
|
|
var add
|
||
|
|
var exit
|
||
|
|
|
||
|
|
if (!self.options.footnotes) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
index = 0
|
||
|
|
length = value.length
|
||
|
|
subvalue = ''
|
||
|
|
now = eat.now()
|
||
|
|
currentLine = now.line
|
||
|
|
|
||
|
|
while (index < length) {
|
||
|
|
character = value.charAt(index)
|
||
|
|
|
||
|
|
if (!whitespace(character)) {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
|
||
|
|
subvalue += character
|
||
|
|
index++
|
||
|
|
}
|
||
|
|
|
||
|
|
if (
|
||
|
|
value.charAt(index) !== leftSquareBracket ||
|
||
|
|
value.charAt(index + 1) !== caret
|
||
|
|
) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
subvalue += leftSquareBracket + caret
|
||
|
|
index = subvalue.length
|
||
|
|
queue = ''
|
||
|
|
|
||
|
|
while (index < length) {
|
||
|
|
character = value.charAt(index)
|
||
|
|
|
||
|
|
if (character === rightSquareBracket) {
|
||
|
|
break
|
||
|
|
} else if (character === backslash) {
|
||
|
|
queue += character
|
||
|
|
index++
|
||
|
|
character = value.charAt(index)
|
||
|
|
}
|
||
|
|
|
||
|
|
queue += character
|
||
|
|
index++
|
||
|
|
}
|
||
|
|
|
||
|
|
if (
|
||
|
|
!queue ||
|
||
|
|
value.charAt(index) !== rightSquareBracket ||
|
||
|
|
value.charAt(index + 1) !== colon
|
||
|
|
) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if (silent) {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
|
||
|
|
identifier = queue
|
||
|
|
subvalue += queue + rightSquareBracket + colon
|
||
|
|
index = subvalue.length
|
||
|
|
|
||
|
|
while (index < length) {
|
||
|
|
character = value.charAt(index)
|
||
|
|
|
||
|
|
if (character !== tab && character !== space) {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
|
||
|
|
subvalue += character
|
||
|
|
index++
|
||
|
|
}
|
||
|
|
|
||
|
|
now.column += subvalue.length
|
||
|
|
now.offset += subvalue.length
|
||
|
|
queue = ''
|
||
|
|
content = ''
|
||
|
|
subqueue = ''
|
||
|
|
|
||
|
|
while (index < length) {
|
||
|
|
character = value.charAt(index)
|
||
|
|
|
||
|
|
if (character === lineFeed) {
|
||
|
|
subqueue = character
|
||
|
|
index++
|
||
|
|
|
||
|
|
while (index < length) {
|
||
|
|
character = value.charAt(index)
|
||
|
|
|
||
|
|
if (character !== lineFeed) {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
|
||
|
|
subqueue += character
|
||
|
|
index++
|
||
|
|
}
|
||
|
|
|
||
|
|
queue += subqueue
|
||
|
|
subqueue = ''
|
||
|
|
|
||
|
|
while (index < length) {
|
||
|
|
character = value.charAt(index)
|
||
|
|
|
||
|
|
if (character !== space) {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
|
||
|
|
subqueue += character
|
||
|
|
index++
|
||
|
|
}
|
||
|
|
|
||
|
|
if (subqueue.length === 0) {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
|
||
|
|
queue += subqueue
|
||
|
|
}
|
||
|
|
|
||
|
|
if (queue) {
|
||
|
|
content += queue
|
||
|
|
queue = ''
|
||
|
|
}
|
||
|
|
|
||
|
|
content += character
|
||
|
|
index++
|
||
|
|
}
|
||
|
|
|
||
|
|
subvalue += content
|
||
|
|
|
||
|
|
content = content.replace(EXPRESSION_INITIAL_TAB, function(line) {
|
||
|
|
offsets[currentLine] = (offsets[currentLine] || 0) + line.length
|
||
|
|
currentLine++
|
||
|
|
|
||
|
|
return ''
|
||
|
|
})
|
||
|
|
|
||
|
|
add = eat(subvalue)
|
||
|
|
|
||
|
|
exit = self.enterBlock()
|
||
|
|
content = self.tokenizeBlock(content, now)
|
||
|
|
exit()
|
||
|
|
|
||
|
|
return add({
|
||
|
|
type: 'footnoteDefinition',
|
||
|
|
identifier: normalize(identifier),
|
||
|
|
label: identifier,
|
||
|
|
children: content
|
||
|
|
})
|
||
|
|
}
|