@prosekit/extensions 0.8.0 → 0.9.1

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.
Files changed (100) hide show
  1. package/dist/commit/style.css +1 -1
  2. package/dist/commit/style.js +0 -0
  3. package/dist/enter-rule-RdhEA900.js +96 -0
  4. package/dist/gap-cursor/style.css +6 -3
  5. package/dist/gap-cursor/style.js +0 -0
  6. package/dist/input-rule-Gji4N7Oe.js +93 -0
  7. package/dist/list/style.css +7 -7
  8. package/dist/list/style.js +0 -0
  9. package/dist/loro/style.css +13 -9
  10. package/dist/loro/style.js +0 -0
  11. package/dist/mark-rule-wEOcDt6i.js +160 -0
  12. package/dist/placeholder/style.css +3 -3
  13. package/dist/placeholder/style.js +0 -0
  14. package/dist/prosekit-extensions-autocomplete.d.ts +33 -3
  15. package/dist/prosekit-extensions-autocomplete.js +126 -174
  16. package/dist/prosekit-extensions-blockquote.d.ts +48 -8
  17. package/dist/prosekit-extensions-blockquote.js +64 -78
  18. package/dist/prosekit-extensions-bold.d.ts +54 -8
  19. package/dist/prosekit-extensions-bold.js +61 -73
  20. package/dist/prosekit-extensions-code-block.d.ts +159 -20
  21. package/dist/prosekit-extensions-code-block.js +201 -184
  22. package/dist/prosekit-extensions-code.d.ts +54 -8
  23. package/dist/prosekit-extensions-code.js +44 -56
  24. package/dist/prosekit-extensions-commit.d.ts +52 -4
  25. package/dist/prosekit-extensions-commit.js +140 -183
  26. package/dist/prosekit-extensions-doc.d.ts +19 -2
  27. package/dist/prosekit-extensions-doc.js +14 -12
  28. package/dist/prosekit-extensions-drop-cursor.d.ts +35 -3
  29. package/dist/prosekit-extensions-drop-cursor.js +14 -8
  30. package/dist/prosekit-extensions-enter-rule.d.ts +105 -5
  31. package/dist/prosekit-extensions-enter-rule.js +3 -8
  32. package/dist/prosekit-extensions-file.d.ts +129 -8
  33. package/dist/prosekit-extensions-file.js +124 -132
  34. package/dist/prosekit-extensions-gap-cursor.d.ts +26 -2
  35. package/dist/prosekit-extensions-gap-cursor.js +21 -9
  36. package/dist/prosekit-extensions-hard-break.d.ts +53 -0
  37. package/dist/prosekit-extensions-hard-break.js +58 -0
  38. package/dist/prosekit-extensions-heading.d.ts +63 -9
  39. package/dist/prosekit-extensions-heading.js +121 -95
  40. package/dist/prosekit-extensions-horizontal-rule.d.ts +38 -8
  41. package/dist/prosekit-extensions-horizontal-rule.js +53 -71
  42. package/dist/prosekit-extensions-image.d.ts +50 -7
  43. package/dist/prosekit-extensions-image.js +71 -62
  44. package/dist/prosekit-extensions-input-rule.d.ts +129 -6
  45. package/dist/prosekit-extensions-input-rule.js +3 -14
  46. package/dist/prosekit-extensions-italic.d.ts +54 -8
  47. package/dist/prosekit-extensions-italic.js +51 -63
  48. package/dist/prosekit-extensions-link.d.ts +62 -10
  49. package/dist/prosekit-extensions-link.js +95 -100
  50. package/dist/prosekit-extensions-list.d.ts +104 -17
  51. package/dist/prosekit-extensions-list.js +115 -158
  52. package/dist/prosekit-extensions-loro.d.ts +69 -11
  53. package/dist/prosekit-extensions-loro.js +49 -77
  54. package/dist/prosekit-extensions-mark-rule.d.ts +37 -2
  55. package/dist/prosekit-extensions-mark-rule.js +3 -6
  56. package/dist/prosekit-extensions-mention.d.ts +39 -4
  57. package/dist/prosekit-extensions-mention.js +52 -50
  58. package/dist/prosekit-extensions-mod-click-prevention.d.ts +17 -2
  59. package/dist/prosekit-extensions-mod-click-prevention.js +20 -16
  60. package/dist/prosekit-extensions-paragraph.d.ts +60 -7
  61. package/dist/prosekit-extensions-paragraph.js +46 -45
  62. package/dist/prosekit-extensions-placeholder.d.ts +33 -2
  63. package/dist/prosekit-extensions-placeholder.js +39 -56
  64. package/dist/prosekit-extensions-readonly.d.ts +10 -1
  65. package/dist/prosekit-extensions-readonly.js +13 -14
  66. package/dist/prosekit-extensions-search.d.ts +74 -3
  67. package/dist/prosekit-extensions-search.js +48 -47
  68. package/dist/prosekit-extensions-strike.d.ts +47 -8
  69. package/dist/prosekit-extensions-strike.js +44 -49
  70. package/dist/prosekit-extensions-table.d.ts +231 -26
  71. package/dist/prosekit-extensions-table.js +3 -34
  72. package/dist/prosekit-extensions-text-align.d.ts +71 -8
  73. package/dist/prosekit-extensions-text-align.js +63 -44
  74. package/dist/prosekit-extensions-text.d.ts +19 -2
  75. package/dist/prosekit-extensions-text.js +13 -11
  76. package/dist/prosekit-extensions-underline.d.ts +43 -7
  77. package/dist/prosekit-extensions-underline.js +33 -37
  78. package/dist/prosekit-extensions-virtual-selection.d.ts +21 -2
  79. package/dist/prosekit-extensions-virtual-selection.js +49 -52
  80. package/dist/prosekit-extensions-yjs.d.ts +90 -14
  81. package/dist/prosekit-extensions-yjs.js +88 -131
  82. package/dist/prosekit-extensions.d.ts +1 -1
  83. package/dist/search/style.css +4 -3
  84. package/dist/search/style.js +0 -0
  85. package/dist/shiki-highlighter-chunk-CZGvZlhf.d.ts +18 -0
  86. package/dist/shiki-highlighter-chunk.d.ts +2 -0
  87. package/dist/shiki-highlighter-chunk.js +32 -39
  88. package/dist/table/style.css +10 -13
  89. package/dist/table/style.js +0 -0
  90. package/dist/table-DnVliJ6E.js +287 -0
  91. package/dist/virtual-selection/style.css +2 -2
  92. package/dist/virtual-selection/style.js +0 -0
  93. package/dist/yjs/style.css +9 -8
  94. package/dist/yjs/style.js +0 -0
  95. package/package.json +81 -54
  96. package/dist/_tsup-dts-rollup.d.ts +0 -2459
  97. package/dist/chunk-6UYLCVBX.js +0 -185
  98. package/dist/chunk-D54VSLLS.js +0 -105
  99. package/dist/chunk-I2UMHK3L.js +0 -99
  100. package/dist/chunk-QVFEYPQ6.js +0 -306
@@ -1,6 +1,129 @@
1
- export { defineInputRule } from './_tsup-dts-rollup.js';
2
- export { createMarkInputRule } from './_tsup-dts-rollup.js';
3
- export { defineMarkInputRule } from './_tsup-dts-rollup.js';
4
- export { defineTextBlockInputRule } from './_tsup-dts-rollup.js';
5
- export { defineWrappingInputRule } from './_tsup-dts-rollup.js';
6
- export { MarkInputRuleOptions } from './_tsup-dts-rollup.js';
1
+ import { PlainExtension } from "@prosekit/core";
2
+ import { InputRule } from "@prosekit/pm/inputrules";
3
+ import { Attrs, MarkType, NodeType, ProseMirrorNode } from "@prosekit/pm/model";
4
+
5
+ //#region src/input-rule/index.d.ts
6
+
7
+ /**
8
+ * Defines an input rule extension.
9
+ *
10
+ * @param rule - The ProseMirror input rule to add.
11
+ *
12
+ * @public
13
+ */
14
+ declare function defineInputRule(rule: InputRule): PlainExtension;
15
+ /**
16
+ * Options for {@link defineMarkInputRule}.
17
+ *
18
+ * @public
19
+ */
20
+ interface MarkInputRuleOptions {
21
+ /**
22
+ * The regular expression to match against, which should end with `$` and has
23
+ * exactly one capture group. All other matched text outside the capture group
24
+ * will be deleted.
25
+ */
26
+ regex: RegExp;
27
+ /**
28
+ * The type of mark to set.
29
+ */
30
+ type: string | MarkType;
31
+ /**
32
+ * Attributes to set on the mark.
33
+ */
34
+ attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);
35
+ /**
36
+ * Whether this rule should fire inside marks marked as [code](https://prosemirror.net/docs/ref/#model.MarkSpec.code).
37
+ *
38
+ * @default `false`
39
+ */
40
+ inCodeMark?: boolean;
41
+ }
42
+ /**
43
+ * @internal
44
+ */
45
+ declare function createMarkInputRule({
46
+ regex,
47
+ type,
48
+ attrs,
49
+ inCodeMark
50
+ }: MarkInputRuleOptions): InputRule;
51
+ /**
52
+ * Defines an input rule for automatically adding inline marks when a given
53
+ * pattern is typed.
54
+ *
55
+ * @public
56
+ */
57
+ declare function defineMarkInputRule(options: MarkInputRuleOptions): PlainExtension;
58
+ /**
59
+ * Defines an input rule that changes the type of a textblock when the matched
60
+ * text is typed into it.
61
+ *
62
+ * See also [textblockTypeInputRule](https://prosemirror.net/docs/ref/#inputrules.textblockTypeInputRule)
63
+ *
64
+ * @param options
65
+ *
66
+ * @public
67
+ */
68
+ declare function defineTextBlockInputRule({
69
+ regex,
70
+ type,
71
+ attrs
72
+ }: {
73
+ /**
74
+ * The regular expression to match against, which should end with `$`. It
75
+ * usually also starts with `^` to that it is only matched at the start of a
76
+ * textblock.
77
+ */
78
+ regex: RegExp;
79
+ /**
80
+ * The node type to replace the matched text with.
81
+ */
82
+ type: string | NodeType;
83
+ /**
84
+ * Attributes to set on the node.
85
+ */
86
+ attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);
87
+ }): PlainExtension;
88
+ /**
89
+ * Defines an input rule for automatically wrapping a textblock when a given
90
+ * string is typed.
91
+ *
92
+ * See also [wrappingInputRule](https://prosemirror.net/docs/ref/#inputrules.wrappingInputRule)
93
+ *
94
+ * @param options
95
+ *
96
+ * @public
97
+ */
98
+ declare function defineWrappingInputRule({
99
+ regex,
100
+ type,
101
+ attrs,
102
+ join
103
+ }: {
104
+ /**
105
+ * The regular expression to match against, which should end with `$`. It
106
+ * usually also starts with `^` to that it is only matched at the start of a
107
+ * textblock.
108
+ */
109
+ regex: RegExp;
110
+ /**
111
+ * The type of node to wrap in.
112
+ */
113
+ type: string | NodeType;
114
+ /**
115
+ * Attributes to set on the node.
116
+ */
117
+ attrs?: Attrs | null | ((match: RegExpMatchArray) => Attrs | null);
118
+ /**
119
+ * By default, if there's a node with the same type above the newly wrapped
120
+ * node, the rule will try to
121
+ * [join](https://prosemirror.net/docs/ref/#transform.Transform.join) those
122
+ * two nodes. You can pass a join predicate, which takes a regular expression
123
+ * match and the node before the wrapped node, and can return a boolean to
124
+ * indicate whether a join should happen.
125
+ */
126
+ join?: (match: RegExpMatchArray, node: ProseMirrorNode) => boolean;
127
+ }): PlainExtension;
128
+ //#endregion
129
+ export { MarkInputRuleOptions, createMarkInputRule, defineInputRule, defineMarkInputRule, defineTextBlockInputRule, defineWrappingInputRule };
@@ -1,14 +1,3 @@
1
- import {
2
- createMarkInputRule,
3
- defineInputRule,
4
- defineMarkInputRule,
5
- defineTextBlockInputRule,
6
- defineWrappingInputRule
7
- } from "./chunk-I2UMHK3L.js";
8
- export {
9
- createMarkInputRule,
10
- defineInputRule,
11
- defineMarkInputRule,
12
- defineTextBlockInputRule,
13
- defineWrappingInputRule
14
- };
1
+ import { createMarkInputRule, defineInputRule, defineMarkInputRule, defineTextBlockInputRule, defineWrappingInputRule } from "./input-rule-Gji4N7Oe.js";
2
+
3
+ export { createMarkInputRule, defineInputRule, defineMarkInputRule, defineTextBlockInputRule, defineWrappingInputRule };
@@ -1,8 +1,54 @@
1
- export { defineItalic } from './_tsup-dts-rollup.js';
2
- export { ItalicExtension } from './_tsup-dts-rollup.js';
3
- export { defineItalicCommands } from './_tsup-dts-rollup.js';
4
- export { ItalicCommandsExtension } from './_tsup-dts-rollup.js';
5
- export { defineItalicInputRule } from './_tsup-dts-rollup.js';
6
- export { defineItalicKeymap } from './_tsup-dts-rollup.js';
7
- export { defineItalicSpec } from './_tsup-dts-rollup.js';
8
- export { ItalicSpecExtension } from './_tsup-dts-rollup.js';
1
+ import { Extension, PlainExtension, Union } from "@prosekit/core";
2
+ import { Attrs } from "@prosekit/pm/model";
3
+
4
+ //#region src/italic/italic-commands.d.ts
5
+ /**
6
+ * @internal
7
+ */
8
+ type ItalicCommandsExtension = Extension<{
9
+ Commands: {
10
+ toggleItalic: [];
11
+ };
12
+ }>;
13
+ /**
14
+ * @internal
15
+ */
16
+ declare function defineItalicCommands(): ItalicCommandsExtension;
17
+ //#endregion
18
+ //#region src/italic/italic-spec.d.ts
19
+ /**
20
+ * @internal
21
+ */
22
+ type ItalicSpecExtension = Extension<{
23
+ Marks: {
24
+ italic: Attrs;
25
+ };
26
+ }>;
27
+ /**
28
+ * @internal
29
+ */
30
+ declare function defineItalicSpec(): ItalicSpecExtension;
31
+ //#endregion
32
+ //#region src/italic/italic.d.ts
33
+ /**
34
+ * @internal
35
+ */
36
+ type ItalicExtension = Union<[ItalicSpecExtension, ItalicCommandsExtension]>;
37
+ /**
38
+ * @public
39
+ */
40
+ declare function defineItalic(): ItalicExtension;
41
+ //#endregion
42
+ //#region src/italic/italic-input-rule.d.ts
43
+ /**
44
+ * @internal
45
+ */
46
+ declare function defineItalicInputRule(): PlainExtension;
47
+ //#endregion
48
+ //#region src/italic/italic-keymap.d.ts
49
+ /**
50
+ * @internal
51
+ */
52
+ declare function defineItalicKeymap(): PlainExtension;
53
+ //#endregion
54
+ export { ItalicCommandsExtension, ItalicExtension, ItalicSpecExtension, defineItalic, defineItalicCommands, defineItalicInputRule, defineItalicKeymap, defineItalicSpec };
@@ -1,78 +1,66 @@
1
- import {
2
- defineMarkInputRule
3
- } from "./chunk-I2UMHK3L.js";
1
+ import { defineMarkInputRule } from "./input-rule-Gji4N7Oe.js";
2
+ import { canUseRegexLookbehind, defineCommands, defineKeymap, defineMarkSpec, toggleMark, union } from "@prosekit/core";
4
3
 
5
- // src/italic/italic.ts
6
- import {
7
- union
8
- } from "@prosekit/core";
9
-
10
- // src/italic/italic-commands.ts
11
- import {
12
- defineCommands,
13
- toggleMark
14
- } from "@prosekit/core";
4
+ //#region src/italic/italic-commands.ts
5
+ /**
6
+ * @internal
7
+ */
15
8
  function defineItalicCommands() {
16
- return defineCommands({
17
- toggleItalic: () => toggleMark({ type: "italic" })
18
- });
9
+ return defineCommands({ toggleItalic: () => toggleMark({ type: "italic" }) });
19
10
  }
20
11
 
21
- // src/italic/italic-input-rule.ts
22
- import { canUseRegexLookbehind } from "@prosekit/core";
12
+ //#endregion
13
+ //#region src/italic/italic-input-rule.ts
14
+ /**
15
+ * @internal
16
+ */
23
17
  function defineItalicInputRule() {
24
- return defineMarkInputRule({
25
- regex: canUseRegexLookbehind() ? /(?<=\s|^)\*([^\s*]|[^\s*][^*]*[^\s*])\*$/ : /\*([^\s*]|[^\s*][^*]*[^\s*])\*$/,
26
- type: "italic"
27
- });
18
+ return defineMarkInputRule({
19
+ regex: canUseRegexLookbehind() ? /(?<=\s|^)\*([^\s*]|[^\s*][^*]*[^\s*])\*$/ : /\*([^\s*]|[^\s*][^*]*[^\s*])\*$/,
20
+ type: "italic"
21
+ });
28
22
  }
29
23
 
30
- // src/italic/italic-keymap.ts
31
- import {
32
- defineKeymap,
33
- toggleMark as toggleMark2
34
- } from "@prosekit/core";
24
+ //#endregion
25
+ //#region src/italic/italic-keymap.ts
26
+ /**
27
+ * @internal
28
+ */
35
29
  function defineItalicKeymap() {
36
- return defineKeymap({
37
- "Mod-i": toggleMark2({ type: "italic" })
38
- });
30
+ return defineKeymap({ "Mod-i": toggleMark({ type: "italic" }) });
39
31
  }
40
32
 
41
- // src/italic/italic-spec.ts
42
- import {
43
- defineMarkSpec
44
- } from "@prosekit/core";
33
+ //#endregion
34
+ //#region src/italic/italic-spec.ts
35
+ /**
36
+ * @internal
37
+ */
45
38
  function defineItalicSpec() {
46
- return defineMarkSpec({
47
- name: "italic",
48
- parseDOM: [
49
- { tag: "i" },
50
- { tag: "em" },
51
- { style: "font-style=italic" },
52
- {
53
- style: "font-style=normal",
54
- clearMark: (m) => m.type.name === "italic"
55
- }
56
- ],
57
- toDOM() {
58
- return ["em", 0];
59
- }
60
- });
39
+ return defineMarkSpec({
40
+ name: "italic",
41
+ parseDOM: [
42
+ { tag: "i" },
43
+ { tag: "em" },
44
+ { style: "font-style=italic" },
45
+ {
46
+ style: "font-style=normal",
47
+ clearMark: (m) => m.type.name === "italic"
48
+ }
49
+ ],
50
+ toDOM() {
51
+ return ["em", 0];
52
+ }
53
+ });
61
54
  }
62
55
 
63
- // src/italic/italic.ts
56
+ //#endregion
57
+ //#region src/italic/italic.ts
58
+ /**
59
+ * @public
60
+ */
64
61
  function defineItalic() {
65
- return union(
66
- defineItalicSpec(),
67
- defineItalicCommands(),
68
- defineItalicKeymap(),
69
- defineItalicInputRule()
70
- );
62
+ return union(defineItalicSpec(), defineItalicCommands(), defineItalicKeymap(), defineItalicInputRule());
71
63
  }
72
- export {
73
- defineItalic,
74
- defineItalicCommands,
75
- defineItalicInputRule,
76
- defineItalicKeymap,
77
- defineItalicSpec
78
- };
64
+
65
+ //#endregion
66
+ export { defineItalic, defineItalicCommands, defineItalicInputRule, defineItalicKeymap, defineItalicSpec };
@@ -1,10 +1,62 @@
1
- export { defineLinkSpec } from './_tsup-dts-rollup.js';
2
- export { defineLinkCommands } from './_tsup-dts-rollup.js';
3
- export { defineLinkInputRule } from './_tsup-dts-rollup.js';
4
- export { defineLinkEnterRule } from './_tsup-dts-rollup.js';
5
- export { defineLinkMarkRule } from './_tsup-dts-rollup.js';
6
- export { defineLink } from './_tsup-dts-rollup.js';
7
- export { LinkAttrs } from './_tsup-dts-rollup.js';
8
- export { LinkSpecExtension } from './_tsup-dts-rollup.js';
9
- export { LinkCommandsExtension } from './_tsup-dts-rollup.js';
10
- export { LinkExtension } from './_tsup-dts-rollup.js';
1
+ import { Extension, PlainExtension, Union } from "@prosekit/core";
2
+
3
+ //#region src/link/index.d.ts
4
+
5
+ /**
6
+ * @public
7
+ */
8
+ interface LinkAttrs {
9
+ href: string;
10
+ }
11
+ /**
12
+ * @internal
13
+ */
14
+ type LinkSpecExtension = Extension<{
15
+ Marks: {
16
+ link: LinkAttrs;
17
+ };
18
+ }>;
19
+ /**
20
+ * @internal
21
+ */
22
+ declare function defineLinkSpec(): LinkSpecExtension;
23
+ /**
24
+ * @internal
25
+ */
26
+ type LinkCommandsExtension = Extension<{
27
+ Commands: {
28
+ addLink: [attrs: LinkAttrs];
29
+ removeLink: [];
30
+ toggleLink: [attrs: LinkAttrs];
31
+ expandLink: [];
32
+ };
33
+ }>;
34
+ declare function defineLinkCommands(): LinkCommandsExtension;
35
+ /**
36
+ * Apply link marks after pressing Space.
37
+ *
38
+ * @internal
39
+ */
40
+ declare function defineLinkInputRule(): PlainExtension;
41
+ /**
42
+ * Apply link marks after typing Enter.
43
+ *
44
+ * @internal
45
+ */
46
+ declare function defineLinkEnterRule(): PlainExtension;
47
+ /**
48
+ * Apply and remove link marks to the text during typing.
49
+ *
50
+ * @internal
51
+ */
52
+ declare function defineLinkMarkRule(): PlainExtension;
53
+ /**
54
+ * @internal
55
+ */
56
+ type LinkExtension = Union<[LinkSpecExtension, LinkCommandsExtension]>;
57
+ /**
58
+ * @public
59
+ */
60
+ declare function defineLink(): LinkExtension;
61
+ //#endregion
62
+ export { LinkAttrs, LinkCommandsExtension, LinkExtension, LinkSpecExtension, defineLink, defineLinkCommands, defineLinkEnterRule, defineLinkInputRule, defineLinkMarkRule, defineLinkSpec };
@@ -1,115 +1,110 @@
1
- import {
2
- defineMarkRule
3
- } from "./chunk-6UYLCVBX.js";
4
- import {
5
- defineEnterRule
6
- } from "./chunk-D54VSLLS.js";
7
- import {
8
- defineInputRule
9
- } from "./chunk-I2UMHK3L.js";
10
-
11
- // src/link/index.ts
12
- import {
13
- addMark,
14
- defineCommands,
15
- defineMarkSpec,
16
- expandMark,
17
- removeMark,
18
- toggleMark,
19
- union
20
- } from "@prosekit/core";
1
+ import { defineInputRule } from "./input-rule-Gji4N7Oe.js";
2
+ import { defineEnterRule } from "./enter-rule-RdhEA900.js";
3
+ import { defineMarkRule } from "./mark-rule-wEOcDt6i.js";
4
+ import { addMark, defineCommands, defineMarkSpec, expandMark, removeMark, toggleMark, union } from "@prosekit/core";
21
5
  import { InputRule } from "@prosekit/pm/inputrules";
22
6
 
23
- // src/link/link-regex.ts
24
- var TLD_RE_PATTERN = "a(?:a(?:a|rp)|b(?:arth|b(?:ott|vie)?|c|le|ogado|udhabi)|c(?:ademy|c(?:enture|ountants?)|o|tor)?|d(?:s|ult)?|e(?:g|ro|tna)?|f(?:l|rica)?|g(?:akhan|ency)?|i(?:g|r(?:bus|force|tel))?|kdn|l(?:faromeo|i(?:baba|pay)|l(?:finanz|state|y)|s(?:ace|tom))?|m(?:azon|e(?:rican(?:express|family)|x)|fam|ica|sterdam)?|n(?:alytics|droid|quan|z)|ol?|p(?:artments|p(?:le)?)|q(?:uarelle)?|r(?:a(?:b|mco)|chi|my|pa|te?)?|s(?:da|ia|sociates)?|t(?:hleta|torney)?|u(?:ction|di(?:ble|o)?|spost|t(?:hor|os?))?|vianca|ws?|xa?|z(?:ure)?)|b(?:a(?:by|idu|n(?:a(?:mex|narepublic)|d|k)|r(?:c(?:elona|lay(?:card|s))|efoot|gains)?|s(?:eball|ketball)|uhaus|yern)?|b(?:c|t|va)?|c[gn]|d|e(?:a(?:ts|uty)|er|ntley|rlin|st(?:buy)?|t)?|f|g|h(?:arti)?|i(?:ble|d|ke|ngo?|o|z)?|j|l(?:ack(?:friday)?|o(?:ckbuster|g|omberg)|ue)|m[sw]?|n(?:pparibas)?|o(?:ats|ehringer|fa|m|nd|o(?:k(?:ing)?)?|s(?:ch|t(?:ik|on))|t|utique|x)?|r(?:adesco|idgestone|o(?:adway|ker|ther)|ussels)?|s|t|u(?:ild(?:ers)?|siness|y|zz)|v|w|y|zh?)|c(?:a(?:b|fe|l(?:l|vinklein)?|m(?:era|p)?|non|p(?:etown|ital(?:one)?)|r(?:avan|ds|e(?:ers?)?|s)?|s(?:a|e|h|ino)|t(?:ering|holic)?)?|b(?:a|n|re|s)|c|d|e(?:nter|o|rn)|f[ad]?|g|h(?:a(?:n(?:el|nel)|rity|se|t)|eap|intai|r(?:istmas|ome)|urch)?|i(?:priani|rcle|sco|t(?:adel|ic?|y(?:eats)?))?|k|l(?:aims|eaning|i(?:ck|ni(?:c|que))|o(?:thing|ud)|ub(?:med)?)?|m|n|o(?:ach|des|ffee|l(?:lege|ogne)|m(?:cast|m(?:bank|unity)|p(?:a(?:ny|re)|uter)|sec)?|n(?:dos|s(?:truction|ulting)|t(?:act|ractors))|o(?:king(?:channel)?|l|p)|rsica|u(?:ntry|pons?|rses))?|pa|r(?:edit(?:card|union)?|icket|own|s|uises?)?|u(?:isinella)?|v|w|x|y(?:mru|ou)?|z)|d(?:a(?:bur|d|nce|t(?:a|e|ing|sun)|y)|clk|ds|e(?:al(?:er|s)?|gree|l(?:ivery|l|oitte|ta)|mocrat|nt(?:al|ist)|si(?:gn)?|v)?|hl|i(?:amonds|et|gital|rect(?:ory)?|s(?:co(?:unt|ver)|h)|y)|j|k|m|np|o(?:c(?:s|tor)|g|mains|t|wnload)?|rive|tv|u(?:bai|nlop|pont|rban)|v(?:ag|r)|z)|e(?:a(?:rth|t)|co?|d(?:eka|u(?:cation)?)|e|g|m(?:ail|erck)|n(?:ergy|gineer(?:ing)?|terprises)|pson|quipment|r(?:icsson|ni)?|s(?:q|tate)?|t(?:isalat)?|u(?:rovision|s)?|vents|x(?:change|p(?:ert|osed|ress)|traspace))|f(?:a(?:ge|i(?:l|rwinds|th)|mily|ns?|rm(?:ers)?|s(?:hion|t))|e(?:dex|edback|rr(?:ari|ero))|i(?:at|d(?:elity|o)|lm|na(?:l|nc(?:e|ial))|r(?:e(?:stone)?|mdale)|sh(?:ing)?|t(?:ness)?)?|j|k|l(?:i(?:ckr|ghts|r)|o(?:rist|wers)|y)|m|o(?:o(?:d(?:network)?|tball)?|r(?:d|ex|sale|um)|undation|x)?|r(?:e(?:e|senius)|l|o(?:gans|nt(?:door|ier)))?|tr|u(?:jitsu|nd?|rniture|tbol)|yi)|g(?:a(?:l(?:l(?:ery|o|up))?|mes?|p|rden|y)?|b(?:iz)?|dn?|e(?:a|nt(?:ing)?|orge)?|f|g(?:ee)?|h|i(?:fts?|v(?:es|ing))?|l(?:ass|e|ob(?:al|o))?|m(?:ail|bh|o|x)?|n|o(?:daddy|l(?:d(?:point)?|f)|o(?:dyear|g(?:le)?)?|p|t|v)|p|q|r(?:a(?:inger|phics|tis)|een|ipe|o(?:cery|up))?|s|t|u(?:ardian|cci|ge|i(?:de|tars)|ru)?|w|y)|h(?:a(?:ir|mburg|ngout|us)|bo|dfc(?:bank)?|e(?:alth(?:care)?|l(?:p|sinki)|r(?:e|mes))|gtv|i(?:phop|samitsu|tachi|v)|kt?|m|n|o(?:ckey|l(?:dings|iday)|me(?:depot|goods|s(?:ense)?)|nda|rse|s(?:pital|t(?:ing)?)|t(?:el(?:es|s)|mail)?|use|w)|r|sbc|t|u(?:ghes)?|y(?:att|undai))|i(?:bm|c(?:bc|e|u)|d|e(?:ee)?|fm|kano|l|m(?:amat|db|mo(?:bilien)?)?|n(?:c|dustries|f(?:initi|o)|g|k|s(?:titute|ur(?:ance|e))|t(?:ernational|uit)?|vestments)?|o|piranga|q|r(?:ish)?|s(?:maili|t(?:anbul)?)?|t(?:au|v)?)|j(?:a(?:guar|va)|cb|e(?:ep|tzt|welry)?|io|ll|mp?|nj|o(?:b(?:s|urg)|t|y)?|p(?:morgan|rs)?|u(?:egos|niper))|k(?:aufen|ddi|e(?:rry(?:hotels|logistics|properties))?|fh|g|h|i(?:a|ds|m|nd(?:er|le)|tchen|wi)?|m|n|o(?:eln|matsu|sher)|p(?:mg|n)?|r(?:d|ed)?|uokgroup|w|y(?:oto)?|z)|l(?:a(?:caixa|m(?:borghini|er)|n(?:c(?:aster|ia)|d(?:rover)?|xess)|salle|t(?:ino|robe)?|w(?:yer)?)?|b|c|ds|e(?:ase|clerc|frak|g(?:al|o)|xus)|gbt|i(?:dl|fe(?:insurance|style)?|ghting|ke|lly|m(?:ited|o)|n(?:coln|de|k)|psy|v(?:e|ing))?|k|l[cp]|o(?:ans?|c(?:ker|us)|l|ndon|tt[eo]|ve)|pl(?:financial)?|r|s|t(?:da?)?|u(?:ndbeck|x(?:e|ury))?|v|y)|m(?:a(?:cys|drid|i(?:f|son)|keup|n(?:agement|go)?|p|r(?:ket(?:ing|s)?|riott|shalls)|serati|ttel)?|ba|c(?:kinsey)?|d|e(?:d(?:ia)?|et|lbourne|m(?:e|orial)|nu?|rckmsd)?|g|h|i(?:ami|crosoft|l|n[it]|t(?:subishi)?)|k|l[bs]?|ma?|n|o(?:bi(?:le)?|da|e|i|m|n(?:ash|ey|ster)|r(?:mon|tgage)|scow|to(?:rcycles)?|v(?:ie)?)?|p|q|r|sd?|t[nr]?|u(?:s(?:eum|ic)|tual)?|v|w|x|y|z)|n(?:a(?:b|goya|me|tura|vy)?|ba|c|e(?:c|t(?:bank|flix|work)?|ustar|ws?|x(?:t(?:direct)?|us))?|fl?|go?|hk|i(?:co|k(?:e|on)|nja|ssa[ny])?|l|o(?:kia|rt(?:hwesternmutual|on)|w(?:ruz|tv)?)?|p|r[aw]?|tt|u|yc|z)|o(?:b(?:i|server)|ffice|kinawa|l(?:ayan(?:group)?|dnavy|lo)|m(?:ega)?|n(?:e|g|l(?:ine)?)|oo|pen|r(?:a(?:cle|nge)|g(?:anic)?|igins)|saka|t(?:suka|t)|vh)|p(?:a(?:ge|nasonic|r(?:is|s|t(?:ners|s|y))|ssagens|y)?|ccw|et?|f(?:izer)?|g|h(?:armacy|d|ilips|o(?:ne|to(?:graphy|s)?)|ysio)?|i(?:c(?:s|t(?:et|ures))|d|n[gk]?|oneer|zza)|k|l(?:a(?:ce|y(?:station)?)|u(?:mbing|s))?|m|nc?|o(?:hl|ker|litie|rn|st)|r(?:a(?:merica|xi)|ess|ime|o(?:d(?:uctions)?|f|gressive|mo|pert(?:ies|y)|tection)?|u(?:dential)?)?|s|t|ub|wc?|y)|q(?:a|pon|ue(?:bec|st))|r(?:a(?:cing|dio)|e(?:a(?:d|l(?:estate|t(?:or|y)))|cipes|d(?:stone|umbrella)?|hab|i(?:sen?|t)|liance|n(?:t(?:als)?)?|p(?:air|ort|ublican)|st(?:aurant)?|views?|xroth)?|i(?:c(?:h(?:ardli)?|oh)|l|o|p)|o(?:c(?:her|ks)|deo|gers|om)?|s(?:vp)?|u(?:gby|hr|n)?|we?|yukyu)|s(?:a(?:arland|fe(?:ty)?|kura|l(?:e|on)|ms(?:club|ung)|n(?:dvik(?:coromant)?|ofi)|p|rl|s|ve|xo)?|b[is]?|c(?:a|b|h(?:aeffler|midt|o(?:larships|ol)|ule|warz)|ience|ot)?|d|e(?:a(?:rch|t)|cur(?:e|ity)|ek|lect|ner|rvices|ven|w|xy?)?|fr|g|h(?:a(?:ngrila|rp|w)|ell|i(?:a|ksha)|o(?:es|p(?:ping)?|uji|w(?:time)?))?|i(?:lk|n(?:a|gles)|te)?|j|k(?:in?|y(?:pe)?)?|l(?:ing)?|m(?:art|ile)?|n(?:cf)?|o(?:c(?:cer|ial)|ft(?:bank|ware)|hu|l(?:ar|utions)|n[gy]|y)?|p(?:a(?:ce)?|o(?:rt|t))|rl?|s|t(?:a(?:da|ples|r|te(?:bank|farm))|c(?:group)?|o(?:ckholm|r(?:age|e))|ream|ud(?:io|y)|yle)?|u(?:cks|pp(?:l(?:ies|y)|ort)|r(?:f|gery)|zuki)?|v|w(?:atch|iss)|x|y(?:dney|stems)?|z)|t(?:a(?:b|ipei|lk|obao|rget|t(?:a(?:motors|r)|too)|xi?)|ci?|dk?|e(?:am|ch(?:nology)?|l|masek|nnis|va)|f|g|h(?:d|eat(?:er|re))?|i(?:aa|ckets|enda|ffany|ps|r(?:es|ol))|j(?:maxx|x)?|k(?:maxx)?|l|m(?:all)?|n|o(?:day|kyo|ols|p|ray|shiba|tal|urs|wn|y(?:ota|s))?|r(?:a(?:d(?:e|ing)|ining|vel(?:channel|ers(?:insurance)?)?)|ust|v)?|t|u(?:be|i|nes|shu)|vs?|w|z)|u(?:a|b(?:ank|s)|g|k|n(?:i(?:com|versity)|o)|ol|ps|s|y|z)|v(?:a(?:cations|n(?:a|guard))?|c|e(?:gas|ntures|r(?:isign|sicherung)|t)?|g|i(?:ajes|deo|g|king|llas|n|p|rgin|s(?:a|ion)|v[ao])?|laanderen|n|o(?:dka|l(?:kswagen|vo)|t(?:e|ing|o)|yage)|u(?:elos)?)|w(?:a(?:l(?:es|mart|ter)|ng(?:gou)?|tch(?:es)?)|e(?:ather(?:channel)?|b(?:cam|er|site)|d(?:ding)?|i(?:bo|r))|f|hoswho|i(?:en|ki|lliamhill|n(?:dows|e|ners)?)|me|o(?:lterskluwer|odside|r(?:ks?|ld)|w)|s|t[cf])|x(?:box|erox|finity|i(?:huan|n)|xx|yz)|y(?:a(?:chts|hoo|maxun|ndex)|e|o(?:dobashi|ga|kohama|u(?:tube)?)|t|un)|z(?:a(?:ppos|ra)?|ero|ip|m|one|uerich|w)";
25
- var PUNCTUATION_CHAR_PATTERN = "\\.\\,\\;\\!\\?";
26
- var STOP_CHAR_PATTERN = "[" + PUNCTUATION_CHAR_PATTERN + "]";
27
- var END_CHAR_PATTERN = "[^\\s" + PUNCTUATION_CHAR_PATTERN + "]";
28
- var LINK_RE_BASE_PATTERN = (
29
- // start of the link group
30
- "((?:(?:(?:https?:)?\\/\\/)?(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:" + TLD_RE_PATTERN + "))(?::\\d{2,5})?(?:/(?:\\S*" + END_CHAR_PATTERN + ")?)?(?:\\?(?:\\S*" + END_CHAR_PATTERN + "))?(?:\\#(?:\\S*" + END_CHAR_PATTERN + ")?)?)"
31
- );
32
- var LINK_ENTER_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + "?$";
33
- var LINK_INPUT_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + "?\\s$";
34
- var LINK_MARK_PATTERN = LINK_RE_BASE_PATTERN + "(?=" + STOP_CHAR_PATTERN + "|\\s|$)";
35
- var LINK_ENTER_RE = new RegExp(LINK_ENTER_PATTERN, "gi");
36
- var LINK_INPUT_RE = new RegExp(LINK_INPUT_PATTERN, "gi");
37
- var LINK_MARK_RE = new RegExp(LINK_MARK_PATTERN, "gi");
7
+ //#region src/link/link-regex.ts
8
+ const TLD_RE_PATTERN = "a(?:a(?:a|rp)|b(?:arth|b(?:ott|vie)?|c|le|ogado|udhabi)|c(?:ademy|c(?:enture|ountants?)|o|tor)?|d(?:s|ult)?|e(?:g|ro|tna)?|f(?:l|rica)?|g(?:akhan|ency)?|i(?:g|r(?:bus|force|tel))?|kdn|l(?:faromeo|i(?:baba|pay)|l(?:finanz|state|y)|s(?:ace|tom))?|m(?:azon|e(?:rican(?:express|family)|x)|fam|ica|sterdam)?|n(?:alytics|droid|quan|z)|ol?|p(?:artments|p(?:le)?)|q(?:uarelle)?|r(?:a(?:b|mco)|chi|my|pa|te?)?|s(?:da|ia|sociates)?|t(?:hleta|torney)?|u(?:ction|di(?:ble|o)?|spost|t(?:hor|os?))?|vianca|ws?|xa?|z(?:ure)?)|b(?:a(?:by|idu|n(?:a(?:mex|narepublic)|d|k)|r(?:c(?:elona|lay(?:card|s))|efoot|gains)?|s(?:eball|ketball)|uhaus|yern)?|b(?:c|t|va)?|c[gn]|d|e(?:a(?:ts|uty)|er|ntley|rlin|st(?:buy)?|t)?|f|g|h(?:arti)?|i(?:ble|d|ke|ngo?|o|z)?|j|l(?:ack(?:friday)?|o(?:ckbuster|g|omberg)|ue)|m[sw]?|n(?:pparibas)?|o(?:ats|ehringer|fa|m|nd|o(?:k(?:ing)?)?|s(?:ch|t(?:ik|on))|t|utique|x)?|r(?:adesco|idgestone|o(?:adway|ker|ther)|ussels)?|s|t|u(?:ild(?:ers)?|siness|y|zz)|v|w|y|zh?)|c(?:a(?:b|fe|l(?:l|vinklein)?|m(?:era|p)?|non|p(?:etown|ital(?:one)?)|r(?:avan|ds|e(?:ers?)?|s)?|s(?:a|e|h|ino)|t(?:ering|holic)?)?|b(?:a|n|re|s)|c|d|e(?:nter|o|rn)|f[ad]?|g|h(?:a(?:n(?:el|nel)|rity|se|t)|eap|intai|r(?:istmas|ome)|urch)?|i(?:priani|rcle|sco|t(?:adel|ic?|y(?:eats)?))?|k|l(?:aims|eaning|i(?:ck|ni(?:c|que))|o(?:thing|ud)|ub(?:med)?)?|m|n|o(?:ach|des|ffee|l(?:lege|ogne)|m(?:cast|m(?:bank|unity)|p(?:a(?:ny|re)|uter)|sec)?|n(?:dos|s(?:truction|ulting)|t(?:act|ractors))|o(?:king(?:channel)?|l|p)|rsica|u(?:ntry|pons?|rses))?|pa|r(?:edit(?:card|union)?|icket|own|s|uises?)?|u(?:isinella)?|v|w|x|y(?:mru|ou)?|z)|d(?:a(?:bur|d|nce|t(?:a|e|ing|sun)|y)|clk|ds|e(?:al(?:er|s)?|gree|l(?:ivery|l|oitte|ta)|mocrat|nt(?:al|ist)|si(?:gn)?|v)?|hl|i(?:amonds|et|gital|rect(?:ory)?|s(?:co(?:unt|ver)|h)|y)|j|k|m|np|o(?:c(?:s|tor)|g|mains|t|wnload)?|rive|tv|u(?:bai|nlop|pont|rban)|v(?:ag|r)|z)|e(?:a(?:rth|t)|co?|d(?:eka|u(?:cation)?)|e|g|m(?:ail|erck)|n(?:ergy|gineer(?:ing)?|terprises)|pson|quipment|r(?:icsson|ni)?|s(?:q|tate)?|t(?:isalat)?|u(?:rovision|s)?|vents|x(?:change|p(?:ert|osed|ress)|traspace))|f(?:a(?:ge|i(?:l|rwinds|th)|mily|ns?|rm(?:ers)?|s(?:hion|t))|e(?:dex|edback|rr(?:ari|ero))|i(?:at|d(?:elity|o)|lm|na(?:l|nc(?:e|ial))|r(?:e(?:stone)?|mdale)|sh(?:ing)?|t(?:ness)?)?|j|k|l(?:i(?:ckr|ghts|r)|o(?:rist|wers)|y)|m|o(?:o(?:d(?:network)?|tball)?|r(?:d|ex|sale|um)|undation|x)?|r(?:e(?:e|senius)|l|o(?:gans|nt(?:door|ier)))?|tr|u(?:jitsu|nd?|rniture|tbol)|yi)|g(?:a(?:l(?:l(?:ery|o|up))?|mes?|p|rden|y)?|b(?:iz)?|dn?|e(?:a|nt(?:ing)?|orge)?|f|g(?:ee)?|h|i(?:fts?|v(?:es|ing))?|l(?:ass|e|ob(?:al|o))?|m(?:ail|bh|o|x)?|n|o(?:daddy|l(?:d(?:point)?|f)|o(?:dyear|g(?:le)?)?|p|t|v)|p|q|r(?:a(?:inger|phics|tis)|een|ipe|o(?:cery|up))?|s|t|u(?:ardian|cci|ge|i(?:de|tars)|ru)?|w|y)|h(?:a(?:ir|mburg|ngout|us)|bo|dfc(?:bank)?|e(?:alth(?:care)?|l(?:p|sinki)|r(?:e|mes))|gtv|i(?:phop|samitsu|tachi|v)|kt?|m|n|o(?:ckey|l(?:dings|iday)|me(?:depot|goods|s(?:ense)?)|nda|rse|s(?:pital|t(?:ing)?)|t(?:el(?:es|s)|mail)?|use|w)|r|sbc|t|u(?:ghes)?|y(?:att|undai))|i(?:bm|c(?:bc|e|u)|d|e(?:ee)?|fm|kano|l|m(?:amat|db|mo(?:bilien)?)?|n(?:c|dustries|f(?:initi|o)|g|k|s(?:titute|ur(?:ance|e))|t(?:ernational|uit)?|vestments)?|o|piranga|q|r(?:ish)?|s(?:maili|t(?:anbul)?)?|t(?:au|v)?)|j(?:a(?:guar|va)|cb|e(?:ep|tzt|welry)?|io|ll|mp?|nj|o(?:b(?:s|urg)|t|y)?|p(?:morgan|rs)?|u(?:egos|niper))|k(?:aufen|ddi|e(?:rry(?:hotels|logistics|properties))?|fh|g|h|i(?:a|ds|m|nd(?:er|le)|tchen|wi)?|m|n|o(?:eln|matsu|sher)|p(?:mg|n)?|r(?:d|ed)?|uokgroup|w|y(?:oto)?|z)|l(?:a(?:caixa|m(?:borghini|er)|n(?:c(?:aster|ia)|d(?:rover)?|xess)|salle|t(?:ino|robe)?|w(?:yer)?)?|b|c|ds|e(?:ase|clerc|frak|g(?:al|o)|xus)|gbt|i(?:dl|fe(?:insurance|style)?|ghting|ke|lly|m(?:ited|o)|n(?:coln|de|k)|psy|v(?:e|ing))?|k|l[cp]|o(?:ans?|c(?:ker|us)|l|ndon|tt[eo]|ve)|pl(?:financial)?|r|s|t(?:da?)?|u(?:ndbeck|x(?:e|ury))?|v|y)|m(?:a(?:cys|drid|i(?:f|son)|keup|n(?:agement|go)?|p|r(?:ket(?:ing|s)?|riott|shalls)|serati|ttel)?|ba|c(?:kinsey)?|d|e(?:d(?:ia)?|et|lbourne|m(?:e|orial)|nu?|rckmsd)?|g|h|i(?:ami|crosoft|l|n[it]|t(?:subishi)?)|k|l[bs]?|ma?|n|o(?:bi(?:le)?|da|e|i|m|n(?:ash|ey|ster)|r(?:mon|tgage)|scow|to(?:rcycles)?|v(?:ie)?)?|p|q|r|sd?|t[nr]?|u(?:s(?:eum|ic)|tual)?|v|w|x|y|z)|n(?:a(?:b|goya|me|tura|vy)?|ba|c|e(?:c|t(?:bank|flix|work)?|ustar|ws?|x(?:t(?:direct)?|us))?|fl?|go?|hk|i(?:co|k(?:e|on)|nja|ssa[ny])?|l|o(?:kia|rt(?:hwesternmutual|on)|w(?:ruz|tv)?)?|p|r[aw]?|tt|u|yc|z)|o(?:b(?:i|server)|ffice|kinawa|l(?:ayan(?:group)?|dnavy|lo)|m(?:ega)?|n(?:e|g|l(?:ine)?)|oo|pen|r(?:a(?:cle|nge)|g(?:anic)?|igins)|saka|t(?:suka|t)|vh)|p(?:a(?:ge|nasonic|r(?:is|s|t(?:ners|s|y))|ssagens|y)?|ccw|et?|f(?:izer)?|g|h(?:armacy|d|ilips|o(?:ne|to(?:graphy|s)?)|ysio)?|i(?:c(?:s|t(?:et|ures))|d|n[gk]?|oneer|zza)|k|l(?:a(?:ce|y(?:station)?)|u(?:mbing|s))?|m|nc?|o(?:hl|ker|litie|rn|st)|r(?:a(?:merica|xi)|ess|ime|o(?:d(?:uctions)?|f|gressive|mo|pert(?:ies|y)|tection)?|u(?:dential)?)?|s|t|ub|wc?|y)|q(?:a|pon|ue(?:bec|st))|r(?:a(?:cing|dio)|e(?:a(?:d|l(?:estate|t(?:or|y)))|cipes|d(?:stone|umbrella)?|hab|i(?:sen?|t)|liance|n(?:t(?:als)?)?|p(?:air|ort|ublican)|st(?:aurant)?|views?|xroth)?|i(?:c(?:h(?:ardli)?|oh)|l|o|p)|o(?:c(?:her|ks)|deo|gers|om)?|s(?:vp)?|u(?:gby|hr|n)?|we?|yukyu)|s(?:a(?:arland|fe(?:ty)?|kura|l(?:e|on)|ms(?:club|ung)|n(?:dvik(?:coromant)?|ofi)|p|rl|s|ve|xo)?|b[is]?|c(?:a|b|h(?:aeffler|midt|o(?:larships|ol)|ule|warz)|ience|ot)?|d|e(?:a(?:rch|t)|cur(?:e|ity)|ek|lect|ner|rvices|ven|w|xy?)?|fr|g|h(?:a(?:ngrila|rp|w)|ell|i(?:a|ksha)|o(?:es|p(?:ping)?|uji|w(?:time)?))?|i(?:lk|n(?:a|gles)|te)?|j|k(?:in?|y(?:pe)?)?|l(?:ing)?|m(?:art|ile)?|n(?:cf)?|o(?:c(?:cer|ial)|ft(?:bank|ware)|hu|l(?:ar|utions)|n[gy]|y)?|p(?:a(?:ce)?|o(?:rt|t))|rl?|s|t(?:a(?:da|ples|r|te(?:bank|farm))|c(?:group)?|o(?:ckholm|r(?:age|e))|ream|ud(?:io|y)|yle)?|u(?:cks|pp(?:l(?:ies|y)|ort)|r(?:f|gery)|zuki)?|v|w(?:atch|iss)|x|y(?:dney|stems)?|z)|t(?:a(?:b|ipei|lk|obao|rget|t(?:a(?:motors|r)|too)|xi?)|ci?|dk?|e(?:am|ch(?:nology)?|l|masek|nnis|va)|f|g|h(?:d|eat(?:er|re))?|i(?:aa|ckets|enda|ffany|ps|r(?:es|ol))|j(?:maxx|x)?|k(?:maxx)?|l|m(?:all)?|n|o(?:day|kyo|ols|p|ray|shiba|tal|urs|wn|y(?:ota|s))?|r(?:a(?:d(?:e|ing)|ining|vel(?:channel|ers(?:insurance)?)?)|ust|v)?|t|u(?:be|i|nes|shu)|vs?|w|z)|u(?:a|b(?:ank|s)|g|k|n(?:i(?:com|versity)|o)|ol|ps|s|y|z)|v(?:a(?:cations|n(?:a|guard))?|c|e(?:gas|ntures|r(?:isign|sicherung)|t)?|g|i(?:ajes|deo|g|king|llas|n|p|rgin|s(?:a|ion)|v[ao])?|laanderen|n|o(?:dka|l(?:kswagen|vo)|t(?:e|ing|o)|yage)|u(?:elos)?)|w(?:a(?:l(?:es|mart|ter)|ng(?:gou)?|tch(?:es)?)|e(?:ather(?:channel)?|b(?:cam|er|site)|d(?:ding)?|i(?:bo|r))|f|hoswho|i(?:en|ki|lliamhill|n(?:dows|e|ners)?)|me|o(?:lterskluwer|odside|r(?:ks?|ld)|w)|s|t[cf])|x(?:box|erox|finity|i(?:huan|n)|xx|yz)|y(?:a(?:chts|hoo|maxun|ndex)|e|o(?:dobashi|ga|kohama|u(?:tube)?)|t|un)|z(?:a(?:ppos|ra)?|ero|ip|m|one|uerich|w)";
9
+ const PUNCTUATION_CHAR_PATTERN = "\\.\\,\\;\\!\\?";
10
+ const STOP_CHAR_PATTERN = "[" + PUNCTUATION_CHAR_PATTERN + "]";
11
+ const END_CHAR_PATTERN = "[^\\s" + PUNCTUATION_CHAR_PATTERN + "]";
12
+ const LINK_RE_BASE_PATTERN = "((?:(?:(?:https?:)?\\/\\/)?(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:" + TLD_RE_PATTERN + "))(?::\\d{2,5})?(?:/(?:\\S*" + END_CHAR_PATTERN + ")?)?(?:\\?(?:\\S*" + END_CHAR_PATTERN + "))?(?:\\#(?:\\S*" + END_CHAR_PATTERN + ")?)?)";
13
+ const LINK_ENTER_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + "?$";
14
+ const LINK_INPUT_PATTERN = LINK_RE_BASE_PATTERN + STOP_CHAR_PATTERN + "?\\s$";
15
+ const LINK_MARK_PATTERN = LINK_RE_BASE_PATTERN + "(?=" + STOP_CHAR_PATTERN + "|\\s|$)";
16
+ const LINK_ENTER_RE = new RegExp(LINK_ENTER_PATTERN, "gi");
17
+ const LINK_INPUT_RE = new RegExp(LINK_INPUT_PATTERN, "gi");
18
+ const LINK_MARK_RE = new RegExp(LINK_MARK_PATTERN, "gi");
38
19
 
39
- // src/link/index.ts
20
+ //#endregion
21
+ //#region src/link/index.ts
22
+ /**
23
+ * @internal
24
+ */
40
25
  function defineLinkSpec() {
41
- return defineMarkSpec({
42
- name: "link",
43
- inclusive: false,
44
- attrs: {
45
- href: {}
46
- },
47
- parseDOM: [
48
- {
49
- tag: "a[href]",
50
- getAttrs: (dom) => {
51
- return {
52
- href: dom.getAttribute("href")
53
- };
54
- }
55
- }
56
- ],
57
- toDOM(node) {
58
- const { href } = node.attrs;
59
- return ["a", { href }, 0];
60
- }
61
- });
26
+ return defineMarkSpec({
27
+ name: "link",
28
+ inclusive: false,
29
+ attrs: { href: { validate: "string" } },
30
+ parseDOM: [{
31
+ tag: "a[href]",
32
+ getAttrs: (dom) => {
33
+ return { href: dom.getAttribute("href") || "" };
34
+ }
35
+ }],
36
+ toDOM(node) {
37
+ const { href } = node.attrs;
38
+ return [
39
+ "a",
40
+ { href },
41
+ 0
42
+ ];
43
+ }
44
+ });
62
45
  }
63
46
  function defineLinkCommands() {
64
- return defineCommands({
65
- addLink: (attrs) => addMark({ type: "link", attrs }),
66
- removeLink: () => removeMark({ type: "link" }),
67
- toggleLink: (attrs) => toggleMark({ type: "link", attrs }),
68
- expandLink: () => expandMark({ type: "link" })
69
- });
47
+ return defineCommands({
48
+ addLink: (attrs) => addMark({
49
+ type: "link",
50
+ attrs
51
+ }),
52
+ removeLink: () => removeMark({ type: "link" }),
53
+ toggleLink: (attrs) => toggleMark({
54
+ type: "link",
55
+ attrs
56
+ }),
57
+ expandLink: () => expandMark({ type: "link" })
58
+ });
70
59
  }
60
+ /**
61
+ * Apply link marks after pressing Space.
62
+ *
63
+ * @internal
64
+ */
71
65
  function defineLinkInputRule() {
72
- return defineInputRule(
73
- new InputRule(LINK_INPUT_RE, (state, match, from) => {
74
- const href = match[1];
75
- if (!href) return null;
76
- const mark = state.schema.marks.link.create({ href });
77
- return state.tr.addMark(from, from + href.length, mark).insertText(" ");
78
- })
79
- );
66
+ return defineInputRule(new InputRule(LINK_INPUT_RE, (state, match, from) => {
67
+ const href = match[1];
68
+ if (!href) return null;
69
+ const mark = state.schema.marks.link.create({ href });
70
+ return state.tr.addMark(from, from + href.length, mark).insertText(" ");
71
+ }));
80
72
  }
73
+ /**
74
+ * Apply link marks after typing Enter.
75
+ *
76
+ * @internal
77
+ */
81
78
  function defineLinkEnterRule() {
82
- return defineEnterRule({
83
- regex: LINK_ENTER_RE,
84
- handler: ({ state, from, match }) => {
85
- const href = match[1];
86
- if (!href) return null;
87
- const mark = state.schema.marks.link.create({ href });
88
- const tr = state.tr.addMark(from, from + href.length, mark);
89
- return tr.docChanged ? tr : null;
90
- }
91
- });
79
+ return defineEnterRule({
80
+ regex: LINK_ENTER_RE,
81
+ handler: ({ state, from, match }) => {
82
+ const href = match[1];
83
+ if (!href) return null;
84
+ const mark = state.schema.marks.link.create({ href });
85
+ const tr = state.tr.addMark(from, from + href.length, mark);
86
+ return tr.docChanged ? tr : null;
87
+ }
88
+ });
92
89
  }
90
+ /**
91
+ * Apply and remove link marks to the text during typing.
92
+ *
93
+ * @internal
94
+ */
93
95
  function defineLinkMarkRule() {
94
- return defineMarkRule({
95
- regex: LINK_MARK_RE,
96
- type: "link",
97
- attrs: (match) => ({ href: match[1] })
98
- });
96
+ return defineMarkRule({
97
+ regex: LINK_MARK_RE,
98
+ type: "link",
99
+ attrs: (match) => ({ href: match[1] })
100
+ });
99
101
  }
102
+ /**
103
+ * @public
104
+ */
100
105
  function defineLink() {
101
- return union(
102
- defineLinkSpec(),
103
- defineLinkCommands(),
104
- defineLinkInputRule(),
105
- defineLinkEnterRule()
106
- );
106
+ return union(defineLinkSpec(), defineLinkCommands(), defineLinkInputRule(), defineLinkEnterRule());
107
107
  }
108
- export {
109
- defineLink,
110
- defineLinkCommands,
111
- defineLinkEnterRule,
112
- defineLinkInputRule,
113
- defineLinkMarkRule,
114
- defineLinkSpec
115
- };
108
+
109
+ //#endregion
110
+ export { defineLink, defineLinkCommands, defineLinkEnterRule, defineLinkInputRule, defineLinkMarkRule, defineLinkSpec };