rapier-html 1.2.46 → 1.2.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BUILD.json +4 -4
- package/README.md +12 -11
- package/dist/ledger/carried.mjs +17 -8
- package/dist/ledger/diff/concerns.mjs +2 -2
- package/dist/ledger/document-fonts.mjs +60 -6
- package/dist/ledger/source.mjs +31 -2
- package/dist/ledger/vendor/SOURCES.json +253 -0
- package/dist/ledger/vendor/entities/decode-codepoint.mjs +27 -0
- package/dist/ledger/vendor/entities.mjs +499 -0
- package/dist/ledger/vendor/linkify-it.mjs +427 -0
- package/dist/ledger/vendor/markdown-it.mjs +4027 -0
- package/dist/ledger/vendor/markdown-plugins.mjs +1328 -11
- package/dist/ledger/vendor/markdown-runtime.mjs +3 -11
- package/dist/ledger/vendor/mdurl/index.mjs +11 -0
- package/dist/ledger/vendor/mdurl/lib/decode.mjs +107 -0
- package/dist/ledger/vendor/mdurl/lib/encode.mjs +77 -0
- package/dist/ledger/vendor/mdurl/lib/format.mjs +20 -0
- package/dist/ledger/vendor/mdurl/lib/parse.mjs +231 -0
- package/dist/ledger/vendor/punycode.mjs +282 -0
- package/dist/ledger/vendor/uc.micro.mjs +49 -0
- package/dist/page.mjs +11 -3
- package/dist/rapier.html +97 -51
- package/dist/wrap.mjs +10 -5
- package/package.json +1 -1
- package/dist/ledger/vendor/BROWSER-ENTITIES.json +0 -36
- package/dist/ledger/vendor/MARKDOWN-RUNTIME.json +0 -136
- package/dist/ledger/vendor/MARKDOWNIT.json +0 -582
- package/dist/ledger/vendor/markdown-plugins.json +0 -46
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { Any, Cc, P, Z } from "./uc.micro.mjs";
|
|
2
|
+
var REBuilder = class {
|
|
3
|
+
src_Any = Any.source;
|
|
4
|
+
src_Cc = Cc.source;
|
|
5
|
+
src_Z = Z.source;
|
|
6
|
+
src_P = P.source;
|
|
7
|
+
src_ZPCc = [
|
|
8
|
+
this.src_Z,
|
|
9
|
+
this.src_P,
|
|
10
|
+
this.src_Cc
|
|
11
|
+
].join("|");
|
|
12
|
+
src_ZCc = [this.src_Z, this.src_Cc].join("|");
|
|
13
|
+
cache = {};
|
|
14
|
+
opts = {
|
|
15
|
+
maxLength: 1e4,
|
|
16
|
+
urlAuth: false,
|
|
17
|
+
schema_names: []
|
|
18
|
+
};
|
|
19
|
+
constructor(opts = {}) {
|
|
20
|
+
this.opts = {
|
|
21
|
+
...this.opts,
|
|
22
|
+
...opts
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
set(opts = {}) {
|
|
26
|
+
this.opts = {
|
|
27
|
+
...this.opts,
|
|
28
|
+
...opts
|
|
29
|
+
};
|
|
30
|
+
this.cache = {};
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
escapeRE(str) {
|
|
34
|
+
return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
|
|
35
|
+
}
|
|
36
|
+
nestedPairRE(open, close, depth = 4) {
|
|
37
|
+
const openRE = this.escapeRE(open);
|
|
38
|
+
const closeRE = this.escapeRE(close);
|
|
39
|
+
const atom = `(?:(?!${this.src_ZCc}|${openRE}|${closeRE}).)`;
|
|
40
|
+
let pair = `${openRE}${atom}{0,1000}${closeRE}`;
|
|
41
|
+
for (let level = 2; level <= depth; level++) pair = `${openRE}(?:${atom}|${pair}){0,1000}${closeRE}`;
|
|
42
|
+
return pair;
|
|
43
|
+
}
|
|
44
|
+
get_text_separators() {
|
|
45
|
+
return this.cache.text_separators ??= /[><\uff5c]/;
|
|
46
|
+
}
|
|
47
|
+
get_pseudo_letter() {
|
|
48
|
+
return this.cache.src_pseudo_letter ??= new RegExp(`(?:(?!${this.get_text_separators().source}|${this.src_ZPCc})${this.src_Any})`);
|
|
49
|
+
}
|
|
50
|
+
get_ipv4_addr() {
|
|
51
|
+
return this.cache.src_ip4 ??= /* @__PURE__ */ new RegExp("(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])[.]){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])");
|
|
52
|
+
}
|
|
53
|
+
get_ipv6_addr() {
|
|
54
|
+
const h16 = "[0-9A-Fa-f]{1,4}";
|
|
55
|
+
const ls32 = `(?:(?:${h16}:${h16})|${this.get_ipv4_addr().source})`;
|
|
56
|
+
return this.cache.src_ip6_addr ??= new RegExp(`(?:(?:${h16}:){6}${ls32}|::(?:${h16}:){5}${ls32}|(?:${h16})?::(?:${h16}:){4}${ls32}|(?:(?:${h16}:){0,1}${h16})?::(?:${h16}:){3}${ls32}|(?:(?:${h16}:){0,2}${h16})?::(?:${h16}:){2}${ls32}|(?:(?:${h16}:){0,3}${h16})?::${h16}:${ls32}|(?:(?:${h16}:){0,4}${h16})?::${ls32}|(?:(?:${h16}:){0,5}${h16})?::${h16}|(?:(?:${h16}:){0,6}${h16})?::)`);
|
|
57
|
+
}
|
|
58
|
+
get_ipv6_url_host() {
|
|
59
|
+
return this.cache.src_ip6_host ??= new RegExp(`\\[${this.get_ipv6_addr().source}\\]`);
|
|
60
|
+
}
|
|
61
|
+
get_ipv6_mail_host() {
|
|
62
|
+
return this.cache.src_ipv6_mail_host ??= new RegExp(`\\[IPv6:${this.get_ipv6_addr().source}\\]`);
|
|
63
|
+
}
|
|
64
|
+
get_auth() {
|
|
65
|
+
return this.cache.src_auth ??= new RegExp(`(?:(?:(?!${this.src_ZCc}|[@/\\[\\]()]).){1,50}@)?`);
|
|
66
|
+
}
|
|
67
|
+
get_port() {
|
|
68
|
+
return this.cache.src_port ??= /* @__PURE__ */ new RegExp("(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?");
|
|
69
|
+
}
|
|
70
|
+
get_host_terminator() {
|
|
71
|
+
return this.cache.src_host_terminator ??= new RegExp(`(?=$|${this.get_text_separators().source}|${this.src_ZPCc})(?!${this.opts["---"] ? "-(?!--)|" : "-|"}_|:\\d|\\.-|\\.(?!$|${this.src_ZPCc}))`);
|
|
72
|
+
}
|
|
73
|
+
get_path_terminator() {
|
|
74
|
+
return this.cache.src_path_terminator ??= new RegExp(`${this.src_ZPCc}|${this.get_text_separators().source}`);
|
|
75
|
+
}
|
|
76
|
+
get_path() {
|
|
77
|
+
return this.cache.src_path ??= new RegExp(`(?:[/?#](?:${this.nestedPairRE("[", "]")}|${this.nestedPairRE("(", ")")}|${this.nestedPairRE("{", "}")}|\\"(?:(?!${this.src_ZCc}|["]).){1,100}\\"|\\'(?:(?!${this.src_ZCc}|[']).){1,100}\\'|\\'(?=${this.get_pseudo_letter().source}|[-])|\\.{2,20}[:]?[a-zA-Z0-9%/&]|\\.(?!${this.src_ZCc}|[.]|$)|` + (this.opts["---"] ? "\\-(?!--(?:[^-]|$))(?:-{0,19})|" : "\\-{1,20}|") + `,(?!${this.src_ZCc}|$)|;(?!${this.src_ZCc}|$)|\\!{1,20}(?!${this.src_ZCc}|[!]|$)|\\?(?!${this.src_ZCc}|[?]|$)|` + this.get_path_extra().source + `[\\\\/:%@#&=_~*]|(?!${this.get_path_terminator().source}).){1,${this.opts.maxLength}}|\\/)?`);
|
|
78
|
+
}
|
|
79
|
+
get_mail_name() {
|
|
80
|
+
return this.cache.src_mail_name ??= /* @__PURE__ */ new RegExp("[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9](?:[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9]|[.](?=[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9])){0,63}");
|
|
81
|
+
}
|
|
82
|
+
get_xn() {
|
|
83
|
+
return this.cache.src_xn ??= /* @__PURE__ */ new RegExp("xn--[a-z0-9\\-]{1,59}");
|
|
84
|
+
}
|
|
85
|
+
get_tld() {
|
|
86
|
+
if (this.cache.tld) return this.cache.tld;
|
|
87
|
+
const tlds_src = [...new Set(this.opts.tlds || [])].sort().reverse().join("|");
|
|
88
|
+
this.cache.tld = new RegExp(`${tlds_src || "$#none#$"}|${this.get_xn().source}`);
|
|
89
|
+
return this.cache.tld;
|
|
90
|
+
}
|
|
91
|
+
get_domain_root() {
|
|
92
|
+
return this.cache.src_domain_root ??= new RegExp("(?:" + this.get_xn().source + `|${this.get_pseudo_letter().source}{1,63})`);
|
|
93
|
+
}
|
|
94
|
+
get_domain() {
|
|
95
|
+
return this.cache.src_domain ??= new RegExp("(?:" + this.get_xn().source + `|(?:${this.get_pseudo_letter().source})|(?:${this.get_pseudo_letter().source}(?:-|${this.get_pseudo_letter().source}){0,61}${this.get_pseudo_letter().source}))`);
|
|
96
|
+
}
|
|
97
|
+
get_url_host_port() {
|
|
98
|
+
return this.cache.url_host_port ??= new RegExp("(?:" + this.get_ipv6_url_host().source + `|(?:(?:(?:${this.get_domain().source})\\.){0,10}${this.get_domain().source}))` + this.get_port().source + this.get_host_terminator().source);
|
|
99
|
+
}
|
|
100
|
+
get_fuzzy_url_host_port() {
|
|
101
|
+
return this.cache.fuzzy_url_host_port ??= new RegExp("(?:" + (this.opts.fuzzyIP ? this.get_ipv4_addr().source + "|" : "") + `(?:(?:(?:${this.get_domain().source})\\.){1,10}(?:${this.get_tld().source})))` + this.get_host_terminator().source);
|
|
102
|
+
}
|
|
103
|
+
get_mail_host() {
|
|
104
|
+
return this.cache.src_mail_host ??= new RegExp("(?:" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})\\.){0,4}${this.get_domain().source}))` + this.get_host_terminator().source);
|
|
105
|
+
}
|
|
106
|
+
get_fuzzy_mail_host() {
|
|
107
|
+
return this.cache.src_fuzzy_mail_host ??= new RegExp("(?:" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})[.]){1,4}${this.get_domain_root().source}))` + this.get_host_terminator().source);
|
|
108
|
+
}
|
|
109
|
+
get_path_extra() {
|
|
110
|
+
return this.cache.src_path_extra ??= /* @__PURE__ */ new RegExp("");
|
|
111
|
+
}
|
|
112
|
+
get_fuzzy_mail_host_search() {
|
|
113
|
+
return this.cache.mail_fuzzy_host_search ??= new RegExp(`@${this.get_fuzzy_mail_host().source}`, "ig");
|
|
114
|
+
}
|
|
115
|
+
get_fuzzy_link_search() {
|
|
116
|
+
return this.cache.link_fuzzy_search ??= new RegExp(`(^|(?![.:/\\-_@])(?:[$+<=>^\`|\uff5c]|${this.src_ZPCc}))(?:(?![$+<=>^\`|\uff5c])${this.get_fuzzy_url_host_port().source}${this.get_path().source})`, "ig");
|
|
117
|
+
}
|
|
118
|
+
get_http_validator() {
|
|
119
|
+
return this.cache.http_validator ??= new RegExp("\\/\\/" + (this.opts.urlAuth ? this.get_auth().source : "") + this.get_url_host_port().source + this.get_path().source, "iy");
|
|
120
|
+
}
|
|
121
|
+
get_relative_proto_validator() {
|
|
122
|
+
return this.cache.relative_proto_validator ??= new RegExp((this.opts.urlAuth ? this.get_auth().source : "") + `(?:localhost|${this.get_ipv6_url_host().source}|(?:(?:${this.get_domain().source})[.]){1,10}${this.get_domain_root().source})` + this.get_port().source + this.get_host_terminator().source + this.get_path().source, "iy");
|
|
123
|
+
}
|
|
124
|
+
get_mail_name_validator() {
|
|
125
|
+
return this.cache.mail_name_validator ??= new RegExp(`(?:^|${this.get_text_separators().source}|"|\\(|${this.src_ZCc})(${this.get_mail_name().source})$`);
|
|
126
|
+
}
|
|
127
|
+
get_mailto_validator() {
|
|
128
|
+
return this.cache.mailto_validator ??= new RegExp(`${this.get_mail_name().source}@${this.get_mail_host().source}`, "iy");
|
|
129
|
+
}
|
|
130
|
+
get_schema_names() {
|
|
131
|
+
return this.cache.schema_names ??= new RegExp((this.opts.schema_names || []).map((name) => this.escapeRE(name)).join("|"));
|
|
132
|
+
}
|
|
133
|
+
get_schema_search() {
|
|
134
|
+
return this.cache.schema_search ??= new RegExp(`(^|(?!_)(?:[><\uff5c]|${this.src_ZPCc}))(${this.get_schema_names().source})`, "ig");
|
|
135
|
+
}
|
|
136
|
+
get_schema_at_start() {
|
|
137
|
+
return this.cache.schema_at_start ??= new RegExp(`^${this.get_schema_search().source}`, "i");
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
var web_schema = {
|
|
141
|
+
validate: (text, pos, self) => {
|
|
142
|
+
const re = self.re.get_http_validator();
|
|
143
|
+
re.lastIndex = pos;
|
|
144
|
+
const m = re.exec(text);
|
|
145
|
+
return m ? m[0].length : 0;
|
|
146
|
+
},
|
|
147
|
+
normalize: (match, self) => self.normalize(match)
|
|
148
|
+
};
|
|
149
|
+
var defaultSchemas = {
|
|
150
|
+
"http:": web_schema,
|
|
151
|
+
"https:": web_schema,
|
|
152
|
+
"ftp:": web_schema,
|
|
153
|
+
"//": {
|
|
154
|
+
validate: function(text, pos, self) {
|
|
155
|
+
const re = self.re.get_relative_proto_validator();
|
|
156
|
+
re.lastIndex = pos;
|
|
157
|
+
const m = re.exec(text);
|
|
158
|
+
if (m) {
|
|
159
|
+
if (pos >= 3 && text[pos - 3] === ":") return 0;
|
|
160
|
+
if (pos >= 3 && text[pos - 3] === "/") return 0;
|
|
161
|
+
return m[0].length;
|
|
162
|
+
}
|
|
163
|
+
return 0;
|
|
164
|
+
},
|
|
165
|
+
normalize: (match, self) => self.normalize(match)
|
|
166
|
+
},
|
|
167
|
+
"mailto:": {
|
|
168
|
+
validate: function(text, pos, self) {
|
|
169
|
+
const re = self.re.get_mailto_validator();
|
|
170
|
+
re.lastIndex = pos;
|
|
171
|
+
const m = re.exec(text);
|
|
172
|
+
return m ? m[0].length : 0;
|
|
173
|
+
},
|
|
174
|
+
normalize: (match, self) => self.normalize(match)
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
var tlds_2ch = "a:cdefgilmnoqrstuwxz|b:abdefghijmnorstvwyz|c:acdfghiklmnoruvwxyz|d:ejkmoz|e:cegrstu|f:ijkmor|g:abdefghilmnpqrstuwy|h:kmnrtu|i:delmnoqrst|j:emop|k:eghimnprwyz|l:abcikrstuvy|m:acdeghklmnopqrstuvwxyz|n:acefgilopruz|o:m|p:aefghklmnrstwy|q:a|r:eosuw|s:abcdeghijklmnortuvxyz|t:cdfghjklmnortvwz|u:agksyz|v:aceginu|w:fs|y:et|z:amw";
|
|
178
|
+
var tlds_default = "biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф";
|
|
179
|
+
function unpackTlds() {
|
|
180
|
+
const result = tlds_default.split("|");
|
|
181
|
+
tlds_2ch.split("|").forEach((item) => {
|
|
182
|
+
const sep = item.indexOf(":");
|
|
183
|
+
const prefix = item.slice(0, sep);
|
|
184
|
+
for (const suffix of item.slice(sep + 1)) result.push(prefix + suffix);
|
|
185
|
+
});
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
var defaultOptions = {
|
|
189
|
+
fuzzyLink: false,
|
|
190
|
+
fuzzyEmail: true,
|
|
191
|
+
fuzzyIP: false,
|
|
192
|
+
"---": false,
|
|
193
|
+
tlds: unpackTlds(),
|
|
194
|
+
urlAuth: false,
|
|
195
|
+
maxLength: 1e4
|
|
196
|
+
};
|
|
197
|
+
var Match = class {
|
|
198
|
+
schema;
|
|
199
|
+
index;
|
|
200
|
+
lastIndex;
|
|
201
|
+
raw;
|
|
202
|
+
text;
|
|
203
|
+
url;
|
|
204
|
+
constructor(text, schema, index, lastIndex) {
|
|
205
|
+
const raw = text.slice(index, lastIndex);
|
|
206
|
+
this.schema = schema.toLowerCase();
|
|
207
|
+
this.index = index;
|
|
208
|
+
this.lastIndex = lastIndex;
|
|
209
|
+
this.raw = raw;
|
|
210
|
+
this.text = raw;
|
|
211
|
+
this.url = raw;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
var LinkifyIt = class {
|
|
215
|
+
__opts__;
|
|
216
|
+
__schemas__;
|
|
217
|
+
re;
|
|
218
|
+
constructor(options = {}) {
|
|
219
|
+
const { rebuilder, ...linkifyOptions } = options;
|
|
220
|
+
this.__opts__ = {
|
|
221
|
+
...defaultOptions,
|
|
222
|
+
...linkifyOptions
|
|
223
|
+
};
|
|
224
|
+
this.__schemas__ = { ...defaultSchemas };
|
|
225
|
+
this.re = rebuilder || new REBuilder();
|
|
226
|
+
this.re.set({
|
|
227
|
+
...this.__opts__,
|
|
228
|
+
schema_names: Object.keys(this.__schemas__)
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
add(schema, definition = null) {
|
|
232
|
+
if (!definition) delete this.__schemas__[schema];
|
|
233
|
+
else {
|
|
234
|
+
const def = {
|
|
235
|
+
normalize: (match, self) => self.normalize(match),
|
|
236
|
+
...definition
|
|
237
|
+
};
|
|
238
|
+
this.__schemas__[schema] = def;
|
|
239
|
+
}
|
|
240
|
+
this.re.set({
|
|
241
|
+
...this.__opts__,
|
|
242
|
+
schema_names: Object.keys(this.__schemas__)
|
|
243
|
+
});
|
|
244
|
+
return this;
|
|
245
|
+
}
|
|
246
|
+
set(options = {}) {
|
|
247
|
+
this.__opts__ = {
|
|
248
|
+
...this.__opts__,
|
|
249
|
+
...options
|
|
250
|
+
};
|
|
251
|
+
this.re.set({
|
|
252
|
+
...this.__opts__,
|
|
253
|
+
schema_names: Object.keys(this.__schemas__)
|
|
254
|
+
});
|
|
255
|
+
return this;
|
|
256
|
+
}
|
|
257
|
+
test(text) {
|
|
258
|
+
if (!text.length) return false;
|
|
259
|
+
let m, re;
|
|
260
|
+
re = this.re.get_schema_search();
|
|
261
|
+
re.lastIndex = 0;
|
|
262
|
+
while ((m = re.exec(text)) !== null) if (this.testSchemaAt(text, m[2], re.lastIndex)) return true;
|
|
263
|
+
if (this.__opts__.fuzzyLink && this.__schemas__["http:"]) {
|
|
264
|
+
re = this.re.get_fuzzy_link_search();
|
|
265
|
+
re.lastIndex = 0;
|
|
266
|
+
if (re.exec(text) !== null) return true;
|
|
267
|
+
}
|
|
268
|
+
if (this.__opts__.fuzzyEmail && this.__schemas__["mailto:"]) {
|
|
269
|
+
if (text.indexOf("@") >= 0) {
|
|
270
|
+
const mailHostRe = this.re.get_fuzzy_mail_host_search();
|
|
271
|
+
const mailNameRe = this.re.get_mail_name_validator();
|
|
272
|
+
mailHostRe.lastIndex = 0;
|
|
273
|
+
while ((m = mailHostRe.exec(text)) !== null) {
|
|
274
|
+
const name = text.slice(Math.max(0, m.index - 65), m.index);
|
|
275
|
+
if (mailNameRe.test(name)) return true;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
testSchemaAt(text, schema, pos) {
|
|
282
|
+
if (!this.__schemas__[schema.toLowerCase()]) return 0;
|
|
283
|
+
return this.__schemas__[schema.toLowerCase()].validate(text.slice(0, pos + this.__opts__.maxLength), pos, this);
|
|
284
|
+
}
|
|
285
|
+
match(text) {
|
|
286
|
+
const result = [];
|
|
287
|
+
const schemaRe = this.re.get_schema_search();
|
|
288
|
+
let fuzzyLinkRe;
|
|
289
|
+
let mailHostRe;
|
|
290
|
+
let mailNameRe;
|
|
291
|
+
let fuzzyLinkCandidate;
|
|
292
|
+
let fuzzyEmailCandidate;
|
|
293
|
+
let schemaPrefix;
|
|
294
|
+
let schemaDone = false;
|
|
295
|
+
let fuzzyLinkDone = false;
|
|
296
|
+
let fuzzyEmailDone = false;
|
|
297
|
+
let pos = 0;
|
|
298
|
+
if (!text.length) return null;
|
|
299
|
+
schemaRe.lastIndex = 0;
|
|
300
|
+
if (this.__opts__.fuzzyLink && this.__schemas__["http:"]) {
|
|
301
|
+
fuzzyLinkRe = this.re.get_fuzzy_link_search();
|
|
302
|
+
fuzzyLinkRe.lastIndex = 0;
|
|
303
|
+
}
|
|
304
|
+
if (this.__opts__.fuzzyEmail && this.__schemas__["mailto:"]) {
|
|
305
|
+
mailHostRe = this.re.get_fuzzy_mail_host_search();
|
|
306
|
+
mailHostRe.lastIndex = 0;
|
|
307
|
+
mailNameRe = this.re.get_mail_name_validator();
|
|
308
|
+
}
|
|
309
|
+
for (;;) {
|
|
310
|
+
const scanFrom = Math.max(pos - 1, 0);
|
|
311
|
+
if (mailHostRe && mailNameRe && !fuzzyEmailDone && (!fuzzyEmailCandidate || fuzzyEmailCandidate.index < pos)) {
|
|
312
|
+
if (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;
|
|
313
|
+
for (;;) {
|
|
314
|
+
const m = mailHostRe.exec(text);
|
|
315
|
+
if (!m) {
|
|
316
|
+
fuzzyEmailDone = true;
|
|
317
|
+
fuzzyEmailCandidate = void 0;
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
const name = mailNameRe.exec(text.slice(Math.max(0, m.index - 65), m.index));
|
|
321
|
+
if (!name) continue;
|
|
322
|
+
fuzzyEmailCandidate = {
|
|
323
|
+
schema: "mailto:",
|
|
324
|
+
index: m.index - name[1].length,
|
|
325
|
+
lastIndex: m.index + m[0].length
|
|
326
|
+
};
|
|
327
|
+
if (fuzzyEmailCandidate.index >= pos) break;
|
|
328
|
+
if (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (fuzzyLinkRe && !fuzzyLinkDone && (!fuzzyLinkCandidate || fuzzyLinkCandidate.index < pos)) {
|
|
332
|
+
if (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;
|
|
333
|
+
for (;;) {
|
|
334
|
+
const m = fuzzyLinkRe.exec(text);
|
|
335
|
+
if (!m) {
|
|
336
|
+
fuzzyLinkDone = true;
|
|
337
|
+
fuzzyLinkCandidate = void 0;
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
fuzzyLinkCandidate = {
|
|
341
|
+
schema: "",
|
|
342
|
+
index: m.index + m[1].length,
|
|
343
|
+
lastIndex: m.index + m[0].length
|
|
344
|
+
};
|
|
345
|
+
if (fuzzyLinkCandidate.index >= pos) break;
|
|
346
|
+
if (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
let fuzzyCandidate = fuzzyEmailCandidate;
|
|
350
|
+
if (!fuzzyCandidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < fuzzyCandidate.index || fuzzyLinkCandidate.index === fuzzyCandidate.index && fuzzyLinkCandidate.lastIndex > fuzzyCandidate.lastIndex)) fuzzyCandidate = fuzzyLinkCandidate;
|
|
351
|
+
let schemaCandidate;
|
|
352
|
+
if (!schemaDone) for (;;) {
|
|
353
|
+
if (!schemaPrefix) {
|
|
354
|
+
if (schemaRe.lastIndex < scanFrom) schemaRe.lastIndex = scanFrom;
|
|
355
|
+
const m = schemaRe.exec(text);
|
|
356
|
+
if (!m) {
|
|
357
|
+
schemaDone = true;
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
schemaPrefix = {
|
|
361
|
+
schema: m[2],
|
|
362
|
+
index: m.index + m[1].length,
|
|
363
|
+
lastIndex: m.index + m[0].length
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
if (schemaPrefix.index < pos) {
|
|
367
|
+
schemaPrefix = void 0;
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
if (fuzzyCandidate && schemaPrefix.index > fuzzyCandidate.index) break;
|
|
371
|
+
const prefix = schemaPrefix;
|
|
372
|
+
schemaPrefix = void 0;
|
|
373
|
+
const len = this.testSchemaAt(text, prefix.schema, prefix.lastIndex);
|
|
374
|
+
if (len) {
|
|
375
|
+
schemaCandidate = {
|
|
376
|
+
schema: prefix.schema,
|
|
377
|
+
index: prefix.index,
|
|
378
|
+
lastIndex: prefix.lastIndex + len
|
|
379
|
+
};
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
let candidate = schemaCandidate;
|
|
384
|
+
if (!candidate || fuzzyEmailCandidate && (fuzzyEmailCandidate.index < candidate.index || fuzzyEmailCandidate.index === candidate.index && fuzzyEmailCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyEmailCandidate;
|
|
385
|
+
if (!candidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < candidate.index || fuzzyLinkCandidate.index === candidate.index && fuzzyLinkCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyLinkCandidate;
|
|
386
|
+
if (!candidate) break;
|
|
387
|
+
if (candidate === fuzzyEmailCandidate) fuzzyEmailCandidate = void 0;
|
|
388
|
+
else if (candidate === fuzzyLinkCandidate) fuzzyLinkCandidate = void 0;
|
|
389
|
+
const match = new Match(text, candidate.schema, candidate.index, candidate.lastIndex);
|
|
390
|
+
if (match.schema) this.__schemas__[match.schema].normalize(match, this);
|
|
391
|
+
else this.normalize(match);
|
|
392
|
+
result.push(match);
|
|
393
|
+
pos = candidate.lastIndex;
|
|
394
|
+
}
|
|
395
|
+
if (result.length) return result;
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
matchAtStart(text) {
|
|
399
|
+
if (!text.length) return null;
|
|
400
|
+
const m = this.re.get_schema_at_start().exec(text);
|
|
401
|
+
if (!m) return null;
|
|
402
|
+
const len = this.testSchemaAt(text, m[2], m[0].length);
|
|
403
|
+
if (!len) return null;
|
|
404
|
+
const match = new Match(text, m[2], m.index + m[1].length, m.index + m[0].length + len);
|
|
405
|
+
this.__schemas__[match.schema].normalize(match, this);
|
|
406
|
+
return match;
|
|
407
|
+
}
|
|
408
|
+
tlds(list, keepOld = false) {
|
|
409
|
+
list = Array.isArray(list) ? list : [list];
|
|
410
|
+
if (!keepOld) this.__opts__.tlds = list;
|
|
411
|
+
else this.__opts__.tlds = this.__opts__.tlds.concat(list);
|
|
412
|
+
this.re.set({
|
|
413
|
+
...this.__opts__,
|
|
414
|
+
schema_names: Object.keys(this.__schemas__)
|
|
415
|
+
});
|
|
416
|
+
return this;
|
|
417
|
+
}
|
|
418
|
+
normalize(match) {
|
|
419
|
+
if (!match.schema) match.url = `http://${match.url}`;
|
|
420
|
+
if (match.schema === "mailto:" && !/^mailto:/i.test(match.url)) match.url = `mailto:${match.url}`;
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
function linkifyit(options = {}) {
|
|
424
|
+
return new LinkifyIt(options);
|
|
425
|
+
}
|
|
426
|
+
export { LinkifyIt, REBuilder, linkifyit };
|
|
427
|
+
|