.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / remark-parse / lib / tokenize / url.js
1 'use strict';
2
3 var decode = require('parse-entities');
4 var whitespace = require('is-whitespace-character');
5 var locate = require('../locate/url');
6
7 module.exports = url;
8 url.locator = locate;
9 url.notInLink = true;
10
11 var C_BRACKET_OPEN = '[';
12 var C_BRACKET_CLOSE = ']';
13 var C_PAREN_OPEN = '(';
14 var C_PAREN_CLOSE = ')';
15 var C_LT = '<';
16 var C_AT_SIGN = '@';
17
18 var HTTP_PROTOCOL = 'http://';
19 var HTTPS_PROTOCOL = 'https://';
20 var MAILTO_PROTOCOL = 'mailto:';
21
22 var PROTOCOLS = [
23   HTTP_PROTOCOL,
24   HTTPS_PROTOCOL,
25   MAILTO_PROTOCOL
26 ];
27
28 var PROTOCOLS_LENGTH = PROTOCOLS.length;
29
30 function url(eat, value, silent) {
31   var self = this;
32   var subvalue;
33   var content;
34   var character;
35   var index;
36   var position;
37   var protocol;
38   var match;
39   var length;
40   var queue;
41   var parenCount;
42   var nextCharacter;
43   var exit;
44
45   if (!self.options.gfm) {
46     return;
47   }
48
49   subvalue = '';
50   index = -1;
51   length = PROTOCOLS_LENGTH;
52
53   while (++index < length) {
54     protocol = PROTOCOLS[index];
55     match = value.slice(0, protocol.length);
56
57     if (match.toLowerCase() === protocol) {
58       subvalue = match;
59       break;
60     }
61   }
62
63   if (!subvalue) {
64     return;
65   }
66
67   index = subvalue.length;
68   length = value.length;
69   queue = '';
70   parenCount = 0;
71
72   while (index < length) {
73     character = value.charAt(index);
74
75     if (whitespace(character) || character === C_LT) {
76       break;
77     }
78
79     if (
80       character === '.' ||
81       character === ',' ||
82       character === ':' ||
83       character === ';' ||
84       character === '"' ||
85       character === '\'' ||
86       character === ')' ||
87       character === ']'
88     ) {
89       nextCharacter = value.charAt(index + 1);
90
91       if (!nextCharacter || whitespace(nextCharacter)) {
92         break;
93       }
94     }
95
96     if (character === C_PAREN_OPEN || character === C_BRACKET_OPEN) {
97       parenCount++;
98     }
99
100     if (character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE) {
101       parenCount--;
102
103       if (parenCount < 0) {
104         break;
105       }
106     }
107
108     queue += character;
109     index++;
110   }
111
112   if (!queue) {
113     return;
114   }
115
116   subvalue += queue;
117   content = subvalue;
118
119   if (protocol === MAILTO_PROTOCOL) {
120     position = queue.indexOf(C_AT_SIGN);
121
122     if (position === -1 || position === length - 1) {
123       return;
124     }
125
126     content = content.substr(MAILTO_PROTOCOL.length);
127   }
128
129   /* istanbul ignore if - never used (yet) */
130   if (silent) {
131     return true;
132   }
133
134   exit = self.enterLink();
135   content = self.tokenizeInline(content, eat.now());
136   exit();
137
138   return eat(subvalue)({
139     type: 'link',
140     title: null,
141     url: decode(subvalue),
142     children: content
143   });
144 }