@markuplint/ml-core 3.0.0-alpha.66 → 3.0.0-dev.176
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/README.md +12 -3
- package/lib/configs.browser.d.ts +2 -0
- package/lib/configs.browser.js +12 -0
- package/lib/configs.js +4 -1
- package/lib/index.d.ts +11 -1
- package/lib/ml-core.d.ts +24 -13
- package/lib/ml-core.js +16 -10
- package/lib/ml-dom/helper/accname.d.ts +2 -1
- package/lib/ml-dom/helper/accname.js +62 -2
- package/lib/ml-dom/helper/create-node.d.ts +7 -3
- package/lib/ml-dom/helper/create-node.js +4 -2
- package/lib/ml-dom/helper/debug.js +10 -5
- package/lib/ml-dom/helper/getIndent.d.ts +7 -7
- package/lib/ml-dom/helper/getIndent.js +18 -12
- package/lib/ml-dom/helper/walkers.d.ts +15 -5
- package/lib/ml-dom/helper/walkers.js +22 -16
- package/lib/ml-dom/index.d.ts +1 -0
- package/lib/ml-dom/manipulations/child-node-methods.d.ts +20 -7
- package/lib/ml-dom/manipulations/child-node-methods.js +24 -6
- package/lib/ml-dom/manipulations/get-children.d.ts +4 -2
- package/lib/ml-dom/manipulations/get-children.js +3 -1
- package/lib/ml-dom/node/attr.d.ts +94 -91
- package/lib/ml-dom/node/attr.js +26 -16
- package/lib/ml-dom/node/block.d.ts +36 -32
- package/lib/ml-dom/node/block.js +14 -4
- package/lib/ml-dom/node/character-data.d.ts +61 -54
- package/lib/ml-dom/node/character-data.js +9 -3
- package/lib/ml-dom/node/child-node.d.ts +10 -3
- package/lib/ml-dom/node/child-node.js +3 -1
- package/lib/ml-dom/node/comment.d.ts +16 -13
- package/lib/ml-dom/node/document-fragment.d.ts +24 -21
- package/lib/ml-dom/node/document-type.d.ts +35 -32
- package/lib/ml-dom/node/document-type.js +14 -4
- package/lib/ml-dom/node/document.d.ts +1608 -1545
- package/lib/ml-dom/node/document.js +125 -33
- package/lib/ml-dom/node/dom-token-list.d.ts +27 -27
- package/lib/ml-dom/node/dom-token-list.js +15 -13
- package/lib/ml-dom/node/element.d.ts +1906 -1817
- package/lib/ml-dom/node/element.js +345 -75
- package/lib/ml-dom/node/named-node-map.d.ts +45 -40
- package/lib/ml-dom/node/named-node-map.js +13 -5
- package/lib/ml-dom/node/node-list.d.ts +10 -4
- package/lib/ml-dom/node/node-list.js +25 -5
- package/lib/ml-dom/node/node-store.d.ts +10 -5
- package/lib/ml-dom/node/node-store.js +19 -1
- package/lib/ml-dom/node/node.d.ts +494 -467
- package/lib/ml-dom/node/node.js +89 -47
- package/lib/ml-dom/node/parent-node.d.ts +68 -59
- package/lib/ml-dom/node/parent-node.js +15 -6
- package/lib/ml-dom/node/rule-mapper.d.ts +9 -9
- package/lib/ml-dom/node/rule-mapper.js +11 -3
- package/lib/ml-dom/node/text.d.ts +50 -47
- package/lib/ml-dom/node/types.d.ts +94 -16
- package/lib/ml-dom/node/unexpected-call-error.d.ts +1 -2
- package/lib/ml-dom/token/token.d.ts +44 -44
- package/lib/ml-rule/create-rule.d.ts +4 -2
- package/lib/ml-rule/create-test-rule.d.ts +6 -4
- package/lib/ml-rule/ml-rule-context.d.ts +58 -49
- package/lib/ml-rule/ml-rule-context.js +23 -4
- package/lib/ml-rule/ml-rule.d.ts +36 -26
- package/lib/ml-rule/ml-rule.js +39 -34
- package/lib/ml-rule/types.d.ts +35 -17
- package/lib/plugin/plugin.d.ts +3 -1
- package/lib/plugin/types.d.ts +9 -9
- package/lib/ruleset/index.d.ts +4 -4
- package/lib/ruleset/index.js +4 -4
- package/lib/test/index.d.ts +21 -8
- package/lib/test/index.js +6 -4
- package/lib/types.d.ts +12 -10
- package/lib/utils/get-location-from-chars.d.ts +9 -4
- package/package.json +21 -15
- package/test/ml-dom/helper/accname.spec.js +85 -0
- package/test/ml-dom/helper/create-node.spec.js +18 -0
- package/test/ml-dom/index.spec.js +680 -0
- 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/tsconfig.test.json +0 -3
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -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 {};
|
|
@@ -1,549 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _Selector_ruleset, _Ruleset_selectorGroup, _StructuredSelector_edge, _StructuredSelector_selector, _SelectorTarget_tagNameCaseSensitive, _SelectorTarget_isAdded, _SelectorTarget_combinatedFrom;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.compareSpecificity = exports.createSelector = void 0;
|
|
5
|
-
const tslib_1 = require("tslib");
|
|
6
|
-
const postcss_selector_parser_1 = tslib_1.__importDefault(require("postcss-selector-parser"));
|
|
7
|
-
const debug_1 = require("../../debug");
|
|
8
|
-
const log = debug_1.log.extend('selector');
|
|
9
|
-
const resLog = log.extend('result');
|
|
10
|
-
function createSelector(selector, tagNameCaseSensitive) {
|
|
11
|
-
return new Selector(selector, !!tagNameCaseSensitive);
|
|
12
|
-
}
|
|
13
|
-
exports.createSelector = createSelector;
|
|
14
|
-
function compareSpecificity(a, b) {
|
|
15
|
-
if (a[0] < b[0]) {
|
|
16
|
-
return -1;
|
|
17
|
-
}
|
|
18
|
-
else if (a[0] > b[0]) {
|
|
19
|
-
return 1;
|
|
20
|
-
}
|
|
21
|
-
else if (a[1] < b[1]) {
|
|
22
|
-
return -1;
|
|
23
|
-
}
|
|
24
|
-
else if (a[1] > b[1]) {
|
|
25
|
-
return 1;
|
|
26
|
-
}
|
|
27
|
-
else if (a[2] < b[2]) {
|
|
28
|
-
return -1;
|
|
29
|
-
}
|
|
30
|
-
else if (a[2] > b[2]) {
|
|
31
|
-
return 1;
|
|
32
|
-
}
|
|
33
|
-
return 0;
|
|
34
|
-
}
|
|
35
|
-
exports.compareSpecificity = compareSpecificity;
|
|
36
|
-
class Selector {
|
|
37
|
-
constructor(selector, tagNameCaseSensitive) {
|
|
38
|
-
_Selector_ruleset.set(this, void 0);
|
|
39
|
-
tslib_1.__classPrivateFieldSet(this, _Selector_ruleset, Ruleset.parse(selector, tagNameCaseSensitive), "f");
|
|
40
|
-
}
|
|
41
|
-
match(el, caller = el) {
|
|
42
|
-
const results = tslib_1.__classPrivateFieldGet(this, _Selector_ruleset, "f").match(el, caller);
|
|
43
|
-
for (const result of results) {
|
|
44
|
-
if (result.matched) {
|
|
45
|
-
return result.specificity;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
_Selector_ruleset = new WeakMap();
|
|
52
|
-
class Ruleset {
|
|
53
|
-
constructor(selectors, tagNameCaseSensitive) {
|
|
54
|
-
_Ruleset_selectorGroup.set(this, []);
|
|
55
|
-
tslib_1.__classPrivateFieldGet(this, _Ruleset_selectorGroup, "f").push(...selectors.map(selector => new StructuredSelector(selector, tagNameCaseSensitive)));
|
|
56
|
-
}
|
|
57
|
-
static parse(selector, tagNameCaseSensitive) {
|
|
58
|
-
const selectors = [];
|
|
59
|
-
(0, postcss_selector_parser_1.default)(root => {
|
|
60
|
-
selectors.push(...root.nodes);
|
|
61
|
-
}).processSync(selector);
|
|
62
|
-
return new Ruleset(selectors, tagNameCaseSensitive);
|
|
63
|
-
}
|
|
64
|
-
match(el, caller) {
|
|
65
|
-
log('%s', el.raw);
|
|
66
|
-
return tslib_1.__classPrivateFieldGet(this, _Ruleset_selectorGroup, "f").map(selector => {
|
|
67
|
-
const res = selector.match(el, caller);
|
|
68
|
-
resLog('%s => %o', selector.selector, res);
|
|
69
|
-
return res;
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
_Ruleset_selectorGroup = new WeakMap();
|
|
74
|
-
class StructuredSelector {
|
|
75
|
-
constructor(selector, tagNameCaseSensitive) {
|
|
76
|
-
_StructuredSelector_edge.set(this, void 0);
|
|
77
|
-
_StructuredSelector_selector.set(this, void 0);
|
|
78
|
-
tslib_1.__classPrivateFieldSet(this, _StructuredSelector_selector, selector, "f");
|
|
79
|
-
tslib_1.__classPrivateFieldSet(this, _StructuredSelector_edge, new SelectorTarget(tagNameCaseSensitive), "f");
|
|
80
|
-
tslib_1.__classPrivateFieldGet(this, _StructuredSelector_selector, "f").nodes.forEach(node => {
|
|
81
|
-
switch (node.type) {
|
|
82
|
-
case 'combinator': {
|
|
83
|
-
const combinatedTarget = new SelectorTarget(tagNameCaseSensitive);
|
|
84
|
-
combinatedTarget.from(tslib_1.__classPrivateFieldGet(this, _StructuredSelector_edge, "f"), node);
|
|
85
|
-
tslib_1.__classPrivateFieldSet(this, _StructuredSelector_edge, combinatedTarget, "f");
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
case 'root':
|
|
89
|
-
case 'string': {
|
|
90
|
-
throw new Error(`Unsupported selector: ${selector.toString()}`);
|
|
91
|
-
}
|
|
92
|
-
case 'nesting': {
|
|
93
|
-
throw new Error(`Unsupported nested selector: ${selector.toString()}`);
|
|
94
|
-
}
|
|
95
|
-
case 'comment': {
|
|
96
|
-
throw new Error(`Unsupported comment in selector: ${selector.toString()}`);
|
|
97
|
-
}
|
|
98
|
-
default: {
|
|
99
|
-
tslib_1.__classPrivateFieldGet(this, _StructuredSelector_edge, "f").add(node);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
get selector() {
|
|
105
|
-
return tslib_1.__classPrivateFieldGet(this, _StructuredSelector_selector, "f").nodes.join('');
|
|
106
|
-
}
|
|
107
|
-
match(el, caller) {
|
|
108
|
-
return tslib_1.__classPrivateFieldGet(this, _StructuredSelector_edge, "f").match(el, caller);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
_StructuredSelector_edge = new WeakMap(), _StructuredSelector_selector = new WeakMap();
|
|
112
|
-
class SelectorTarget {
|
|
113
|
-
constructor(tagNameCaseSensitive) {
|
|
114
|
-
this.tag = null;
|
|
115
|
-
this.id = [];
|
|
116
|
-
this.class = [];
|
|
117
|
-
this.attr = [];
|
|
118
|
-
this.pseudo = [];
|
|
119
|
-
_SelectorTarget_tagNameCaseSensitive.set(this, void 0);
|
|
120
|
-
_SelectorTarget_isAdded.set(this, false);
|
|
121
|
-
_SelectorTarget_combinatedFrom.set(this, null);
|
|
122
|
-
tslib_1.__classPrivateFieldSet(this, _SelectorTarget_tagNameCaseSensitive, tagNameCaseSensitive, "f");
|
|
123
|
-
}
|
|
124
|
-
match(el, caller) {
|
|
125
|
-
const unitCheck = this._matchWithoutCombinateChecking(el, caller);
|
|
126
|
-
if (!unitCheck.matched) {
|
|
127
|
-
return unitCheck;
|
|
128
|
-
}
|
|
129
|
-
if (!tslib_1.__classPrivateFieldGet(this, _SelectorTarget_combinatedFrom, "f")) {
|
|
130
|
-
return unitCheck;
|
|
131
|
-
}
|
|
132
|
-
const { target, combinator } = tslib_1.__classPrivateFieldGet(this, _SelectorTarget_combinatedFrom, "f");
|
|
133
|
-
switch (combinator.value) {
|
|
134
|
-
// Descendant combinator
|
|
135
|
-
case ' ': {
|
|
136
|
-
let ancestor = el.getParentElement();
|
|
137
|
-
let matched = false;
|
|
138
|
-
let specificity;
|
|
139
|
-
while (ancestor) {
|
|
140
|
-
const res = target.match(ancestor, caller);
|
|
141
|
-
if (!specificity) {
|
|
142
|
-
specificity = [
|
|
143
|
-
unitCheck.specificity[0] + res.specificity[0],
|
|
144
|
-
unitCheck.specificity[1] + res.specificity[1],
|
|
145
|
-
unitCheck.specificity[2] + res.specificity[2],
|
|
146
|
-
];
|
|
147
|
-
}
|
|
148
|
-
if (res.matched) {
|
|
149
|
-
matched = true;
|
|
150
|
-
}
|
|
151
|
-
ancestor = ancestor.getParentElement();
|
|
152
|
-
}
|
|
153
|
-
if (!specificity) {
|
|
154
|
-
const res = target.match(el, caller);
|
|
155
|
-
specificity = [
|
|
156
|
-
unitCheck.specificity[0] + res.specificity[0],
|
|
157
|
-
unitCheck.specificity[1] + res.specificity[1],
|
|
158
|
-
unitCheck.specificity[2] + res.specificity[2],
|
|
159
|
-
];
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
specificity,
|
|
163
|
-
matched,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
// Child combinator
|
|
167
|
-
case '>': {
|
|
168
|
-
let matched;
|
|
169
|
-
const specificity = unitCheck.specificity;
|
|
170
|
-
const parentNode = el.getParentElement();
|
|
171
|
-
if (parentNode) {
|
|
172
|
-
const res = target.match(parentNode, caller);
|
|
173
|
-
specificity[0] += res.specificity[0];
|
|
174
|
-
specificity[1] += res.specificity[1];
|
|
175
|
-
specificity[2] += res.specificity[2];
|
|
176
|
-
matched = res.matched;
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
const res = target.match(el, caller);
|
|
180
|
-
specificity[0] += res.specificity[0];
|
|
181
|
-
specificity[1] += res.specificity[1];
|
|
182
|
-
specificity[2] += res.specificity[2];
|
|
183
|
-
matched = false;
|
|
184
|
-
}
|
|
185
|
-
return {
|
|
186
|
-
specificity,
|
|
187
|
-
matched,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
// Next-sibling combinator
|
|
191
|
-
case '+': {
|
|
192
|
-
let matched;
|
|
193
|
-
const specificity = unitCheck.specificity;
|
|
194
|
-
if (el.previousElementSibling) {
|
|
195
|
-
const res = target.match(el.previousElementSibling, caller);
|
|
196
|
-
specificity[0] += res.specificity[0];
|
|
197
|
-
specificity[1] += res.specificity[1];
|
|
198
|
-
specificity[2] += res.specificity[2];
|
|
199
|
-
matched = res.matched;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
const res = target.match(el, caller);
|
|
203
|
-
specificity[0] += res.specificity[0];
|
|
204
|
-
specificity[1] += res.specificity[1];
|
|
205
|
-
specificity[2] += res.specificity[2];
|
|
206
|
-
matched = false;
|
|
207
|
-
}
|
|
208
|
-
return {
|
|
209
|
-
specificity,
|
|
210
|
-
matched,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
// // Subsequent-sibling combinator
|
|
214
|
-
case '~': {
|
|
215
|
-
let prev = el.previousElementSibling;
|
|
216
|
-
let matched = false;
|
|
217
|
-
let specificity;
|
|
218
|
-
while (prev) {
|
|
219
|
-
const res = target.match(prev, caller);
|
|
220
|
-
if (!specificity) {
|
|
221
|
-
specificity = [
|
|
222
|
-
unitCheck.specificity[0] + res.specificity[0],
|
|
223
|
-
unitCheck.specificity[1] + res.specificity[1],
|
|
224
|
-
unitCheck.specificity[2] + res.specificity[2],
|
|
225
|
-
];
|
|
226
|
-
}
|
|
227
|
-
if (res.matched) {
|
|
228
|
-
matched = true;
|
|
229
|
-
}
|
|
230
|
-
prev = prev.previousElementSibling;
|
|
231
|
-
}
|
|
232
|
-
if (!specificity) {
|
|
233
|
-
const res = target.match(el, caller);
|
|
234
|
-
specificity = [
|
|
235
|
-
unitCheck.specificity[0] + res.specificity[0],
|
|
236
|
-
unitCheck.specificity[1] + res.specificity[1],
|
|
237
|
-
unitCheck.specificity[2] + res.specificity[2],
|
|
238
|
-
];
|
|
239
|
-
}
|
|
240
|
-
return {
|
|
241
|
-
specificity,
|
|
242
|
-
matched,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
// Column combinator
|
|
246
|
-
case '||': {
|
|
247
|
-
throw new Error('Unsupported column combinator yet. If you want it, please request it as the issue (https://github.com/markuplint/markuplint/issues/new).');
|
|
248
|
-
}
|
|
249
|
-
default: {
|
|
250
|
-
throw new Error(`Unsupported ${tslib_1.__classPrivateFieldGet(this, _SelectorTarget_combinatedFrom, "f").combinator.value} combinator in selector`);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
_matchWithoutCombinateChecking(el, caller) {
|
|
255
|
-
const specificity = [0, 0, 0];
|
|
256
|
-
let matched = true;
|
|
257
|
-
if (!tslib_1.__classPrivateFieldGet(this, _SelectorTarget_isAdded, "f") && !isScope(el, caller)) {
|
|
258
|
-
matched = false;
|
|
259
|
-
}
|
|
260
|
-
if (!this.id.every(id => id.value === el.id)) {
|
|
261
|
-
matched = false;
|
|
262
|
-
}
|
|
263
|
-
specificity[0] += this.id.length;
|
|
264
|
-
if (!this.class.every(className => el.classList.includes(className.value))) {
|
|
265
|
-
matched = false;
|
|
266
|
-
}
|
|
267
|
-
specificity[1] += this.class.length;
|
|
268
|
-
if (!this.attr.every(attr => attrMatch(attr, el))) {
|
|
269
|
-
matched = false;
|
|
270
|
-
}
|
|
271
|
-
specificity[1] += this.attr.length;
|
|
272
|
-
for (const pseudo of this.pseudo) {
|
|
273
|
-
const pseudoRes = pseudoMatch(pseudo, el, caller, tslib_1.__classPrivateFieldGet(this, _SelectorTarget_tagNameCaseSensitive, "f"));
|
|
274
|
-
specificity[0] += pseudoRes.specificity[0];
|
|
275
|
-
specificity[1] += pseudoRes.specificity[1];
|
|
276
|
-
specificity[2] += pseudoRes.specificity[2];
|
|
277
|
-
if (!pseudoRes.matched) {
|
|
278
|
-
matched = false;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
if (this.tag && this.tag.type === 'tag') {
|
|
282
|
-
specificity[2] += 1;
|
|
283
|
-
let a = this.tag.value;
|
|
284
|
-
let b = el.nodeName;
|
|
285
|
-
if (!tslib_1.__classPrivateFieldGet(this, _SelectorTarget_tagNameCaseSensitive, "f")) {
|
|
286
|
-
a = a.toLowerCase();
|
|
287
|
-
b = b.toLowerCase();
|
|
288
|
-
}
|
|
289
|
-
if (a !== b) {
|
|
290
|
-
matched = false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return {
|
|
294
|
-
specificity,
|
|
295
|
-
matched,
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
add(selector) {
|
|
299
|
-
tslib_1.__classPrivateFieldSet(this, _SelectorTarget_isAdded, true, "f");
|
|
300
|
-
switch (selector.type) {
|
|
301
|
-
case 'tag':
|
|
302
|
-
case 'universal': {
|
|
303
|
-
this.tag = selector;
|
|
304
|
-
break;
|
|
305
|
-
}
|
|
306
|
-
case 'id': {
|
|
307
|
-
this.id.push(selector);
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
case 'class': {
|
|
311
|
-
this.class.push(selector);
|
|
312
|
-
break;
|
|
313
|
-
}
|
|
314
|
-
case 'attribute': {
|
|
315
|
-
this.attr.push(selector);
|
|
316
|
-
break;
|
|
317
|
-
}
|
|
318
|
-
case 'pseudo': {
|
|
319
|
-
this.pseudo.push(selector);
|
|
320
|
-
break;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
from(target, combinator) {
|
|
325
|
-
tslib_1.__classPrivateFieldSet(this, _SelectorTarget_combinatedFrom, { target, combinator }, "f");
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
_SelectorTarget_tagNameCaseSensitive = new WeakMap(), _SelectorTarget_isAdded = new WeakMap(), _SelectorTarget_combinatedFrom = new WeakMap();
|
|
329
|
-
function attrMatch(attr, el) {
|
|
330
|
-
return el.attributes.some(attrOfEl => {
|
|
331
|
-
if (attr.attribute !== attrOfEl.getName().potential) {
|
|
332
|
-
return false;
|
|
333
|
-
}
|
|
334
|
-
if (attr.value != null) {
|
|
335
|
-
let value = attr.value;
|
|
336
|
-
let valueOfEl = attrOfEl.getValue().potential;
|
|
337
|
-
if (attr.insensitive) {
|
|
338
|
-
value = value.toLowerCase();
|
|
339
|
-
valueOfEl = valueOfEl.toLowerCase();
|
|
340
|
-
}
|
|
341
|
-
switch (attr.operator) {
|
|
342
|
-
case '=': {
|
|
343
|
-
if (value !== valueOfEl) {
|
|
344
|
-
return false;
|
|
345
|
-
}
|
|
346
|
-
break;
|
|
347
|
-
}
|
|
348
|
-
case '~=': {
|
|
349
|
-
if (!valueOfEl.split(/\s+/).includes(value)) {
|
|
350
|
-
return false;
|
|
351
|
-
}
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
case '|=': {
|
|
355
|
-
if (!new RegExp(`^${value}(?:$|-)`).test(valueOfEl)) {
|
|
356
|
-
return false;
|
|
357
|
-
}
|
|
358
|
-
break;
|
|
359
|
-
}
|
|
360
|
-
case '*=': {
|
|
361
|
-
if (valueOfEl.indexOf(value) === -1) {
|
|
362
|
-
return false;
|
|
363
|
-
}
|
|
364
|
-
break;
|
|
365
|
-
}
|
|
366
|
-
case '^=': {
|
|
367
|
-
if (valueOfEl.indexOf(value) !== 0) {
|
|
368
|
-
return false;
|
|
369
|
-
}
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
case '$=': {
|
|
373
|
-
if (valueOfEl.lastIndexOf(value) !== valueOfEl.length - value.length) {
|
|
374
|
-
return false;
|
|
375
|
-
}
|
|
376
|
-
break;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
return true;
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
function pseudoMatch(pseudo, el, caller, tagNameCaseSensitive) {
|
|
384
|
-
switch (pseudo.value) {
|
|
385
|
-
/**
|
|
386
|
-
* Below, markuplint Specific Selector
|
|
387
|
-
*/
|
|
388
|
-
case ':closest': {
|
|
389
|
-
const ruleset = new Ruleset(pseudo.nodes, tagNameCaseSensitive);
|
|
390
|
-
const specificity = getSpecificity(ruleset.match(el, caller));
|
|
391
|
-
let parent = el.getParentElement();
|
|
392
|
-
while (parent) {
|
|
393
|
-
if (ruleset.match(parent, caller).some(r => r.matched)) {
|
|
394
|
-
return {
|
|
395
|
-
specificity,
|
|
396
|
-
matched: true,
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
parent = parent.getParentElement();
|
|
400
|
-
}
|
|
401
|
-
return {
|
|
402
|
-
specificity,
|
|
403
|
-
matched: false,
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Below, Selector Level 4
|
|
408
|
-
*/
|
|
409
|
-
case ':not': {
|
|
410
|
-
const ruleset = new Ruleset(pseudo.nodes, tagNameCaseSensitive);
|
|
411
|
-
const resList = ruleset.match(el, caller);
|
|
412
|
-
const specificity = getSpecificity(resList);
|
|
413
|
-
const matched = resList.every(r => !r.matched);
|
|
414
|
-
return {
|
|
415
|
-
specificity,
|
|
416
|
-
matched,
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
case ':is': {
|
|
420
|
-
const ruleset = new Ruleset(pseudo.nodes, tagNameCaseSensitive);
|
|
421
|
-
const resList = ruleset.match(el, caller);
|
|
422
|
-
const specificity = getSpecificity(resList);
|
|
423
|
-
const matched = resList.some(r => r.matched);
|
|
424
|
-
return {
|
|
425
|
-
specificity,
|
|
426
|
-
matched,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
case ':has': {
|
|
430
|
-
const ruleset = new Ruleset(pseudo.nodes, tagNameCaseSensitive);
|
|
431
|
-
const specificity = getSpecificity(ruleset.match(el, caller));
|
|
432
|
-
const descendants = getDescendants(el);
|
|
433
|
-
const matched = descendants.some(desc => ruleset.match(desc, caller).some(m => m.matched));
|
|
434
|
-
return {
|
|
435
|
-
specificity,
|
|
436
|
-
matched,
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
|
-
case ':where': {
|
|
440
|
-
const ruleset = new Ruleset(pseudo.nodes, tagNameCaseSensitive);
|
|
441
|
-
const resList = ruleset.match(el, caller);
|
|
442
|
-
const matched = resList.some(r => r.matched);
|
|
443
|
-
return {
|
|
444
|
-
specificity: [0, 0, 0],
|
|
445
|
-
matched,
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
case ':scope': {
|
|
449
|
-
if (!isScope(el, caller)) {
|
|
450
|
-
return {
|
|
451
|
-
specificity: [0, 1, 0],
|
|
452
|
-
matched: false,
|
|
453
|
-
};
|
|
454
|
-
}
|
|
455
|
-
return {
|
|
456
|
-
specificity: [0, 1, 0],
|
|
457
|
-
matched: true,
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
case ':root': {
|
|
461
|
-
if (!(!el.isInFragmentDocument && el.parentNode === null)) {
|
|
462
|
-
return {
|
|
463
|
-
specificity: [0, 1, 0],
|
|
464
|
-
matched: false,
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
return {
|
|
468
|
-
specificity: [0, 1, 0],
|
|
469
|
-
matched: true,
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
case ':enable':
|
|
473
|
-
case ':disable':
|
|
474
|
-
case ':read-write':
|
|
475
|
-
case ':read-only':
|
|
476
|
-
case ':placeholder-shown':
|
|
477
|
-
case ':default':
|
|
478
|
-
case ':checked':
|
|
479
|
-
case ':indeterminate':
|
|
480
|
-
case ':valid':
|
|
481
|
-
case ':invalid':
|
|
482
|
-
case ':in-range':
|
|
483
|
-
case ':out-of-range':
|
|
484
|
-
case ':required':
|
|
485
|
-
case ':optional':
|
|
486
|
-
case ':blank':
|
|
487
|
-
case ':user-invalid':
|
|
488
|
-
case ':empty':
|
|
489
|
-
case ':nth-child':
|
|
490
|
-
case ':nth-last-child':
|
|
491
|
-
case ':first-child':
|
|
492
|
-
case ':last-child':
|
|
493
|
-
case ':only-child':
|
|
494
|
-
case ':nth-of-type':
|
|
495
|
-
case ':nth-last-of-type':
|
|
496
|
-
case ':first-of-type':
|
|
497
|
-
case ':last-of-type':
|
|
498
|
-
case ':only-of-type':
|
|
499
|
-
case ':nth-last-col':
|
|
500
|
-
case ':nth-col': {
|
|
501
|
-
throw new Error(`Unsupported pseudo ${pseudo.toString()} selector yet. If you want it, please request it as the issue (https://github.com/markuplint/markuplint/issues/new).`);
|
|
502
|
-
}
|
|
503
|
-
case ':dir':
|
|
504
|
-
case ':lang':
|
|
505
|
-
case ':any-link':
|
|
506
|
-
case ':link':
|
|
507
|
-
case ':visited':
|
|
508
|
-
case ':local-link':
|
|
509
|
-
case ':target':
|
|
510
|
-
case ':target-within':
|
|
511
|
-
case ':current':
|
|
512
|
-
case ':past':
|
|
513
|
-
case ':future':
|
|
514
|
-
case ':active':
|
|
515
|
-
case ':hover':
|
|
516
|
-
case ':focus':
|
|
517
|
-
case ':focus-within':
|
|
518
|
-
case ':focus-visible':
|
|
519
|
-
case '::before':
|
|
520
|
-
case '::after':
|
|
521
|
-
default: {
|
|
522
|
-
throw new Error(`Unsupported pseudo ${pseudo.toString()} selector.`);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
function isScope(el, caller) {
|
|
527
|
-
return el.uuid === (caller === null || caller === void 0 ? void 0 : caller.uuid) || (!el.isInFragmentDocument && el.parentNode === null);
|
|
528
|
-
}
|
|
529
|
-
function getDescendants(el, includeSelf = false) {
|
|
530
|
-
return [...el.children.map(child => getDescendants(child, true)).flat(), ...(includeSelf ? [el] : [])];
|
|
531
|
-
}
|
|
532
|
-
function getSpecificity(result) {
|
|
533
|
-
let specificity;
|
|
534
|
-
for (const res of result) {
|
|
535
|
-
if (specificity) {
|
|
536
|
-
const order = compareSpecificity(specificity, res.specificity);
|
|
537
|
-
if (order === -1) {
|
|
538
|
-
specificity = res.specificity;
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
specificity = res.specificity;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
if (!specificity) {
|
|
546
|
-
throw new Error('Result is empty');
|
|
547
|
-
}
|
|
548
|
-
return specificity;
|
|
549
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Specificity } from './helper/selector';
|
|
2
|
-
import type { AnonymousNode } from './types';
|
|
3
|
-
import type { AnyRule } from '@markuplint/ml-config';
|
|
4
|
-
declare type RuleType = 'rules' | 'nodeRules' | 'childNodeRules';
|
|
5
|
-
declare type MappingLayer = {
|
|
6
|
-
from: RuleType;
|
|
7
|
-
specificity: Specificity;
|
|
8
|
-
rule: AnyRule;
|
|
9
|
-
};
|
|
10
|
-
export declare class RuleMapper<N extends AnonymousNode<any, any> = AnonymousNode<any, any>> {
|
|
11
|
-
#private;
|
|
12
|
-
constructor(nodeList: ReadonlyArray<N>);
|
|
13
|
-
set(node: N, ruleName: string, rule: MappingLayer): void;
|
|
14
|
-
apply(): void;
|
|
15
|
-
}
|
|
16
|
-
export {};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _RuleMapper_nodeList, _RuleMapper_ruleMap;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.RuleMapper = void 0;
|
|
5
|
-
const tslib_1 = require("tslib");
|
|
6
|
-
const debug_1 = require("../debug");
|
|
7
|
-
const selector_1 = require("./helper/selector");
|
|
8
|
-
const ruleMapperLog = debug_1.log.extend('rule-mapper');
|
|
9
|
-
const ruleMapperNodeLog = ruleMapperLog.extend('node');
|
|
10
|
-
const ruleMapperNodeRuleLog = ruleMapperNodeLog.extend('rule');
|
|
11
|
-
class RuleMapper {
|
|
12
|
-
constructor(nodeList) {
|
|
13
|
-
_RuleMapper_nodeList.set(this, void 0);
|
|
14
|
-
_RuleMapper_ruleMap.set(this, new Map());
|
|
15
|
-
tslib_1.__classPrivateFieldSet(this, _RuleMapper_nodeList, nodeList, "f");
|
|
16
|
-
}
|
|
17
|
-
set(node, ruleName, rule) {
|
|
18
|
-
if (node.type === 'ElementCloseTag') {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
const rules = tslib_1.__classPrivateFieldGet(this, _RuleMapper_ruleMap, "f").get(node.uuid) || {};
|
|
22
|
-
const currentRule = rules[ruleName];
|
|
23
|
-
if (currentRule) {
|
|
24
|
-
const order = (0, selector_1.compareSpecificity)(currentRule.specificity, rule.specificity);
|
|
25
|
-
if (order === 1) {
|
|
26
|
-
ruleMapperLog("Don't set %o ([%s] vs [%s])", rule, currentRule.specificity, rule.specificity);
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
ruleMapperLog('Unset %o from %s', currentRule, node);
|
|
30
|
-
}
|
|
31
|
-
rules[ruleName] = rule;
|
|
32
|
-
tslib_1.__classPrivateFieldGet(this, _RuleMapper_ruleMap, "f").set(node.uuid, rules);
|
|
33
|
-
if (node.type === 'Element' && node.closeTag) {
|
|
34
|
-
tslib_1.__classPrivateFieldGet(this, _RuleMapper_ruleMap, "f").set(node.closeTag.uuid, rules);
|
|
35
|
-
}
|
|
36
|
-
ruleMapperLog('Set to %s from %s (%o): %O', node.raw, rule.from, rule.specificity, rule.rule);
|
|
37
|
-
}
|
|
38
|
-
apply() {
|
|
39
|
-
ruleMapperLog('ruleTree:');
|
|
40
|
-
tslib_1.__classPrivateFieldGet(this, _RuleMapper_nodeList, "f").forEach(node => {
|
|
41
|
-
const rules = tslib_1.__classPrivateFieldGet(this, _RuleMapper_ruleMap, "f").get(node.uuid);
|
|
42
|
-
if (!rules) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const slash = node.type === 'ElementCloseTag' ? '/' : '';
|
|
46
|
-
const nodeName = 'nodeName' in node ? node.nodeName : `#${node.type}`;
|
|
47
|
-
ruleMapperNodeLog('<%s%s>', slash, nodeName);
|
|
48
|
-
Object.keys(rules).forEach(ruleName => {
|
|
49
|
-
const rule = rules[ruleName];
|
|
50
|
-
node.rules[ruleName] = rule.rule;
|
|
51
|
-
ruleMapperNodeRuleLog('[from: %s(%s)] %s: %o', rule.from, rule.specificity, ruleName, rule.rule);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.RuleMapper = RuleMapper;
|
|
57
|
-
_RuleMapper_nodeList = new WeakMap(), _RuleMapper_ruleMap = new WeakMap();
|