mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
3.4 KiB
194 lines
3.4 KiB
/**
|
|
* @author Titus Wormer
|
|
* @copyright 2015 Titus Wormer
|
|
* @license MIT
|
|
* @module remark:parse:tokenize:footnote-definition
|
|
* @fileoverview Tokenise footnote definition.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var whitespace = require('is-whitespace-character');
|
|
var normalize = require('../util/normalize');
|
|
|
|
module.exports = footnoteDefinition;
|
|
footnoteDefinition.notInList = true;
|
|
footnoteDefinition.notInBlock = true;
|
|
|
|
var C_BACKSLASH = '\\';
|
|
var C_NEWLINE = '\n';
|
|
var C_TAB = '\t';
|
|
var C_SPACE = ' ';
|
|
var C_BRACKET_OPEN = '[';
|
|
var C_BRACKET_CLOSE = ']';
|
|
var C_CARET = '^';
|
|
var C_COLON = ':';
|
|
|
|
var EXPRESSION_INITIAL_TAB = /^( {4}|\t)?/gm;
|
|
|
|
/* Tokenise a footnote definition. */
|
|
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) !== C_BRACKET_OPEN ||
|
|
value.charAt(index + 1) !== C_CARET
|
|
) {
|
|
return;
|
|
}
|
|
|
|
subvalue += C_BRACKET_OPEN + C_CARET;
|
|
index = subvalue.length;
|
|
queue = '';
|
|
|
|
while (index < length) {
|
|
character = value.charAt(index);
|
|
|
|
if (character === C_BRACKET_CLOSE) {
|
|
break;
|
|
} else if (character === C_BACKSLASH) {
|
|
queue += character;
|
|
index++;
|
|
character = value.charAt(index);
|
|
}
|
|
|
|
queue += character;
|
|
index++;
|
|
}
|
|
|
|
if (
|
|
!queue ||
|
|
value.charAt(index) !== C_BRACKET_CLOSE ||
|
|
value.charAt(index + 1) !== C_COLON
|
|
) {
|
|
return;
|
|
}
|
|
|
|
if (silent) {
|
|
return true;
|
|
}
|
|
|
|
identifier = normalize(queue);
|
|
subvalue += queue + C_BRACKET_CLOSE + C_COLON;
|
|
index = subvalue.length;
|
|
|
|
while (index < length) {
|
|
character = value.charAt(index);
|
|
|
|
if (character !== C_TAB && character !== C_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 === C_NEWLINE) {
|
|
subqueue = character;
|
|
index++;
|
|
|
|
while (index < length) {
|
|
character = value.charAt(index);
|
|
|
|
if (character !== C_NEWLINE) {
|
|
break;
|
|
}
|
|
|
|
subqueue += character;
|
|
index++;
|
|
}
|
|
|
|
queue += subqueue;
|
|
subqueue = '';
|
|
|
|
while (index < length) {
|
|
character = value.charAt(index);
|
|
|
|
if (character !== C_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: identifier,
|
|
children: content
|
|
});
|
|
}
|
|
|