@contentful/field-editor-markdown 1.2.1 → 1.3.0
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/dist/cjs/MarkdownActions.js +235 -0
- package/dist/cjs/MarkdownEditor.js +180 -0
- package/dist/cjs/__fixtures__/FakeSdk.js +183 -0
- package/dist/cjs/__fixtures__/asset/index.js +37 -0
- package/dist/cjs/__fixtures__/content-type/index.js +16 -0
- package/dist/cjs/__fixtures__/entry/index.js +33 -0
- package/dist/cjs/__fixtures__/fixtures.js +71 -0
- package/dist/cjs/__fixtures__/locale/index.js +40 -0
- package/dist/cjs/__fixtures__/space/index.js +16 -0
- package/dist/cjs/codemirrorImports.js +9 -0
- package/dist/cjs/components/HeadingSelector.js +66 -0
- package/dist/cjs/components/InsertLinkSelector.js +86 -0
- package/dist/cjs/components/MarkdownBottomBar.js +111 -0
- package/dist/cjs/components/MarkdownConstraints.js +79 -0
- package/dist/cjs/components/MarkdownPreview.js +249 -0
- package/dist/cjs/components/MarkdownTabs.js +128 -0
- package/dist/cjs/components/MarkdownTextarea/CodeMirrorWrapper.js +383 -0
- package/dist/cjs/components/MarkdownTextarea/MarkdownCommands.js +233 -0
- package/dist/cjs/components/MarkdownTextarea/MarkdownTextarea.js +190 -0
- package/dist/cjs/components/MarkdownTextarea/createMarkdownEditor.js +101 -0
- package/dist/cjs/components/MarkdownToolbar.js +367 -0
- package/dist/cjs/components/icons.js +193 -0
- package/dist/cjs/dialogs/CheatsheetModalDialog.js +239 -0
- package/dist/cjs/dialogs/ConfirmInsertAssetModalDialog.js +94 -0
- package/dist/cjs/dialogs/EmdebExternalContentDialog.js +202 -0
- package/dist/cjs/dialogs/InsertLinkModalDialog.js +149 -0
- package/dist/cjs/dialogs/InsertTableModalDialog.js +140 -0
- package/dist/cjs/dialogs/SpecialCharacterModalDialog.js +146 -0
- package/dist/cjs/dialogs/ZenModeModalDialog.js +257 -0
- package/dist/cjs/dialogs/openMarkdownDialog.js +121 -0
- package/dist/cjs/dialogs/renderMarkdownDialog.js +108 -0
- package/dist/cjs/index.js +29 -0
- package/dist/cjs/types.js +20 -0
- package/dist/cjs/utils/insertAssetLinks.js +122 -0
- package/dist/cjs/utils/insertAssetLinks.spec.js +22 -0
- package/dist/cjs/utils/isValidUrl.js +22 -0
- package/dist/cjs/utils/linkOrganizer.js +187 -0
- package/dist/cjs/utils/linkOrganizer.spec.js +96 -0
- package/dist/cjs/utils/replaceMailtoAmp.js +15 -0
- package/dist/cjs/utils/replaceMailtoAmp.spec.js +22 -0
- package/dist/cjs/utils/specialCharacters.js +228 -0
- package/dist/cjs/utils/userAgent.js +28 -0
- package/dist/esm/MarkdownActions.js +186 -0
- package/dist/esm/MarkdownEditor.js +118 -0
- package/dist/esm/__fixtures__/FakeSdk.js +173 -0
- package/dist/esm/__fixtures__/asset/index.js +6 -0
- package/dist/esm/__fixtures__/content-type/index.js +2 -0
- package/dist/esm/__fixtures__/entry/index.js +5 -0
- package/dist/esm/__fixtures__/fixtures.js +6 -0
- package/dist/esm/__fixtures__/locale/index.js +15 -0
- package/dist/esm/__fixtures__/space/index.js +2 -0
- package/dist/esm/codemirrorImports.js +5 -0
- package/dist/esm/components/HeadingSelector.js +17 -0
- package/dist/esm/components/InsertLinkSelector.js +37 -0
- package/dist/esm/components/MarkdownBottomBar.js +46 -0
- package/dist/esm/components/MarkdownConstraints.js +25 -0
- package/dist/esm/components/MarkdownPreview.js +195 -0
- package/dist/esm/components/MarkdownTabs.js +74 -0
- package/dist/esm/components/MarkdownTextarea/CodeMirrorWrapper.js +329 -0
- package/dist/esm/components/MarkdownTextarea/MarkdownCommands.js +218 -0
- package/dist/esm/components/MarkdownTextarea/MarkdownTextarea.js +136 -0
- package/dist/esm/components/MarkdownTextarea/createMarkdownEditor.js +52 -0
- package/dist/esm/components/MarkdownToolbar.js +302 -0
- package/dist/esm/components/icons.js +112 -0
- package/dist/esm/dialogs/CheatsheetModalDialog.js +177 -0
- package/dist/esm/dialogs/ConfirmInsertAssetModalDialog.js +37 -0
- package/dist/esm/dialogs/EmdebExternalContentDialog.js +140 -0
- package/dist/esm/dialogs/InsertLinkModalDialog.js +92 -0
- package/dist/esm/dialogs/InsertTableModalDialog.js +78 -0
- package/dist/esm/dialogs/SpecialCharacterModalDialog.js +84 -0
- package/dist/esm/dialogs/ZenModeModalDialog.js +195 -0
- package/dist/esm/dialogs/openMarkdownDialog.js +72 -0
- package/dist/esm/dialogs/renderMarkdownDialog.js +59 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/types.js +10 -0
- package/dist/esm/utils/insertAssetLinks.js +99 -0
- package/dist/esm/utils/insertAssetLinks.spec.js +18 -0
- package/dist/esm/utils/isValidUrl.js +4 -0
- package/dist/esm/utils/linkOrganizer.js +152 -0
- package/dist/esm/utils/linkOrganizer.spec.js +53 -0
- package/dist/esm/utils/replaceMailtoAmp.js +5 -0
- package/dist/esm/utils/replaceMailtoAmp.spec.js +18 -0
- package/dist/esm/utils/specialCharacters.js +218 -0
- package/dist/esm/utils/userAgent.js +13 -0
- package/dist/{MarkdownActions.d.ts → types/MarkdownActions.d.ts} +38 -38
- package/dist/{MarkdownEditor.d.ts → types/MarkdownEditor.d.ts} +22 -22
- package/dist/types/__fixtures__/FakeSdk.d.ts +8 -0
- package/dist/types/__fixtures__/asset/index.d.ts +6 -0
- package/dist/types/__fixtures__/content-type/index.d.ts +2 -0
- package/dist/types/__fixtures__/entry/index.d.ts +5 -0
- package/dist/types/__fixtures__/fixtures.d.ts +6 -0
- package/dist/types/__fixtures__/locale/index.d.ts +42 -0
- package/dist/types/__fixtures__/space/index.d.ts +2 -0
- package/dist/{codemirrorImports.d.ts → types/codemirrorImports.d.ts} +5 -5
- package/dist/{components → types/components}/HeadingSelector.d.ts +7 -7
- package/dist/{components → types/components}/InsertLinkSelector.d.ts +9 -9
- package/dist/{components → types/components}/MarkdownBottomBar.d.ts +11 -11
- package/dist/{components → types/components}/MarkdownConstraints.d.ts +6 -6
- package/dist/{components → types/components}/MarkdownPreview.d.ts +14 -14
- package/dist/{components → types/components}/MarkdownTabs.d.ts +8 -8
- package/dist/{components → types/components}/MarkdownTextarea/CodeMirrorWrapper.d.ts +58 -58
- package/dist/{components → types/components}/MarkdownTextarea/MarkdownCommands.d.ts +33 -33
- package/dist/{components → types/components}/MarkdownTextarea/MarkdownTextarea.d.ts +17 -17
- package/dist/{components → types/components}/MarkdownTextarea/createMarkdownEditor.d.ts +55 -55
- package/dist/{components → types/components}/MarkdownToolbar.d.ts +12 -12
- package/dist/types/components/icons.d.ts +18 -0
- package/dist/{dialogs → types/dialogs}/CheatsheetModalDialog.d.ts +4 -4
- package/dist/{dialogs → types/dialogs}/ConfirmInsertAssetModalDialog.d.ts +23 -23
- package/dist/{dialogs → types/dialogs}/EmdebExternalContentDialog.d.ts +9 -9
- package/dist/{dialogs → types/dialogs}/InsertLinkModalDialog.d.ts +17 -17
- package/dist/{dialogs → types/dialogs}/InsertTableModalDialog.d.ts +13 -13
- package/dist/{dialogs → types/dialogs}/SpecialCharacterModalDialog.d.ts +9 -9
- package/dist/{dialogs → types/dialogs}/ZenModeModalDialog.d.ts +24 -24
- package/dist/{dialogs → types/dialogs}/openMarkdownDialog.d.ts +5 -5
- package/dist/{dialogs → types/dialogs}/renderMarkdownDialog.d.ts +8 -8
- package/dist/{index.d.ts → types/index.d.ts} +5 -5
- package/dist/{types.d.ts → types/types.d.ts} +75 -75
- package/dist/{utils → types/utils}/insertAssetLinks.d.ts +29 -29
- package/dist/types/utils/insertAssetLinks.spec.d.ts +1 -0
- package/dist/{utils → types/utils}/isValidUrl.d.ts +2 -2
- package/dist/{utils → types/utils}/linkOrganizer.d.ts +6 -6
- package/dist/types/utils/linkOrganizer.spec.d.ts +1 -0
- package/dist/{utils → types/utils}/replaceMailtoAmp.d.ts +1 -1
- package/dist/types/utils/replaceMailtoAmp.spec.d.ts +1 -0
- package/dist/{utils → types/utils}/specialCharacters.d.ts +4 -4
- package/dist/{utils → types/utils}/userAgent.d.ts +1 -1
- package/package.json +25 -11
- package/CHANGELOG.md +0 -314
- package/dist/components/icons.d.ts +0 -18
- package/dist/field-editor-markdown.cjs.development.js +0 -3609
- package/dist/field-editor-markdown.cjs.development.js.map +0 -1
- package/dist/field-editor-markdown.cjs.production.min.js +0 -216
- package/dist/field-editor-markdown.cjs.production.min.js.map +0 -1
- package/dist/field-editor-markdown.esm.js +0 -3599
- package/dist/field-editor-markdown.esm.js.map +0 -1
- package/dist/index.js +0 -8
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
urlRegex: function() {
|
|
13
|
+
return urlRegex;
|
|
14
|
+
},
|
|
15
|
+
isValidUrl: function() {
|
|
16
|
+
return isValidUrl;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const urlRegex = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?$/;
|
|
20
|
+
function isValidUrl(value) {
|
|
21
|
+
return urlRegex.test(value);
|
|
22
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
findInline: function() {
|
|
13
|
+
return findInline;
|
|
14
|
+
},
|
|
15
|
+
findRefs: function() {
|
|
16
|
+
return findRefs;
|
|
17
|
+
},
|
|
18
|
+
findLabels: function() {
|
|
19
|
+
return findLabels;
|
|
20
|
+
},
|
|
21
|
+
convertInlineToRef: function() {
|
|
22
|
+
return convertInlineToRef;
|
|
23
|
+
},
|
|
24
|
+
rewriteRefs: function() {
|
|
25
|
+
return rewriteRefs;
|
|
26
|
+
},
|
|
27
|
+
findMaxLabelId: function() {
|
|
28
|
+
return findMaxLabelId;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const _extend = _interop_require_default(require("lodash/extend"));
|
|
32
|
+
const _isObject = _interop_require_default(require("lodash/isObject"));
|
|
33
|
+
const _isString = _interop_require_default(require("lodash/isString"));
|
|
34
|
+
const _max = _interop_require_default(require("lodash/max"));
|
|
35
|
+
const _isFinite = _interop_require_default(require("lodash/isFinite"));
|
|
36
|
+
const _forEach = _interop_require_default(require("lodash/forEach"));
|
|
37
|
+
function _interop_require_default(obj) {
|
|
38
|
+
return obj && obj.__esModule ? obj : {
|
|
39
|
+
default: obj
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function extractTitle(title) {
|
|
43
|
+
title = title || '';
|
|
44
|
+
title = title.replace(/^ *('|"|\()*/, '');
|
|
45
|
+
title = title.replace(/('|"|\))* *$/, '');
|
|
46
|
+
return title;
|
|
47
|
+
}
|
|
48
|
+
function head(text) {
|
|
49
|
+
return text.split(' ').shift();
|
|
50
|
+
}
|
|
51
|
+
function tail(text) {
|
|
52
|
+
const segments = text.split(' ');
|
|
53
|
+
segments.shift();
|
|
54
|
+
return segments.join(' ');
|
|
55
|
+
}
|
|
56
|
+
const PROCESSORS = {
|
|
57
|
+
inline: function(match) {
|
|
58
|
+
return {
|
|
59
|
+
match: match[0],
|
|
60
|
+
text: match[1],
|
|
61
|
+
href: head(match[2]),
|
|
62
|
+
title: extractTitle(tail(match[2]))
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
ref: function(match) {
|
|
66
|
+
return {
|
|
67
|
+
match: match[0],
|
|
68
|
+
text: match[1],
|
|
69
|
+
id: match[2]
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
label: function(match) {
|
|
73
|
+
return {
|
|
74
|
+
match: match[0],
|
|
75
|
+
id: match[1],
|
|
76
|
+
href: head(match[2]),
|
|
77
|
+
title: extractTitle(tail(match[2]))
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const REGEXS = {
|
|
82
|
+
inline: /\[([^\r\n[\]]+)]\(([^\r\n)]+)\)/,
|
|
83
|
+
ref: /\[([^\r\n[\]]+)] ?\[([^\r\n[\]]+)]/,
|
|
84
|
+
label: /^ {0,3}\[([^\r\n[\]]+)]:\s+(.+)$/
|
|
85
|
+
};
|
|
86
|
+
const findInline = makeFinder('inline');
|
|
87
|
+
const findRefs = makeFinder('ref');
|
|
88
|
+
const findLabels = makeFinder('label');
|
|
89
|
+
function convertInlineToRef(text) {
|
|
90
|
+
let id = findMaxLabelId(text);
|
|
91
|
+
(0, _forEach.default)(findInline(text), (inline)=>{
|
|
92
|
+
id += 1;
|
|
93
|
+
text = text.replace(inline.match, buildRef(inline, id));
|
|
94
|
+
text += '\n' + buildLabel(inline, id);
|
|
95
|
+
});
|
|
96
|
+
return text;
|
|
97
|
+
}
|
|
98
|
+
function mergeLabels(text) {
|
|
99
|
+
const byHref = {};
|
|
100
|
+
const byOldId = {};
|
|
101
|
+
(0, _forEach.default)(findLabels(text), (label)=>{
|
|
102
|
+
const alreadyAdded = byHref[label.href];
|
|
103
|
+
const current = (0, _extend.default)({}, label);
|
|
104
|
+
if (!alreadyAdded) {
|
|
105
|
+
byHref[current.href] = current;
|
|
106
|
+
} else if (hasTitle(current) && !hasTitle(alreadyAdded)) {
|
|
107
|
+
alreadyAdded.title = current.title;
|
|
108
|
+
}
|
|
109
|
+
byOldId[current.id] = alreadyAdded || current;
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
byHref: byHref,
|
|
113
|
+
byOldId: byOldId
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function rewriteRefs(text) {
|
|
117
|
+
const merged = mergeLabels(text);
|
|
118
|
+
const hrefToRefId = {};
|
|
119
|
+
const labels = [];
|
|
120
|
+
const rewrites = [];
|
|
121
|
+
let i = 1;
|
|
122
|
+
(0, _forEach.default)(findRefs(text), (ref)=>{
|
|
123
|
+
const oldLabel = merged.byOldId[ref.id];
|
|
124
|
+
if (!oldLabel) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const href = oldLabel.href;
|
|
128
|
+
let newRefId = hrefToRefId[href];
|
|
129
|
+
if (!newRefId) {
|
|
130
|
+
hrefToRefId[href] = newRefId = i;
|
|
131
|
+
i += 1;
|
|
132
|
+
labels.push((0, _extend.default)({
|
|
133
|
+
newId: newRefId
|
|
134
|
+
}, oldLabel));
|
|
135
|
+
}
|
|
136
|
+
rewrites.push((0, _extend.default)({
|
|
137
|
+
newId: newRefId
|
|
138
|
+
}, ref));
|
|
139
|
+
});
|
|
140
|
+
(0, _forEach.default)(findLabels(text), (label)=>{
|
|
141
|
+
text = text.replace(label.match, '');
|
|
142
|
+
});
|
|
143
|
+
text = text.replace(/[\r\n\s]*$/, '');
|
|
144
|
+
text += '\n\n';
|
|
145
|
+
(0, _forEach.default)(rewrites, (ref)=>{
|
|
146
|
+
text = text.replace(ref.match, buildRef(ref, ref.newId));
|
|
147
|
+
});
|
|
148
|
+
(0, _forEach.default)(labels, (label)=>{
|
|
149
|
+
text += '\n' + buildLabel(label, label.newId);
|
|
150
|
+
});
|
|
151
|
+
return text;
|
|
152
|
+
}
|
|
153
|
+
function makeFinder(type) {
|
|
154
|
+
return (text)=>findAll(text, type).map(PROCESSORS[type]);
|
|
155
|
+
}
|
|
156
|
+
function findMaxLabelId(textOrLabels) {
|
|
157
|
+
if ((0, _isString.default)(textOrLabels)) {
|
|
158
|
+
textOrLabels = findLabels(textOrLabels);
|
|
159
|
+
}
|
|
160
|
+
const ids = textOrLabels.map((x)=>x.id).map((x)=>parseInt(x, 10)).filter((x)=>(0, _isFinite.default)(x) && x > 0);
|
|
161
|
+
return ids.length > 0 ? (0, _max.default)(ids) || 0 : 0;
|
|
162
|
+
}
|
|
163
|
+
function findAll(text, type) {
|
|
164
|
+
const flags = 'g' + (type === 'label' ? 'm' : '');
|
|
165
|
+
const matches = [];
|
|
166
|
+
const re = new RegExp(REGEXS[type].source, flags);
|
|
167
|
+
let found = re.exec(text);
|
|
168
|
+
while(found){
|
|
169
|
+
matches.push(found);
|
|
170
|
+
re.lastIndex = found.index + found[0].length;
|
|
171
|
+
found = re.exec(text);
|
|
172
|
+
}
|
|
173
|
+
return matches;
|
|
174
|
+
}
|
|
175
|
+
function hasTitle(link) {
|
|
176
|
+
return (0, _isObject.default)(link) && (0, _isString.default)(link.title) && link.title.length > 0;
|
|
177
|
+
}
|
|
178
|
+
function buildLabel(link, id) {
|
|
179
|
+
let markup = '[' + id + ']: ' + link.href;
|
|
180
|
+
if (hasTitle(link)) {
|
|
181
|
+
markup += ' "' + link.title + '"';
|
|
182
|
+
}
|
|
183
|
+
return markup;
|
|
184
|
+
}
|
|
185
|
+
function buildRef(link, id) {
|
|
186
|
+
return '[' + link.text + '][' + id + ']';
|
|
187
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _linkOrganizer = _interop_require_wildcard(require("./linkOrganizer"));
|
|
6
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
7
|
+
if (typeof WeakMap !== "function") return null;
|
|
8
|
+
var cacheBabelInterop = new WeakMap();
|
|
9
|
+
var cacheNodeInterop = new WeakMap();
|
|
10
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
11
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
12
|
+
})(nodeInterop);
|
|
13
|
+
}
|
|
14
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
15
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
16
|
+
return obj;
|
|
17
|
+
}
|
|
18
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
19
|
+
return {
|
|
20
|
+
default: obj
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
24
|
+
if (cache && cache.has(obj)) {
|
|
25
|
+
return cache.get(obj);
|
|
26
|
+
}
|
|
27
|
+
var newObj = {};
|
|
28
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
29
|
+
for(var key in obj){
|
|
30
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
31
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
32
|
+
if (desc && (desc.get || desc.set)) {
|
|
33
|
+
Object.defineProperty(newObj, key, desc);
|
|
34
|
+
} else {
|
|
35
|
+
newObj[key] = obj[key];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
newObj.default = obj;
|
|
40
|
+
if (cache) {
|
|
41
|
+
cache.set(obj, newObj);
|
|
42
|
+
}
|
|
43
|
+
return newObj;
|
|
44
|
+
}
|
|
45
|
+
describe('Link organizer', ()=>{
|
|
46
|
+
describe('Inline link finder', ()=>{
|
|
47
|
+
it('Finds all inline links in text', ()=>{
|
|
48
|
+
const subject = 'test [link](http://url.com) test [link2](http://url2.com) test [link3](http://url.com)';
|
|
49
|
+
const found = _linkOrganizer.findInline(subject);
|
|
50
|
+
expect(found).toHaveLength(3);
|
|
51
|
+
expect(found[0].match).toBe('[link](http://url.com)');
|
|
52
|
+
expect(found[0].text).toBe('link');
|
|
53
|
+
expect(found[0].href).toBe('http://url.com');
|
|
54
|
+
expect(found[0].title).toBe('');
|
|
55
|
+
});
|
|
56
|
+
it('Finds and standardizes title', ()=>{
|
|
57
|
+
const subject = 'test [x](http://url.com "title!") [y](http://xyz.com title 2 )';
|
|
58
|
+
const found = _linkOrganizer.findInline(subject);
|
|
59
|
+
expect(found).toHaveLength(2);
|
|
60
|
+
expect(found[0].title).toBe('title!');
|
|
61
|
+
expect(found[1].title).toBe('title 2');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('Reference finder', ()=>{
|
|
65
|
+
it('Finds all references in text', ()=>{
|
|
66
|
+
const subject = 'test [x][1] test [y][2] [with space separator] [3]';
|
|
67
|
+
const found = _linkOrganizer.findRefs(subject);
|
|
68
|
+
expect(found).toHaveLength(3);
|
|
69
|
+
expect(found[0].match).toBe('[x][1]');
|
|
70
|
+
expect(found[2].match).toBe('[with space separator] [3]');
|
|
71
|
+
expect(found[1].text).toBe('y');
|
|
72
|
+
expect(found[1].id).toBe('2');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('Label finder', ()=>{
|
|
76
|
+
const subject = [
|
|
77
|
+
'[1]: http://test.com',
|
|
78
|
+
'[2]: http://url.com',
|
|
79
|
+
'[string]: http://url.com',
|
|
80
|
+
'[4]: http://test.com "Hello world"'
|
|
81
|
+
].join('\n');
|
|
82
|
+
it('Finds all labels', ()=>{
|
|
83
|
+
const found = _linkOrganizer.findLabels(subject);
|
|
84
|
+
expect(found).toHaveLength(4);
|
|
85
|
+
expect(found[0].id).toBe('1');
|
|
86
|
+
expect(found[2].id).toBe('string');
|
|
87
|
+
expect(found[0].href).toBe('http://test.com');
|
|
88
|
+
expect(found[3].href).toBe('http://test.com');
|
|
89
|
+
expect(found[1].title).toBe('');
|
|
90
|
+
expect(found[3].title).toBe('Hello world');
|
|
91
|
+
});
|
|
92
|
+
it('Finds max label id', ()=>{
|
|
93
|
+
expect(_linkOrganizer.findMaxLabelId(subject)).toBe(4);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "replaceMailtoAmp", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return replaceMailtoAmp;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const replaceMailtoAmp = (string)=>{
|
|
12
|
+
return string.replace(/href="mailto:[^"]*&/g, function(match) {
|
|
13
|
+
return match.replace(/&/g, '&');
|
|
14
|
+
});
|
|
15
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _replaceMailtoAmp = require("./replaceMailtoAmp");
|
|
6
|
+
describe('replace inside mailto', ()=>{
|
|
7
|
+
let str = '<a href="mailto:example@example.com?subject=Hello&body=Hello%20world">Send Email</a>';
|
|
8
|
+
test('replace & with &', ()=>{
|
|
9
|
+
const newStr = (0, _replaceMailtoAmp.replaceMailtoAmp)(str);
|
|
10
|
+
expect(newStr).toBe('<a href="mailto:example@example.com?subject=Hello&body=Hello%20world">Send Email</a>');
|
|
11
|
+
});
|
|
12
|
+
test('no replace if not inside mailto', ()=>{
|
|
13
|
+
str = '<a href="https://example.com?subject=Hello&body=Hello%20world">Visit Website</a>';
|
|
14
|
+
const newStr = (0, _replaceMailtoAmp.replaceMailtoAmp)(str);
|
|
15
|
+
expect(newStr).toBe('<a href="https://example.com?subject=Hello&body=Hello%20world">Visit Website</a>');
|
|
16
|
+
});
|
|
17
|
+
test('no replace if no &', ()=>{
|
|
18
|
+
str = '<a href="mailto:example@example.com?subject=Hello">Send Email</a>';
|
|
19
|
+
const newStr = (0, _replaceMailtoAmp.replaceMailtoAmp)(str);
|
|
20
|
+
expect(newStr).toBe('<a href="mailto:example@example.com?subject=Hello">Send Email</a>');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "specialCharacters", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return specialCharacters;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const specialCharacters = [
|
|
12
|
+
{
|
|
13
|
+
code: 180,
|
|
14
|
+
desc: 'acute accent'
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
code: 38,
|
|
18
|
+
desc: 'ampersand'
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
code: 166,
|
|
22
|
+
desc: 'broken vertical bar'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
code: 8226,
|
|
26
|
+
desc: 'bullet'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
code: 184,
|
|
30
|
+
desc: 'cedilla'
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
code: 162,
|
|
34
|
+
desc: 'cent'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
code: 169,
|
|
38
|
+
desc: 'copyright'
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
code: 176,
|
|
42
|
+
desc: 'degree'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
code: 247,
|
|
46
|
+
desc: 'division'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
code: 189,
|
|
50
|
+
desc: 'fraction half'
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
code: 188,
|
|
54
|
+
desc: 'fraction quarter'
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
code: 190,
|
|
58
|
+
desc: 'fraction three quarters'
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
code: 62,
|
|
62
|
+
desc: 'greater than'
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
code: 161,
|
|
66
|
+
desc: 'inverted exclamation mark'
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
code: 191,
|
|
70
|
+
desc: 'inverted question mark'
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
code: 171,
|
|
74
|
+
desc: 'left-pointing double angle quotation mark'
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
code: 60,
|
|
78
|
+
desc: 'less than'
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
code: 175,
|
|
82
|
+
desc: 'macron'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
code: 181,
|
|
86
|
+
desc: 'micro'
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
code: 160,
|
|
90
|
+
desc: 'non-breaking space'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
code: 172,
|
|
94
|
+
desc: 'not'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
code: 182,
|
|
98
|
+
desc: 'paragraph'
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
code: 177,
|
|
102
|
+
desc: 'plus-minus'
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
code: 34,
|
|
106
|
+
desc: 'quotation mark'
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
code: 174,
|
|
110
|
+
desc: 'registered'
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
code: 187,
|
|
114
|
+
desc: 'right-pointing double angle quotation mark'
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
code: 167,
|
|
118
|
+
desc: 'section'
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
code: 168,
|
|
122
|
+
desc: 'umlaut/diaeresis'
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
code: 215,
|
|
126
|
+
desc: 'multiplication'
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
code: 8482,
|
|
130
|
+
desc: 'trade mark'
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
code: 8364,
|
|
134
|
+
desc: 'euro'
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
code: 163,
|
|
138
|
+
desc: 'pound'
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
code: 165,
|
|
142
|
+
desc: 'yen'
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
code: 8222,
|
|
146
|
+
desc: 'double low-9 quotation mark'
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
code: 710,
|
|
150
|
+
desc: 'modifier circumflex accent'
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
code: 8224,
|
|
154
|
+
desc: 'dagger'
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
code: 8225,
|
|
158
|
+
desc: 'double dagger'
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
code: 8230,
|
|
162
|
+
desc: 'horizontal ellipsis'
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
code: 8220,
|
|
166
|
+
desc: 'left double quotation mark'
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
code: 8249,
|
|
170
|
+
desc: 'single left-pointing angle quotation mark'
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
code: 8216,
|
|
174
|
+
desc: 'left single quotation mark'
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
code: 183,
|
|
178
|
+
desc: 'middle dot'
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
code: 8212,
|
|
182
|
+
desc: 'em dash'
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
code: 8211,
|
|
186
|
+
desc: 'en dash'
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
code: 8240,
|
|
190
|
+
desc: 'per mille'
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
code: 8250,
|
|
194
|
+
desc: 'single right-pointing angle quotation mark'
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
code: 8217,
|
|
198
|
+
desc: 'right single quotation mark'
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
code: 8218,
|
|
202
|
+
desc: 'single low-9 quotation mark'
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
code: 170,
|
|
206
|
+
desc: 'feminine ordinal indicator'
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
code: 186,
|
|
210
|
+
desc: 'masculine ordinal indicator'
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
code: 8221,
|
|
214
|
+
desc: 'right double quotation mark'
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
code: 732,
|
|
218
|
+
desc: 'small tilde'
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
code: 9829,
|
|
222
|
+
desc: 'black heart'
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
code: 9830,
|
|
226
|
+
desc: 'diamond'
|
|
227
|
+
}
|
|
228
|
+
];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "getCtrlKey", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return getCtrlKey;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _get = _interop_require_default(require("lodash/get"));
|
|
12
|
+
function _interop_require_default(obj) {
|
|
13
|
+
return obj && obj.__esModule ? obj : {
|
|
14
|
+
default: obj
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const userAgent = (0, _get.default)(window, 'navigator.userAgent', '');
|
|
18
|
+
const platform = (0, _get.default)(window, 'navigator.platform', '');
|
|
19
|
+
let ctrlKey = 'Ctrl';
|
|
20
|
+
const tests = {
|
|
21
|
+
ios: /(iphone os|ipad|iphone|ipod)/i.test(userAgent) && !window.MSStream
|
|
22
|
+
};
|
|
23
|
+
if (tests.ios || /mac(68k|ppc|intel)/i.test(platform)) {
|
|
24
|
+
ctrlKey = 'Cmd';
|
|
25
|
+
}
|
|
26
|
+
function getCtrlKey() {
|
|
27
|
+
return ctrlKey;
|
|
28
|
+
}
|