UNPKG

@mapbox/jsxtreme-markdown

Version:
276 lines (217 loc) 5.21 kB
'use strict'; var whitespace = require('is-whitespace-character'); var normalize = require('../util/normalize'); module.exports = definition; var quotationMark = '"'; var apostrophe = "'"; var backslash = '\\'; var lineFeed = '\n'; var tab = '\t'; var space = ' '; var leftSquareBracket = '['; var rightSquareBracket = ']'; var leftParenthesis = '('; var rightParenthesis = ')'; var colon = ':'; var lessThan = '<'; var greaterThan = '>'; function definition(eat, value, silent) { var self = this; var commonmark = self.options.commonmark; var index = 0; var length = value.length; var subvalue = ''; var beforeURL; var beforeTitle; var queue; var character; var test; var identifier; var url; var title; while (index < length) { character = value.charAt(index); if (character !== space && character !== tab) { break; } subvalue += character; index++; } character = value.charAt(index); if (character !== leftSquareBracket) { return; } index++; subvalue += character; 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; } identifier = queue; subvalue += queue + rightSquareBracket + colon; index = subvalue.length; queue = ''; while (index < length) { character = value.charAt(index); if (character !== tab && character !== space && character !== lineFeed) { break; } subvalue += character; index++; } character = value.charAt(index); queue = ''; beforeURL = subvalue; if (character === lessThan) { index++; while (index < length) { character = value.charAt(index); if (!isEnclosedURLCharacter(character)) { break; } queue += character; index++; } character = value.charAt(index); if (character === isEnclosedURLCharacter.delimiter) { subvalue += lessThan + queue + character; index++; } else { if (commonmark) { return; } index -= queue.length + 1; queue = ''; } } if (!queue) { while (index < length) { character = value.charAt(index); if (!isUnclosedURLCharacter(character)) { break; } queue += character; index++; } subvalue += queue; } if (!queue) { return; } url = queue; queue = ''; while (index < length) { character = value.charAt(index); if (character !== tab && character !== space && character !== lineFeed) { break; } queue += character; index++; } character = value.charAt(index); test = null; if (character === quotationMark) { test = quotationMark; } else if (character === apostrophe) { test = apostrophe; } else if (character === leftParenthesis) { test = rightParenthesis; } if (!test) { queue = ''; index = subvalue.length; } else if (queue) { subvalue += queue + character; index = subvalue.length; queue = ''; while (index < length) { character = value.charAt(index); if (character === test) { break; } if (character === lineFeed) { index++; character = value.charAt(index); if (character === lineFeed || character === test) { return; } queue += lineFeed; } queue += character; index++; } character = value.charAt(index); if (character !== test) { return; } beforeTitle = subvalue; subvalue += queue + character; index++; title = queue; queue = ''; } else { return; } while (index < length) { character = value.charAt(index); if (character !== tab && character !== space) { break; } subvalue += character; index++; } character = value.charAt(index); if (!character || character === lineFeed) { if (silent) { return true; } beforeURL = eat(beforeURL).test().end; url = self.decode.raw(self.unescape(url), beforeURL, { nonTerminated: false, }); if (title) { beforeTitle = eat(beforeTitle).test().end; title = self.decode.raw(self.unescape(title), beforeTitle); } return eat(subvalue)({ type: 'definition', identifier: normalize(identifier), label: identifier, title: title || null, url: url, }); } } // Check if `character` can be inside an enclosed URI. function isEnclosedURLCharacter(character) { return ( character !== greaterThan && character !== leftSquareBracket && character !== rightSquareBracket ); } isEnclosedURLCharacter.delimiter = greaterThan; // Check if `character` can be inside an unclosed URI. function isUnclosedURLCharacter(character) { return ( character !== leftSquareBracket && character !== rightSquareBracket && !whitespace(character) ); }