3 var decode = require('parse-entities');
4 var whitespace = require('is-whitespace-character');
5 var locate = require('../locate/url');
11 var C_BRACKET_OPEN = '[';
12 var C_BRACKET_CLOSE = ']';
13 var C_PAREN_OPEN = '(';
14 var C_PAREN_CLOSE = ')';
18 var HTTP_PROTOCOL = 'http://';
19 var HTTPS_PROTOCOL = 'https://';
20 var MAILTO_PROTOCOL = 'mailto:';
28 var PROTOCOLS_LENGTH = PROTOCOLS.length;
30 function url(eat, value, silent) {
45 if (!self.options.gfm) {
51 length = PROTOCOLS_LENGTH;
53 while (++index < length) {
54 protocol = PROTOCOLS[index];
55 match = value.slice(0, protocol.length);
57 if (match.toLowerCase() === protocol) {
67 index = subvalue.length;
68 length = value.length;
72 while (index < length) {
73 character = value.charAt(index);
75 if (whitespace(character) || character === C_LT) {
89 nextCharacter = value.charAt(index + 1);
91 if (!nextCharacter || whitespace(nextCharacter)) {
96 if (character === C_PAREN_OPEN || character === C_BRACKET_OPEN) {
100 if (character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE) {
103 if (parenCount < 0) {
119 if (protocol === MAILTO_PROTOCOL) {
120 position = queue.indexOf(C_AT_SIGN);
122 if (position === -1 || position === length - 1) {
126 content = content.substr(MAILTO_PROTOCOL.length);
129 /* istanbul ignore if - never used (yet) */
134 exit = self.enterLink();
135 content = self.tokenizeInline(content, eat.now());
138 return eat(subvalue)({
141 url: decode(subvalue),