occam-dom 5.0.15 → 5.2.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/example.js +515 -1
- package/lib/index.js +9 -1
- package/lib/transform.js +262 -0
- package/lib/utilities/transform.js +215 -0
- package/package.json +1 -1
- package/src/index.js +2 -0
- package/src/transform.js +184 -0
- package/src/utilities/transform.js +191 -0
package/src/transform.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { arrayUtilities } from "necessary";
|
|
4
|
+
|
|
5
|
+
import { appendNode,
|
|
6
|
+
removeNode,
|
|
7
|
+
prependNode,
|
|
8
|
+
replaceNode,
|
|
9
|
+
appendTokens,
|
|
10
|
+
removeTokens,
|
|
11
|
+
replaceTokens,
|
|
12
|
+
addNodesAfter,
|
|
13
|
+
prependTokens,
|
|
14
|
+
addTokensAfter,
|
|
15
|
+
overwriteClonedNodeTokens,
|
|
16
|
+
clonedTokensFromNodeAndTokens, } from "./utilities/transform";
|
|
17
|
+
|
|
18
|
+
const { push } = arrayUtilities;
|
|
19
|
+
|
|
20
|
+
export default class Transform {
|
|
21
|
+
constructor(node, tokens) {
|
|
22
|
+
this.node = node;
|
|
23
|
+
this.tokens = tokens;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getNode() {
|
|
27
|
+
return this.node;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
getTokens(tokens = []) {
|
|
31
|
+
push(tokens, this.tokens);
|
|
32
|
+
|
|
33
|
+
return this.tokens;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
contract(Class, descendentNode, ...remainingArguments) {
|
|
37
|
+
if (descendentNode === undefined) {
|
|
38
|
+
descendentNode = Class; ///
|
|
39
|
+
|
|
40
|
+
Class = Transform; ///
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const node = descendentNode, ///
|
|
44
|
+
tokens = this.tokens, ///
|
|
45
|
+
context = { ///
|
|
46
|
+
tokens
|
|
47
|
+
},
|
|
48
|
+
transform = Class.fromNode(node, ...remainingArguments, context);
|
|
49
|
+
|
|
50
|
+
return transform;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
expand(Class, ascendantNode, ...remainingArguments) {
|
|
54
|
+
if (ascendantNode === undefined) {
|
|
55
|
+
ascendantNode = Class;
|
|
56
|
+
|
|
57
|
+
Class = Transform; ///
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const node = ascendantNode, ///
|
|
61
|
+
tokens = this.tokens, ///
|
|
62
|
+
context = {
|
|
63
|
+
tokens
|
|
64
|
+
},
|
|
65
|
+
transform = Class.fromNode(node, ...remainingArguments, context);
|
|
66
|
+
|
|
67
|
+
return transform;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
appendTo(parentNode, context) {
|
|
71
|
+
const { tokens } = context,
|
|
72
|
+
appendedNode = this.node, ///
|
|
73
|
+
appendedTokens = this.tokens; ///
|
|
74
|
+
|
|
75
|
+
appendNode(appendedNode, parentNode);
|
|
76
|
+
|
|
77
|
+
appendTokens(appendedTokens, parentNode, tokens);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
prependTo(parentNode, context) {
|
|
81
|
+
const { tokens } = context,
|
|
82
|
+
prependedNode = this.node, ///
|
|
83
|
+
prependedTokens = this.tokens; ///
|
|
84
|
+
|
|
85
|
+
prependNode(prependedNode, parentNode);
|
|
86
|
+
|
|
87
|
+
prependTokens(prependedTokens, parentNode, tokens);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
addAfter(existingNode, parentNode, context) {
|
|
91
|
+
const { tokens } = context,
|
|
92
|
+
markdownNode = this.node, ///
|
|
93
|
+
removedChildNodes = markdownNode.removeChildNodes(),
|
|
94
|
+
addedTokens = this.tokens, ///
|
|
95
|
+
addedNodes = removedChildNodes; ///
|
|
96
|
+
|
|
97
|
+
addNodesAfter(existingNode, addedNodes, parentNode);
|
|
98
|
+
|
|
99
|
+
addTokensAfter(existingNode, addedTokens, tokens);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
replace(replacedNode, parentNode, context) {
|
|
103
|
+
const { tokens } = context,
|
|
104
|
+
replacementNode = this.node, ///
|
|
105
|
+
replacementTokens = this.tokens; ///
|
|
106
|
+
|
|
107
|
+
replaceNode(replacementNode, replacedNode, parentNode);
|
|
108
|
+
|
|
109
|
+
replaceTokens(replacementTokens, replacedNode, tokens);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
removeFrom(removedNode, parentNode, context) {
|
|
113
|
+
const { tokens } = context;
|
|
114
|
+
|
|
115
|
+
removeTokens(removedNode, tokens);
|
|
116
|
+
|
|
117
|
+
removeNode(removedNode, parentNode);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
clone(...remainingArguments) {
|
|
121
|
+
const clonedNode = this.node.clone(),
|
|
122
|
+
clonedTokens = clonedTokensFromNodeAndTokens(this.node, this.tokens);
|
|
123
|
+
|
|
124
|
+
overwriteClonedNodeTokens(clonedNode, clonedTokens, this.tokens);
|
|
125
|
+
|
|
126
|
+
const Class = this.constructor, ///
|
|
127
|
+
node = clonedNode, ///
|
|
128
|
+
tokens = clonedTokens, ///
|
|
129
|
+
transform = new Class(node, tokens, ...remainingArguments);
|
|
130
|
+
|
|
131
|
+
return transform
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
static fromNode(Class, node, ...remainingArguments) {
|
|
135
|
+
let context = remainingArguments.pop();
|
|
136
|
+
|
|
137
|
+
if (context === undefined) {
|
|
138
|
+
context = node; ///
|
|
139
|
+
|
|
140
|
+
node = Class; ///
|
|
141
|
+
|
|
142
|
+
Class = Transform; ///
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
let { tokens } = context;
|
|
146
|
+
|
|
147
|
+
const firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
|
|
148
|
+
clonedNode = node.clone();
|
|
149
|
+
|
|
150
|
+
let clonedTokens;
|
|
151
|
+
|
|
152
|
+
if (firstSignificantTokenIndex === null) {
|
|
153
|
+
clonedTokens = [];
|
|
154
|
+
} else {
|
|
155
|
+
const offset = firstSignificantTokenIndex; ///
|
|
156
|
+
|
|
157
|
+
clonedTokens = clonedTokensFromNodeAndTokens(node, tokens);
|
|
158
|
+
|
|
159
|
+
overwriteClonedNodeTokens(clonedNode, clonedTokens, tokens, offset);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
node = clonedNode; ///
|
|
163
|
+
|
|
164
|
+
tokens = clonedTokens; ///
|
|
165
|
+
|
|
166
|
+
const transform = new Class(node, tokens, ...remainingArguments);
|
|
167
|
+
|
|
168
|
+
return transform;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static fromNodeAndTokens(Class, node, tokens, ...remainingArguments) {
|
|
172
|
+
if (tokens === undefined) {
|
|
173
|
+
tokens = node; ///
|
|
174
|
+
|
|
175
|
+
node = Class; ///
|
|
176
|
+
|
|
177
|
+
Class = Transform; ///
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const transform = new Class(node, tokens, ...remainingArguments);
|
|
181
|
+
|
|
182
|
+
return transform;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export function appendNode(appendedNode, parentNode) {
|
|
4
|
+
const appendedChildNode = appendedNode; ///
|
|
5
|
+
|
|
6
|
+
parentNode.appendChildNode(appendedChildNode);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function prependNode(prependedNode, parentNode) {
|
|
10
|
+
const prependedChildNode = prependedNode; ///
|
|
11
|
+
|
|
12
|
+
parentNode.prependChildNode(prependedChildNode);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function removeNode(removedNode, parentNode) {
|
|
16
|
+
const removedChildNode = removedNode; ///
|
|
17
|
+
|
|
18
|
+
parentNode.removeChildNode(removedChildNode);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function removeNodes(removedNodes, parentNode) {
|
|
22
|
+
const removedChildNodes = removedNodes; ///
|
|
23
|
+
|
|
24
|
+
parentNode.removeChildNodes(removedChildNodes);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function replaceNode(replacementNode, replacedNode, parentNode) {
|
|
28
|
+
const replacedChildNode = replacedNode, ///
|
|
29
|
+
replacementChildNode = replacementNode, ///
|
|
30
|
+
replacementChildNodes = [
|
|
31
|
+
replacementChildNode
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
parentNode.replaceChildNode(replacedChildNode, replacementChildNodes);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function replaceNodes(replacementNodes, replacedNode, parentNode) {
|
|
38
|
+
const replacedChildNode = replacedNode, ///
|
|
39
|
+
replacementChildNodes = replacementNodes; ///
|
|
40
|
+
|
|
41
|
+
parentNode.replaceChildNodes(replacedChildNode, replacementChildNodes);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function addNodeAfter(existingNode, addedNode, parentNode) {
|
|
45
|
+
const childNode = existingNode, ///
|
|
46
|
+
index = parentNode.indexOfChildNode(childNode),
|
|
47
|
+
addedChildNode = addedNode, ///
|
|
48
|
+
startIndex = index + 1;
|
|
49
|
+
|
|
50
|
+
parentNode.addChildNode(addedChildNode, startIndex);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function addNodesAfter(existingNode, addedNodes, parentNode) {
|
|
54
|
+
const childNode = existingNode, ///
|
|
55
|
+
index = parentNode.indexOfChildNode(childNode),
|
|
56
|
+
addedChildNodes = addedNodes, ///
|
|
57
|
+
startIndex = index + 1;
|
|
58
|
+
|
|
59
|
+
parentNode.addChildNodes(addedChildNodes, startIndex);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function appendTokens(appendedTokens, parentNode, tokens) {
|
|
63
|
+
const node = parentNode, ///
|
|
64
|
+
lastSignificantTokenIndex = node.getLastSignificantTokenIndex(tokens),
|
|
65
|
+
start = lastSignificantTokenIndex + 1,
|
|
66
|
+
deleteCount = 0;
|
|
67
|
+
|
|
68
|
+
tokens.splice(start, deleteCount, ...appendedTokens);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function prependTokens(prependedTokens, parentNode, tokens) {
|
|
72
|
+
const node = parentNode, ///
|
|
73
|
+
firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
|
|
74
|
+
start = firstSignificantTokenIndex,
|
|
75
|
+
deleteCount = 0;
|
|
76
|
+
|
|
77
|
+
tokens.splice(start, deleteCount, ...prependedTokens);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function removeTokens(removedNode, tokens) {
|
|
81
|
+
const node = removedNode, ///
|
|
82
|
+
firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
|
|
83
|
+
lastSignificantTokenIndex = node.getLastSignificantTokenIndex(tokens),
|
|
84
|
+
start = firstSignificantTokenIndex, ///
|
|
85
|
+
end = lastSignificantTokenIndex + 1,
|
|
86
|
+
deleteCount = end - start;
|
|
87
|
+
|
|
88
|
+
tokens.splice(start, deleteCount);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function replaceTokens(replacementTokens, replacedNode, tokens) {
|
|
92
|
+
const node = replacedNode, ///
|
|
93
|
+
firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
|
|
94
|
+
lastSignificantTokenIndex = node.getLastSignificantTokenIndex(tokens),
|
|
95
|
+
start = firstSignificantTokenIndex, ///
|
|
96
|
+
end = lastSignificantTokenIndex + 1,
|
|
97
|
+
deleteCount = end - start;
|
|
98
|
+
|
|
99
|
+
tokens.splice(start, deleteCount, ...replacementTokens);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function addTokensAfter(existingNode, addedTokens, tokens) {
|
|
103
|
+
const node = existingNode, ///
|
|
104
|
+
lastSignificantTokenIndex = node.getLastSignificantTokenIndex(tokens),
|
|
105
|
+
start = lastSignificantTokenIndex + 1,
|
|
106
|
+
deleteCount = 0;
|
|
107
|
+
|
|
108
|
+
tokens.splice(start, deleteCount, ...addedTokens);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function overwriteClonedNodeTokens(clonedNode, clonedTokens, tokens, offset = 0) {
|
|
112
|
+
const node = clonedNode; ///
|
|
113
|
+
|
|
114
|
+
overwriteNodeTokens(node, clonedTokens, tokens, offset);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function clonedTokensFromNodeAndTokens(node, tokens) {
|
|
118
|
+
const firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
|
|
119
|
+
lastSignificantTokenIndex = node.getLastSignificantTokenIndex(tokens),
|
|
120
|
+
start = firstSignificantTokenIndex, ///
|
|
121
|
+
end = lastSignificantTokenIndex + 1;
|
|
122
|
+
|
|
123
|
+
tokens = tokens.slice(start, end); ///
|
|
124
|
+
|
|
125
|
+
const clonedTokens = tokens.map((token) => { ///
|
|
126
|
+
const clonedToken = token.clone();
|
|
127
|
+
|
|
128
|
+
return clonedToken;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
return clonedTokens;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export default {
|
|
135
|
+
appendNode,
|
|
136
|
+
prependNode,
|
|
137
|
+
removeNode,
|
|
138
|
+
removeNodes,
|
|
139
|
+
replaceNode,
|
|
140
|
+
replaceNodes,
|
|
141
|
+
addNodeAfter,
|
|
142
|
+
addNodesAfter,
|
|
143
|
+
appendTokens,
|
|
144
|
+
prependTokens,
|
|
145
|
+
removeTokens,
|
|
146
|
+
replaceTokens,
|
|
147
|
+
addTokensAfter,
|
|
148
|
+
overwriteClonedNodeTokens,
|
|
149
|
+
clonedTokensFromNodeAndTokens
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
function overwriteNodeTokens(node, clonedTokens, tokens, offset) {
|
|
153
|
+
const nodeTerminalNode = node.isTerminalNode();
|
|
154
|
+
|
|
155
|
+
if (nodeTerminalNode) {
|
|
156
|
+
const terminalNode = node; ///
|
|
157
|
+
|
|
158
|
+
overwriteTerminalNodeTokens(terminalNode, clonedTokens, tokens, offset);
|
|
159
|
+
} else {
|
|
160
|
+
const nonTerminalNode = node; ///
|
|
161
|
+
|
|
162
|
+
overwriteNonTerminalNodeTokens(nonTerminalNode, clonedTokens, tokens, offset);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function overwriteTerminalNodeTokens(terminalNode, clonedTokens, tokens, offset) {
|
|
167
|
+
let index,
|
|
168
|
+
significantToken;
|
|
169
|
+
|
|
170
|
+
significantToken = terminalNode.getSignificantToken();
|
|
171
|
+
|
|
172
|
+
if (significantToken !== null) {
|
|
173
|
+
index = tokens.indexOf(significantToken);
|
|
174
|
+
|
|
175
|
+
index -= offset;
|
|
176
|
+
|
|
177
|
+
const clonedToken = clonedTokens[index];
|
|
178
|
+
|
|
179
|
+
significantToken = clonedToken; ///
|
|
180
|
+
|
|
181
|
+
terminalNode.setSignificantToken(significantToken);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function overwriteNonTerminalNodeTokens(nonTerminalNode, clonedTokens, tokens, offset) {
|
|
186
|
+
nonTerminalNode.forEachChildNode((childNode) => {
|
|
187
|
+
const clonedNode = childNode; ///
|
|
188
|
+
|
|
189
|
+
overwriteNodeTokens(clonedNode, clonedTokens, tokens, offset);
|
|
190
|
+
});
|
|
191
|
+
}
|