123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- '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)
- )
- }
|