@atlaskit/adf-utils 18.0.1 → 18.0.3
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/CHANGELOG.md +13 -0
- package/dist/cjs/builders/marks/alignment.js +0 -3
- package/dist/cjs/builders/marks/annotation.js +0 -3
- package/dist/cjs/builders/marks/breakout.js +0 -3
- package/dist/cjs/builders/marks/code.js +0 -3
- package/dist/cjs/builders/marks/data-consumer.js +0 -3
- package/dist/cjs/builders/marks/em.js +0 -3
- package/dist/cjs/builders/marks/fragment.js +0 -3
- package/dist/cjs/builders/marks/indentation.js +0 -3
- package/dist/cjs/builders/marks/link.js +0 -3
- package/dist/cjs/builders/marks/strike.js +0 -3
- package/dist/cjs/builders/marks/strong.js +0 -3
- package/dist/cjs/builders/marks/subsup.js +0 -3
- package/dist/cjs/builders/marks/text-color.js +0 -3
- package/dist/cjs/builders/marks/underline.js +0 -3
- package/dist/cjs/builders/nodes/block-card.js +0 -2
- package/dist/cjs/builders/nodes/blockquote.js +0 -3
- package/dist/cjs/builders/nodes/bodied-extension.js +0 -3
- package/dist/cjs/builders/nodes/bullet-list.js +0 -3
- package/dist/cjs/builders/nodes/caption.js +0 -3
- package/dist/cjs/builders/nodes/code-block.js +0 -3
- package/dist/cjs/builders/nodes/date.js +0 -2
- package/dist/cjs/builders/nodes/decision-item.js +0 -3
- package/dist/cjs/builders/nodes/decision-list.js +0 -3
- package/dist/cjs/builders/nodes/doc.js +0 -3
- package/dist/cjs/builders/nodes/embed-card.js +0 -2
- package/dist/cjs/builders/nodes/emoji.js +0 -2
- package/dist/cjs/builders/nodes/expand.js +0 -3
- package/dist/cjs/builders/nodes/extension.js +0 -2
- package/dist/cjs/builders/nodes/hard-break.js +0 -2
- package/dist/cjs/builders/nodes/heading.js +0 -3
- package/dist/cjs/builders/nodes/inline-card.js +0 -2
- package/dist/cjs/builders/nodes/inline-extension.js +0 -2
- package/dist/cjs/builders/nodes/layout-column.js +0 -2
- package/dist/cjs/builders/nodes/layout-section.js +0 -2
- package/dist/cjs/builders/nodes/list-item.js +0 -2
- package/dist/cjs/builders/nodes/media-group.js +0 -3
- package/dist/cjs/builders/nodes/media-inline.js +0 -2
- package/dist/cjs/builders/nodes/media-single.js +0 -2
- package/dist/cjs/builders/nodes/media.js +0 -2
- package/dist/cjs/builders/nodes/mention.js +0 -6
- package/dist/cjs/builders/nodes/nested-expand.js +0 -3
- package/dist/cjs/builders/nodes/ordered-list.js +0 -3
- package/dist/cjs/builders/nodes/panel.js +0 -3
- package/dist/cjs/builders/nodes/paragraph.js +0 -4
- package/dist/cjs/builders/nodes/placeholder.js +0 -2
- package/dist/cjs/builders/nodes/rule.js +0 -2
- package/dist/cjs/builders/nodes/status.js +0 -2
- package/dist/cjs/builders/nodes/table-cell.js +0 -3
- package/dist/cjs/builders/nodes/table-header.js +0 -3
- package/dist/cjs/builders/nodes/table-row.js +0 -2
- package/dist/cjs/builders/nodes/table.js +0 -3
- package/dist/cjs/builders/nodes/task-item.js +0 -3
- package/dist/cjs/builders/nodes/task-list.js +0 -3
- package/dist/cjs/builders/nodes/text.js +0 -2
- package/dist/cjs/builders/utils/apply-mark.js +0 -5
- package/dist/cjs/builders/utils/create-text-nodes.js +0 -3
- package/dist/cjs/builders/utils/is-duplicate-mark.js +0 -3
- package/dist/cjs/builders.js +0 -51
- package/dist/cjs/empty-adf.js +0 -2
- package/dist/cjs/scrub/default-node-replacements.js +0 -11
- package/dist/cjs/scrub/default-value-replacements.js +0 -2
- package/dist/cjs/scrub/hash.js +0 -4
- package/dist/cjs/scrub/scrub-adf.js +2 -25
- package/dist/cjs/scrub/scrub-content.js +7 -37
- package/dist/cjs/scrub.js +0 -2
- package/dist/cjs/transforms/dedupe-marks-transform.js +6 -24
- package/dist/cjs/transforms/helpers.js +0 -3
- package/dist/cjs/transforms/indentation-marks-transform.js +6 -14
- package/dist/cjs/transforms/invalid-media-content-transform.js +3 -22
- package/dist/cjs/transforms/media-link-transform.js +2 -12
- package/dist/cjs/transforms/nodes-missing-content-transform.js +0 -44
- package/dist/cjs/transforms/text-link-code-transform.js +3 -13
- package/dist/cjs/transforms.js +0 -6
- package/dist/cjs/traverse/filter.js +0 -2
- package/dist/cjs/traverse/map.js +0 -2
- package/dist/cjs/traverse/reduce.js +0 -2
- package/dist/cjs/traverse/traverse.js +1 -18
- package/dist/cjs/traverse.js +0 -4
- package/dist/cjs/validator/rules.js +0 -2
- package/dist/cjs/validator/specs/index.js +0 -83
- package/dist/cjs/validator/utils.js +4 -20
- package/dist/cjs/validator/validator.js +67 -218
- package/dist/cjs/validator.js +0 -1
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/builders/utils/apply-mark.js +0 -2
- package/dist/es2019/builders/utils/is-duplicate-mark.js +0 -1
- package/dist/es2019/builders.js +4 -1
- package/dist/es2019/scrub/default-node-replacements.js +2 -7
- package/dist/es2019/scrub/hash.js +0 -2
- package/dist/es2019/scrub/scrub-adf.js +4 -10
- package/dist/es2019/scrub/scrub-content.js +7 -20
- package/dist/es2019/transforms/dedupe-marks-transform.js +7 -18
- package/dist/es2019/transforms/helpers.js +0 -1
- package/dist/es2019/transforms/indentation-marks-transform.js +10 -10
- package/dist/es2019/transforms/invalid-media-content-transform.js +5 -15
- package/dist/es2019/transforms/media-link-transform.js +2 -9
- package/dist/es2019/transforms/nodes-missing-content-transform.js +6 -38
- package/dist/es2019/transforms/text-link-code-transform.js +5 -8
- package/dist/es2019/traverse/traverse.js +5 -13
- package/dist/es2019/validator/utils.js +4 -2
- package/dist/es2019/validator/validator.js +60 -174
- package/dist/es2019/version.json +1 -1
- package/dist/esm/builders/nodes/blockquote.js +0 -1
- package/dist/esm/builders/nodes/bodied-extension.js +0 -1
- package/dist/esm/builders/nodes/bullet-list.js +0 -1
- package/dist/esm/builders/nodes/caption.js +0 -1
- package/dist/esm/builders/nodes/code-block.js +0 -1
- package/dist/esm/builders/nodes/decision-item.js +0 -1
- package/dist/esm/builders/nodes/decision-list.js +0 -1
- package/dist/esm/builders/nodes/doc.js +0 -1
- package/dist/esm/builders/nodes/expand.js +0 -1
- package/dist/esm/builders/nodes/heading.js +0 -1
- package/dist/esm/builders/nodes/media-group.js +0 -1
- package/dist/esm/builders/nodes/mention.js +0 -3
- package/dist/esm/builders/nodes/nested-expand.js +0 -1
- package/dist/esm/builders/nodes/ordered-list.js +0 -1
- package/dist/esm/builders/nodes/panel.js +0 -1
- package/dist/esm/builders/nodes/paragraph.js +0 -1
- package/dist/esm/builders/nodes/table-cell.js +0 -1
- package/dist/esm/builders/nodes/table-header.js +0 -1
- package/dist/esm/builders/nodes/table.js +0 -1
- package/dist/esm/builders/nodes/task-item.js +0 -1
- package/dist/esm/builders/nodes/task-list.js +0 -1
- package/dist/esm/builders/utils/apply-mark.js +0 -2
- package/dist/esm/builders/utils/is-duplicate-mark.js +0 -1
- package/dist/esm/builders.js +4 -1
- package/dist/esm/scrub/default-node-replacements.js +0 -9
- package/dist/esm/scrub/hash.js +0 -2
- package/dist/esm/scrub/scrub-adf.js +2 -17
- package/dist/esm/scrub/scrub-content.js +7 -28
- package/dist/esm/transforms/dedupe-marks-transform.js +6 -20
- package/dist/esm/transforms/helpers.js +0 -1
- package/dist/esm/transforms/indentation-marks-transform.js +6 -11
- package/dist/esm/transforms/invalid-media-content-transform.js +3 -18
- package/dist/esm/transforms/media-link-transform.js +2 -9
- package/dist/esm/transforms/nodes-missing-content-transform.js +0 -38
- package/dist/esm/transforms/text-link-code-transform.js +3 -10
- package/dist/esm/traverse/traverse.js +1 -15
- package/dist/esm/validator/utils.js +4 -2
- package/dist/esm/validator/validator.js +67 -209
- package/dist/esm/version.json +1 -1
- package/package.json +2 -2
package/dist/cjs/validator.js
CHANGED
package/dist/cjs/version.json
CHANGED
|
@@ -2,13 +2,11 @@ import { isDuplicateMark, duplicateMarkError } from './is-duplicate-mark';
|
|
|
2
2
|
import { text } from '../nodes/text';
|
|
3
3
|
export function applyMark(mark, maybeNode) {
|
|
4
4
|
const node = typeof maybeNode === 'string' ? text(maybeNode) : maybeNode;
|
|
5
|
-
|
|
6
5
|
if (isDuplicateMark(node, mark.type)) {
|
|
7
6
|
// eslint-disable-next-line no-console
|
|
8
7
|
console.error(duplicateMarkError(node, mark.type));
|
|
9
8
|
return node;
|
|
10
9
|
}
|
|
11
|
-
|
|
12
10
|
node.marks = node.marks || [];
|
|
13
11
|
node.marks.push(mark);
|
|
14
12
|
return node;
|
package/dist/es2019/builders.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Marks Builders
|
|
2
|
+
|
|
2
3
|
export { breakout } from './builders/marks/breakout';
|
|
3
4
|
export { code } from './builders/marks/code';
|
|
4
5
|
export { em } from './builders/marks/em';
|
|
@@ -14,7 +15,9 @@ export { underline as u } from './builders/marks/underline';
|
|
|
14
15
|
export { alignment } from './builders/marks/alignment';
|
|
15
16
|
export { indentation } from './builders/marks/indentation';
|
|
16
17
|
export { dataConsumer } from './builders/marks/data-consumer';
|
|
17
|
-
export { fragment } from './builders/marks/fragment';
|
|
18
|
+
export { fragment } from './builders/marks/fragment';
|
|
19
|
+
|
|
20
|
+
// Nodes Builders
|
|
18
21
|
|
|
19
22
|
export { blockQuote } from './builders/nodes/blockquote';
|
|
20
23
|
export { bodiedExtension } from './builders/nodes/bodied-extension';
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { scrubAttrs } from './scrub-content';
|
|
2
|
-
|
|
3
2
|
const card = (node, {
|
|
4
3
|
valueReplacements
|
|
5
4
|
}) => {
|
|
6
5
|
var _node$attrs;
|
|
7
|
-
|
|
8
6
|
return {
|
|
9
7
|
type: node.type,
|
|
10
8
|
attrs: {
|
|
@@ -12,17 +10,14 @@ const card = (node, {
|
|
|
12
10
|
}
|
|
13
11
|
};
|
|
14
12
|
};
|
|
15
|
-
|
|
16
13
|
const mediaParent = node => {
|
|
17
14
|
var _node$content;
|
|
18
|
-
|
|
19
15
|
return {
|
|
20
16
|
type: node.type,
|
|
21
17
|
attrs: node.attrs ? scrubAttrs(node.type, node.attrs) : undefined,
|
|
22
18
|
content: (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.filter(c => (c === null || c === void 0 ? void 0 : c.type) === 'media')
|
|
23
19
|
};
|
|
24
20
|
};
|
|
25
|
-
|
|
26
21
|
export const defaultNodeReplacements = {
|
|
27
22
|
emoji: () => ({
|
|
28
23
|
type: 'emoji',
|
|
@@ -54,7 +49,6 @@ export const defaultNodeReplacements = {
|
|
|
54
49
|
parent
|
|
55
50
|
}) => {
|
|
56
51
|
var _parent$node, _node$attrs$width, _node$attrs2, _node$attrs$height, _node$attrs3;
|
|
57
|
-
|
|
58
52
|
const defaults = ((_parent$node = parent.node) === null || _parent$node === void 0 ? void 0 : _parent$node.type) === 'mediaSingle' ? {
|
|
59
53
|
width: 600,
|
|
60
54
|
height: 400
|
|
@@ -66,7 +60,8 @@ export const defaultNodeReplacements = {
|
|
|
66
60
|
const height = (_node$attrs$height = (_node$attrs3 = node.attrs) === null || _node$attrs3 === void 0 ? void 0 : _node$attrs3.height) !== null && _node$attrs$height !== void 0 ? _node$attrs$height : defaults.height;
|
|
67
61
|
return {
|
|
68
62
|
type: 'media',
|
|
69
|
-
attrs: {
|
|
63
|
+
attrs: {
|
|
64
|
+
...scrubAttrs('media', node.attrs),
|
|
70
65
|
type: 'external',
|
|
71
66
|
url: `https://dummyimage.com/${width}x${height}/f4f5f7/a5adba`
|
|
72
67
|
}
|
|
@@ -3,50 +3,44 @@ import { scrubAttrs, scrubStr, scrubLink } from './scrub-content';
|
|
|
3
3
|
import { defaultNodeReplacements } from './default-node-replacements';
|
|
4
4
|
import { defaultValueReplacements } from './default-value-replacements';
|
|
5
5
|
export default ((adf, options = {}) => {
|
|
6
|
-
const nodeReplacements = {
|
|
6
|
+
const nodeReplacements = {
|
|
7
|
+
...defaultNodeReplacements,
|
|
7
8
|
...options.nodeReplacements
|
|
8
9
|
};
|
|
9
|
-
const valueReplacements = {
|
|
10
|
+
const valueReplacements = {
|
|
11
|
+
...defaultValueReplacements,
|
|
10
12
|
...options.valueReplacements
|
|
11
13
|
};
|
|
12
14
|
return traverse(adf, {
|
|
13
15
|
any: (node, parent) => {
|
|
14
16
|
const replacement = nodeReplacements[node.type];
|
|
15
|
-
|
|
16
17
|
if (typeof replacement === 'function') {
|
|
17
18
|
const result = replacement(node, {
|
|
18
19
|
parent,
|
|
19
20
|
valueReplacements
|
|
20
21
|
});
|
|
21
|
-
|
|
22
22
|
if (result !== false) {
|
|
23
23
|
return result;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
|
|
27
26
|
const updatedNode = {};
|
|
28
27
|
Object.entries(node).forEach(([key, value]) => {
|
|
29
28
|
if (['version', 'type', 'content', 'marks'].includes(key)) {
|
|
30
29
|
updatedNode[key] = value;
|
|
31
30
|
}
|
|
32
31
|
});
|
|
33
|
-
|
|
34
32
|
if (node.text && node.marks) {
|
|
35
33
|
var _node$marks;
|
|
36
|
-
|
|
37
34
|
updatedNode.marks = scrubLink((_node$marks = node.marks) !== null && _node$marks !== void 0 ? _node$marks : [], {
|
|
38
35
|
valueReplacements
|
|
39
36
|
});
|
|
40
37
|
}
|
|
41
|
-
|
|
42
38
|
if (node.text) {
|
|
43
39
|
updatedNode.text = scrubStr(node.text);
|
|
44
40
|
}
|
|
45
|
-
|
|
46
41
|
if (node.attrs) {
|
|
47
42
|
updatedNode.attrs = scrubAttrs(node.type, node.attrs);
|
|
48
43
|
}
|
|
49
|
-
|
|
50
44
|
return updatedNode;
|
|
51
45
|
}
|
|
52
46
|
});
|
|
@@ -20,14 +20,12 @@ const BYPASS_ATTR_LIST = {
|
|
|
20
20
|
tableRow: ['defaultMarks'],
|
|
21
21
|
taskItem: ['state']
|
|
22
22
|
};
|
|
23
|
-
|
|
24
23
|
const fromEntries = iterable => {
|
|
25
24
|
return [...iterable].reduce((obj, [key, val]) => {
|
|
26
25
|
obj[key] = val;
|
|
27
26
|
return obj;
|
|
28
27
|
}, {});
|
|
29
28
|
};
|
|
30
|
-
|
|
31
29
|
const scrubNum = (val, start = 0) => {
|
|
32
30
|
return parseInt(val.toString().split('').map((_, index) => {
|
|
33
31
|
const base = start + index;
|
|
@@ -35,18 +33,17 @@ const scrubNum = (val, start = 0) => {
|
|
|
35
33
|
return DUMMY_DIGITS[base % len];
|
|
36
34
|
}).join(''), 10);
|
|
37
35
|
};
|
|
38
|
-
|
|
39
36
|
export const scrubStr = (val, offset = 0) => {
|
|
40
|
-
const base = DUMMY_TEXT.repeat(Math.ceil((offset + val.length) / DUMMY_TEXT.length));
|
|
41
|
-
// something like "".split('')
|
|
37
|
+
const base = DUMMY_TEXT.repeat(Math.ceil((offset + val.length) / DUMMY_TEXT.length));
|
|
42
38
|
|
|
39
|
+
// using [...val] splits emoji character pairs correctly, compared to
|
|
40
|
+
// something like "".split('')
|
|
43
41
|
return [...val].map((char, index, chars) => {
|
|
44
42
|
if (/^\p{Nd}$/u.test(char)) {
|
|
45
43
|
// Decimal digits
|
|
46
44
|
return scrubNum(parseInt(char, 10), index).toString();
|
|
47
45
|
} else if (/^\p{So}$/u.test(char)) {
|
|
48
46
|
var _chars;
|
|
49
|
-
|
|
50
47
|
// Emoji
|
|
51
48
|
return ((_chars = chars[index - 1]) === null || _chars === void 0 ? void 0 : _chars.codePointAt(0)) === 8205 ? '' : '⭐️';
|
|
52
49
|
} else if (/^\p{Sc}$/u.test(char)) {
|
|
@@ -74,59 +71,49 @@ export const scrubLink = (marks, {
|
|
|
74
71
|
}) => {
|
|
75
72
|
return marks.map(mark => {
|
|
76
73
|
if (mark.type === 'link' && mark.attrs.href) {
|
|
77
|
-
return {
|
|
78
|
-
|
|
74
|
+
return {
|
|
75
|
+
...mark,
|
|
76
|
+
attrs: {
|
|
77
|
+
...mark.attrs,
|
|
79
78
|
href: valueReplacements.href(mark.attrs.href)
|
|
80
79
|
}
|
|
81
80
|
};
|
|
82
81
|
}
|
|
83
|
-
|
|
84
82
|
return mark;
|
|
85
83
|
});
|
|
86
84
|
};
|
|
87
|
-
|
|
88
85
|
const scrubObj = (nodeType, attrsObj) => {
|
|
89
86
|
const entries = Object.entries(attrsObj).map(([key, value]) => {
|
|
90
87
|
var _BYPASS_ATTR_LIST$nod;
|
|
91
|
-
|
|
92
88
|
return (_BYPASS_ATTR_LIST$nod = BYPASS_ATTR_LIST[nodeType]) !== null && _BYPASS_ATTR_LIST$nod !== void 0 && _BYPASS_ATTR_LIST$nod.includes(key) ? [key, value] : [key, scrubAttrs(nodeType, value)];
|
|
93
89
|
});
|
|
94
90
|
return fromEntries(entries);
|
|
95
91
|
};
|
|
96
|
-
|
|
97
92
|
export const scrubAttrs = (nodeType, attrs, offset = 0) => {
|
|
98
93
|
if (typeof attrs === 'number') {
|
|
99
94
|
return scrubNum(attrs, offset);
|
|
100
95
|
}
|
|
101
|
-
|
|
102
96
|
if (typeof attrs === 'string') {
|
|
103
97
|
return scrubStr(attrs, offset);
|
|
104
98
|
}
|
|
105
|
-
|
|
106
99
|
if (typeof attrs === 'boolean') {
|
|
107
100
|
return attrs;
|
|
108
101
|
}
|
|
109
|
-
|
|
110
102
|
if (!attrs) {
|
|
111
103
|
return attrs;
|
|
112
104
|
}
|
|
113
|
-
|
|
114
105
|
const attrsObj = attrs;
|
|
115
|
-
|
|
116
106
|
if (attrsObj && attrsObj.constructor === Object && Object.keys(attrsObj).length === 0) {
|
|
117
107
|
return {};
|
|
118
108
|
}
|
|
119
|
-
|
|
120
109
|
if (typeof attrsObj === 'object' && !Array.isArray(attrsObj)) {
|
|
121
110
|
return scrubObj(nodeType, attrsObj);
|
|
122
111
|
}
|
|
123
|
-
|
|
124
112
|
if (Array.isArray(attrsObj)) {
|
|
125
113
|
return attrsObj.map(el => {
|
|
126
114
|
return typeof el === 'object' ? scrubObj(nodeType, el) : scrubAttrs(nodeType, el);
|
|
127
115
|
});
|
|
128
116
|
}
|
|
129
|
-
|
|
130
117
|
throw new TypeError(`scrubAttrs: encountered unsupported attributes type "${typeof attrsObj}"
|
|
131
118
|
of value ${JSON.stringify(attrsObj)}`);
|
|
132
119
|
};
|
|
@@ -4,24 +4,20 @@ import { traverse } from '../traverse/traverse';
|
|
|
4
4
|
// not include annotations here, because we do allow duplicate
|
|
5
5
|
// annotations as long as they have unique id attributes (valid scenario)
|
|
6
6
|
const markDuplicatesDisallowed = new Set(['strong', 'underline', 'textColor', 'link', 'em', 'subsup', 'strike']);
|
|
7
|
-
|
|
8
7
|
const maybeHasDisallowedDuplicateMarks = node => {
|
|
9
8
|
var _node$marks, _node$marks$map;
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const markTypes = (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : (_node$marks$map = _node$marks.map(mark => mark.type)) === null || _node$marks$map === void 0 ? void 0 : _node$marks$map.filter(markType =>
|
|
10
|
+
// For annotations, we are performing the same cheap check
|
|
12
11
|
// for duplicates by type, without considering IDs, to quickly determine
|
|
13
12
|
// whether there may be potential deduping targets.
|
|
14
13
|
// In the actual deduping logic in maybeRemoveDisallowedDuplicateMarks,
|
|
15
14
|
// we correctly/safely dedupe annotations by their unique IDs.
|
|
16
15
|
markDuplicatesDisallowed.has(markType) || markType === 'annotation');
|
|
17
|
-
|
|
18
16
|
if (!(markTypes !== null && markTypes !== void 0 && markTypes.length)) {
|
|
19
17
|
return false;
|
|
20
18
|
}
|
|
21
|
-
|
|
22
19
|
return new Set(markTypes).size !== markTypes.length;
|
|
23
20
|
};
|
|
24
|
-
|
|
25
21
|
const maybeRemoveDisallowedDuplicateMarks = node => {
|
|
26
22
|
const quota = new Map();
|
|
27
23
|
const annotationsQuota = new Map();
|
|
@@ -29,21 +25,16 @@ const maybeRemoveDisallowedDuplicateMarks = node => {
|
|
|
29
25
|
markDuplicatesDisallowed.forEach(mark => {
|
|
30
26
|
quota.set(mark, false);
|
|
31
27
|
});
|
|
32
|
-
|
|
33
28
|
if (!node.marks) {
|
|
34
29
|
return {
|
|
35
30
|
discardedMarks
|
|
36
31
|
};
|
|
37
32
|
}
|
|
38
|
-
|
|
39
33
|
let dedupedMarks = node.marks.filter(mark => {
|
|
40
34
|
const markType = mark.type;
|
|
41
|
-
|
|
42
35
|
if (markType === 'annotation') {
|
|
43
36
|
var _mark$attrs;
|
|
44
|
-
|
|
45
37
|
const id = (_mark$attrs = mark.attrs) === null || _mark$attrs === void 0 ? void 0 : _mark$attrs.id;
|
|
46
|
-
|
|
47
38
|
if (annotationsQuota.has(id)) {
|
|
48
39
|
discardedMarks.push(mark);
|
|
49
40
|
return false;
|
|
@@ -52,7 +43,6 @@ const maybeRemoveDisallowedDuplicateMarks = node => {
|
|
|
52
43
|
return true;
|
|
53
44
|
}
|
|
54
45
|
}
|
|
55
|
-
|
|
56
46
|
if (quota.has(markType)) {
|
|
57
47
|
if (!quota.get(markType)) {
|
|
58
48
|
quota.set(markType, true);
|
|
@@ -62,17 +52,16 @@ const maybeRemoveDisallowedDuplicateMarks = node => {
|
|
|
62
52
|
return false;
|
|
63
53
|
}
|
|
64
54
|
}
|
|
65
|
-
|
|
66
55
|
return true;
|
|
67
56
|
});
|
|
68
57
|
return {
|
|
69
|
-
node: {
|
|
58
|
+
node: {
|
|
59
|
+
...node,
|
|
70
60
|
marks: dedupedMarks
|
|
71
61
|
},
|
|
72
62
|
discardedMarks
|
|
73
63
|
};
|
|
74
64
|
};
|
|
75
|
-
|
|
76
65
|
export const transformDedupeMarks = adf => {
|
|
77
66
|
let isTransformed = false;
|
|
78
67
|
let discardedMarks = [];
|
|
@@ -80,9 +69,9 @@ export const transformDedupeMarks = adf => {
|
|
|
80
69
|
text: node => {
|
|
81
70
|
if (maybeHasDisallowedDuplicateMarks(node)) {
|
|
82
71
|
const result = maybeRemoveDisallowedDuplicateMarks(node);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
72
|
+
const resultDiscardedMarks = result.discardedMarks;
|
|
73
|
+
if (resultDiscardedMarks.length) {
|
|
74
|
+
discardedMarks.push(...resultDiscardedMarks);
|
|
86
75
|
isTransformed = true;
|
|
87
76
|
return result.node;
|
|
88
77
|
}
|
|
@@ -1,33 +1,27 @@
|
|
|
1
1
|
import { traverse } from '../traverse/traverse';
|
|
2
|
-
|
|
3
2
|
const hasChildHeadingWithIndentation = node => {
|
|
4
3
|
var _node$content$some, _node$content;
|
|
5
|
-
|
|
6
4
|
return (_node$content$some = (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.some(childNode => {
|
|
7
5
|
var _childNode$marks;
|
|
8
|
-
|
|
9
6
|
return (childNode === null || childNode === void 0 ? void 0 : childNode.type) === 'heading' && (childNode === null || childNode === void 0 ? void 0 : (_childNode$marks = childNode.marks) === null || _childNode$marks === void 0 ? void 0 : _childNode$marks.some(mark => mark.type === 'indentation'));
|
|
10
7
|
})) !== null && _node$content$some !== void 0 ? _node$content$some : false;
|
|
11
8
|
};
|
|
12
|
-
|
|
13
9
|
const removeIndentationFromHeadings = node => {
|
|
14
10
|
var _node$content2;
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
return {
|
|
12
|
+
...node,
|
|
17
13
|
content: (_node$content2 = node.content) === null || _node$content2 === void 0 ? void 0 : _node$content2.map(childNode => {
|
|
18
14
|
if ((childNode === null || childNode === void 0 ? void 0 : childNode.type) === 'heading') {
|
|
19
15
|
var _childNode$marks2;
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
return {
|
|
17
|
+
...childNode,
|
|
22
18
|
marks: (_childNode$marks2 = childNode.marks) === null || _childNode$marks2 === void 0 ? void 0 : _childNode$marks2.filter(mark => mark.type !== 'indentation')
|
|
23
19
|
};
|
|
24
20
|
}
|
|
25
|
-
|
|
26
21
|
return childNode;
|
|
27
22
|
})
|
|
28
23
|
};
|
|
29
24
|
};
|
|
30
|
-
|
|
31
25
|
export const transformIndentationMarks = adf => {
|
|
32
26
|
let isTransformed = false;
|
|
33
27
|
const transformedAdf = traverse(adf, {
|
|
@@ -36,6 +30,12 @@ export const transformIndentationMarks = adf => {
|
|
|
36
30
|
isTransformed = true;
|
|
37
31
|
return removeIndentationFromHeadings(node);
|
|
38
32
|
}
|
|
33
|
+
},
|
|
34
|
+
tableHeader: node => {
|
|
35
|
+
if (hasChildHeadingWithIndentation(node)) {
|
|
36
|
+
isTransformed = true;
|
|
37
|
+
return removeIndentationFromHeadings(node);
|
|
38
|
+
}
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
41
|
return {
|
|
@@ -1,69 +1,59 @@
|
|
|
1
1
|
import { traverse } from '../traverse/traverse';
|
|
2
2
|
import { isEmpty } from './helpers';
|
|
3
|
-
|
|
4
3
|
const getChildrenTypeCounts = (nodeContent, allowedTypes) => {
|
|
5
4
|
let childrenTypes = {};
|
|
6
5
|
nodeContent.forEach((childNode, index) => {
|
|
7
6
|
if (!(childNode !== null && childNode !== void 0 && childNode.type) || !allowedTypes.includes(childNode.type)) {
|
|
8
7
|
return;
|
|
9
8
|
}
|
|
10
|
-
|
|
11
9
|
if (!childrenTypes[childNode.type]) {
|
|
12
10
|
childrenTypes[childNode.type] = 1;
|
|
13
11
|
return;
|
|
14
12
|
}
|
|
15
|
-
|
|
16
13
|
childrenTypes[childNode.type]++;
|
|
17
14
|
});
|
|
18
15
|
return childrenTypes;
|
|
19
16
|
};
|
|
20
|
-
|
|
21
17
|
const removeDuplicatedNodes = (type, content, predicate) => {
|
|
22
18
|
let maxIterations = 10;
|
|
23
19
|
let childrenTypeCounts = getChildrenTypeCounts(content, [type])[type];
|
|
24
20
|
let firstPredicateNodeIndex = content.findIndex(predicate);
|
|
25
|
-
|
|
26
21
|
while (childrenTypeCounts > 1 && firstPredicateNodeIndex > -1 && maxIterations-- > 0) {
|
|
27
22
|
content.splice(firstPredicateNodeIndex, 1);
|
|
28
23
|
firstPredicateNodeIndex = content.findIndex(predicate);
|
|
29
24
|
childrenTypeCounts = getChildrenTypeCounts(content, [type])[type];
|
|
30
25
|
}
|
|
31
26
|
};
|
|
27
|
+
|
|
32
28
|
/**
|
|
33
29
|
* @param {{[type:string]:number}} allowedTypes - array types allowed to deduplicate
|
|
34
30
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
37
31
|
const deduplicateMediaSingleChildren = (node, allowedTypes) => {
|
|
38
32
|
if (!node.content) {
|
|
39
33
|
return;
|
|
40
34
|
}
|
|
41
|
-
|
|
42
35
|
const content = [...node.content];
|
|
43
36
|
Object.keys(allowedTypes).forEach(type => {
|
|
44
37
|
//prioritise removing empty nodes first
|
|
45
|
-
removeDuplicatedNodes(type, content, node => (node === null || node === void 0 ? void 0 : node.type) === type && isEmpty(node));
|
|
46
|
-
|
|
38
|
+
removeDuplicatedNodes(type, content, node => (node === null || node === void 0 ? void 0 : node.type) === type && isEmpty(node));
|
|
39
|
+
//remove other remaining dupicates
|
|
47
40
|
removeDuplicatedNodes(type, content, node => (node === null || node === void 0 ? void 0 : node.type) === type);
|
|
48
41
|
});
|
|
49
|
-
return {
|
|
42
|
+
return {
|
|
43
|
+
...node,
|
|
50
44
|
content
|
|
51
45
|
};
|
|
52
46
|
};
|
|
53
|
-
|
|
54
47
|
export const transformInvalidMediaContent = adf => {
|
|
55
48
|
let isTransformed = false;
|
|
56
49
|
const transformedAdf = traverse(adf, {
|
|
57
50
|
mediaSingle: node => {
|
|
58
51
|
var _node$content;
|
|
59
|
-
|
|
60
52
|
if (!(node !== null && node !== void 0 && (_node$content = node.content) !== null && _node$content !== void 0 && _node$content.length)) {
|
|
61
53
|
return;
|
|
62
54
|
}
|
|
63
|
-
|
|
64
55
|
const disallowedDuplicateTypes = ['media', 'caption'];
|
|
65
56
|
const childrenTypes = getChildrenTypeCounts(node.content, disallowedDuplicateTypes);
|
|
66
|
-
|
|
67
57
|
if (Object.values(childrenTypes).some(occurences => occurences > 1)) {
|
|
68
58
|
isTransformed = true;
|
|
69
59
|
return deduplicateMediaSingleChildren(node, childrenTypes);
|
|
@@ -6,38 +6,31 @@ export const transformMediaLinkMarks = adf => {
|
|
|
6
6
|
const transformedAdf = traverse(adf, {
|
|
7
7
|
mediaSingle: node => {
|
|
8
8
|
var _node$content$;
|
|
9
|
-
|
|
10
9
|
if (!node.marks || !node.content || ((_node$content$ = node.content[0]) === null || _node$content$ === void 0 ? void 0 : _node$content$.type) !== 'media') {
|
|
11
10
|
return node;
|
|
12
11
|
}
|
|
13
|
-
|
|
14
12
|
let linkMark = null;
|
|
15
13
|
node.marks.forEach((mark, i) => {
|
|
16
14
|
if (mark.type === 'link') {
|
|
17
15
|
var _node$marks;
|
|
18
|
-
|
|
19
16
|
linkMark = mark;
|
|
20
17
|
(_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : _node$marks.splice(i, 1);
|
|
21
18
|
isTransformed = true;
|
|
22
19
|
}
|
|
23
20
|
});
|
|
24
|
-
|
|
25
21
|
if (node.marks.length === 0) {
|
|
26
22
|
delete node.marks;
|
|
27
23
|
}
|
|
28
|
-
|
|
29
24
|
if (linkMark) {
|
|
30
25
|
var _mediaNode$marks;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
const mediaNode = node.content[0];
|
|
27
|
+
// only add link mark if media node doesnt already have one
|
|
34
28
|
if ((_mediaNode$marks = mediaNode.marks) !== null && _mediaNode$marks !== void 0 && _mediaNode$marks.every(mark => mark.type !== 'link')) {
|
|
35
29
|
mediaNode.marks.push(linkMark);
|
|
36
30
|
} else if (!mediaNode.marks) {
|
|
37
31
|
mediaNode.marks = [linkMark];
|
|
38
32
|
}
|
|
39
33
|
}
|
|
40
|
-
|
|
41
34
|
return node;
|
|
42
35
|
}
|
|
43
36
|
});
|