/** * @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 }); }