| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- 'use strict';
- var decode = require('parse-entities');
- var whitespace = require('is-whitespace-character');
- var locate = require('../locate/url');
- module.exports = url;
- url.locator = locate;
- url.notInLink = true;
- var C_BRACKET_OPEN = '[';
- var C_BRACKET_CLOSE = ']';
- var C_PAREN_OPEN = '(';
- var C_PAREN_CLOSE = ')';
- var C_LT = '<';
- var C_AT_SIGN = '@';
- var HTTP_PROTOCOL = 'http://';
- var HTTPS_PROTOCOL = 'https://';
- var MAILTO_PROTOCOL = 'mailto:';
- var PROTOCOLS = [
- HTTP_PROTOCOL,
- HTTPS_PROTOCOL,
- MAILTO_PROTOCOL
- ];
- var PROTOCOLS_LENGTH = PROTOCOLS.length;
- function url(eat, value, silent) {
- var self = this;
- var subvalue;
- var content;
- var character;
- var index;
- var position;
- var protocol;
- var match;
- var length;
- var queue;
- var parenCount;
- var nextCharacter;
- var exit;
- if (!self.options.gfm) {
- return;
- }
- subvalue = '';
- index = -1;
- length = PROTOCOLS_LENGTH;
- while (++index < length) {
- protocol = PROTOCOLS[index];
- match = value.slice(0, protocol.length);
- if (match.toLowerCase() === protocol) {
- subvalue = match;
- break;
- }
- }
- if (!subvalue) {
- return;
- }
- index = subvalue.length;
- length = value.length;
- queue = '';
- parenCount = 0;
- while (index < length) {
- character = value.charAt(index);
- if (whitespace(character) || character === C_LT) {
- break;
- }
- if (
- character === '.' ||
- character === ',' ||
- character === ':' ||
- character === ';' ||
- character === '"' ||
- character === '\'' ||
- character === ')' ||
- character === ']'
- ) {
- nextCharacter = value.charAt(index + 1);
- if (!nextCharacter || whitespace(nextCharacter)) {
- break;
- }
- }
- if (character === C_PAREN_OPEN || character === C_BRACKET_OPEN) {
- parenCount++;
- }
- if (character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE) {
- parenCount--;
- if (parenCount < 0) {
- break;
- }
- }
- queue += character;
- index++;
- }
- if (!queue) {
- return;
- }
- subvalue += queue;
- content = subvalue;
- if (protocol === MAILTO_PROTOCOL) {
- position = queue.indexOf(C_AT_SIGN);
- if (position === -1 || position === length - 1) {
- return;
- }
- content = content.substr(MAILTO_PROTOCOL.length);
- }
- /* istanbul ignore if - never used (yet) */
- if (silent) {
- return true;
- }
- exit = self.enterLink();
- content = self.tokenizeInline(content, eat.now());
- exit();
- return eat(subvalue)({
- type: 'link',
- title: null,
- url: decode(subvalue, {nonTerminated: false}),
- children: content
- });
- }
|