@markuplint/ml-core 3.0.0-alpha.0 → 3.0.0-alpha.2
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/lib/ml-core.d.ts +1 -1
- package/lib/ml-core.js +12 -7
- package/lib/ml-dom/helper/accname.d.ts +2 -1
- package/lib/ml-dom/helper/accname.js +51 -2
- package/lib/ml-dom/helper/create-node.d.ts +2 -2
- package/lib/ml-dom/helper/create-node.js +1 -1
- package/lib/ml-dom/helper/debug.js +1 -1
- package/lib/ml-dom/helper/getIndent.d.ts +1 -1
- package/lib/ml-dom/node/attr.d.ts +5 -5
- package/lib/ml-dom/node/attr.js +9 -9
- package/lib/ml-dom/node/block.d.ts +1 -1
- package/lib/ml-dom/node/character-data.d.ts +2 -2
- package/lib/ml-dom/node/document-fragment.d.ts +2 -2
- package/lib/ml-dom/node/document-type.d.ts +1 -1
- package/lib/ml-dom/node/document.d.ts +28 -19
- package/lib/ml-dom/node/document.js +40 -17
- package/lib/ml-dom/node/dom-token-list.d.ts +2 -2
- package/lib/ml-dom/node/dom-token-list.js +6 -6
- package/lib/ml-dom/node/element.d.ts +53 -30
- package/lib/ml-dom/node/element.js +203 -50
- package/lib/ml-dom/node/node-list.d.ts +1 -1
- package/lib/ml-dom/node/node-store.d.ts +3 -3
- package/lib/ml-dom/node/node.d.ts +19 -12
- package/lib/ml-dom/node/node.js +35 -26
- package/lib/ml-dom/node/parent-node.d.ts +2 -2
- package/lib/ml-dom/node/types.d.ts +13 -3
- package/lib/ml-dom/token/token.d.ts +1 -1
- package/lib/ml-rule/ml-rule-context.d.ts +2 -1
- package/lib/ml-rule/ml-rule-context.js +19 -2
- package/lib/ml-rule/ml-rule.d.ts +4 -4
- package/lib/ml-rule/ml-rule.js +4 -4
- package/lib/ml-rule/types.d.ts +1 -1
- package/lib/test/index.d.ts +2 -1
- package/lib/test/index.js +5 -3
- package/lib/types.d.ts +3 -2
- package/package.json +11 -11
- package/tsconfig.tsbuildinfo +1 -1
- package/lib/ml-dom/document.d.ts +0 -94
- package/lib/ml-dom/document.js +0 -273
- package/lib/ml-dom/helper/index.d.ts +0 -4
- package/lib/ml-dom/helper/index.js +0 -12
- package/lib/ml-dom/helper/mapped-nodes.d.ts +0 -52
- package/lib/ml-dom/helper/mapped-nodes.js +0 -2
- package/lib/ml-dom/helper/match-selector.d.ts +0 -20
- package/lib/ml-dom/helper/match-selector.js +0 -233
- package/lib/ml-dom/helper/node-store.d.ts +0 -12
- package/lib/ml-dom/helper/node-store.js +0 -28
- package/lib/ml-dom/helper/selector.d.ts +0 -11
- package/lib/ml-dom/helper/selector.js +0 -549
- package/lib/ml-dom/rule-mapper.d.ts +0 -16
- package/lib/ml-dom/rule-mapper.js +0 -57
- package/lib/ml-dom/tokens/abstract-element.d.ts +0 -54
- package/lib/ml-dom/tokens/abstract-element.js +0 -249
- package/lib/ml-dom/tokens/attribute.d.ts +0 -42
- package/lib/ml-dom/tokens/attribute.js +0 -85
- package/lib/ml-dom/tokens/comment.d.ts +0 -12
- package/lib/ml-dom/tokens/comment.js +0 -15
- package/lib/ml-dom/tokens/doctype.d.ts +0 -18
- package/lib/ml-dom/tokens/doctype.js +0 -32
- package/lib/ml-dom/tokens/element-close-tag.d.ts +0 -27
- package/lib/ml-dom/tokens/element-close-tag.js +0 -45
- package/lib/ml-dom/tokens/element.d.ts +0 -26
- package/lib/ml-dom/tokens/element.js +0 -66
- package/lib/ml-dom/tokens/index.d.ts +0 -10
- package/lib/ml-dom/tokens/index.js +0 -26
- package/lib/ml-dom/tokens/node.d.ts +0 -46
- package/lib/ml-dom/tokens/node.js +0 -126
- package/lib/ml-dom/tokens/omitted-element.d.ts +0 -13
- package/lib/ml-dom/tokens/omitted-element.js +0 -12
- package/lib/ml-dom/tokens/preprocessor-specific-attribute.d.ts +0 -24
- package/lib/ml-dom/tokens/preprocessor-specific-attribute.js +0 -37
- package/lib/ml-dom/tokens/preprocessor-specific-block.d.ts +0 -14
- package/lib/ml-dom/tokens/preprocessor-specific-block.js +0 -16
- package/lib/ml-dom/tokens/text.d.ts +0 -19
- package/lib/ml-dom/tokens/text.js +0 -26
- package/lib/ml-dom/tokens/token.d.ts +0 -16
- package/lib/ml-dom/tokens/token.js +0 -55
- package/lib/ml-dom/types.d.ts +0 -49
- package/lib/ml-dom/types.js +0 -2
- package/lib/selector/is-pure-html-element.d.ts +0 -1
- package/lib/selector/is-pure-html-element.js +0 -7
- package/lib/selector/match-selector.d.ts +0 -14
- package/lib/selector/match-selector.js +0 -230
- package/lib/selector/selector.d.ts +0 -9
- package/lib/selector/selector.js +0 -561
package/lib/ml-dom/document.js
DELETED
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _MLDOMDocument_filename;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const ml_config_1 = require("@markuplint/ml-config");
|
|
6
|
-
const ml_spec_1 = require("@markuplint/ml-spec");
|
|
7
|
-
const debug_1 = require("../debug");
|
|
8
|
-
const helper_1 = require("./helper");
|
|
9
|
-
const debug_2 = require("./helper/debug");
|
|
10
|
-
const match_selector_1 = require("./helper/match-selector");
|
|
11
|
-
const walkers_1 = require("./helper/walkers");
|
|
12
|
-
const rule_mapper_1 = require("./rule-mapper");
|
|
13
|
-
const tokens_1 = require("./tokens");
|
|
14
|
-
const log = debug_1.log.extend('ml-dom');
|
|
15
|
-
const docLog = log.extend('document');
|
|
16
|
-
const ruleLog = docLog.extend('rule');
|
|
17
|
-
/**
|
|
18
|
-
* markuplint DOM Document
|
|
19
|
-
*/
|
|
20
|
-
class MLDOMDocument {
|
|
21
|
-
/**
|
|
22
|
-
*
|
|
23
|
-
* @param ast node list of markuplint AST
|
|
24
|
-
* @param ruleset ruleset object
|
|
25
|
-
*/
|
|
26
|
-
constructor(ast, ruleset, schemas, options) {
|
|
27
|
-
var _a;
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
*/
|
|
31
|
-
this.currentRule = null;
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
34
|
-
*/
|
|
35
|
-
this.nodeStore = new helper_1.NodeStore();
|
|
36
|
-
/**
|
|
37
|
-
* Window object for calling the `getComputedStyle` and the `getPropertyValue` that are needed by **Accessible Name and Description Computation**.
|
|
38
|
-
* But it always returns the empty object.
|
|
39
|
-
* (It may improve to possible to compute the name from the `style` attribute in the future.)
|
|
40
|
-
*/
|
|
41
|
-
this.defaultView = {
|
|
42
|
-
getComputedStyle(_el) {
|
|
43
|
-
return {
|
|
44
|
-
getPropertyValue(_propName) {
|
|
45
|
-
return {};
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
_MLDOMDocument_filename.set(this, void 0);
|
|
51
|
-
this.isFragment = ast.isFragment;
|
|
52
|
-
this.specs = (0, ml_spec_1.getSpec)(schemas);
|
|
53
|
-
this.endTag = (_a = options === null || options === void 0 ? void 0 : options.endTag) !== null && _a !== void 0 ? _a : 'omittable';
|
|
54
|
-
tslib_1.__classPrivateFieldSet(this, _MLDOMDocument_filename, options === null || options === void 0 ? void 0 : options.filename, "f");
|
|
55
|
-
// console.log(ast.nodeList.map((n, i) => `${i}: ${n.uuid} "${n.raw.trim()}"(${n.type})`));
|
|
56
|
-
this.nodeList = Object.freeze(ast.nodeList.map(astNode => {
|
|
57
|
-
if (astNode.type === 'endtag') {
|
|
58
|
-
return this.nodeStore.getNode(astNode);
|
|
59
|
-
}
|
|
60
|
-
return (0, helper_1.createNode)(astNode, this);
|
|
61
|
-
}));
|
|
62
|
-
this._ruleMapping(ruleset, options === null || options === void 0 ? void 0 : options.tagNameCaseSensitive);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* It could be used in rule, make sure it is immutable
|
|
66
|
-
*/
|
|
67
|
-
get filename() {
|
|
68
|
-
return tslib_1.__classPrivateFieldGet(this, _MLDOMDocument_filename, "f");
|
|
69
|
-
}
|
|
70
|
-
get doctype() {
|
|
71
|
-
for (const node of this.nodeList) {
|
|
72
|
-
if (node instanceof tokens_1.MLDOMDoctype) {
|
|
73
|
-
return node;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
get tree() {
|
|
79
|
-
const treeRoots = [];
|
|
80
|
-
let traversalNode = this.nodeList[0];
|
|
81
|
-
while (traversalNode) {
|
|
82
|
-
treeRoots.push(traversalNode);
|
|
83
|
-
traversalNode = traversalNode.nextNode;
|
|
84
|
-
}
|
|
85
|
-
return treeRoots;
|
|
86
|
-
}
|
|
87
|
-
walk(walker) {
|
|
88
|
-
/**
|
|
89
|
-
* The following pattern is used to ensure that all rules run sequentially,
|
|
90
|
-
* no matter it runs asynchronously or synchronously.
|
|
91
|
-
*/
|
|
92
|
-
let _resolve;
|
|
93
|
-
let _reject;
|
|
94
|
-
const promise = new Promise((resolve, reject) => {
|
|
95
|
-
_resolve = resolve;
|
|
96
|
-
_reject = reject;
|
|
97
|
-
});
|
|
98
|
-
const loop = (index = 0) => {
|
|
99
|
-
if (index >= this.nodeList.length) {
|
|
100
|
-
_resolve();
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const node = this.nodeList[index];
|
|
104
|
-
const result = walker(node);
|
|
105
|
-
if (result instanceof Promise) {
|
|
106
|
-
result.then(() => loop(index + 1)).catch(_reject);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
loop(index + 1);
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
loop();
|
|
113
|
-
return promise;
|
|
114
|
-
}
|
|
115
|
-
walkOn(type, walker, skipWhenRuleIsDisabled = true) {
|
|
116
|
-
return this.walk(node => {
|
|
117
|
-
if (node instanceof tokens_1.MLDOMNode) {
|
|
118
|
-
if (skipWhenRuleIsDisabled && node.rule.disabled) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (node.is(type)) {
|
|
122
|
-
return walker(node);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
setRule(rule) {
|
|
128
|
-
this.currentRule = rule;
|
|
129
|
-
}
|
|
130
|
-
matchNodes(query) {
|
|
131
|
-
return this.nodeList.filter((node) => node.type === 'Element' && node.matches(query));
|
|
132
|
-
}
|
|
133
|
-
querySelectorAll(query) {
|
|
134
|
-
return this.matchNodes(query);
|
|
135
|
-
}
|
|
136
|
-
querySelector(query) {
|
|
137
|
-
return this.querySelectorAll(query)[0] || null;
|
|
138
|
-
}
|
|
139
|
-
getElementById(id) {
|
|
140
|
-
return this.querySelector(`#${id}`);
|
|
141
|
-
}
|
|
142
|
-
toString() {
|
|
143
|
-
const html = [];
|
|
144
|
-
for (const node of this.nodeList) {
|
|
145
|
-
html.push(node.raw);
|
|
146
|
-
}
|
|
147
|
-
return html.join('');
|
|
148
|
-
}
|
|
149
|
-
debugMap() {
|
|
150
|
-
return (0, debug_2.nodeListToDebugMaps)(this.nodeList, true);
|
|
151
|
-
}
|
|
152
|
-
_ruleMapping(ruleset, tagNameCaseSensitive) {
|
|
153
|
-
docLog('Rule Mapping');
|
|
154
|
-
const ruleMapper = new rule_mapper_1.RuleMapper(this.nodeList);
|
|
155
|
-
// add rules to node
|
|
156
|
-
for (const node of this.nodeList) {
|
|
157
|
-
if (node.type === 'ElementCloseTag') {
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
if (docLog.enabled) {
|
|
161
|
-
docLog('Add rules to node <%s>', 'nodeName' in node ? node.nodeName : `#${node.type}`);
|
|
162
|
-
}
|
|
163
|
-
// global rules
|
|
164
|
-
Object.keys(ruleset.rules).forEach(ruleName => {
|
|
165
|
-
const rule = ruleset.rules[ruleName];
|
|
166
|
-
ruleMapper.set(node, ruleName, {
|
|
167
|
-
from: 'rules',
|
|
168
|
-
specificity: [0, 0, 0],
|
|
169
|
-
rule,
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
if (node.type !== 'Element' && node.type !== 'OmittedElement' && node.type !== 'Text') {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
const selectorTarget = node.type === 'Element' || node.type === 'OmittedElement' ? node : null;
|
|
176
|
-
// node specs and special rules for node by selector
|
|
177
|
-
ruleset.nodeRules.forEach((nodeRule, i) => {
|
|
178
|
-
if (!nodeRule.rules) {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
if (!selectorTarget) {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
const selector = nodeRule.selector || nodeRule.regexSelector || nodeRule.tagName;
|
|
185
|
-
const matches =
|
|
186
|
-
/**
|
|
187
|
-
* Forward v1.x compatibility
|
|
188
|
-
*/
|
|
189
|
-
nodeRule.tagName && /^#text$/i.test(nodeRule.tagName) && node.type === 'Text'
|
|
190
|
-
? {
|
|
191
|
-
matched: true,
|
|
192
|
-
selector: '#text',
|
|
193
|
-
specificity: [0, 0, 0],
|
|
194
|
-
}
|
|
195
|
-
: /**
|
|
196
|
-
* v2.0.0 or later
|
|
197
|
-
*/
|
|
198
|
-
(0, match_selector_1.matchSelector)(selectorTarget, selector, tagNameCaseSensitive);
|
|
199
|
-
if (!matches.matched) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
if (docLog.enabled) {
|
|
203
|
-
docLog('Matched nodeRule: <%s>(%s)', 'nodeName' in node ? node.nodeName : node.type, matches.selector || '*');
|
|
204
|
-
}
|
|
205
|
-
const ruleList = Object.keys(nodeRule.rules);
|
|
206
|
-
for (const ruleName of ruleList) {
|
|
207
|
-
const rule = nodeRule.rules[ruleName];
|
|
208
|
-
const convertedRule = (0, ml_config_1.exchangeValueOnRule)(rule, matches.data || {});
|
|
209
|
-
if (convertedRule === undefined) {
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
const globalRule = ruleset.rules[ruleName];
|
|
213
|
-
const mergedRule = globalRule ? (0, ml_config_1.mergeRule)(globalRule, convertedRule) : convertedRule;
|
|
214
|
-
ruleLog('↑ nodeRule (%s): %O', ruleName, mergedRule);
|
|
215
|
-
ruleMapper.set(node, ruleName, {
|
|
216
|
-
from: 'nodeRules',
|
|
217
|
-
specificity: matches.specificity,
|
|
218
|
-
rule: mergedRule,
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
// overwrite rule to child node
|
|
223
|
-
if (selectorTarget && ruleset.childNodeRules.length) {
|
|
224
|
-
const descendants = [];
|
|
225
|
-
(0, walkers_1.syncWalk)(selectorTarget.childNodes, childNode => {
|
|
226
|
-
descendants.push(childNode);
|
|
227
|
-
if (childNode.type === 'Element' && childNode.closeTag) {
|
|
228
|
-
descendants.push(childNode.closeTag);
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
const children = selectorTarget.childNodes;
|
|
232
|
-
ruleset.childNodeRules.forEach((nodeRule, i) => {
|
|
233
|
-
if (!nodeRule.rules) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
const nodeRuleRules = nodeRule.rules;
|
|
237
|
-
const selector = nodeRule.selector || nodeRule.tagName || nodeRule.regexSelector;
|
|
238
|
-
if (!selector) {
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
const matches = (0, match_selector_1.matchSelector)(selectorTarget, selector, tagNameCaseSensitive);
|
|
242
|
-
if (!matches.matched) {
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
if (docLog.enabled) {
|
|
246
|
-
docLog('Matched childNodeRule: <%s>(%s), inheritance: %o', selectorTarget.nodeName, matches.selector || '*', !!nodeRule.inheritance);
|
|
247
|
-
}
|
|
248
|
-
const targetDescendants = nodeRule.inheritance ? descendants : children;
|
|
249
|
-
Object.keys(nodeRuleRules).forEach(ruleName => {
|
|
250
|
-
const rule = nodeRuleRules[ruleName];
|
|
251
|
-
const convertedRule = (0, ml_config_1.exchangeValueOnRule)(rule, matches.data || {});
|
|
252
|
-
if (convertedRule === undefined) {
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
const globalRule = ruleset.rules[ruleName];
|
|
256
|
-
const mergedRule = globalRule ? (0, ml_config_1.mergeRule)(globalRule, convertedRule) : convertedRule;
|
|
257
|
-
ruleLog('↑ childNodeRule (%s): %O', ruleName, mergedRule);
|
|
258
|
-
targetDescendants.forEach(descendant => {
|
|
259
|
-
ruleMapper.set(descendant, ruleName, {
|
|
260
|
-
from: 'childNodeRules',
|
|
261
|
-
specificity: matches.specificity,
|
|
262
|
-
rule: mergedRule,
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
ruleMapper.apply();
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
exports.default = MLDOMDocument;
|
|
273
|
-
_MLDOMDocument_filename = new WeakMap();
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createSelector = exports.NodeStore = exports.createNode = void 0;
|
|
7
|
-
var create_node_1 = require("./create-node");
|
|
8
|
-
Object.defineProperty(exports, "createNode", { enumerable: true, get: function () { return create_node_1.createNode; } });
|
|
9
|
-
var node_store_1 = require("./node-store");
|
|
10
|
-
Object.defineProperty(exports, "NodeStore", { enumerable: true, get: function () { return __importDefault(node_store_1).default; } });
|
|
11
|
-
var selector_1 = require("./selector");
|
|
12
|
-
Object.defineProperty(exports, "createSelector", { enumerable: true, get: function () { return selector_1.createSelector; } });
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
MLDOMAttribute,
|
|
3
|
-
MLDOMComment,
|
|
4
|
-
MLDOMDoctype,
|
|
5
|
-
MLDOMElement,
|
|
6
|
-
MLDOMElementCloseTag,
|
|
7
|
-
MLDOMNode,
|
|
8
|
-
MLDOMOmittedElement,
|
|
9
|
-
MLDOMPreprocessorSpecificBlock,
|
|
10
|
-
MLDOMText,
|
|
11
|
-
MLDOMToken,
|
|
12
|
-
} from '../tokens';
|
|
13
|
-
import type {
|
|
14
|
-
MLASTAbstructNode,
|
|
15
|
-
MLASTAttr,
|
|
16
|
-
MLASTComment,
|
|
17
|
-
MLASTDoctype,
|
|
18
|
-
MLASTElement,
|
|
19
|
-
MLASTElementCloseTag,
|
|
20
|
-
MLASTNode,
|
|
21
|
-
MLASTOmittedElement,
|
|
22
|
-
MLASTParentNode,
|
|
23
|
-
MLASTPreprocessorSpecificBlock,
|
|
24
|
-
MLASTText,
|
|
25
|
-
MLToken,
|
|
26
|
-
} from '@markuplint/ml-ast/';
|
|
27
|
-
import type { RuleConfigValue } from '@markuplint/ml-config';
|
|
28
|
-
export declare type MappedNode<N, T extends RuleConfigValue, O = null> = N extends MLASTElement
|
|
29
|
-
? MLDOMElement<T, O>
|
|
30
|
-
: N extends MLASTElementCloseTag
|
|
31
|
-
? MLDOMElementCloseTag<T, O>
|
|
32
|
-
: N extends MLASTOmittedElement
|
|
33
|
-
? MLDOMOmittedElement<T, O>
|
|
34
|
-
: N extends MLASTParentNode
|
|
35
|
-
? MLDOMElement<T, O> | MLDOMOmittedElement<T, O>
|
|
36
|
-
: N extends MLASTComment
|
|
37
|
-
? MLDOMComment<T, O>
|
|
38
|
-
: N extends MLASTText
|
|
39
|
-
? MLDOMText<T, O>
|
|
40
|
-
: N extends MLASTDoctype
|
|
41
|
-
? MLDOMDoctype<T, O>
|
|
42
|
-
: N extends MLASTNode
|
|
43
|
-
? MLDOMNode<T, O, MLASTNode>
|
|
44
|
-
: N extends MLASTPreprocessorSpecificBlock
|
|
45
|
-
? MLDOMPreprocessorSpecificBlock<T, O>
|
|
46
|
-
: N extends MLASTAbstructNode
|
|
47
|
-
? MLDOMNode<T, O, MLASTAbstructNode>
|
|
48
|
-
: N extends MLASTAttr
|
|
49
|
-
? MLDOMAttribute
|
|
50
|
-
: N extends MLToken
|
|
51
|
-
? MLDOMToken<MLToken>
|
|
52
|
-
: never;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type MLDOMAbstractElement from '../tokens/abstract-element';
|
|
2
|
-
import type { Specificity } from './selector';
|
|
3
|
-
import type { RegexSelector } from '@markuplint/ml-config';
|
|
4
|
-
export declare type SelectorMatches = SelectorMatched | SelectorUnmatched;
|
|
5
|
-
declare type SelectorMatched = {
|
|
6
|
-
matched: true;
|
|
7
|
-
selector: string;
|
|
8
|
-
specificity: Specificity;
|
|
9
|
-
data?: Record<string, string>;
|
|
10
|
-
};
|
|
11
|
-
declare type SelectorUnmatched = {
|
|
12
|
-
matched: false;
|
|
13
|
-
};
|
|
14
|
-
declare type TargetElement = MLDOMAbstractElement<any, any>;
|
|
15
|
-
export declare function matchSelector(
|
|
16
|
-
el: TargetElement,
|
|
17
|
-
selector: string | RegexSelector | undefined,
|
|
18
|
-
tagNameCaseSensitive?: boolean,
|
|
19
|
-
): SelectorMatches;
|
|
20
|
-
export {};
|
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.matchSelector = void 0;
|
|
4
|
-
const ml_config_1 = require("@markuplint/ml-config");
|
|
5
|
-
const selector_1 = require("./selector");
|
|
6
|
-
function matchSelector(el, selector, tagNameCaseSensitive) {
|
|
7
|
-
if (!selector) {
|
|
8
|
-
return {
|
|
9
|
-
matched: false,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
if (typeof selector === 'string') {
|
|
13
|
-
const sel = (0, selector_1.createSelector)(selector, tagNameCaseSensitive);
|
|
14
|
-
const specificity = sel.match(el);
|
|
15
|
-
if (specificity) {
|
|
16
|
-
return {
|
|
17
|
-
matched: true,
|
|
18
|
-
selector,
|
|
19
|
-
specificity,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
return {
|
|
23
|
-
matched: false,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
return regexSelect(el, selector);
|
|
27
|
-
}
|
|
28
|
-
exports.matchSelector = matchSelector;
|
|
29
|
-
function regexSelect(el, selector) {
|
|
30
|
-
let edge = new SelectorTarget(selector);
|
|
31
|
-
let edgeSelector = selector.combination;
|
|
32
|
-
while (edgeSelector) {
|
|
33
|
-
const child = new SelectorTarget(edgeSelector);
|
|
34
|
-
child.from(edge, edgeSelector.combinator);
|
|
35
|
-
edge = child;
|
|
36
|
-
edgeSelector = edgeSelector.combination;
|
|
37
|
-
}
|
|
38
|
-
return edge.match(el);
|
|
39
|
-
}
|
|
40
|
-
class SelectorTarget {
|
|
41
|
-
constructor(selector) {
|
|
42
|
-
this._combinatedFrom = null;
|
|
43
|
-
this._selector = {
|
|
44
|
-
nodeName: selector.nodeName,
|
|
45
|
-
attrName: selector.attrName,
|
|
46
|
-
attrValue: selector.attrValue,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
match(el) {
|
|
50
|
-
const unitCheck = this._matchWithoutCombinateChecking(el);
|
|
51
|
-
if (!unitCheck.matched) {
|
|
52
|
-
return unitCheck;
|
|
53
|
-
}
|
|
54
|
-
if (!this._combinatedFrom) {
|
|
55
|
-
return unitCheck;
|
|
56
|
-
}
|
|
57
|
-
const { target, combinator } = this._combinatedFrom;
|
|
58
|
-
switch (combinator) {
|
|
59
|
-
// Descendant combinator
|
|
60
|
-
case ' ': {
|
|
61
|
-
let ancestor = el.getParentElement();
|
|
62
|
-
while (ancestor) {
|
|
63
|
-
const matches = target.match(ancestor);
|
|
64
|
-
if (matches.matched) {
|
|
65
|
-
return mergeMatches(matches, unitCheck, ' ');
|
|
66
|
-
}
|
|
67
|
-
ancestor = ancestor.getParentElement();
|
|
68
|
-
}
|
|
69
|
-
return {
|
|
70
|
-
matched: false,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
// Child combinator
|
|
74
|
-
case '>': {
|
|
75
|
-
const parentNode = el.getParentElement();
|
|
76
|
-
if (!parentNode) {
|
|
77
|
-
return { matched: false };
|
|
78
|
-
}
|
|
79
|
-
const matches = target.match(parentNode);
|
|
80
|
-
if (matches.matched) {
|
|
81
|
-
return mergeMatches(matches, unitCheck, ' > ');
|
|
82
|
-
}
|
|
83
|
-
return { matched: false };
|
|
84
|
-
}
|
|
85
|
-
// Next-sibling combinator
|
|
86
|
-
case '+': {
|
|
87
|
-
if (!el.previousElementSibling) {
|
|
88
|
-
return { matched: false };
|
|
89
|
-
}
|
|
90
|
-
const matches = target.match(el.previousElementSibling);
|
|
91
|
-
if (matches.matched) {
|
|
92
|
-
return mergeMatches(matches, unitCheck, ' + ');
|
|
93
|
-
}
|
|
94
|
-
return { matched: false };
|
|
95
|
-
}
|
|
96
|
-
// Subsequent-sibling combinator
|
|
97
|
-
case '~': {
|
|
98
|
-
let prev = el.previousElementSibling;
|
|
99
|
-
while (prev) {
|
|
100
|
-
const matches = target.match(prev);
|
|
101
|
-
if (matches.matched) {
|
|
102
|
-
return mergeMatches(matches, unitCheck, ' ~ ');
|
|
103
|
-
}
|
|
104
|
-
prev = prev.previousElementSibling;
|
|
105
|
-
}
|
|
106
|
-
return { matched: false };
|
|
107
|
-
}
|
|
108
|
-
// Prev-sibling combinator
|
|
109
|
-
case ':has(+)': {
|
|
110
|
-
if (!el.nextElementSibling) {
|
|
111
|
-
return { matched: false };
|
|
112
|
-
}
|
|
113
|
-
const matches = target.match(el.nextElementSibling);
|
|
114
|
-
if (matches.matched) {
|
|
115
|
-
return mergeMatches(matches, unitCheck, ':has(+ ', true);
|
|
116
|
-
}
|
|
117
|
-
return { matched: false };
|
|
118
|
-
}
|
|
119
|
-
// Subsequent-sibling (in front) combinator
|
|
120
|
-
case ':has(~)': {
|
|
121
|
-
let next = el.nextElementSibling;
|
|
122
|
-
while (next) {
|
|
123
|
-
const matches = target.match(next);
|
|
124
|
-
if (matches.matched) {
|
|
125
|
-
return mergeMatches(matches, unitCheck, ':has(~ ', true);
|
|
126
|
-
}
|
|
127
|
-
next = next.nextElementSibling;
|
|
128
|
-
}
|
|
129
|
-
return { matched: false };
|
|
130
|
-
}
|
|
131
|
-
default: {
|
|
132
|
-
throw new Error(`Unsupported ${this._combinatedFrom.combinator} combinator in selector`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
_matchWithoutCombinateChecking(el) {
|
|
137
|
-
return uncombinatedRegexSelect(el, this._selector);
|
|
138
|
-
}
|
|
139
|
-
from(target, combinator) {
|
|
140
|
-
this._combinatedFrom = { target, combinator };
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
function uncombinatedRegexSelect(el, selector) {
|
|
144
|
-
let matched = true;
|
|
145
|
-
let data = {};
|
|
146
|
-
let tagSelector = '';
|
|
147
|
-
const specificity = [0, 0, 0];
|
|
148
|
-
const specifiedAttr = new Map();
|
|
149
|
-
if (selector.nodeName) {
|
|
150
|
-
const matchedNodeName = (0, ml_config_1.regexSelectorMatches)(selector.nodeName, el.nodeName);
|
|
151
|
-
if (matchedNodeName) {
|
|
152
|
-
delete matchedNodeName.$0;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
matched = false;
|
|
156
|
-
}
|
|
157
|
-
data = {
|
|
158
|
-
...data,
|
|
159
|
-
...matchedNodeName,
|
|
160
|
-
};
|
|
161
|
-
tagSelector = el.nodeName;
|
|
162
|
-
specificity[2] = 1;
|
|
163
|
-
}
|
|
164
|
-
if (selector.attrName) {
|
|
165
|
-
const selectorAttrName = selector.attrName;
|
|
166
|
-
const matchedAttrNameList = el.attributes.map(attr => {
|
|
167
|
-
const attrName = attr.getName().potential;
|
|
168
|
-
const matchedAttrName = (0, ml_config_1.regexSelectorMatches)(selectorAttrName, attrName);
|
|
169
|
-
if (matchedAttrName) {
|
|
170
|
-
delete matchedAttrName.$0;
|
|
171
|
-
data = {
|
|
172
|
-
...data,
|
|
173
|
-
...matchedAttrName,
|
|
174
|
-
};
|
|
175
|
-
specifiedAttr.set(attrName, '');
|
|
176
|
-
}
|
|
177
|
-
return matchedAttrName;
|
|
178
|
-
});
|
|
179
|
-
if (!matchedAttrNameList.some(_ => !!_)) {
|
|
180
|
-
matched = false;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
if (selector.attrValue) {
|
|
184
|
-
const selectorAttrValue = selector.attrValue;
|
|
185
|
-
const matchedAttrValueList = el.attributes.map(attr => {
|
|
186
|
-
const attrName = attr.getName().potential;
|
|
187
|
-
const attrValue = attr.getValue().potential;
|
|
188
|
-
const matchedAttrValue = (0, ml_config_1.regexSelectorMatches)(selectorAttrValue, attrValue);
|
|
189
|
-
if (matchedAttrValue) {
|
|
190
|
-
delete matchedAttrValue.$0;
|
|
191
|
-
data = {
|
|
192
|
-
...data,
|
|
193
|
-
...matchedAttrValue,
|
|
194
|
-
};
|
|
195
|
-
specifiedAttr.set(attrName, attrValue);
|
|
196
|
-
}
|
|
197
|
-
return matchedAttrValue;
|
|
198
|
-
});
|
|
199
|
-
if (!matchedAttrValueList.some(_ => !!_)) {
|
|
200
|
-
matched = false;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
const attrSelector = Array.from(specifiedAttr.entries())
|
|
204
|
-
.map(([name, value]) => {
|
|
205
|
-
return `[${name}${value ? `="${value}"` : ''}]`;
|
|
206
|
-
})
|
|
207
|
-
.join('');
|
|
208
|
-
specificity[1] += specifiedAttr.size;
|
|
209
|
-
if (matched) {
|
|
210
|
-
return {
|
|
211
|
-
matched,
|
|
212
|
-
selector: `${tagSelector}${attrSelector}`,
|
|
213
|
-
specificity,
|
|
214
|
-
data,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
return { matched };
|
|
218
|
-
}
|
|
219
|
-
function mergeMatches(a, b, sep, close = false) {
|
|
220
|
-
return {
|
|
221
|
-
matched: true,
|
|
222
|
-
selector: `${a.selector}${sep}${b.selector}${close ? ')' : ''}`,
|
|
223
|
-
specificity: [
|
|
224
|
-
a.specificity[0] + b.specificity[0],
|
|
225
|
-
a.specificity[1] + b.specificity[1],
|
|
226
|
-
a.specificity[2] + b.specificity[2],
|
|
227
|
-
],
|
|
228
|
-
data: {
|
|
229
|
-
...a.data,
|
|
230
|
-
...b.data,
|
|
231
|
-
},
|
|
232
|
-
};
|
|
233
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type MLDOMNode from '../tokens/node';
|
|
2
|
-
import type { MappedNode } from './mapped-nodes';
|
|
3
|
-
import type { MLASTAbstructNode } from '@markuplint/ml-ast';
|
|
4
|
-
import type { RuleConfigValue } from '@markuplint/ml-config';
|
|
5
|
-
export default class NodeStore {
|
|
6
|
-
#private;
|
|
7
|
-
setNode<A extends MLASTAbstructNode, T extends RuleConfigValue, O = null>(
|
|
8
|
-
astNode: A,
|
|
9
|
-
node: MLDOMNode<T, O, A>,
|
|
10
|
-
): void;
|
|
11
|
-
getNode<N extends MLASTAbstructNode, T extends RuleConfigValue, O = null>(astNode: N): MappedNode<N, T, O>;
|
|
12
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _NodeStore_store;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const parser_utils_1 = require("@markuplint/parser-utils");
|
|
6
|
-
class NodeStore {
|
|
7
|
-
constructor() {
|
|
8
|
-
_NodeStore_store.set(this, new Map());
|
|
9
|
-
}
|
|
10
|
-
setNode(astNode, node) {
|
|
11
|
-
tslib_1.__classPrivateFieldGet(this, _NodeStore_store, "f").set(astNode.uuid, node);
|
|
12
|
-
}
|
|
13
|
-
getNode(astNode) {
|
|
14
|
-
// console.log(`Get: ${astNode.uuid} -> ${astNode.raw.trim()}(${astNode.type})`);
|
|
15
|
-
const node = tslib_1.__classPrivateFieldGet(this, _NodeStore_store, "f").get(astNode.uuid);
|
|
16
|
-
if (!node) {
|
|
17
|
-
throw new parser_utils_1.ParserError('Broke mapping nodes.', {
|
|
18
|
-
line: astNode.startLine,
|
|
19
|
-
col: astNode.startCol,
|
|
20
|
-
raw: astNode.raw,
|
|
21
|
-
nodeName: astNode.nodeName,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
return node;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
exports.default = NodeStore;
|
|
28
|
-
_NodeStore_store = new WeakMap();
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type MLDOMAbstractElement from '../tokens/abstract-element';
|
|
2
|
-
export declare type Specificity = [number, number, number];
|
|
3
|
-
export declare function createSelector(selector: string, tagNameCaseSensitive?: boolean): Selector;
|
|
4
|
-
export declare function compareSpecificity(a: Specificity, b: Specificity): 0 | 1 | -1;
|
|
5
|
-
declare type TargetElement = MLDOMAbstractElement<any, any>;
|
|
6
|
-
declare class Selector {
|
|
7
|
-
#private;
|
|
8
|
-
constructor(selector: string, tagNameCaseSensitive: boolean);
|
|
9
|
-
match(el: TargetElement, caller?: TargetElement | null): Specificity | false;
|
|
10
|
-
}
|
|
11
|
-
export {};
|