@takeshape/util 11.45.5 → 11.46.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/common/arrays.js +42 -0
- package/dist/cjs/common/assert.js +9 -0
- package/dist/cjs/common/async-noop.js +5 -0
- package/dist/cjs/common/billing.js +35 -0
- package/dist/cjs/common/clone.js +76 -0
- package/dist/cjs/common/delay.js +28 -0
- package/dist/cjs/common/draftjs-templates.js +131 -0
- package/dist/cjs/common/draftjs.js +807 -0
- package/dist/cjs/common/get-image-url.js +8 -0
- package/dist/cjs/common/highlight-code.js +33 -0
- package/dist/cjs/common/http.js +19 -0
- package/dist/cjs/common/index.js +50 -0
- package/dist/cjs/common/map.js +7 -0
- package/dist/cjs/common/memoize.js +13 -0
- package/dist/cjs/common/merge.js +64 -0
- package/dist/cjs/common/mime.js +68 -0
- package/dist/cjs/common/names.js +13 -0
- package/dist/cjs/common/naming.js +65 -0
- package/dist/cjs/common/path-to-string.js +10 -0
- package/dist/cjs/common/persisted-queries.js +4 -0
- package/dist/cjs/common/predicate.js +15 -0
- package/dist/cjs/common/set-in.js +13 -0
- package/dist/cjs/common/sets.js +19 -0
- package/dist/cjs/common/sleep.js +9 -0
- package/dist/cjs/common/sort-object.js +16 -0
- package/dist/cjs/common/strings.js +74 -0
- package/dist/cjs/common/templates.js +109 -0
- package/dist/cjs/common/timezone.js +606 -0
- package/dist/cjs/common/tracing.js +2 -0
- package/dist/cjs/common/types.js +63 -0
- package/dist/cjs/common/unix-to-iso.js +15 -0
- package/dist/cjs/common/urls.js +9 -0
- package/dist/cjs/common/validation.js +5 -0
- package/dist/cjs/common/value.js +8 -0
- package/dist/cjs/common/visit.js +60 -0
- package/dist/cjs/node/encryption.js +31 -0
- package/dist/cjs/node/gzip.js +10 -0
- package/dist/cjs/node/index.js +19 -0
- package/dist/cjs/node/search-params.js +23 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/common/arrays.js +33 -0
- package/dist/esm/common/assert.js +5 -0
- package/dist/esm/common/async-noop.js +2 -0
- package/dist/esm/common/billing.js +29 -0
- package/dist/esm/common/clone.js +71 -0
- package/dist/esm/common/delay.js +22 -0
- package/dist/esm/common/draftjs-templates.js +122 -0
- package/dist/esm/common/draftjs.js +792 -0
- package/{es → dist/esm/common}/get-image-url.js +2 -7
- package/dist/esm/common/highlight-code.js +26 -0
- package/dist/esm/common/http.js +15 -0
- package/dist/esm/common/index.js +34 -0
- package/{es → dist/esm/common}/map.js +2 -2
- package/dist/esm/common/memoize.js +6 -0
- package/dist/esm/common/merge.js +54 -0
- package/dist/esm/common/mime.js +60 -0
- package/dist/esm/common/names.js +9 -0
- package/dist/esm/common/naming.js +54 -0
- package/dist/esm/common/path-to-string.js +6 -0
- package/{es → dist/esm/common}/persisted-queries.js +1 -1
- package/{es → dist/esm/common}/predicate.js +4 -4
- package/dist/esm/common/set-in.js +7 -0
- package/dist/esm/common/sets.js +14 -0
- package/dist/esm/common/sleep.js +5 -0
- package/dist/esm/common/sort-object.js +12 -0
- package/dist/esm/common/strings.js +60 -0
- package/dist/esm/common/templates.js +95 -0
- package/dist/esm/common/timezone.js +602 -0
- package/dist/esm/common/tracing.js +1 -0
- package/dist/esm/common/types.js +50 -0
- package/dist/esm/common/unix-to-iso.js +9 -0
- package/dist/esm/common/urls.js +5 -0
- package/dist/esm/common/validation.js +2 -0
- package/dist/esm/common/value.js +4 -0
- package/dist/esm/common/visit.js +52 -0
- package/dist/esm/node/encryption.js +25 -0
- package/dist/esm/node/gzip.js +4 -0
- package/dist/esm/node/index.js +3 -0
- package/dist/esm/node/search-params.js +17 -0
- package/dist/esm/package.json +1 -0
- package/dist/tsconfig.types.tsbuildinfo +1 -0
- package/dist/{arrays.d.ts → types/common/arrays.d.ts} +0 -1
- package/dist/{assert.d.ts → types/common/assert.d.ts} +0 -1
- package/dist/{async-noop.d.ts → types/common/async-noop.d.ts} +0 -1
- package/dist/types/common/billing.d.ts +365 -0
- package/dist/{clone.d.ts → types/common/clone.d.ts} +0 -1
- package/dist/{delay.d.ts → types/common/delay.d.ts} +0 -1
- package/dist/{draftjs-templates.d.ts → types/common/draftjs-templates.d.ts} +1 -2
- package/dist/{draftjs.d.ts → types/common/draftjs.d.ts} +1 -2
- package/dist/{get-image-url.d.ts → types/common/get-image-url.d.ts} +0 -1
- package/dist/types/common/highlight-code.d.ts +14 -0
- package/dist/{http.d.ts → types/common/http.d.ts} +0 -1
- package/dist/types/common/index.d.ts +34 -0
- package/dist/{map.d.ts → types/common/map.d.ts} +0 -1
- package/dist/{memoize.d.ts → types/common/memoize.d.ts} +0 -1
- package/dist/{merge.d.ts → types/common/merge.d.ts} +0 -1
- package/dist/{mime.d.ts → types/common/mime.d.ts} +0 -1
- package/dist/{names.d.ts → types/common/names.d.ts} +0 -1
- package/dist/{naming.d.ts → types/common/naming.d.ts} +0 -1
- package/dist/{path-to-string.d.ts → types/common/path-to-string.d.ts} +0 -1
- package/dist/{persisted-queries.d.ts → types/common/persisted-queries.d.ts} +0 -1
- package/dist/{predicate.d.ts → types/common/predicate.d.ts} +0 -1
- package/dist/{set-in.d.ts → types/common/set-in.d.ts} +0 -1
- package/dist/{sets.d.ts → types/common/sets.d.ts} +0 -1
- package/dist/{sleep.d.ts → types/common/sleep.d.ts} +0 -1
- package/dist/{sort-object.d.ts → types/common/sort-object.d.ts} +0 -1
- package/dist/{strings.d.ts → types/common/strings.d.ts} +1 -2
- package/dist/{templates.d.ts → types/common/templates.d.ts} +1 -2
- package/dist/{timezone.d.ts → types/common/timezone.d.ts} +0 -1
- package/dist/{tracing.d.ts → types/common/tracing.d.ts} +1 -2
- package/dist/{types.d.ts → types/common/types.d.ts} +0 -1
- package/dist/{unix-to-iso.d.ts → types/common/unix-to-iso.d.ts} +0 -1
- package/dist/{urls.d.ts → types/common/urls.d.ts} +0 -1
- package/dist/{validation.d.ts → types/common/validation.d.ts} +0 -1
- package/dist/{value.d.ts → types/common/value.d.ts} +0 -1
- package/dist/{visit.d.ts → types/common/visit.d.ts} +0 -1
- package/dist/{encryption.d.ts → types/node/encryption.d.ts} +0 -1
- package/dist/{gzip.d.ts → types/node/gzip.d.ts} +1 -2
- package/dist/types/node/index.d.ts +3 -0
- package/dist/{search-params.d.ts → types/node/search-params.d.ts} +1 -2
- package/package.json +33 -21
- package/dist/arrays.d.ts.map +0 -1
- package/dist/arrays.js +0 -44
- package/dist/assert.d.ts.map +0 -1
- package/dist/assert.js +0 -11
- package/dist/async-noop.d.ts.map +0 -1
- package/dist/async-noop.js +0 -8
- package/dist/billing.d.ts +0 -366
- package/dist/billing.d.ts.map +0 -1
- package/dist/billing.js +0 -48
- package/dist/browser.d.ts +0 -2
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js +0 -16
- package/dist/clone.d.ts.map +0 -1
- package/dist/clone.js +0 -101
- package/dist/common.d.ts +0 -32
- package/dist/common.d.ts.map +0 -1
- package/dist/common.js +0 -346
- package/dist/delay.d.ts.map +0 -1
- package/dist/delay.js +0 -34
- package/dist/draftjs-templates.d.ts.map +0 -1
- package/dist/draftjs-templates.js +0 -157
- package/dist/draftjs.d.ts.map +0 -1
- package/dist/draftjs.js +0 -836
- package/dist/encryption.d.ts.map +0 -1
- package/dist/encryption.js +0 -33
- package/dist/get-image-url.d.ts.map +0 -1
- package/dist/get-image-url.js +0 -15
- package/dist/gzip.d.ts.map +0 -1
- package/dist/gzip.js +0 -11
- package/dist/highlight-code.d.ts +0 -15
- package/dist/highlight-code.d.ts.map +0 -1
- package/dist/highlight-code.js +0 -35
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -18
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -60
- package/dist/map.d.ts.map +0 -1
- package/dist/map.js +0 -9
- package/dist/memoize.d.ts.map +0 -1
- package/dist/memoize.js +0 -13
- package/dist/merge.d.ts.map +0 -1
- package/dist/merge.js +0 -67
- package/dist/mime.d.ts.map +0 -1
- package/dist/mime.js +0 -37
- package/dist/names.d.ts.map +0 -1
- package/dist/names.js +0 -15
- package/dist/naming.d.ts.map +0 -1
- package/dist/naming.js +0 -91
- package/dist/path-to-string.d.ts.map +0 -1
- package/dist/path-to-string.js +0 -13
- package/dist/persisted-queries.d.ts.map +0 -1
- package/dist/persisted-queries.js +0 -7
- package/dist/predicate.d.ts.map +0 -1
- package/dist/predicate.js +0 -17
- package/dist/search-params.d.ts.map +0 -1
- package/dist/search-params.js +0 -25
- package/dist/set-in.d.ts.map +0 -1
- package/dist/set-in.js +0 -11
- package/dist/sets.d.ts.map +0 -1
- package/dist/sets.js +0 -21
- package/dist/sleep.d.ts.map +0 -1
- package/dist/sleep.js +0 -11
- package/dist/sort-object.d.ts.map +0 -1
- package/dist/sort-object.js +0 -21
- package/dist/strings.d.ts.map +0 -1
- package/dist/strings.js +0 -87
- package/dist/templates.d.ts.map +0 -1
- package/dist/templates.js +0 -120
- package/dist/timezone.d.ts.map +0 -1
- package/dist/timezone.js +0 -17
- package/dist/tracing.d.ts.map +0 -1
- package/dist/tracing.js +0 -5
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -92
- package/dist/unix-to-iso.d.ts.map +0 -1
- package/dist/unix-to-iso.js +0 -17
- package/dist/urls.d.ts.map +0 -1
- package/dist/urls.js +0 -11
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -8
- package/dist/value.d.ts.map +0 -1
- package/dist/value.js +0 -11
- package/dist/visit.d.ts.map +0 -1
- package/dist/visit.js +0 -61
- package/es/arrays.js +0 -33
- package/es/assert.js +0 -5
- package/es/async-noop.js +0 -2
- package/es/billing.js +0 -40
- package/es/browser.js +0 -1
- package/es/clone.js +0 -94
- package/es/common.js +0 -31
- package/es/delay.js +0 -26
- package/es/draftjs-templates.js +0 -147
- package/es/draftjs.js +0 -819
- package/es/encryption.js +0 -26
- package/es/gzip.js +0 -4
- package/es/highlight-code.js +0 -26
- package/es/http.js +0 -11
- package/es/index.js +0 -6
- package/es/memoize.js +0 -6
- package/es/merge.js +0 -58
- package/es/mime.js +0 -29
- package/es/names.js +0 -9
- package/es/naming.js +0 -78
- package/es/path-to-string.js +0 -6
- package/es/search-params.js +0 -17
- package/es/set-in.js +0 -6
- package/es/sets.js +0 -14
- package/es/sleep.js +0 -5
- package/es/sort-object.js +0 -14
- package/es/strings.js +0 -72
- package/es/templates.js +0 -105
- package/es/timezone.js +0 -10
- package/es/tracing.js +0 -1
- package/es/types.js +0 -80
- package/es/unix-to-iso.js +0 -9
- package/es/urls.js +0 -5
- package/es/validation.js +0 -2
- package/es/value.js +0 -4
- package/es/visit.js +0 -53
package/dist/draftjs.js
DELETED
|
@@ -1,836 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.adjustRanges = void 0;
|
|
7
|
-
exports.draftjsToMd = draftjsToMd;
|
|
8
|
-
exports.draftjsToMdx = draftjsToMdx;
|
|
9
|
-
exports.encodeHtmlEntities = void 0;
|
|
10
|
-
exports.fromDraftjs = fromDraftjs;
|
|
11
|
-
exports.getImagePathFromUrl = getImagePathFromUrl;
|
|
12
|
-
exports.insertBreaksAroundBlocks = insertBreaksAroundBlocks;
|
|
13
|
-
exports.mdToDraftjs = mdToDraftjs;
|
|
14
|
-
exports.mdxToDraftjs = mdxToDraftjs;
|
|
15
|
-
var _markdownDraftJs = require("markdown-draft-js");
|
|
16
|
-
var _htmlparser = require("htmlparser2");
|
|
17
|
-
var _urlParse = _interopRequireDefault(require("url-parse"));
|
|
18
|
-
var _domSerializer = _interopRequireDefault(require("dom-serializer"));
|
|
19
|
-
var _shortid = _interopRequireDefault(require("shortid"));
|
|
20
|
-
var _escape = _interopRequireDefault(require("lodash/escape"));
|
|
21
|
-
var _unescape = _interopRequireDefault(require("lodash/unescape"));
|
|
22
|
-
var _pickBy = _interopRequireDefault(require("lodash/pickBy"));
|
|
23
|
-
var _routing = require("@takeshape/routing");
|
|
24
|
-
var _forEach = _interopRequireDefault(require("lodash/forEach"));
|
|
25
|
-
var _he = _interopRequireDefault(require("he"));
|
|
26
|
-
var _draftjsTemplates = require("./draftjs-templates");
|
|
27
|
-
var _templates = require("./templates");
|
|
28
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
29
|
-
/*
|
|
30
|
-
* The intention is to move all this to the client package in the end, but right now it's here
|
|
31
|
-
* to be shared between the draftjs / mdx implementations, which span the client / server differently.
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
const SUPERSCRIPT_MARKER = 'TEMPORARY_SUPERSCRIPT_MARKER_TLfDNyf7VYKDduyL';
|
|
35
|
-
const SUBSCRIPT_MARKER = 'TEMPORARY_SUBSCRIPT_MARKER_K5VrdPEzyQyy2RcY';
|
|
36
|
-
const INSERT_MARKER = 'TEMPORARY_INSERT_MARKER_FSYdr8m8CS7YLb8y';
|
|
37
|
-
const EXTERNAL_LINK_MARKER = 'TEMPORARY_EXTERNAL_LINK_MARKER_HP3vprmERkc9ZAss';
|
|
38
|
-
const pullquoteStyle = 'font-style: italic; margin: 2em 2.5em;';
|
|
39
|
-
const getDraftjsEmpty = (depth = 0) => {
|
|
40
|
-
return {
|
|
41
|
-
key: _shortid.default.generate(),
|
|
42
|
-
depth,
|
|
43
|
-
type: 'unstyled',
|
|
44
|
-
text: '',
|
|
45
|
-
entityRanges: [],
|
|
46
|
-
inlineStyleRanges: []
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
const REMOVAL_MARKER_TYPE = 'removal-marker';
|
|
50
|
-
const getDraftjsRemovalMarker = (depth = 0) => {
|
|
51
|
-
return {
|
|
52
|
-
key: _shortid.default.generate(),
|
|
53
|
-
type: REMOVAL_MARKER_TYPE,
|
|
54
|
-
depth,
|
|
55
|
-
text: '',
|
|
56
|
-
entityRanges: [],
|
|
57
|
-
inlineStyleRanges: []
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
const mdxShortcodePrefix = tagName => `TS${tagName}`;
|
|
61
|
-
const handleMultiword = (markdown, marker, markdownSyntax, markdownRegex) => {
|
|
62
|
-
const parts = markdown.replace(markdownRegex, `\\${markdownSyntax}`).split(marker);
|
|
63
|
-
let result = '';
|
|
64
|
-
let open = false;
|
|
65
|
-
for (const [i, part] of parts.entries()) {
|
|
66
|
-
if (open) {
|
|
67
|
-
result += part.replace(/\s+/g, match => `${markdownSyntax}${match}${markdownSyntax}`);
|
|
68
|
-
} else {
|
|
69
|
-
result += part;
|
|
70
|
-
}
|
|
71
|
-
if (i !== parts.length - 1) {
|
|
72
|
-
result += markdownSyntax;
|
|
73
|
-
open = !open;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return result;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// Workaround inability to reasonably process child content using draftToMarkdown
|
|
80
|
-
const handleExternalLinks = markdown => {
|
|
81
|
-
const regex = /(<TSExternalLink text="TEMPORARY_EXTERNAL_LINK_MARKER_HP3vprmERkc9ZAss" href="[^"]+">)([^<]+)<\/TSExternalLink>/g;
|
|
82
|
-
return markdown.replace(regex, (match, openTag, content) => match.replace(EXTERNAL_LINK_MARKER, content));
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Adjust entity ranges or inline style ranges to insert `amount` space starting at `after`.
|
|
87
|
-
* For example, take this visualization of a range with offset 5 and length 5, where
|
|
88
|
-
* the vertical bars are the start and end of the range, inclusive:
|
|
89
|
-
* -----|---|-----
|
|
90
|
-
* If you insert amount 5 after 0 you get this:
|
|
91
|
-
* ----------|---|-----
|
|
92
|
-
* If you insert amount 5 after 7 you get this:
|
|
93
|
-
* -----|--------|-----
|
|
94
|
-
* If you insert amount 5 after 10 you get this:
|
|
95
|
-
* -----|---|----------
|
|
96
|
-
* If you insert amount -2 after 7 you get this:
|
|
97
|
-
* -----|-|-----
|
|
98
|
-
*/
|
|
99
|
-
const adjustRanges = (ranges, after, amount) => {
|
|
100
|
-
return ranges.map(range => ({
|
|
101
|
-
...range,
|
|
102
|
-
offset: range.offset > after ? range.offset + amount : range.offset,
|
|
103
|
-
length: range.offset <= after && range.offset + range.length > after ? range.length + amount : range.length
|
|
104
|
-
}));
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Encode HTML entities in this draftjs state.
|
|
109
|
-
* We adjust ranges so that their offsets and lengths are still correct with the encoded text.
|
|
110
|
-
* EG `'` is 5 characters longer than `'` so if there is a single apostrophe before a link,
|
|
111
|
-
* the link entity's offset needs to be increased by 5 when the text is encoded.
|
|
112
|
-
* This also applies to the entity's length if there are escaped characters inside the entity.
|
|
113
|
-
*/
|
|
114
|
-
exports.adjustRanges = adjustRanges;
|
|
115
|
-
const encodeHtmlEntities = draftjs => {
|
|
116
|
-
const result = {
|
|
117
|
-
...draftjs,
|
|
118
|
-
blocks: draftjs.blocks.map(block => {
|
|
119
|
-
let {
|
|
120
|
-
text
|
|
121
|
-
} = block;
|
|
122
|
-
let {
|
|
123
|
-
entityRanges,
|
|
124
|
-
inlineStyleRanges
|
|
125
|
-
} = block;
|
|
126
|
-
for (let i = 0; i < text.length; i++) {
|
|
127
|
-
const char = text.charAt(i);
|
|
128
|
-
const encodedChar = _he.default.encode(char);
|
|
129
|
-
if (encodedChar !== char) {
|
|
130
|
-
const offset = encodedChar.length - char.length;
|
|
131
|
-
entityRanges = adjustRanges(entityRanges, i, offset);
|
|
132
|
-
inlineStyleRanges = adjustRanges(inlineStyleRanges, i, offset);
|
|
133
|
-
text = text.substring(0, i) + encodedChar + text.substring(i + 1);
|
|
134
|
-
i += offset;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
...block,
|
|
139
|
-
entityRanges,
|
|
140
|
-
inlineStyleRanges,
|
|
141
|
-
text
|
|
142
|
-
};
|
|
143
|
-
})
|
|
144
|
-
};
|
|
145
|
-
return result;
|
|
146
|
-
};
|
|
147
|
-
exports.encodeHtmlEntities = encodeHtmlEntities;
|
|
148
|
-
function fromDraftjs(draftjs, styleItems, entityItems) {
|
|
149
|
-
let markdown = (0, _markdownDraftJs.draftToMarkdown)(encodeHtmlEntities(draftjs), {
|
|
150
|
-
styleItems: {
|
|
151
|
-
'section-break': {
|
|
152
|
-
open() {
|
|
153
|
-
return '***';
|
|
154
|
-
},
|
|
155
|
-
close() {
|
|
156
|
-
return '';
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
SUP: {
|
|
160
|
-
open() {
|
|
161
|
-
return SUPERSCRIPT_MARKER;
|
|
162
|
-
},
|
|
163
|
-
close() {
|
|
164
|
-
return SUPERSCRIPT_MARKER;
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
SUB: {
|
|
168
|
-
open() {
|
|
169
|
-
return SUBSCRIPT_MARKER;
|
|
170
|
-
},
|
|
171
|
-
close() {
|
|
172
|
-
return SUBSCRIPT_MARKER;
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
UNDERLINE: {
|
|
176
|
-
open() {
|
|
177
|
-
return INSERT_MARKER;
|
|
178
|
-
},
|
|
179
|
-
close() {
|
|
180
|
-
return INSERT_MARKER;
|
|
181
|
-
}
|
|
182
|
-
},
|
|
183
|
-
'code-block': {
|
|
184
|
-
open(entity) {
|
|
185
|
-
const lang = entity?.data?.lang ?? '';
|
|
186
|
-
return `\`\`\`${lang}\n`;
|
|
187
|
-
},
|
|
188
|
-
close() {
|
|
189
|
-
return '\n```';
|
|
190
|
-
}
|
|
191
|
-
},
|
|
192
|
-
...styleItems
|
|
193
|
-
},
|
|
194
|
-
entityItems: {
|
|
195
|
-
LINK: {
|
|
196
|
-
open(entity) {
|
|
197
|
-
if (entity?.data?.target === '_blank') {
|
|
198
|
-
const url = (0, _escape.default)(entity?.data?.url || entity?.data?.href || '');
|
|
199
|
-
return `<TSExternalLink text="${EXTERNAL_LINK_MARKER}" href="${url}">`;
|
|
200
|
-
}
|
|
201
|
-
return '[';
|
|
202
|
-
},
|
|
203
|
-
close(entity) {
|
|
204
|
-
if (entity?.data?.target === '_blank') {
|
|
205
|
-
return '</TSExternalLink>';
|
|
206
|
-
}
|
|
207
|
-
return ']('.concat(entity?.data?.url || entity?.data?.href || '', ')');
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
...entityItems
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
markdown = handleExternalLinks(markdown);
|
|
214
|
-
markdown = handleMultiword(markdown, SUPERSCRIPT_MARKER, '^', /\^/g);
|
|
215
|
-
markdown = handleMultiword(markdown, SUBSCRIPT_MARKER, '~', /~/g);
|
|
216
|
-
markdown = markdown.replace(/\+/g, '\\+').replace(new RegExp(INSERT_MARKER, 'g'), '++');
|
|
217
|
-
return markdown;
|
|
218
|
-
}
|
|
219
|
-
function draftjsToMd(draftjs, assets) {
|
|
220
|
-
return fromDraftjs(draftjs, {
|
|
221
|
-
pullquote: {
|
|
222
|
-
open() {
|
|
223
|
-
return `<aside style="${pullquoteStyle}">`;
|
|
224
|
-
},
|
|
225
|
-
close() {
|
|
226
|
-
return '</aside>';
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}, {
|
|
230
|
-
oembed: {
|
|
231
|
-
open() {
|
|
232
|
-
return '';
|
|
233
|
-
},
|
|
234
|
-
close(entity) {
|
|
235
|
-
if (!entity?.data) {
|
|
236
|
-
return '';
|
|
237
|
-
}
|
|
238
|
-
const {
|
|
239
|
-
data
|
|
240
|
-
} = entity;
|
|
241
|
-
return (0, _templates.oembedTemplate)(str => str, data);
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
image: {
|
|
245
|
-
open() {
|
|
246
|
-
return '';
|
|
247
|
-
},
|
|
248
|
-
close(entity) {
|
|
249
|
-
if (!entity?.data) {
|
|
250
|
-
return '';
|
|
251
|
-
}
|
|
252
|
-
const {
|
|
253
|
-
data
|
|
254
|
-
} = entity;
|
|
255
|
-
const asset = assets[data.id];
|
|
256
|
-
if (asset === undefined) {
|
|
257
|
-
return '';
|
|
258
|
-
}
|
|
259
|
-
const imageTemplateData = {
|
|
260
|
-
...data,
|
|
261
|
-
alignment: data.alignment,
|
|
262
|
-
size: data.size,
|
|
263
|
-
asset,
|
|
264
|
-
caption: getAssetField(data, asset, 'caption'),
|
|
265
|
-
credit: getAssetField(data, asset, 'credit'),
|
|
266
|
-
imageParams: {}
|
|
267
|
-
};
|
|
268
|
-
return (0, _templates.imageTemplate)(str => str, imageTemplateData);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
function getTextFromDraftjs(draftjs) {
|
|
274
|
-
return draftjs?.blocks?.[0]?.text;
|
|
275
|
-
}
|
|
276
|
-
function getAssetField(data, asset, field) {
|
|
277
|
-
const dataText = getTextFromDraftjs(data[field]);
|
|
278
|
-
if (dataText) {
|
|
279
|
-
return dataText;
|
|
280
|
-
}
|
|
281
|
-
if (asset[field]) {
|
|
282
|
-
return getTextFromDraftjs(asset[field]);
|
|
283
|
-
}
|
|
284
|
-
return '';
|
|
285
|
-
}
|
|
286
|
-
function draftjsToMdx(draftjs, assets, prefix = mdxShortcodePrefix) {
|
|
287
|
-
return fromDraftjs(draftjs, {
|
|
288
|
-
pullquote: {
|
|
289
|
-
open() {
|
|
290
|
-
return `<${prefix('Pullquote')}>`;
|
|
291
|
-
},
|
|
292
|
-
close() {
|
|
293
|
-
return `</${prefix('Pullquote')}>`;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}, {
|
|
297
|
-
oembed: {
|
|
298
|
-
open() {
|
|
299
|
-
return '';
|
|
300
|
-
},
|
|
301
|
-
close(entity) {
|
|
302
|
-
if (!entity?.data) {
|
|
303
|
-
return '';
|
|
304
|
-
}
|
|
305
|
-
const {
|
|
306
|
-
data
|
|
307
|
-
} = entity;
|
|
308
|
-
return (0, _templates.oembedTemplateMdx)(prefix, data);
|
|
309
|
-
}
|
|
310
|
-
},
|
|
311
|
-
image: {
|
|
312
|
-
open() {
|
|
313
|
-
return '';
|
|
314
|
-
},
|
|
315
|
-
close(entity) {
|
|
316
|
-
const asset = assets[entity?.data?.id];
|
|
317
|
-
if (!entity?.data || asset === undefined) {
|
|
318
|
-
return '';
|
|
319
|
-
}
|
|
320
|
-
const {
|
|
321
|
-
data
|
|
322
|
-
} = entity;
|
|
323
|
-
const imageUrlOptions = process.env.NODE_ENV === 'production' ? {} : {
|
|
324
|
-
baseUrl: 'https://images.dev.takeshape.io'
|
|
325
|
-
};
|
|
326
|
-
return (0, _templates.imageTemplateMdx)(prefix, {
|
|
327
|
-
...data,
|
|
328
|
-
assetId: data.id,
|
|
329
|
-
assetPath: asset.path,
|
|
330
|
-
credit: getAssetField(data, asset, 'credit'),
|
|
331
|
-
caption: getAssetField(data, asset, 'caption'),
|
|
332
|
-
link: data.link?.url,
|
|
333
|
-
linkisexternal: data.link?.external ? 'true' : 'false',
|
|
334
|
-
src: (0, _routing.getImageUrl)(asset.path, data.imageParams, imageUrlOptions)
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
function getAssetIdFromImageSrc(src) {
|
|
341
|
-
return new _urlParse.default(src).pathname.split('/')[3];
|
|
342
|
-
}
|
|
343
|
-
function parseFigureClass(className) {
|
|
344
|
-
if (className === undefined) {
|
|
345
|
-
return {
|
|
346
|
-
alignment: undefined,
|
|
347
|
-
size: undefined
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
const parts = className.split(' ');
|
|
351
|
-
return {
|
|
352
|
-
alignment: parts[0],
|
|
353
|
-
size: parts[1]
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// eslint-disable-next-line complexity
|
|
358
|
-
function htmlDomToDraftjsImage(dom, item, entityKeyGenerator) {
|
|
359
|
-
for (const figure of dom) {
|
|
360
|
-
if (figure.type === _htmlparser.ElementType.Tag && figure.name === 'figure') {
|
|
361
|
-
let link;
|
|
362
|
-
const figureChildOne = figure.children?.[0];
|
|
363
|
-
const figureChildTwo = figure.children?.[1];
|
|
364
|
-
if (figureChildOne?.type === _htmlparser.ElementType.Tag && figureChildOne?.name === 'a') {
|
|
365
|
-
link = figureChildOne;
|
|
366
|
-
}
|
|
367
|
-
let figcaption;
|
|
368
|
-
if (figureChildOne?.type === _htmlparser.ElementType.Tag && figureChildOne?.name === 'figcaption') {
|
|
369
|
-
figcaption = figureChildOne;
|
|
370
|
-
} else if (figureChildTwo?.type === _htmlparser.ElementType.Tag && figureChildTwo?.name === 'figcaption') {
|
|
371
|
-
figcaption = figure.children[1];
|
|
372
|
-
}
|
|
373
|
-
const img = link ? link.children[0] : figure.children[0];
|
|
374
|
-
if (img?.type !== _htmlparser.ElementType.Tag || img?.name !== 'img') {
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
const figcaptionChild = figcaption?.type === _htmlparser.ElementType.Tag ? figcaption?.children[0] : undefined;
|
|
378
|
-
let caption;
|
|
379
|
-
if (figcaptionChild?.type === _htmlparser.ElementType.Tag && figcaptionChild?.name === 'span' && figcaptionChild?.attribs.class === 'caption') {
|
|
380
|
-
caption = figcaptionChild;
|
|
381
|
-
}
|
|
382
|
-
const captionChildThree = figcaption?.type === _htmlparser.ElementType.Tag ? figcaption?.children[2] : undefined;
|
|
383
|
-
let credit;
|
|
384
|
-
if (captionChildThree?.type === _htmlparser.ElementType.Tag && captionChildThree?.name === 'span' && captionChildThree?.attribs.class === 'credit') {
|
|
385
|
-
credit = captionChildThree;
|
|
386
|
-
}
|
|
387
|
-
const {
|
|
388
|
-
alignment,
|
|
389
|
-
size
|
|
390
|
-
} = parseFigureClass(figure.attribs.class);
|
|
391
|
-
return (0, _draftjsTemplates.getDraftjsImage)({
|
|
392
|
-
captionText: caption?.children[0].type === _htmlparser.ElementType.Text ? caption.children[0].data ?? '' : '',
|
|
393
|
-
creditText: credit?.children[0].type === _htmlparser.ElementType.Text ? credit?.children[0].data ?? '' : '',
|
|
394
|
-
alignment,
|
|
395
|
-
size,
|
|
396
|
-
assetId: getAssetIdFromImageSrc(img.attribs.src),
|
|
397
|
-
linkUrl: link?.attribs.href,
|
|
398
|
-
linkIsExternal: link?.attribs.target === '_blank',
|
|
399
|
-
key: entityKeyGenerator(),
|
|
400
|
-
depth: item.level,
|
|
401
|
-
path: getImagePathFromUrl(img.attribs.src)
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
function htmlDomToOembed(dom, item, entityKeyGenerator) {
|
|
407
|
-
for (const oembedDiv of dom) {
|
|
408
|
-
if (oembedDiv.type === _htmlparser.ElementType.Tag && oembedDiv.name === 'div' && oembedDiv.attribs.class === 'oembed') {
|
|
409
|
-
const blockquote = oembedDiv.children[0];
|
|
410
|
-
if (blockquote?.type !== _htmlparser.ElementType.Tag || blockquote?.name !== 'blockquote') {
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
const script = oembedDiv.children[2];
|
|
414
|
-
if (script?.type !== 'script' || script?.name !== 'script') {
|
|
415
|
-
return;
|
|
416
|
-
}
|
|
417
|
-
return (0, _draftjsTemplates.getDraftjsOembed)({
|
|
418
|
-
html: `${(0, _domSerializer.default)(blockquote)}\n${(0, _domSerializer.default)(script)}\n`,
|
|
419
|
-
key: entityKeyGenerator(),
|
|
420
|
-
depth: item.level
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
function mdxToDraftjsOembed(item, entityKeyGenerator) {
|
|
426
|
-
if (item.content.startsWith(`<${mdxShortcodePrefix('Oembed')}`)) {
|
|
427
|
-
const dom = (0, _htmlparser.parseDOM)(item.content, {
|
|
428
|
-
decodeEntities: true
|
|
429
|
-
})[0];
|
|
430
|
-
if (dom.type !== _htmlparser.ElementType.Tag) {
|
|
431
|
-
return;
|
|
432
|
-
}
|
|
433
|
-
return (0, _draftjsTemplates.getDraftjsOembed)({
|
|
434
|
-
html: (0, _unescape.default)(dom.attribs.html),
|
|
435
|
-
width: dom.attribs.width ? Number(dom.attribs.width) : undefined,
|
|
436
|
-
height: dom.attribs.height ? Number(dom.attribs.height) : undefined,
|
|
437
|
-
url: (0, _unescape.default)(dom.attribs.url),
|
|
438
|
-
author_name: (0, _unescape.default)(dom.attribs.author_name),
|
|
439
|
-
author_url: (0, _unescape.default)(dom.attribs.author_url),
|
|
440
|
-
type: (0, _unescape.default)(dom.attribs.type),
|
|
441
|
-
cache_age: Number(dom.attribs.cache_age),
|
|
442
|
-
provider_name: (0, _unescape.default)(dom.attribs.provider_name),
|
|
443
|
-
provider_url: (0, _unescape.default)(dom.attribs.provider_url),
|
|
444
|
-
version: (0, _unescape.default)(dom.attribs.version),
|
|
445
|
-
key: entityKeyGenerator(),
|
|
446
|
-
depth: item.level
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
function htmlDomToPullquote(dom, item) {
|
|
451
|
-
for (const pullquote of dom) {
|
|
452
|
-
if (pullquote.type === _htmlparser.ElementType.Tag && pullquote.name === 'aside' && pullquote.attribs.style === pullquoteStyle) {
|
|
453
|
-
const text = pullquote.children[0];
|
|
454
|
-
if (text?.type !== 'text') {
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
return (0, _draftjsTemplates.getDraftjsPullquote)({
|
|
458
|
-
text: text.data,
|
|
459
|
-
depth: item.level
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
function fromMd(md, blockEntities, blockTypes) {
|
|
465
|
-
md = md.replace(/\\\+/g, '+').replace(/\\~/g, '~').replace(/\\\^/g, '^');
|
|
466
|
-
return (0, _markdownDraftJs.markdownToDraft)(md, {
|
|
467
|
-
remarkablePreset: 'full',
|
|
468
|
-
remarkableOptions: {
|
|
469
|
-
html: true
|
|
470
|
-
},
|
|
471
|
-
blockStyles: {
|
|
472
|
-
ins_open: 'UNDERLINE',
|
|
473
|
-
sub: 'SUB',
|
|
474
|
-
sup: 'SUP'
|
|
475
|
-
},
|
|
476
|
-
blockEntities,
|
|
477
|
-
blockTypes: {
|
|
478
|
-
hr(item) {
|
|
479
|
-
if (!item) {
|
|
480
|
-
return getDraftjsEmpty();
|
|
481
|
-
}
|
|
482
|
-
return {
|
|
483
|
-
key: _shortid.default.generate(),
|
|
484
|
-
text: ' ',
|
|
485
|
-
type: 'section-break',
|
|
486
|
-
depth: item.level,
|
|
487
|
-
inlineStyleRanges: [],
|
|
488
|
-
entityRanges: [],
|
|
489
|
-
data: {}
|
|
490
|
-
};
|
|
491
|
-
},
|
|
492
|
-
fence(item) {
|
|
493
|
-
if (!item) {
|
|
494
|
-
return getDraftjsEmpty();
|
|
495
|
-
}
|
|
496
|
-
return {
|
|
497
|
-
type: 'code-block',
|
|
498
|
-
data: {
|
|
499
|
-
// In markdown-to-draft this is language, we require lang
|
|
500
|
-
lang: item.params || ''
|
|
501
|
-
},
|
|
502
|
-
// Using the text handling from markdown-to-draft
|
|
503
|
-
text: _he.default.decode((item.content || '').replace(/\n$/, '')),
|
|
504
|
-
entityRanges: [],
|
|
505
|
-
inlineStyleRanges: []
|
|
506
|
-
};
|
|
507
|
-
},
|
|
508
|
-
...blockTypes
|
|
509
|
-
}
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
function mdToDraftjs(mdx) {
|
|
513
|
-
const entities = {};
|
|
514
|
-
|
|
515
|
-
// Start really high to avoid conflicts with keys created by markdown-draft-js
|
|
516
|
-
let currentEntityKey = 1000000;
|
|
517
|
-
function entityKeyGenerator() {
|
|
518
|
-
return currentEntityKey++;
|
|
519
|
-
}
|
|
520
|
-
const result = fromMd(mdx, {}, {
|
|
521
|
-
htmlblock(item) {
|
|
522
|
-
if (item === undefined) {
|
|
523
|
-
return getDraftjsEmpty();
|
|
524
|
-
}
|
|
525
|
-
const dom = (0, _htmlparser.parseDOM)(item.content, {
|
|
526
|
-
decodeEntities: false
|
|
527
|
-
});
|
|
528
|
-
const image = htmlDomToDraftjsImage(dom, item, entityKeyGenerator);
|
|
529
|
-
if (image) {
|
|
530
|
-
Object.assign(entities, image.entities);
|
|
531
|
-
return image.contentBlock;
|
|
532
|
-
}
|
|
533
|
-
const oembed = htmlDomToOembed(dom, item, entityKeyGenerator);
|
|
534
|
-
if (oembed) {
|
|
535
|
-
Object.assign(entities, oembed.entities);
|
|
536
|
-
return oembed.contentBlock;
|
|
537
|
-
}
|
|
538
|
-
const pullquote = htmlDomToPullquote(dom, item);
|
|
539
|
-
if (pullquote) {
|
|
540
|
-
Object.assign(entities, pullquote.entities);
|
|
541
|
-
return pullquote.contentBlock;
|
|
542
|
-
}
|
|
543
|
-
return getDraftjsEmpty(item.level);
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
result.entityMap = {
|
|
547
|
-
...result.entityMap,
|
|
548
|
-
...entities
|
|
549
|
-
};
|
|
550
|
-
return result;
|
|
551
|
-
}
|
|
552
|
-
function getImagePathFromUrl(url) {
|
|
553
|
-
return new _urlParse.default(url).pathname.substr(1);
|
|
554
|
-
}
|
|
555
|
-
function mdxToBr(item) {
|
|
556
|
-
if (item.content.startsWith('<br/>')) {
|
|
557
|
-
return {
|
|
558
|
-
key: _shortid.default.generate(),
|
|
559
|
-
depth: item.depth,
|
|
560
|
-
type: 'unstyled',
|
|
561
|
-
text: '',
|
|
562
|
-
entityRanges: [],
|
|
563
|
-
inlineStyleRanges: []
|
|
564
|
-
};
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
function mdxToLinkData(item) {
|
|
568
|
-
if (item.content.startsWith('<TSExternalLink')) {
|
|
569
|
-
const dom = (0, _htmlparser.parseDOM)(item.content, {
|
|
570
|
-
decodeEntities: false
|
|
571
|
-
})[0];
|
|
572
|
-
if (dom.type !== _htmlparser.ElementType.Tag) {
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
return {
|
|
576
|
-
url: dom.attribs.href,
|
|
577
|
-
target: '_blank',
|
|
578
|
-
text: dom.attribs.text
|
|
579
|
-
};
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
function mdxToDraftjsImage(item, entityKeyGenerator) {
|
|
583
|
-
if (item.content.startsWith(`<${mdxShortcodePrefix('Image')}`)) {
|
|
584
|
-
const dom = (0, _htmlparser.parseDOM)(item.content, {
|
|
585
|
-
decodeEntities: false
|
|
586
|
-
})[0];
|
|
587
|
-
if (dom.type !== _htmlparser.ElementType.Tag) {
|
|
588
|
-
return;
|
|
589
|
-
}
|
|
590
|
-
return (0, _draftjsTemplates.getDraftjsImage)({
|
|
591
|
-
captionText: (0, _unescape.default)(dom.attribs.caption).replace(/<\/?p>/g, ''),
|
|
592
|
-
creditText: (0, _unescape.default)(dom.attribs.credit).replace(/<\/?p>/g, ''),
|
|
593
|
-
alignment: dom.attribs.alignment,
|
|
594
|
-
size: dom.attribs.size,
|
|
595
|
-
assetId: dom.attribs.id,
|
|
596
|
-
linkUrl: dom.attribs.link,
|
|
597
|
-
linkIsExternal: dom.attribs.linkisexternal === 'true',
|
|
598
|
-
key: entityKeyGenerator(),
|
|
599
|
-
depth: item.level,
|
|
600
|
-
path: getImagePathFromUrl(decodeURIComponent(dom.attribs.src))
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
function mdxToDraftjsPullquote(item) {
|
|
605
|
-
if (item.content.startsWith(`<${mdxShortcodePrefix('Pullquote')}`)) {
|
|
606
|
-
const dom = (0, _htmlparser.parseDOM)(item.content, {
|
|
607
|
-
decodeEntities: false
|
|
608
|
-
})[0];
|
|
609
|
-
if (dom.type !== _htmlparser.ElementType.Tag) {
|
|
610
|
-
return;
|
|
611
|
-
}
|
|
612
|
-
return (0, _draftjsTemplates.getDraftjsPullquote)({
|
|
613
|
-
text: (0, _unescape.default)(dom.attribs.text),
|
|
614
|
-
depth: item.level
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
/**
|
|
619
|
-
* Mutates result to replace empty entities with links,
|
|
620
|
-
* assuming there is nothing else they could be...
|
|
621
|
-
*/
|
|
622
|
-
function addLinks(state, links) {
|
|
623
|
-
let linkNumber = 0;
|
|
624
|
-
let linkOpen = false;
|
|
625
|
-
for (const block of state.blocks) {
|
|
626
|
-
let blockIsCustom = false;
|
|
627
|
-
for (const [i, entityRange] of block.entityRanges.entries()) {
|
|
628
|
-
const entity = state.entityMap[entityRange.key];
|
|
629
|
-
if (entity === undefined) {
|
|
630
|
-
throw new Error('Missing entity');
|
|
631
|
-
}
|
|
632
|
-
if (i === 0 && entity.data?.marker) {
|
|
633
|
-
blockIsCustom = true;
|
|
634
|
-
continue;
|
|
635
|
-
}
|
|
636
|
-
if (blockIsCustom && i === Object.keys(block.entityRanges).length - 1) {
|
|
637
|
-
continue;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
// Ignore line breaks that were inserted around blocks
|
|
641
|
-
if (entity.depth === undefined) {
|
|
642
|
-
continue;
|
|
643
|
-
}
|
|
644
|
-
const link = links[linkNumber];
|
|
645
|
-
if (link && !linkOpen) {
|
|
646
|
-
entity.type = 'LINK';
|
|
647
|
-
entity.mutability = 'MUTABLE';
|
|
648
|
-
entity.data = link;
|
|
649
|
-
const decodedText = _he.default.decode(link.text);
|
|
650
|
-
entity.text = decodedText;
|
|
651
|
-
entityRange.length += decodedText.length;
|
|
652
|
-
linkNumber++;
|
|
653
|
-
}
|
|
654
|
-
linkOpen = !linkOpen;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
/**
|
|
660
|
-
* Mutate state to replace blocks with our custom versions
|
|
661
|
-
* Return a list of entity keys that should be removed
|
|
662
|
-
*/
|
|
663
|
-
function replaceBlocks(state, replacementBlocks) {
|
|
664
|
-
let entityKeysToExclude = [];
|
|
665
|
-
for (let i = 0; i < state.blocks.length; i++) {
|
|
666
|
-
const block = state.blocks[i];
|
|
667
|
-
for (const entityKey of Object.keys(state.entityMap)) {
|
|
668
|
-
let removeBlockEntityKeys = false;
|
|
669
|
-
const blockEntityKeys = block.entityRanges.map(range => range.key);
|
|
670
|
-
if (blockEntityKeys.includes(Number(entityKey))) {
|
|
671
|
-
const entity = state.entityMap[entityKey];
|
|
672
|
-
const markerKey = entity.data?.marker;
|
|
673
|
-
const replacementBlock = replacementBlocks[markerKey];
|
|
674
|
-
if (replacementBlock && !removeBlockEntityKeys) {
|
|
675
|
-
const originalBlock = state.blocks[i];
|
|
676
|
-
const originalBlockText = state.blocks[i].text;
|
|
677
|
-
replacementBlock.text = originalBlockText !== '' ? originalBlockText : replacementBlock.text;
|
|
678
|
-
replacementBlock.inlineStyleRanges = originalBlock.inlineStyleRanges;
|
|
679
|
-
const removeBlockEntities = entity.data.type === 'image' || entity.data.type === 'oembed';
|
|
680
|
-
// eslint-disable-next-line max-depth
|
|
681
|
-
if (!removeBlockEntities) {
|
|
682
|
-
replacementBlock.entityRanges = originalBlock.entityRanges.filter(entityRange => state.entityMap[entityRange.key].data?.marker === undefined);
|
|
683
|
-
}
|
|
684
|
-
state.blocks[i] = replacementBlock;
|
|
685
|
-
// eslint-disable-next-line max-depth
|
|
686
|
-
if (removeBlockEntities) {
|
|
687
|
-
removeBlockEntityKeys = true;
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
if (removeBlockEntityKeys) {
|
|
692
|
-
entityKeysToExclude = entityKeysToExclude.concat(blockEntityKeys);
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
return entityKeysToExclude;
|
|
697
|
-
}
|
|
698
|
-
const blockStarts = [{
|
|
699
|
-
regex: ' <TSImage',
|
|
700
|
-
replacement: ' <TSImage'
|
|
701
|
-
}, {
|
|
702
|
-
regex: ' <TSOembed',
|
|
703
|
-
replacement: ' <TSOembed'
|
|
704
|
-
}, {
|
|
705
|
-
regex: '\\*\\*\\*',
|
|
706
|
-
replacement: '***'
|
|
707
|
-
}, {
|
|
708
|
-
regex: '```',
|
|
709
|
-
replacement: '```'
|
|
710
|
-
}];
|
|
711
|
-
const blockEnds = [{
|
|
712
|
-
lookBehind: '<TSImage.*(?=/>)',
|
|
713
|
-
regex: '/>',
|
|
714
|
-
replacement: '/>'
|
|
715
|
-
}, {
|
|
716
|
-
regex: '</TSOembed>',
|
|
717
|
-
replacement: '</TSOembed>'
|
|
718
|
-
}, {
|
|
719
|
-
regex: '\\*\\*\\*',
|
|
720
|
-
replacement: '***'
|
|
721
|
-
}, {
|
|
722
|
-
regex: '```',
|
|
723
|
-
replacement: '```'
|
|
724
|
-
}];
|
|
725
|
-
const getLookBehindValue = (end, str) => {
|
|
726
|
-
if (end.lookBehind) {
|
|
727
|
-
const behindMatch = new RegExp(end.lookBehind).exec(str);
|
|
728
|
-
if (behindMatch) {
|
|
729
|
-
return behindMatch[0];
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
return '';
|
|
733
|
-
};
|
|
734
|
-
|
|
735
|
-
/**
|
|
736
|
-
* Make sure there is a place to put the cursor around block-level items such as images and oembeds
|
|
737
|
-
*/
|
|
738
|
-
function insertBreaksAroundBlocks(mdx) {
|
|
739
|
-
for (const start of blockStarts) {
|
|
740
|
-
mdx = mdx.replace(new RegExp(`^${start.regex}`, 'g'), `<br/>\n\n${start.replacement}`);
|
|
741
|
-
}
|
|
742
|
-
for (const end of blockEnds) {
|
|
743
|
-
mdx = mdx.replace(new RegExp(`${end.lookBehind ?? ''}${end.regex}\\s*$`, 'g'), match => {
|
|
744
|
-
return `${getLookBehindValue(end, match)}${end.replacement}\n\n<br/>`;
|
|
745
|
-
});
|
|
746
|
-
for (const start of blockStarts) {
|
|
747
|
-
mdx = mdx.replace(new RegExp(`${end.lookBehind ?? ''}${end.regex}\\s*${start.regex}`, 'g'), match => {
|
|
748
|
-
return `${getLookBehindValue(end, match)}${end.replacement ?? 'FFF'}\n\n<br/>\n\n${start.replacement}`;
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
return mdx;
|
|
753
|
-
}
|
|
754
|
-
function mdxToDraftjs(mdx) {
|
|
755
|
-
const replacementBlocks = {};
|
|
756
|
-
const entities = {};
|
|
757
|
-
const oembedKeyToHtml = {};
|
|
758
|
-
let currentOembedKey;
|
|
759
|
-
|
|
760
|
-
// Start really high to avoid conflicts with keys created by markdown-draft-js
|
|
761
|
-
let currentEntityKey = 1000000;
|
|
762
|
-
function entityKeyGenerator() {
|
|
763
|
-
return currentEntityKey++;
|
|
764
|
-
}
|
|
765
|
-
mdx = insertBreaksAroundBlocks(mdx);
|
|
766
|
-
const links = [];
|
|
767
|
-
const result = fromMd(mdx, {
|
|
768
|
-
htmltag(item) {
|
|
769
|
-
if (item === undefined) {
|
|
770
|
-
return getDraftjsEmpty();
|
|
771
|
-
}
|
|
772
|
-
const br = mdxToBr(item);
|
|
773
|
-
if (br) {
|
|
774
|
-
return br;
|
|
775
|
-
}
|
|
776
|
-
const linkData = mdxToLinkData(item);
|
|
777
|
-
if (linkData) {
|
|
778
|
-
links.push(linkData);
|
|
779
|
-
}
|
|
780
|
-
const image = mdxToDraftjsImage(item, entityKeyGenerator);
|
|
781
|
-
if (image) {
|
|
782
|
-
replacementBlocks[image.contentBlock.key] = image.contentBlock;
|
|
783
|
-
Object.assign(entities, image.entities);
|
|
784
|
-
return {
|
|
785
|
-
data: {
|
|
786
|
-
marker: image.contentBlock.key,
|
|
787
|
-
type: 'image'
|
|
788
|
-
}
|
|
789
|
-
};
|
|
790
|
-
}
|
|
791
|
-
const oembed = mdxToDraftjsOembed(item, entityKeyGenerator);
|
|
792
|
-
if (oembed) {
|
|
793
|
-
currentOembedKey = Object.keys(oembed.entities)[0];
|
|
794
|
-
replacementBlocks[oembed.contentBlock.key] = oembed.contentBlock;
|
|
795
|
-
Object.assign(entities, oembed.entities);
|
|
796
|
-
return {
|
|
797
|
-
data: {
|
|
798
|
-
marker: oembed.contentBlock.key,
|
|
799
|
-
type: 'oembed'
|
|
800
|
-
}
|
|
801
|
-
};
|
|
802
|
-
}
|
|
803
|
-
const pullquote = mdxToDraftjsPullquote(item);
|
|
804
|
-
if (pullquote) {
|
|
805
|
-
replacementBlocks[pullquote.contentBlock.key] = pullquote.contentBlock;
|
|
806
|
-
Object.assign(entities, pullquote.entities);
|
|
807
|
-
return {
|
|
808
|
-
data: {
|
|
809
|
-
marker: pullquote.contentBlock.key,
|
|
810
|
-
type: 'pullquote'
|
|
811
|
-
}
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
return getDraftjsEmpty(item.level);
|
|
815
|
-
}
|
|
816
|
-
}, {
|
|
817
|
-
htmlblock(item) {
|
|
818
|
-
if (item && currentOembedKey) {
|
|
819
|
-
oembedKeyToHtml[currentOembedKey] = item.content.replace(`</${mdxShortcodePrefix('Oembed')}>\n`, '');
|
|
820
|
-
currentOembedKey = undefined;
|
|
821
|
-
}
|
|
822
|
-
return getDraftjsRemovalMarker();
|
|
823
|
-
}
|
|
824
|
-
});
|
|
825
|
-
addLinks(result, links);
|
|
826
|
-
const entityKeysToExclude = replaceBlocks(result, replacementBlocks);
|
|
827
|
-
result.blocks = result.blocks.filter(block => block.type !== REMOVAL_MARKER_TYPE);
|
|
828
|
-
(0, _forEach.default)(oembedKeyToHtml, (html, key) => {
|
|
829
|
-
entities[key].data.html = html;
|
|
830
|
-
});
|
|
831
|
-
result.entityMap = (0, _pickBy.default)({
|
|
832
|
-
...result.entityMap,
|
|
833
|
-
...entities
|
|
834
|
-
}, (entity, key) => entity.data?.marker === undefined && !entityKeysToExclude.includes(Number(key)));
|
|
835
|
-
return result;
|
|
836
|
-
}
|