html-validate 7.7.0 → 7.8.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/README.md +16 -16
- package/dist/cjs/browser.d.ts +4 -2
- package/dist/cjs/browser.js +11 -7
- package/dist/cjs/browser.js.map +1 -1
- package/dist/cjs/cli.js +2 -0
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/core.d.ts +26 -67
- package/dist/cjs/core.js +189 -2388
- package/dist/cjs/core.js.map +1 -1
- package/dist/cjs/elements.js +3704 -0
- package/dist/cjs/elements.js.map +1 -0
- package/dist/cjs/html-validate.js +3 -0
- package/dist/cjs/html-validate.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -3
- package/dist/cjs/index.js +11 -7
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/jest-lib.js +1 -0
- package/dist/cjs/jest-lib.js.map +1 -1
- package/dist/cjs/jest.d.ts +1 -1
- package/dist/cjs/jest.js +3 -0
- package/dist/cjs/jest.js.map +1 -1
- package/dist/cjs/meta-helper.d.ts +27 -0
- package/dist/cjs/meta-helper.js +64 -0
- package/dist/cjs/meta-helper.js.map +1 -0
- package/dist/cjs/rules-helper.d.ts +45 -0
- package/dist/cjs/rules-helper.js +408 -0
- package/dist/cjs/rules-helper.js.map +1 -0
- package/dist/cjs/test-utils.d.ts +1 -1
- package/dist/es/browser.d.ts +4 -2
- package/dist/es/browser.js +4 -2
- package/dist/es/browser.js.map +1 -1
- package/dist/es/cli.js +3 -1
- package/dist/es/cli.js.map +1 -1
- package/dist/es/core.d.ts +26 -67
- package/dist/es/core.js +156 -2357
- package/dist/es/core.js.map +1 -1
- package/dist/es/elements.js +3701 -0
- package/dist/es/elements.js.map +1 -0
- package/dist/es/html-validate.js +3 -1
- package/dist/es/html-validate.js.map +1 -1
- package/dist/es/index.d.ts +5 -3
- package/dist/es/index.js +4 -2
- package/dist/es/index.js.map +1 -1
- package/dist/es/jest-lib.js +2 -1
- package/dist/es/jest-lib.js.map +1 -1
- package/dist/es/jest.d.ts +1 -1
- package/dist/es/jest.js +3 -1
- package/dist/es/jest.js.map +1 -1
- package/dist/es/meta-helper.d.ts +27 -0
- package/dist/es/meta-helper.js +61 -0
- package/dist/es/meta-helper.js.map +1 -0
- package/dist/es/rules-helper.d.ts +45 -0
- package/dist/es/rules-helper.js +398 -0
- package/dist/es/rules-helper.js.map +1 -0
- package/dist/es/test-utils.d.ts +1 -1
- package/elements/html5.js +1 -2119
- package/package.json +15 -9
- package/elements/README.md +0 -49
- package/elements/entities.json +0 -1724
package/dist/cjs/core.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var fs = require('fs');
|
|
4
4
|
var betterAjvErrors = require('@sidvind/better-ajv-errors');
|
|
5
|
+
var rulesHelper = require('./rules-helper.js');
|
|
5
6
|
var Ajv = require('ajv');
|
|
6
7
|
var deepmerge = require('deepmerge');
|
|
7
8
|
var espree = require('espree');
|
|
@@ -9,6 +10,7 @@ var walk = require('acorn-walk');
|
|
|
9
10
|
var path = require('path');
|
|
10
11
|
var semver = require('semver');
|
|
11
12
|
var kleur = require('kleur');
|
|
13
|
+
var elements = require('./elements.js');
|
|
12
14
|
var codeFrame = require('@babel/code-frame');
|
|
13
15
|
var stylishImpl = require('@html-validate/stylish');
|
|
14
16
|
|
|
@@ -274,104 +276,6 @@ var ajvSchemaDraft = {
|
|
|
274
276
|
}
|
|
275
277
|
};
|
|
276
278
|
|
|
277
|
-
function stringify(value) {
|
|
278
|
-
if (typeof value === "string") {
|
|
279
|
-
return String(value);
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
return JSON.stringify(value);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Represents an `Error` created from arbitrary values.
|
|
287
|
-
*
|
|
288
|
-
* @public
|
|
289
|
-
*/
|
|
290
|
-
class WrappedError extends Error {
|
|
291
|
-
constructor(message) {
|
|
292
|
-
super(stringify(message));
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Ensures the value is an Error.
|
|
298
|
-
*
|
|
299
|
-
* If the passed value is not an `Error` instance a [[WrappedError]] is
|
|
300
|
-
* constructed with the stringified value.
|
|
301
|
-
*
|
|
302
|
-
* @internal
|
|
303
|
-
*/
|
|
304
|
-
function ensureError(value) {
|
|
305
|
-
if (value instanceof Error) {
|
|
306
|
-
return value;
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
return new WrappedError(value);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
class NestedError extends Error {
|
|
314
|
-
constructor(message, nested) {
|
|
315
|
-
super(message);
|
|
316
|
-
Error.captureStackTrace(this, NestedError);
|
|
317
|
-
if (nested && nested.stack) {
|
|
318
|
-
this.stack += `\nCaused by: ${nested.stack}`;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
/**
|
|
324
|
-
* @public
|
|
325
|
-
*/
|
|
326
|
-
class UserError extends NestedError {
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
function getSummary(schema, obj, errors) {
|
|
330
|
-
const output = betterAjvErrors__default.default(schema, obj, errors, {
|
|
331
|
-
format: "js",
|
|
332
|
-
});
|
|
333
|
-
// istanbul ignore next: for safety only
|
|
334
|
-
return output.length > 0 ? output[0].error : "unknown validation error";
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* @public
|
|
338
|
-
*/
|
|
339
|
-
class SchemaValidationError extends UserError {
|
|
340
|
-
constructor(filename, message, obj, schema, errors) {
|
|
341
|
-
const summary = getSummary(schema, obj, errors);
|
|
342
|
-
super(`${message}: ${summary}`);
|
|
343
|
-
this.filename = filename;
|
|
344
|
-
this.obj = obj;
|
|
345
|
-
this.schema = schema;
|
|
346
|
-
this.errors = errors;
|
|
347
|
-
}
|
|
348
|
-
prettyError() {
|
|
349
|
-
const json = this.getRawJSON();
|
|
350
|
-
return betterAjvErrors__default.default(this.schema, this.obj, this.errors, {
|
|
351
|
-
format: "cli",
|
|
352
|
-
indent: 2,
|
|
353
|
-
json,
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
getRawJSON() {
|
|
357
|
-
if (this.filename && fs__default.default.existsSync(this.filename)) {
|
|
358
|
-
return fs__default.default.readFileSync(this.filename, "utf-8");
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
return null;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Helper function to assist IDE with completion and type-checking.
|
|
368
|
-
*
|
|
369
|
-
* @public
|
|
370
|
-
*/
|
|
371
|
-
function defineMetadata(metatable) {
|
|
372
|
-
return metatable;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
279
|
/**
|
|
376
280
|
* @public
|
|
377
281
|
*/
|
|
@@ -1728,273 +1632,94 @@ class DOMTree {
|
|
|
1728
1632
|
}
|
|
1729
1633
|
}
|
|
1730
1634
|
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
/**
|
|
1735
|
-
* Tests if this element is present in the accessibility tree.
|
|
1736
|
-
*
|
|
1737
|
-
* In practice it tests whenever the element or its parents has
|
|
1738
|
-
* `role="presentation"` or `aria-hidden="false"`. Dynamic values counts as
|
|
1739
|
-
* visible since the element might be in the visibility tree sometimes.
|
|
1740
|
-
*/
|
|
1741
|
-
function inAccessibilityTree(node) {
|
|
1742
|
-
return !isAriaHidden(node) && !isPresentation(node);
|
|
1743
|
-
}
|
|
1744
|
-
function isAriaHiddenImpl(node) {
|
|
1745
|
-
const isHidden = (node) => {
|
|
1746
|
-
const ariaHidden = node.getAttribute("aria-hidden");
|
|
1747
|
-
return Boolean(ariaHidden && ariaHidden.value === "true");
|
|
1748
|
-
};
|
|
1749
|
-
return {
|
|
1750
|
-
byParent: node.parent ? isAriaHidden(node.parent) : false,
|
|
1751
|
-
bySelf: isHidden(node),
|
|
1752
|
-
};
|
|
1753
|
-
}
|
|
1754
|
-
function isAriaHidden(node, details) {
|
|
1755
|
-
const cached = node.cacheGet(ARIA_HIDDEN_CACHE);
|
|
1756
|
-
if (cached) {
|
|
1757
|
-
return details ? cached : cached.byParent || cached.bySelf;
|
|
1635
|
+
function stringify(value) {
|
|
1636
|
+
if (typeof value === "string") {
|
|
1637
|
+
return String(value);
|
|
1758
1638
|
}
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
}
|
|
1762
|
-
function isHTMLHiddenImpl(node) {
|
|
1763
|
-
const isHidden = (node) => {
|
|
1764
|
-
const hidden = node.getAttribute("hidden");
|
|
1765
|
-
return hidden !== null && hidden.isStatic;
|
|
1766
|
-
};
|
|
1767
|
-
return {
|
|
1768
|
-
byParent: node.parent ? isHTMLHidden(node.parent) : false,
|
|
1769
|
-
bySelf: isHidden(node),
|
|
1770
|
-
};
|
|
1771
|
-
}
|
|
1772
|
-
function isHTMLHidden(node, details) {
|
|
1773
|
-
const cached = node.cacheGet(HTML_HIDDEN_CACHE);
|
|
1774
|
-
if (cached) {
|
|
1775
|
-
return details ? cached : cached.byParent || cached.bySelf;
|
|
1639
|
+
else {
|
|
1640
|
+
return JSON.stringify(value);
|
|
1776
1641
|
}
|
|
1777
|
-
const result = node.cacheSet(HTML_HIDDEN_CACHE, isHTMLHiddenImpl(node));
|
|
1778
|
-
return details ? result : result.byParent || result.bySelf;
|
|
1779
1642
|
}
|
|
1780
1643
|
/**
|
|
1781
|
-
*
|
|
1644
|
+
* Represents an `Error` created from arbitrary values.
|
|
1782
1645
|
*
|
|
1783
|
-
* Dynamic values yields `false` just as if the attribute wasn't present.
|
|
1784
|
-
*/
|
|
1785
|
-
function isPresentation(node) {
|
|
1786
|
-
if (node.cacheExists(ROLE_PRESENTATION_CACHE)) {
|
|
1787
|
-
return Boolean(node.cacheGet(ROLE_PRESENTATION_CACHE));
|
|
1788
|
-
}
|
|
1789
|
-
let cur = node;
|
|
1790
|
-
do {
|
|
1791
|
-
const role = cur.getAttribute("role");
|
|
1792
|
-
/* role="presentation" */
|
|
1793
|
-
if (role && role.value === "presentation") {
|
|
1794
|
-
return cur.cacheSet(ROLE_PRESENTATION_CACHE, true);
|
|
1795
|
-
}
|
|
1796
|
-
/* sanity check: break if no parent is present, normally not an issue as the
|
|
1797
|
-
* root element should be found first */
|
|
1798
|
-
if (!cur.parent) {
|
|
1799
|
-
break;
|
|
1800
|
-
}
|
|
1801
|
-
/* check parents */
|
|
1802
|
-
cur = cur.parent;
|
|
1803
|
-
} while (!cur.isRootElement());
|
|
1804
|
-
return node.cacheSet(ROLE_PRESENTATION_CACHE, false);
|
|
1805
|
-
}
|
|
1806
|
-
|
|
1807
|
-
const cachePrefix = classifyNodeText.name;
|
|
1808
|
-
const HTML_CACHE_KEY = Symbol(`${cachePrefix}|html`);
|
|
1809
|
-
const A11Y_CACHE_KEY = Symbol(`${cachePrefix}|a11y`);
|
|
1810
|
-
const IGNORE_HIDDEN_ROOT_HTML_CACHE_KEY = Symbol(`${cachePrefix}|html|ignore-hidden-root`);
|
|
1811
|
-
const IGNORE_HIDDEN_ROOT_A11Y_CACHE_KEY = Symbol(`${cachePrefix}|a11y|ignore-hidden-root`);
|
|
1812
|
-
/**
|
|
1813
1646
|
* @public
|
|
1814
1647
|
*/
|
|
1815
|
-
|
|
1816
|
-
(
|
|
1817
|
-
|
|
1818
|
-
TextClassification[TextClassification["DYNAMIC_TEXT"] = 1] = "DYNAMIC_TEXT";
|
|
1819
|
-
TextClassification[TextClassification["STATIC_TEXT"] = 2] = "STATIC_TEXT";
|
|
1820
|
-
})(exports.TextClassification || (exports.TextClassification = {}));
|
|
1821
|
-
function getCachekey(options = {}) {
|
|
1822
|
-
const { accessible = false, ignoreHiddenRoot = false } = options;
|
|
1823
|
-
if (accessible && ignoreHiddenRoot) {
|
|
1824
|
-
return IGNORE_HIDDEN_ROOT_A11Y_CACHE_KEY;
|
|
1825
|
-
}
|
|
1826
|
-
else if (ignoreHiddenRoot) {
|
|
1827
|
-
return IGNORE_HIDDEN_ROOT_HTML_CACHE_KEY;
|
|
1828
|
-
}
|
|
1829
|
-
else if (accessible) {
|
|
1830
|
-
return A11Y_CACHE_KEY;
|
|
1831
|
-
}
|
|
1832
|
-
else {
|
|
1833
|
-
return HTML_CACHE_KEY;
|
|
1648
|
+
class WrappedError extends Error {
|
|
1649
|
+
constructor(message) {
|
|
1650
|
+
super(stringify(message));
|
|
1834
1651
|
}
|
|
1835
1652
|
}
|
|
1836
|
-
|
|
1837
|
-
* element kinda acts as if there is no text content, most particularly it
|
|
1838
|
-
* doesn't receive and accessible name. The `.textContent` property does
|
|
1839
|
-
* however include the <option> childrens text. But for the sake of the
|
|
1840
|
-
* validator it is probably best if the classification acts as if there is no
|
|
1841
|
-
* text as I think that is what is expected of the return values. Might have
|
|
1842
|
-
* to revisit this at some point or if someone could clarify what section of
|
|
1843
|
-
* the standard deals with this. */
|
|
1844
|
-
function isSpecialEmpty(node) {
|
|
1845
|
-
return node.is("select") || node.is("textarea");
|
|
1846
|
-
}
|
|
1653
|
+
|
|
1847
1654
|
/**
|
|
1848
|
-
*
|
|
1849
|
-
*
|
|
1850
|
-
* Any text is considered including text from descendant elements. Whitespace is
|
|
1851
|
-
* ignored.
|
|
1655
|
+
* Ensures the value is an Error.
|
|
1852
1656
|
*
|
|
1853
|
-
* If
|
|
1657
|
+
* If the passed value is not an `Error` instance a [[WrappedError]] is
|
|
1658
|
+
* constructed with the stringified value.
|
|
1854
1659
|
*
|
|
1855
|
-
* @
|
|
1660
|
+
* @internal
|
|
1856
1661
|
*/
|
|
1857
|
-
function
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
if (node.cacheExists(cacheKey)) {
|
|
1861
|
-
return node.cacheGet(cacheKey);
|
|
1862
|
-
}
|
|
1863
|
-
if (!ignoreHiddenRoot && isHTMLHidden(node)) {
|
|
1864
|
-
return node.cacheSet(cacheKey, exports.TextClassification.EMPTY_TEXT);
|
|
1865
|
-
}
|
|
1866
|
-
if (!ignoreHiddenRoot && accessible && isAriaHidden(node)) {
|
|
1867
|
-
return node.cacheSet(cacheKey, exports.TextClassification.EMPTY_TEXT);
|
|
1868
|
-
}
|
|
1869
|
-
if (isSpecialEmpty(node)) {
|
|
1870
|
-
return node.cacheSet(cacheKey, exports.TextClassification.EMPTY_TEXT);
|
|
1871
|
-
}
|
|
1872
|
-
const text = findTextNodes(node, {
|
|
1873
|
-
...options,
|
|
1874
|
-
ignoreHiddenRoot: false,
|
|
1875
|
-
});
|
|
1876
|
-
/* if any text is dynamic classify as dynamic */
|
|
1877
|
-
if (text.some((cur) => cur.isDynamic)) {
|
|
1878
|
-
return node.cacheSet(cacheKey, exports.TextClassification.DYNAMIC_TEXT);
|
|
1879
|
-
}
|
|
1880
|
-
/* if any text has non-whitespace character classify as static */
|
|
1881
|
-
if (text.some((cur) => cur.textContent.match(/\S/) !== null)) {
|
|
1882
|
-
return node.cacheSet(cacheKey, exports.TextClassification.STATIC_TEXT);
|
|
1883
|
-
}
|
|
1884
|
-
/* default to empty */
|
|
1885
|
-
return node.cacheSet(cacheKey, exports.TextClassification.EMPTY_TEXT);
|
|
1886
|
-
}
|
|
1887
|
-
function findTextNodes(node, options) {
|
|
1888
|
-
const { accessible = false } = options;
|
|
1889
|
-
let text = [];
|
|
1890
|
-
for (const child of node.childNodes) {
|
|
1891
|
-
if (isTextNode(child)) {
|
|
1892
|
-
text.push(child);
|
|
1893
|
-
}
|
|
1894
|
-
else if (isElementNode(child)) {
|
|
1895
|
-
if (isHTMLHidden(child, true).bySelf) {
|
|
1896
|
-
continue;
|
|
1897
|
-
}
|
|
1898
|
-
if (accessible && isAriaHidden(child, true).bySelf) {
|
|
1899
|
-
continue;
|
|
1900
|
-
}
|
|
1901
|
-
text = text.concat(findTextNodes(child, options));
|
|
1902
|
-
}
|
|
1662
|
+
function ensureError(value) {
|
|
1663
|
+
if (value instanceof Error) {
|
|
1664
|
+
return value;
|
|
1903
1665
|
}
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
function hasAltText(image) {
|
|
1908
|
-
const alt = image.getAttribute("alt");
|
|
1909
|
-
/* missing or boolean */
|
|
1910
|
-
if (alt === null || alt.value === null) {
|
|
1911
|
-
return false;
|
|
1666
|
+
else {
|
|
1667
|
+
return new WrappedError(value);
|
|
1912
1668
|
}
|
|
1913
|
-
return alt.isDynamic || alt.value.toString() !== "";
|
|
1914
1669
|
}
|
|
1915
1670
|
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1671
|
+
class NestedError extends Error {
|
|
1672
|
+
constructor(message, nested) {
|
|
1673
|
+
super(message);
|
|
1674
|
+
Error.captureStackTrace(this, NestedError);
|
|
1675
|
+
if (nested && nested.stack) {
|
|
1676
|
+
this.stack += `\nCaused by: ${nested.stack}`;
|
|
1677
|
+
}
|
|
1921
1678
|
}
|
|
1922
|
-
return label.isDynamic || label.value.toString() !== "";
|
|
1923
1679
|
}
|
|
1924
1680
|
|
|
1925
1681
|
/**
|
|
1926
|
-
*
|
|
1927
|
-
*
|
|
1928
|
-
* - `["foo"]` becomes `"foo"`
|
|
1929
|
-
* - `["foo", "bar"]` becomes `"foo or bar"`
|
|
1930
|
-
* - `["foo", "bar", "baz"]` becomes `"foo, bar or baz"`
|
|
1931
|
-
* - and so on...
|
|
1932
|
-
*
|
|
1933
|
-
* @internal
|
|
1934
|
-
* @param values - List of words to join
|
|
1935
|
-
* @param conjunction - Conjunction for the last element.
|
|
1936
|
-
* @returns String with the words naturally joined with a conjunction.
|
|
1682
|
+
* @public
|
|
1937
1683
|
*/
|
|
1938
|
-
|
|
1939
|
-
switch (values.length) {
|
|
1940
|
-
case 0:
|
|
1941
|
-
return "";
|
|
1942
|
-
case 1:
|
|
1943
|
-
return values[0];
|
|
1944
|
-
case 2:
|
|
1945
|
-
return `${values[0]} ${conjunction} ${values[1]}`;
|
|
1946
|
-
default:
|
|
1947
|
-
return `${values.slice(0, -1).join(", ")} ${conjunction} ${values.slice(-1)[0]}`;
|
|
1948
|
-
}
|
|
1684
|
+
class UserError extends NestedError {
|
|
1949
1685
|
}
|
|
1950
1686
|
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
return null;
|
|
1958
|
-
}
|
|
1959
|
-
const expected = naturalJoin(attr.map((it) => `"${it}"`));
|
|
1960
|
-
return `requires ${expected} attribute to be present`;
|
|
1961
|
-
};
|
|
1962
|
-
}
|
|
1963
|
-
/**
|
|
1964
|
-
* @internal
|
|
1965
|
-
*/
|
|
1966
|
-
function allowedIfAttributeIsAbsent(...attr) {
|
|
1967
|
-
return (node) => {
|
|
1968
|
-
const present = attr.filter((it) => node.hasAttribute(it));
|
|
1969
|
-
if (present.length === 0) {
|
|
1970
|
-
return null;
|
|
1971
|
-
}
|
|
1972
|
-
const expected = naturalJoin(present.map((it) => `"${it}"`));
|
|
1973
|
-
return `cannot be used at the same time as ${expected}`;
|
|
1974
|
-
};
|
|
1687
|
+
function getSummary(schema, obj, errors) {
|
|
1688
|
+
const output = betterAjvErrors__default.default(schema, obj, errors, {
|
|
1689
|
+
format: "js",
|
|
1690
|
+
});
|
|
1691
|
+
// istanbul ignore next: for safety only
|
|
1692
|
+
return output.length > 0 ? output[0].error : "unknown validation error";
|
|
1975
1693
|
}
|
|
1976
1694
|
/**
|
|
1977
|
-
* @
|
|
1695
|
+
* @public
|
|
1978
1696
|
*/
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
const
|
|
1982
|
-
|
|
1983
|
-
|
|
1697
|
+
class SchemaValidationError extends UserError {
|
|
1698
|
+
constructor(filename, message, obj, schema, errors) {
|
|
1699
|
+
const summary = getSummary(schema, obj, errors);
|
|
1700
|
+
super(`${message}: ${summary}`);
|
|
1701
|
+
this.filename = filename;
|
|
1702
|
+
this.obj = obj;
|
|
1703
|
+
this.schema = schema;
|
|
1704
|
+
this.errors = errors;
|
|
1705
|
+
}
|
|
1706
|
+
prettyError() {
|
|
1707
|
+
const json = this.getRawJSON();
|
|
1708
|
+
return betterAjvErrors__default.default(this.schema, this.obj, this.errors, {
|
|
1709
|
+
format: "cli",
|
|
1710
|
+
indent: 2,
|
|
1711
|
+
json,
|
|
1712
|
+
});
|
|
1713
|
+
}
|
|
1714
|
+
getRawJSON() {
|
|
1715
|
+
if (this.filename && fs__default.default.existsSync(this.filename)) {
|
|
1716
|
+
return fs__default.default.readFileSync(this.filename, "utf-8");
|
|
1984
1717
|
}
|
|
1985
|
-
|
|
1986
|
-
if (actualValue && expectedValue.includes(actualValue.toLocaleLowerCase())) {
|
|
1718
|
+
else {
|
|
1987
1719
|
return null;
|
|
1988
1720
|
}
|
|
1989
|
-
|
|
1990
|
-
return `"${key}" attribute must be ${expected}`;
|
|
1991
|
-
};
|
|
1721
|
+
}
|
|
1992
1722
|
}
|
|
1993
|
-
const metadataHelper = {
|
|
1994
|
-
allowedIfAttributeIsPresent,
|
|
1995
|
-
allowedIfAttributeIsAbsent,
|
|
1996
|
-
allowedIfAttributeHasValue,
|
|
1997
|
-
};
|
|
1998
1723
|
|
|
1999
1724
|
/**
|
|
2000
1725
|
* Computes hash for given string.
|
|
@@ -2022,9 +1747,7 @@ function cyrb53(str) {
|
|
|
2022
1747
|
}
|
|
2023
1748
|
const computeHash = cyrb53;
|
|
2024
1749
|
|
|
2025
|
-
const
|
|
2026
|
-
const legacyRequire = require;
|
|
2027
|
-
const distFolder = path__default.default.resolve(projectRoot, "dist/cjs");
|
|
1750
|
+
const legacyRequire = require;
|
|
2028
1751
|
|
|
2029
1752
|
/**
|
|
2030
1753
|
* Similar to `require(..)` but removes the cached copy first.
|
|
@@ -3533,16 +3256,6 @@ var TRANSFORMER_API;
|
|
|
3533
3256
|
TRANSFORMER_API[TRANSFORMER_API["VERSION"] = 1] = "VERSION";
|
|
3534
3257
|
})(TRANSFORMER_API || (TRANSFORMER_API = {}));
|
|
3535
3258
|
|
|
3536
|
-
/* generated file, changes will be overwritten */
|
|
3537
|
-
/** @public */
|
|
3538
|
-
const name = "html-validate";
|
|
3539
|
-
/** @public */
|
|
3540
|
-
const version = "7.7.0";
|
|
3541
|
-
/** @public */
|
|
3542
|
-
const homepage = "https://html-validate.org";
|
|
3543
|
-
/** @public */
|
|
3544
|
-
const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
|
|
3545
|
-
|
|
3546
3259
|
/**
|
|
3547
3260
|
* @public
|
|
3548
3261
|
*/
|
|
@@ -3851,20 +3564,6 @@ class Rule {
|
|
|
3851
3564
|
return null;
|
|
3852
3565
|
}
|
|
3853
3566
|
}
|
|
3854
|
-
/**
|
|
3855
|
-
* @internal
|
|
3856
|
-
*/
|
|
3857
|
-
function ruleDocumentationUrl(filename) {
|
|
3858
|
-
/* during bundling all "@/rule.ts"'s are converted to paths relative to the src
|
|
3859
|
-
* folder and with the @/ prefix, by replacing the @ with the dist folder we
|
|
3860
|
-
* can resolve the path properly */
|
|
3861
|
-
filename = filename.replace("@", distFolder);
|
|
3862
|
-
const p = path__default.default.parse(filename);
|
|
3863
|
-
const root = path__default.default.join(distFolder, "rules");
|
|
3864
|
-
const rel = path__default.default.relative(root, path__default.default.join(p.dir, p.name));
|
|
3865
|
-
const normalized = rel.replace(/\\/g, "/");
|
|
3866
|
-
return `${homepage}/rules/${normalized}.html`;
|
|
3867
|
-
}
|
|
3868
3567
|
|
|
3869
3568
|
const defaults$t = {
|
|
3870
3569
|
allowExternal: true,
|
|
@@ -3945,7 +3644,7 @@ class AllowedLinks extends Rule {
|
|
|
3945
3644
|
const message = description[context] || "This link type is not allowed by current configuration";
|
|
3946
3645
|
return {
|
|
3947
3646
|
description: message,
|
|
3948
|
-
url:
|
|
3647
|
+
url: "https://html-validate.org/rules/allowed-links.html",
|
|
3949
3648
|
};
|
|
3950
3649
|
}
|
|
3951
3650
|
setup() {
|
|
@@ -4108,7 +3807,7 @@ class AreaAlt extends Rule {
|
|
|
4108
3807
|
documentation(context) {
|
|
4109
3808
|
return {
|
|
4110
3809
|
description: getDescription(context).join("\n"),
|
|
4111
|
-
url:
|
|
3810
|
+
url: "https://html-validate.org/rules/area-alt.html",
|
|
4112
3811
|
};
|
|
4113
3812
|
}
|
|
4114
3813
|
setup() {
|
|
@@ -4160,7 +3859,7 @@ class AriaHiddenBody extends Rule {
|
|
|
4160
3859
|
documentation() {
|
|
4161
3860
|
return {
|
|
4162
3861
|
description: "`aria-hidden` must not be used on the `<body>` element as it makes the page inaccessible to assistive technology such as screenreaders",
|
|
4163
|
-
url:
|
|
3862
|
+
url: "https://html-validate.org/rules/aria-hidden-body.html",
|
|
4164
3863
|
};
|
|
4165
3864
|
}
|
|
4166
3865
|
setup() {
|
|
@@ -4213,7 +3912,7 @@ class AriaLabelMisuse extends Rule {
|
|
|
4213
3912
|
const lines = valid.map((it) => `- ${it}\n`).join("");
|
|
4214
3913
|
return {
|
|
4215
3914
|
description: `\`aria-label\` can only be used on:\n\n${lines}`,
|
|
4216
|
-
url:
|
|
3915
|
+
url: "https://html-validate.org/rules/aria-label-misuse.html",
|
|
4217
3916
|
};
|
|
4218
3917
|
}
|
|
4219
3918
|
setup() {
|
|
@@ -4260,60 +3959,6 @@ class AriaLabelMisuse extends Rule {
|
|
|
4260
3959
|
class ConfigError extends UserError {
|
|
4261
3960
|
}
|
|
4262
3961
|
|
|
4263
|
-
/**
|
|
4264
|
-
* Represents casing for a name, e.g. lowercase, uppercase, etc.
|
|
4265
|
-
*/
|
|
4266
|
-
class CaseStyle {
|
|
4267
|
-
/**
|
|
4268
|
-
* @param style - Name of a valid case style.
|
|
4269
|
-
*/
|
|
4270
|
-
constructor(style, ruleId) {
|
|
4271
|
-
if (!Array.isArray(style)) {
|
|
4272
|
-
style = [style];
|
|
4273
|
-
}
|
|
4274
|
-
if (style.length === 0) {
|
|
4275
|
-
throw new ConfigError(`Missing style for ${ruleId} rule`);
|
|
4276
|
-
}
|
|
4277
|
-
this.styles = this.parseStyle(style, ruleId);
|
|
4278
|
-
}
|
|
4279
|
-
/**
|
|
4280
|
-
* Test if a text matches this case style.
|
|
4281
|
-
*/
|
|
4282
|
-
match(text) {
|
|
4283
|
-
return this.styles.some((style) => text.match(style.pattern));
|
|
4284
|
-
}
|
|
4285
|
-
get name() {
|
|
4286
|
-
const names = this.styles.map((style) => style.name);
|
|
4287
|
-
switch (this.styles.length) {
|
|
4288
|
-
case 1:
|
|
4289
|
-
return names[0];
|
|
4290
|
-
case 2:
|
|
4291
|
-
return names.join(" or ");
|
|
4292
|
-
default: {
|
|
4293
|
-
const last = names.slice(-1);
|
|
4294
|
-
const rest = names.slice(0, -1);
|
|
4295
|
-
return `${rest.join(", ")} or ${last[0]}`;
|
|
4296
|
-
}
|
|
4297
|
-
}
|
|
4298
|
-
}
|
|
4299
|
-
parseStyle(style, ruleId) {
|
|
4300
|
-
return style.map((cur) => {
|
|
4301
|
-
switch (cur.toLowerCase()) {
|
|
4302
|
-
case "lowercase":
|
|
4303
|
-
return { pattern: /^[a-z]*$/, name: "lowercase" };
|
|
4304
|
-
case "uppercase":
|
|
4305
|
-
return { pattern: /^[A-Z]*$/, name: "uppercase" };
|
|
4306
|
-
case "pascalcase":
|
|
4307
|
-
return { pattern: /^[A-Z][A-Za-z]*$/, name: "PascalCase" };
|
|
4308
|
-
case "camelcase":
|
|
4309
|
-
return { pattern: /^[a-z][A-Za-z]*$/, name: "camelCase" };
|
|
4310
|
-
default:
|
|
4311
|
-
throw new ConfigError(`Invalid style "${cur}" for ${ruleId} rule`);
|
|
4312
|
-
}
|
|
4313
|
-
});
|
|
4314
|
-
}
|
|
4315
|
-
}
|
|
4316
|
-
|
|
4317
3962
|
const defaults$r = {
|
|
4318
3963
|
style: "lowercase",
|
|
4319
3964
|
ignoreForeign: true,
|
|
@@ -4321,7 +3966,7 @@ const defaults$r = {
|
|
|
4321
3966
|
class AttrCase extends Rule {
|
|
4322
3967
|
constructor(options) {
|
|
4323
3968
|
super({ ...defaults$r, ...options });
|
|
4324
|
-
this.style = new CaseStyle(this.options.style, "attr-case");
|
|
3969
|
+
this.style = new rulesHelper.CaseStyle(this.options.style, "attr-case");
|
|
4325
3970
|
}
|
|
4326
3971
|
static schema() {
|
|
4327
3972
|
const styleEnum = ["lowercase", "uppercase", "pascalcase", "camelcase"];
|
|
@@ -4352,7 +3997,7 @@ class AttrCase extends Rule {
|
|
|
4352
3997
|
description: Array.isArray(style)
|
|
4353
3998
|
? [`Attribute name must be in one of:`, "", ...style.map((it) => `- ${it}`)].join("\n")
|
|
4354
3999
|
: `Attribute name must be in ${style}.`,
|
|
4355
|
-
url:
|
|
4000
|
+
url: "https://html-validate.org/rules/attr-case.html",
|
|
4356
4001
|
};
|
|
4357
4002
|
}
|
|
4358
4003
|
setup() {
|
|
@@ -4645,7 +4290,7 @@ class AttrDelimiter extends Rule {
|
|
|
4645
4290
|
documentation() {
|
|
4646
4291
|
return {
|
|
4647
4292
|
description: `Attribute value must not be separated by whitespace.`,
|
|
4648
|
-
url:
|
|
4293
|
+
url: "https://html-validate.org/rules/attr-delimiter.html",
|
|
4649
4294
|
};
|
|
4650
4295
|
}
|
|
4651
4296
|
setup() {
|
|
@@ -4725,7 +4370,7 @@ class AttrPattern extends Rule {
|
|
|
4725
4370
|
}
|
|
4726
4371
|
return {
|
|
4727
4372
|
description,
|
|
4728
|
-
url:
|
|
4373
|
+
url: "https://html-validate.org/rules/attr-pattern.html",
|
|
4729
4374
|
};
|
|
4730
4375
|
}
|
|
4731
4376
|
setup() {
|
|
@@ -4830,7 +4475,7 @@ class AttrQuotes extends Rule {
|
|
|
4830
4475
|
];
|
|
4831
4476
|
return {
|
|
4832
4477
|
description: description.join("\n"),
|
|
4833
|
-
url:
|
|
4478
|
+
url: "https://html-validate.org/rules/attr-quotes.html",
|
|
4834
4479
|
};
|
|
4835
4480
|
}
|
|
4836
4481
|
setup() {
|
|
@@ -4898,7 +4543,7 @@ class AttrSpacing extends Rule {
|
|
|
4898
4543
|
documentation() {
|
|
4899
4544
|
return {
|
|
4900
4545
|
description: `No space between attributes. At least one whitespace character (commonly space) must be used to separate attributes.`,
|
|
4901
|
-
url:
|
|
4546
|
+
url: "https://html-validate.org/rules/attr-spacing.html",
|
|
4902
4547
|
};
|
|
4903
4548
|
}
|
|
4904
4549
|
setup() {
|
|
@@ -4926,7 +4571,7 @@ class AttributeAllowedValues extends Rule {
|
|
|
4926
4571
|
documentation(context) {
|
|
4927
4572
|
const docs = {
|
|
4928
4573
|
description: "Attribute has invalid value.",
|
|
4929
|
-
url:
|
|
4574
|
+
url: "https://html-validate.org/rules/attribute-allowed-values.html",
|
|
4930
4575
|
};
|
|
4931
4576
|
if (!context) {
|
|
4932
4577
|
return docs;
|
|
@@ -5019,7 +4664,7 @@ class AttributeBooleanStyle extends Rule {
|
|
|
5019
4664
|
documentation() {
|
|
5020
4665
|
return {
|
|
5021
4666
|
description: "Require a specific style when writing boolean attributes.",
|
|
5022
|
-
url:
|
|
4667
|
+
url: "https://html-validate.org/rules/attribute-boolean-style.html",
|
|
5023
4668
|
};
|
|
5024
4669
|
}
|
|
5025
4670
|
setup() {
|
|
@@ -5100,7 +4745,7 @@ class AttributeEmptyStyle extends Rule {
|
|
|
5100
4745
|
documentation() {
|
|
5101
4746
|
return {
|
|
5102
4747
|
description: "Require a specific style for attributes with empty values.",
|
|
5103
|
-
url:
|
|
4748
|
+
url: "https://html-validate.org/rules/attribute-empty-style.html",
|
|
5104
4749
|
};
|
|
5105
4750
|
}
|
|
5106
4751
|
setup() {
|
|
@@ -5181,7 +4826,7 @@ class AttributeMisuse extends Rule {
|
|
|
5181
4826
|
documentation(context) {
|
|
5182
4827
|
return {
|
|
5183
4828
|
description: ruleDescription(context),
|
|
5184
|
-
url:
|
|
4829
|
+
url: "https://html-validate.org/rules/attribute-misuse.html",
|
|
5185
4830
|
};
|
|
5186
4831
|
}
|
|
5187
4832
|
setup() {
|
|
@@ -5261,7 +4906,7 @@ class ClassPattern extends Rule {
|
|
|
5261
4906
|
const pattern = describePattern(this.options.pattern);
|
|
5262
4907
|
return {
|
|
5263
4908
|
description: `For consistency all classes are required to match the pattern ${pattern}.`,
|
|
5264
|
-
url:
|
|
4909
|
+
url: "https://html-validate.org/rules/class-pattern.html",
|
|
5265
4910
|
};
|
|
5266
4911
|
}
|
|
5267
4912
|
setup() {
|
|
@@ -5286,7 +4931,7 @@ class CloseAttr extends Rule {
|
|
|
5286
4931
|
documentation() {
|
|
5287
4932
|
return {
|
|
5288
4933
|
description: "HTML disallows end tags to have attributes.",
|
|
5289
|
-
url:
|
|
4934
|
+
url: "https://html-validate.org/rules/close-attr.html",
|
|
5290
4935
|
};
|
|
5291
4936
|
}
|
|
5292
4937
|
setup() {
|
|
@@ -5312,7 +4957,7 @@ class CloseOrder extends Rule {
|
|
|
5312
4957
|
documentation() {
|
|
5313
4958
|
return {
|
|
5314
4959
|
description: "HTML requires elements to be closed in the same order as they were opened.",
|
|
5315
|
-
url:
|
|
4960
|
+
url: "https://html-validate.org/rules/close-order.html",
|
|
5316
4961
|
};
|
|
5317
4962
|
}
|
|
5318
4963
|
setup() {
|
|
@@ -5397,7 +5042,7 @@ class Deprecated extends Rule {
|
|
|
5397
5042
|
documentation(context) {
|
|
5398
5043
|
const doc = {
|
|
5399
5044
|
description: "This element is deprecated and should not be used in new code.",
|
|
5400
|
-
url:
|
|
5045
|
+
url: "https://html-validate.org/rules/deprecated.html",
|
|
5401
5046
|
};
|
|
5402
5047
|
if (context) {
|
|
5403
5048
|
const text = [];
|
|
@@ -5484,7 +5129,7 @@ class DeprecatedRule extends Rule {
|
|
|
5484
5129
|
const preamble = context ? `The rule "${context}"` : "This rule";
|
|
5485
5130
|
return {
|
|
5486
5131
|
description: `${preamble} is deprecated and should not be used any longer, consult documentation for further information.`,
|
|
5487
|
-
url:
|
|
5132
|
+
url: "https://html-validate.org/rules/deprecated-rule.html",
|
|
5488
5133
|
};
|
|
5489
5134
|
}
|
|
5490
5135
|
setup() {
|
|
@@ -5512,7 +5157,7 @@ let NoStyleTag$1 = class NoStyleTag extends Rule {
|
|
|
5512
5157
|
"<!DOCTYPE html>",
|
|
5513
5158
|
"```",
|
|
5514
5159
|
].join("\n"),
|
|
5515
|
-
url:
|
|
5160
|
+
url: "https://html-validate.org/rules/doctype-html.html",
|
|
5516
5161
|
};
|
|
5517
5162
|
}
|
|
5518
5163
|
setup() {
|
|
@@ -5543,7 +5188,7 @@ class DoctypeStyle extends Rule {
|
|
|
5543
5188
|
documentation(context) {
|
|
5544
5189
|
const doc = {
|
|
5545
5190
|
description: `While DOCTYPE is case-insensitive in the standard the current configuration requires a specific style.`,
|
|
5546
|
-
url:
|
|
5191
|
+
url: "https://html-validate.org/rules/doctype-style.html",
|
|
5547
5192
|
};
|
|
5548
5193
|
if (context) {
|
|
5549
5194
|
doc.description = `While DOCTYPE is case-insensitive in the standard the current configuration requires it to be ${context.style}`;
|
|
@@ -5568,7 +5213,7 @@ const defaults$j = {
|
|
|
5568
5213
|
class ElementCase extends Rule {
|
|
5569
5214
|
constructor(options) {
|
|
5570
5215
|
super({ ...defaults$j, ...options });
|
|
5571
|
-
this.style = new CaseStyle(this.options.style, "element-case");
|
|
5216
|
+
this.style = new rulesHelper.CaseStyle(this.options.style, "element-case");
|
|
5572
5217
|
}
|
|
5573
5218
|
static schema() {
|
|
5574
5219
|
const styleEnum = ["lowercase", "uppercase", "pascalcase", "camelcase"];
|
|
@@ -5596,7 +5241,7 @@ class ElementCase extends Rule {
|
|
|
5596
5241
|
description: Array.isArray(style)
|
|
5597
5242
|
? [`Element tagname must be in one of:`, "", ...style.map((it) => `- ${it}`)].join("\n")
|
|
5598
5243
|
: `Element tagname must be in ${style}.`,
|
|
5599
|
-
url:
|
|
5244
|
+
url: "https://html-validate.org/rules/element-case.html",
|
|
5600
5245
|
};
|
|
5601
5246
|
}
|
|
5602
5247
|
setup() {
|
|
@@ -5666,7 +5311,7 @@ class ElementName extends Rule {
|
|
|
5666
5311
|
documentation(context) {
|
|
5667
5312
|
return {
|
|
5668
5313
|
description: this.documentationMessages(context).join("\n"),
|
|
5669
|
-
url:
|
|
5314
|
+
url: "https://html-validate.org/rules/element-name.html",
|
|
5670
5315
|
};
|
|
5671
5316
|
}
|
|
5672
5317
|
documentationMessages(context) {
|
|
@@ -5772,7 +5417,7 @@ class ElementPermittedContent extends Rule {
|
|
|
5772
5417
|
documentation(context) {
|
|
5773
5418
|
return {
|
|
5774
5419
|
description: getRuleDescription$2(context).join("\n"),
|
|
5775
|
-
url:
|
|
5420
|
+
url: "https://html-validate.org/rules/element-permitted-content.html",
|
|
5776
5421
|
};
|
|
5777
5422
|
}
|
|
5778
5423
|
setup() {
|
|
@@ -5865,7 +5510,7 @@ class ElementPermittedOccurrences extends Rule {
|
|
|
5865
5510
|
documentation() {
|
|
5866
5511
|
return {
|
|
5867
5512
|
description: "Some elements may only be used a fixed amount of times in given context.",
|
|
5868
|
-
url:
|
|
5513
|
+
url: "https://html-validate.org/rules/element-permitted-occurrences.html",
|
|
5869
5514
|
};
|
|
5870
5515
|
}
|
|
5871
5516
|
setup() {
|
|
@@ -5899,7 +5544,7 @@ class ElementPermittedOrder extends Rule {
|
|
|
5899
5544
|
documentation() {
|
|
5900
5545
|
return {
|
|
5901
5546
|
description: "Some elements has a specific order the children must use.",
|
|
5902
|
-
url:
|
|
5547
|
+
url: "https://html-validate.org/rules/element-permitted-order.html",
|
|
5903
5548
|
};
|
|
5904
5549
|
}
|
|
5905
5550
|
setup() {
|
|
@@ -5960,14 +5605,14 @@ function formatMessage$1(node, parent, rules) {
|
|
|
5960
5605
|
if (!isFormattable(rules)) {
|
|
5961
5606
|
return `${nodeName} element cannot have ${parentName} element as parent`;
|
|
5962
5607
|
}
|
|
5963
|
-
const allowed = naturalJoin(rules.filter(isCategoryOrTag).map(formatCategoryOrTag));
|
|
5608
|
+
const allowed = rulesHelper.naturalJoin(rules.filter(isCategoryOrTag).map(formatCategoryOrTag));
|
|
5964
5609
|
return `${nodeName} element requires a ${allowed} element as parent`;
|
|
5965
5610
|
}
|
|
5966
5611
|
class ElementPermittedParent extends Rule {
|
|
5967
5612
|
documentation(context) {
|
|
5968
5613
|
return {
|
|
5969
5614
|
description: getRuleDescription$1(context).join("\n"),
|
|
5970
|
-
url:
|
|
5615
|
+
url: "https://html-validate.org/rules/element-permitted-parent.html",
|
|
5971
5616
|
};
|
|
5972
5617
|
}
|
|
5973
5618
|
setup() {
|
|
@@ -6024,13 +5669,13 @@ function getRuleDescription(context) {
|
|
|
6024
5669
|
];
|
|
6025
5670
|
}
|
|
6026
5671
|
const escaped = context.ancestor.map((it) => `\`${it}\``);
|
|
6027
|
-
return [`The \`${context.child}\` element requires a ${naturalJoin(escaped)} ancestor.`];
|
|
5672
|
+
return [`The \`${context.child}\` element requires a ${rulesHelper.naturalJoin(escaped)} ancestor.`];
|
|
6028
5673
|
}
|
|
6029
5674
|
class ElementRequiredAncestor extends Rule {
|
|
6030
5675
|
documentation(context) {
|
|
6031
5676
|
return {
|
|
6032
5677
|
description: getRuleDescription(context).join("\n"),
|
|
6033
|
-
url:
|
|
5678
|
+
url: "https://html-validate.org/rules/element-required-ancestor.html",
|
|
6034
5679
|
};
|
|
6035
5680
|
}
|
|
6036
5681
|
setup() {
|
|
@@ -6060,7 +5705,7 @@ class ElementRequiredAncestor extends Rule {
|
|
|
6060
5705
|
}
|
|
6061
5706
|
const ancestor = rules.map((it) => (isTagnameOnly(it) ? `<${it}>` : `"${it}"`));
|
|
6062
5707
|
const child = `<${node.tagName}>`;
|
|
6063
|
-
const message = `<${node.tagName}> element requires a ${naturalJoin(ancestor)} ancestor`;
|
|
5708
|
+
const message = `<${node.tagName}> element requires a ${rulesHelper.naturalJoin(ancestor)} ancestor`;
|
|
6064
5709
|
const context = {
|
|
6065
5710
|
ancestor,
|
|
6066
5711
|
child,
|
|
@@ -6073,7 +5718,7 @@ class ElementRequiredAttributes extends Rule {
|
|
|
6073
5718
|
documentation(context) {
|
|
6074
5719
|
const docs = {
|
|
6075
5720
|
description: "Element is missing a required attribute",
|
|
6076
|
-
url:
|
|
5721
|
+
url: "https://html-validate.org/rules/element-required-attributes.html",
|
|
6077
5722
|
};
|
|
6078
5723
|
if (context) {
|
|
6079
5724
|
docs.description = `The <${context.element}> element is required to have a "${context.attribute}" attribute.`;
|
|
@@ -6110,13 +5755,13 @@ class ElementRequiredContent extends Rule {
|
|
|
6110
5755
|
const { element, missing } = context;
|
|
6111
5756
|
return {
|
|
6112
5757
|
description: `The \`${element}\` element requires a \`${missing}\` to be present as content.`,
|
|
6113
|
-
url:
|
|
5758
|
+
url: "https://html-validate.org/rules/element-required-content.html",
|
|
6114
5759
|
};
|
|
6115
5760
|
}
|
|
6116
5761
|
else {
|
|
6117
5762
|
return {
|
|
6118
5763
|
description: "Some elements has requirements on content that must be present.",
|
|
6119
|
-
url:
|
|
5764
|
+
url: "https://html-validate.org/rules/element-required-content.html",
|
|
6120
5765
|
};
|
|
6121
5766
|
}
|
|
6122
5767
|
}
|
|
@@ -6147,9 +5792,9 @@ class ElementRequiredContent extends Rule {
|
|
|
6147
5792
|
}
|
|
6148
5793
|
|
|
6149
5794
|
const selector = ["h1", "h2", "h3", "h4", "h5", "h6"].join(",");
|
|
6150
|
-
function hasImgAltText
|
|
5795
|
+
function hasImgAltText(node) {
|
|
6151
5796
|
if (node.is("img")) {
|
|
6152
|
-
return hasAltText(node);
|
|
5797
|
+
return rulesHelper.hasAltText(node);
|
|
6153
5798
|
}
|
|
6154
5799
|
else if (node.is("svg")) {
|
|
6155
5800
|
return node.textContent.trim() !== "";
|
|
@@ -6162,7 +5807,7 @@ class EmptyHeading extends Rule {
|
|
|
6162
5807
|
documentation() {
|
|
6163
5808
|
return {
|
|
6164
5809
|
description: `Assistive technology such as screen readers require textual content in headings. Whitespace only is considered empty.`,
|
|
6165
|
-
url:
|
|
5810
|
+
url: "https://html-validate.org/rules/empty-heading.html",
|
|
6166
5811
|
};
|
|
6167
5812
|
}
|
|
6168
5813
|
setup() {
|
|
@@ -6176,16 +5821,16 @@ class EmptyHeading extends Rule {
|
|
|
6176
5821
|
validateHeading(heading) {
|
|
6177
5822
|
const images = heading.querySelectorAll("img, svg");
|
|
6178
5823
|
for (const child of images) {
|
|
6179
|
-
if (hasImgAltText
|
|
5824
|
+
if (hasImgAltText(child)) {
|
|
6180
5825
|
return;
|
|
6181
5826
|
}
|
|
6182
5827
|
}
|
|
6183
|
-
switch (classifyNodeText(heading)) {
|
|
6184
|
-
case
|
|
6185
|
-
case
|
|
5828
|
+
switch (rulesHelper.classifyNodeText(heading)) {
|
|
5829
|
+
case rulesHelper.TextClassification.DYNAMIC_TEXT:
|
|
5830
|
+
case rulesHelper.TextClassification.STATIC_TEXT:
|
|
6186
5831
|
/* have some text content, consider ok */
|
|
6187
5832
|
break;
|
|
6188
|
-
case
|
|
5833
|
+
case rulesHelper.TextClassification.EMPTY_TEXT:
|
|
6189
5834
|
/* no content or whitespace only */
|
|
6190
5835
|
this.report(heading, `<${heading.tagName}> cannot be empty, must have text content`);
|
|
6191
5836
|
break;
|
|
@@ -6204,7 +5849,7 @@ class EmptyTitle extends Rule {
|
|
|
6204
5849
|
"",
|
|
6205
5850
|
"Whitespace is ignored.",
|
|
6206
5851
|
].join("\n"),
|
|
6207
|
-
url:
|
|
5852
|
+
url: "https://html-validate.org/rules/empty-title.html",
|
|
6208
5853
|
};
|
|
6209
5854
|
}
|
|
6210
5855
|
setup() {
|
|
@@ -6212,12 +5857,12 @@ class EmptyTitle extends Rule {
|
|
|
6212
5857
|
const node = event.previous;
|
|
6213
5858
|
if (node.tagName !== "title")
|
|
6214
5859
|
return;
|
|
6215
|
-
switch (classifyNodeText(node)) {
|
|
6216
|
-
case
|
|
6217
|
-
case
|
|
5860
|
+
switch (rulesHelper.classifyNodeText(node)) {
|
|
5861
|
+
case rulesHelper.TextClassification.DYNAMIC_TEXT:
|
|
5862
|
+
case rulesHelper.TextClassification.STATIC_TEXT:
|
|
6218
5863
|
/* have some text content, consider ok */
|
|
6219
5864
|
break;
|
|
6220
|
-
case
|
|
5865
|
+
case rulesHelper.TextClassification.EMPTY_TEXT:
|
|
6221
5866
|
/* no content or whitespace only */
|
|
6222
5867
|
{
|
|
6223
5868
|
const message = `<${node.tagName}> cannot be empty, must have text content`;
|
|
@@ -6298,7 +5943,7 @@ class HeadingLevel extends Rule {
|
|
|
6298
5943
|
}
|
|
6299
5944
|
return {
|
|
6300
5945
|
description: text.join("\n"),
|
|
6301
|
-
url:
|
|
5946
|
+
url: "https://html-validate.org/rules/heading-level.html",
|
|
6302
5947
|
};
|
|
6303
5948
|
}
|
|
6304
5949
|
setup() {
|
|
@@ -6437,7 +6082,7 @@ class IdPattern extends Rule {
|
|
|
6437
6082
|
const pattern = describePattern(this.options.pattern);
|
|
6438
6083
|
return {
|
|
6439
6084
|
description: `For consistency all IDs are required to match the pattern ${pattern}.`,
|
|
6440
|
-
url:
|
|
6085
|
+
url: "https://html-validate.org/rules/id-pattern.html",
|
|
6441
6086
|
};
|
|
6442
6087
|
}
|
|
6443
6088
|
setup() {
|
|
@@ -6569,13 +6214,13 @@ class InputAttributes extends Rule {
|
|
|
6569
6214
|
const list = (_b = (_a = restricted.get(attribute)) === null || _a === void 0 ? void 0 : _a.map((it) => `- \`${it}\``)) !== null && _b !== void 0 ? _b : [];
|
|
6570
6215
|
return {
|
|
6571
6216
|
description: [summary, details, ...list].join("\n"),
|
|
6572
|
-
url:
|
|
6217
|
+
url: "https://html-validate.org/rules/input-attributes.html",
|
|
6573
6218
|
};
|
|
6574
6219
|
}
|
|
6575
6220
|
else {
|
|
6576
6221
|
return {
|
|
6577
6222
|
description: `This attribute cannot be used with this input type.`,
|
|
6578
|
-
url:
|
|
6223
|
+
url: "https://html-validate.org/rules/input-attributes.html",
|
|
6579
6224
|
};
|
|
6580
6225
|
}
|
|
6581
6226
|
}
|
|
@@ -6606,126 +6251,6 @@ class InputAttributes extends Rule {
|
|
|
6606
6251
|
}
|
|
6607
6252
|
}
|
|
6608
6253
|
|
|
6609
|
-
const HAS_ACCESSIBLE_TEXT_CACHE = Symbol(hasAccessibleName.name);
|
|
6610
|
-
function isHidden(node, context) {
|
|
6611
|
-
const { reference } = context;
|
|
6612
|
-
if (reference && reference.isSameNode(node)) {
|
|
6613
|
-
return false;
|
|
6614
|
-
}
|
|
6615
|
-
else {
|
|
6616
|
-
return isHTMLHidden(node) || !inAccessibilityTree(node);
|
|
6617
|
-
}
|
|
6618
|
-
}
|
|
6619
|
-
function hasImgAltText(node, context) {
|
|
6620
|
-
if (node.is("img")) {
|
|
6621
|
-
return hasAltText(node);
|
|
6622
|
-
}
|
|
6623
|
-
else if (node.is("svg")) {
|
|
6624
|
-
return node.textContent.trim() !== "";
|
|
6625
|
-
}
|
|
6626
|
-
else {
|
|
6627
|
-
for (const img of node.querySelectorAll("img, svg")) {
|
|
6628
|
-
const hasName = hasAccessibleNameImpl(img, context);
|
|
6629
|
-
if (hasName) {
|
|
6630
|
-
return true;
|
|
6631
|
-
}
|
|
6632
|
-
}
|
|
6633
|
-
return false;
|
|
6634
|
-
}
|
|
6635
|
-
}
|
|
6636
|
-
function hasLabel(node) {
|
|
6637
|
-
var _a;
|
|
6638
|
-
const value = (_a = node.getAttributeValue("aria-label")) !== null && _a !== void 0 ? _a : "";
|
|
6639
|
-
return Boolean(value.trim());
|
|
6640
|
-
}
|
|
6641
|
-
function isLabelledby(node, context) {
|
|
6642
|
-
const { document, reference } = context;
|
|
6643
|
-
/* if we already have resolved one level of reference we don't resolve another
|
|
6644
|
-
* level (as per accname step 2B) */
|
|
6645
|
-
if (reference) {
|
|
6646
|
-
return false;
|
|
6647
|
-
}
|
|
6648
|
-
const ariaLabelledby = node.ariaLabelledby;
|
|
6649
|
-
/* consider dynamic aria-labelledby as having a name as we cannot resolve it
|
|
6650
|
-
* so no way to prove correctness */
|
|
6651
|
-
if (ariaLabelledby instanceof DynamicValue) {
|
|
6652
|
-
return true;
|
|
6653
|
-
}
|
|
6654
|
-
/* ignore elements without aria-labelledby */
|
|
6655
|
-
if (ariaLabelledby === null) {
|
|
6656
|
-
return false;
|
|
6657
|
-
}
|
|
6658
|
-
return ariaLabelledby.some((id) => {
|
|
6659
|
-
const selector = generateIdSelector(id);
|
|
6660
|
-
return document.querySelectorAll(selector).some((child) => {
|
|
6661
|
-
return hasAccessibleNameImpl(child, {
|
|
6662
|
-
document,
|
|
6663
|
-
reference: child,
|
|
6664
|
-
});
|
|
6665
|
-
});
|
|
6666
|
-
});
|
|
6667
|
-
}
|
|
6668
|
-
/**
|
|
6669
|
-
* This algorithm is based on ["Accessible Name and Description Computation
|
|
6670
|
-
* 1.2"][accname] with some exceptions:
|
|
6671
|
-
*
|
|
6672
|
-
* It doesn't compute the actual name but only the presence of one, e.g. if a
|
|
6673
|
-
* non-empty flat string is present the algorithm terminates with a positive
|
|
6674
|
-
* result.
|
|
6675
|
-
*
|
|
6676
|
-
* It takes some optimization shortcuts such as starting with step F as it
|
|
6677
|
-
* would be more common usage and as there is no actual name being computed
|
|
6678
|
-
* the order wont matter.
|
|
6679
|
-
*
|
|
6680
|
-
* [accname]: https://w3c.github.io/accname
|
|
6681
|
-
*/
|
|
6682
|
-
function hasAccessibleNameImpl(current, context) {
|
|
6683
|
-
const { reference } = context;
|
|
6684
|
-
/* if this element is hidden (see function for exceptions) it does not have an accessible name */
|
|
6685
|
-
if (isHidden(current, context)) {
|
|
6686
|
-
return false;
|
|
6687
|
-
}
|
|
6688
|
-
/* special case: when this element is directly referenced by aria-labelledby
|
|
6689
|
-
* we ignore `hidden` */
|
|
6690
|
-
const ignoreHiddenRoot = Boolean(reference && reference.isSameNode(current));
|
|
6691
|
-
const text = classifyNodeText(current, { accessible: true, ignoreHiddenRoot });
|
|
6692
|
-
if (text !== exports.TextClassification.EMPTY_TEXT) {
|
|
6693
|
-
return true;
|
|
6694
|
-
}
|
|
6695
|
-
if (hasImgAltText(current, context)) {
|
|
6696
|
-
return true;
|
|
6697
|
-
}
|
|
6698
|
-
if (hasLabel(current)) {
|
|
6699
|
-
return true;
|
|
6700
|
-
}
|
|
6701
|
-
if (isLabelledby(current, context)) {
|
|
6702
|
-
return true;
|
|
6703
|
-
}
|
|
6704
|
-
return false;
|
|
6705
|
-
}
|
|
6706
|
-
/**
|
|
6707
|
-
* Returns `true` if the element has an accessible name.
|
|
6708
|
-
*
|
|
6709
|
-
* It does not yet consider if the elements role prohibits naming, e.g. a `<p>`
|
|
6710
|
-
* element will still show up as having an accessible name.
|
|
6711
|
-
*
|
|
6712
|
-
* @public
|
|
6713
|
-
* @param document - Document element.
|
|
6714
|
-
* @param current - The element to get accessible name for
|
|
6715
|
-
* @returns `true` if the element has an accessible name.
|
|
6716
|
-
*/
|
|
6717
|
-
function hasAccessibleName(document, current) {
|
|
6718
|
-
/* istanbul ignore next: we're not testing cache */
|
|
6719
|
-
if (current.cacheExists(HAS_ACCESSIBLE_TEXT_CACHE)) {
|
|
6720
|
-
return Boolean(current.cacheGet(HAS_ACCESSIBLE_TEXT_CACHE));
|
|
6721
|
-
}
|
|
6722
|
-
const result = hasAccessibleNameImpl(current, {
|
|
6723
|
-
document,
|
|
6724
|
-
reference: null,
|
|
6725
|
-
});
|
|
6726
|
-
return current.cacheSet(HAS_ACCESSIBLE_TEXT_CACHE, result);
|
|
6727
|
-
}
|
|
6728
|
-
|
|
6729
6254
|
function isIgnored(node) {
|
|
6730
6255
|
var _a;
|
|
6731
6256
|
if (node.is("input")) {
|
|
@@ -6748,7 +6273,7 @@ class InputMissingLabel extends Rule {
|
|
|
6748
6273
|
" - Use a nested `<label>` as parent element.",
|
|
6749
6274
|
" - Use `aria-label` or `aria-labelledby` attributes.",
|
|
6750
6275
|
].join("\n"),
|
|
6751
|
-
url:
|
|
6276
|
+
url: "https://html-validate.org/rules/input-missing-label.html",
|
|
6752
6277
|
};
|
|
6753
6278
|
}
|
|
6754
6279
|
setup() {
|
|
@@ -6760,14 +6285,14 @@ class InputMissingLabel extends Rule {
|
|
|
6760
6285
|
});
|
|
6761
6286
|
}
|
|
6762
6287
|
validateInput(root, elem) {
|
|
6763
|
-
if (isHTMLHidden(elem) || isAriaHidden(elem)) {
|
|
6288
|
+
if (rulesHelper.isHTMLHidden(elem) || rulesHelper.isAriaHidden(elem)) {
|
|
6764
6289
|
return;
|
|
6765
6290
|
}
|
|
6766
6291
|
/* hidden, submit, reset or button should not have label */
|
|
6767
6292
|
if (isIgnored(elem)) {
|
|
6768
6293
|
return;
|
|
6769
6294
|
}
|
|
6770
|
-
if (hasAccessibleName(root, elem)) {
|
|
6295
|
+
if (rulesHelper.hasAccessibleName(root, elem)) {
|
|
6771
6296
|
return;
|
|
6772
6297
|
}
|
|
6773
6298
|
let label = [];
|
|
@@ -6800,13 +6325,13 @@ class InputMissingLabel extends Rule {
|
|
|
6800
6325
|
this.report(elem, `<${elem.tagName}> element has <label> but <label> element is hidden`);
|
|
6801
6326
|
return;
|
|
6802
6327
|
}
|
|
6803
|
-
if (!labels.some((label) => hasAccessibleName(root, label))) {
|
|
6328
|
+
if (!labels.some((label) => rulesHelper.hasAccessibleName(root, label))) {
|
|
6804
6329
|
this.report(elem, `<${elem.tagName}> element has <label> but <label> has no text`);
|
|
6805
6330
|
}
|
|
6806
6331
|
}
|
|
6807
6332
|
}
|
|
6808
6333
|
function isVisible(elem) {
|
|
6809
|
-
const hidden = isHTMLHidden(elem) || isAriaHidden(elem);
|
|
6334
|
+
const hidden = rulesHelper.isHTMLHidden(elem) || rulesHelper.isAriaHidden(elem);
|
|
6810
6335
|
return !hidden;
|
|
6811
6336
|
}
|
|
6812
6337
|
function findLabelById(root, id) {
|
|
@@ -6843,7 +6368,7 @@ class LongTitle extends Rule {
|
|
|
6843
6368
|
documentation() {
|
|
6844
6369
|
return {
|
|
6845
6370
|
description: `Search engines truncates titles with long text, possibly down-ranking the page in the process.`,
|
|
6846
|
-
url:
|
|
6371
|
+
url: "https://html-validate.org/rules/long-title.html",
|
|
6847
6372
|
};
|
|
6848
6373
|
}
|
|
6849
6374
|
setup() {
|
|
@@ -6863,7 +6388,7 @@ class MetaRefresh extends Rule {
|
|
|
6863
6388
|
documentation() {
|
|
6864
6389
|
return {
|
|
6865
6390
|
description: `Meta refresh directive must use the \`0;url=...\` format. Non-zero values for time interval is disallowed as people with assistive technology might be unable to read and understand the page content before automatically reloading. For the same reason skipping the url is disallowed as it would put the browser in an infinite loop reloading the same page over and over again.`,
|
|
6866
|
-
url:
|
|
6391
|
+
url: "https://html-validate.org/rules/meta-refresh.html",
|
|
6867
6392
|
};
|
|
6868
6393
|
}
|
|
6869
6394
|
setup() {
|
|
@@ -6917,7 +6442,7 @@ class MissingDoctype extends Rule {
|
|
|
6917
6442
|
documentation() {
|
|
6918
6443
|
return {
|
|
6919
6444
|
description: "Requires that the document contains a doctype.",
|
|
6920
|
-
url:
|
|
6445
|
+
url: "https://html-validate.org/rules/missing-doctype.html",
|
|
6921
6446
|
};
|
|
6922
6447
|
}
|
|
6923
6448
|
setup() {
|
|
@@ -6938,7 +6463,7 @@ class MultipleLabeledControls extends Rule {
|
|
|
6938
6463
|
documentation() {
|
|
6939
6464
|
return {
|
|
6940
6465
|
description: `A \`<label>\` element can only be associated with one control at a time.`,
|
|
6941
|
-
url:
|
|
6466
|
+
url: "https://html-validate.org/rules/multiple-labeled-controls.html",
|
|
6942
6467
|
};
|
|
6943
6468
|
}
|
|
6944
6469
|
setup() {
|
|
@@ -6993,7 +6518,7 @@ class NoAutoplay extends Rule {
|
|
|
6993
6518
|
"Autoplaying content can be disruptive for users and has accessibilty concerns.",
|
|
6994
6519
|
"Prefer to let the user control playback.",
|
|
6995
6520
|
].join("\n"),
|
|
6996
|
-
url:
|
|
6521
|
+
url: "https://html-validate.org/rules/no-autoplay.html",
|
|
6997
6522
|
};
|
|
6998
6523
|
}
|
|
6999
6524
|
static schema() {
|
|
@@ -7053,7 +6578,7 @@ class NoConditionalComment extends Rule {
|
|
|
7053
6578
|
documentation() {
|
|
7054
6579
|
return {
|
|
7055
6580
|
description: "Microsoft Internet Explorer previously supported using special HTML comments (conditional comments) for targeting specific versions of IE but since IE 10 it is deprecated and not supported in standards mode.",
|
|
7056
|
-
url:
|
|
6581
|
+
url: "https://html-validate.org/rules/no-conditional-comment.html",
|
|
7057
6582
|
};
|
|
7058
6583
|
}
|
|
7059
6584
|
setup() {
|
|
@@ -7067,7 +6592,7 @@ class NoDeprecatedAttr extends Rule {
|
|
|
7067
6592
|
documentation() {
|
|
7068
6593
|
return {
|
|
7069
6594
|
description: "HTML5 deprecated many old attributes.",
|
|
7070
|
-
url:
|
|
6595
|
+
url: "https://html-validate.org/rules/no-deprecated-attr.html",
|
|
7071
6596
|
};
|
|
7072
6597
|
}
|
|
7073
6598
|
setup() {
|
|
@@ -7095,7 +6620,7 @@ class NoDupAttr extends Rule {
|
|
|
7095
6620
|
documentation() {
|
|
7096
6621
|
return {
|
|
7097
6622
|
description: "HTML disallows two or more attributes with the same (case-insensitive) name.",
|
|
7098
|
-
url:
|
|
6623
|
+
url: "https://html-validate.org/rules/no-dup-attr.html",
|
|
7099
6624
|
};
|
|
7100
6625
|
}
|
|
7101
6626
|
setup() {
|
|
@@ -7122,7 +6647,7 @@ class NoDupClass extends Rule {
|
|
|
7122
6647
|
documentation() {
|
|
7123
6648
|
return {
|
|
7124
6649
|
description: "Prevents unnecessary duplication of class names.",
|
|
7125
|
-
url:
|
|
6650
|
+
url: "https://html-validate.org/rules/no-dup-class.html",
|
|
7126
6651
|
};
|
|
7127
6652
|
}
|
|
7128
6653
|
setup() {
|
|
@@ -7147,7 +6672,7 @@ class NoDupID extends Rule {
|
|
|
7147
6672
|
documentation() {
|
|
7148
6673
|
return {
|
|
7149
6674
|
description: "The ID of an element must be unique.",
|
|
7150
|
-
url:
|
|
6675
|
+
url: "https://html-validate.org/rules/no-dup-id.html",
|
|
7151
6676
|
};
|
|
7152
6677
|
}
|
|
7153
6678
|
setup() {
|
|
@@ -7194,7 +6719,7 @@ class NoImplicitClose extends Rule {
|
|
|
7194
6719
|
description: `Some elements in HTML has optional end tags. When an optional tag is omitted a browser must handle it as if the end tag was present.
|
|
7195
6720
|
|
|
7196
6721
|
Omitted end tags can be ambigious for humans to read and many editors have trouble formatting the markup.`,
|
|
7197
|
-
url:
|
|
6722
|
+
url: "https://html-validate.org/rules/no-implicit-close.html",
|
|
7198
6723
|
};
|
|
7199
6724
|
}
|
|
7200
6725
|
setup() {
|
|
@@ -7280,7 +6805,7 @@ class NoInlineStyle extends Rule {
|
|
|
7280
6805
|
}
|
|
7281
6806
|
return {
|
|
7282
6807
|
description: text.join("\n"),
|
|
7283
|
-
url:
|
|
6808
|
+
url: "https://html-validate.org/rules/no-inline-style.html",
|
|
7284
6809
|
};
|
|
7285
6810
|
}
|
|
7286
6811
|
setup() {
|
|
@@ -7341,13 +6866,13 @@ class NoMissingReferences extends Rule {
|
|
|
7341
6866
|
if (context) {
|
|
7342
6867
|
return {
|
|
7343
6868
|
description: `The element ID "${context.value}" referenced by the ${context.key} attribute must point to an existing element.`,
|
|
7344
|
-
url:
|
|
6869
|
+
url: "https://html-validate.org/rules/no-missing-references.html",
|
|
7345
6870
|
};
|
|
7346
6871
|
}
|
|
7347
6872
|
else {
|
|
7348
6873
|
return {
|
|
7349
6874
|
description: `The element ID referenced by the attribute must point to an existing element.`,
|
|
7350
|
-
url:
|
|
6875
|
+
url: "https://html-validate.org/rules/no-missing-references.html",
|
|
7351
6876
|
};
|
|
7352
6877
|
}
|
|
7353
6878
|
}
|
|
@@ -7417,7 +6942,7 @@ class NoMultipleMain extends Rule {
|
|
|
7417
6942
|
"",
|
|
7418
6943
|
"Multiple `<main>` can be present in the DOM as long the others are hidden using the HTML5 `hidden` attribute.",
|
|
7419
6944
|
].join("\n"),
|
|
7420
|
-
url:
|
|
6945
|
+
url: "https://html-validate.org/rules/no-multiple-main.html",
|
|
7421
6946
|
};
|
|
7422
6947
|
}
|
|
7423
6948
|
setup() {
|
|
@@ -7463,7 +6988,7 @@ class NoRawCharacters extends Rule {
|
|
|
7463
6988
|
documentation() {
|
|
7464
6989
|
return {
|
|
7465
6990
|
description: `Some characters such as \`<\`, \`>\` and \`&\` hold special meaning in HTML and must be escaped using a character reference (html entity).`,
|
|
7466
|
-
url:
|
|
6991
|
+
url: "https://html-validate.org/rules/no-raw-characters.html",
|
|
7467
6992
|
};
|
|
7468
6993
|
}
|
|
7469
6994
|
setup() {
|
|
@@ -7528,7 +7053,7 @@ class NoRedundantFor extends Rule {
|
|
|
7528
7053
|
documentation() {
|
|
7529
7054
|
return {
|
|
7530
7055
|
description: `When the \`<label>\` element wraps the labelable control the \`for\` attribute is redundant and better left out.`,
|
|
7531
|
-
url:
|
|
7056
|
+
url: "https://html-validate.org/rules/no-redundant-for.html",
|
|
7532
7057
|
};
|
|
7533
7058
|
}
|
|
7534
7059
|
setup() {
|
|
@@ -7590,7 +7115,7 @@ class NoRedundantRole extends Rule {
|
|
|
7590
7115
|
documentation(context) {
|
|
7591
7116
|
const doc = {
|
|
7592
7117
|
description: `Using this role is redundant as it is already implied by the element.`,
|
|
7593
|
-
url:
|
|
7118
|
+
url: "https://html-validate.org/rules/no-redundant-role.html",
|
|
7594
7119
|
};
|
|
7595
7120
|
if (context) {
|
|
7596
7121
|
doc.description = `Using the "${context.role}" role is redundant as it is already implied by the <${context.tagname}> element.`;
|
|
@@ -7650,7 +7175,7 @@ class NoSelfClosing extends Rule {
|
|
|
7650
7175
|
tagName = tagName || "element";
|
|
7651
7176
|
return {
|
|
7652
7177
|
description: `Self-closing elements are disallowed. Use regular end tag <${tagName}></${tagName}> instead of self-closing <${tagName}/>.`,
|
|
7653
|
-
url:
|
|
7178
|
+
url: "https://html-validate.org/rules/no-self-closing.html",
|
|
7654
7179
|
};
|
|
7655
7180
|
}
|
|
7656
7181
|
setup() {
|
|
@@ -7694,7 +7219,7 @@ class NoStyleTag extends Rule {
|
|
|
7694
7219
|
documentation() {
|
|
7695
7220
|
return {
|
|
7696
7221
|
description: "Prefer to use external stylesheets with the `<link>` tag instead of inlining the styling.",
|
|
7697
|
-
url:
|
|
7222
|
+
url: "https://html-validate.org/rules/no-style-tag.html",
|
|
7698
7223
|
};
|
|
7699
7224
|
}
|
|
7700
7225
|
setup() {
|
|
@@ -7711,7 +7236,7 @@ class NoTrailingWhitespace extends Rule {
|
|
|
7711
7236
|
documentation() {
|
|
7712
7237
|
return {
|
|
7713
7238
|
description: "Lines with trailing whitespace cause unnessecary diff when using version control and usually serve no special purpose in HTML.",
|
|
7714
|
-
url:
|
|
7239
|
+
url: "https://html-validate.org/rules/no-trailing-whitespace.html",
|
|
7715
7240
|
};
|
|
7716
7241
|
}
|
|
7717
7242
|
setup() {
|
|
@@ -7728,7 +7253,7 @@ class NoUnknownElements extends Rule {
|
|
|
7728
7253
|
const element = context ? ` <${context}>` : "";
|
|
7729
7254
|
return {
|
|
7730
7255
|
description: `An unknown element${element} was used. If this is a Custom Element you need to supply element metadata for it.`,
|
|
7731
|
-
url:
|
|
7256
|
+
url: "https://html-validate.org/rules/no-unknown-elements.html",
|
|
7732
7257
|
};
|
|
7733
7258
|
}
|
|
7734
7259
|
setup() {
|
|
@@ -7745,7 +7270,7 @@ class NoUtf8Bom extends Rule {
|
|
|
7745
7270
|
documentation() {
|
|
7746
7271
|
return {
|
|
7747
7272
|
description: `This file is saved with the UTF-8 byte order mark (BOM) present. It is neither required or recommended to use.\n\nInstead the document should be served with the \`Content-Type: application/javascript; charset=utf-8\` header.`,
|
|
7748
|
-
url:
|
|
7273
|
+
url: "https://html-validate.org/rules/no-utf8-bom.html",
|
|
7749
7274
|
};
|
|
7750
7275
|
}
|
|
7751
7276
|
setup() {
|
|
@@ -7808,7 +7333,7 @@ class PreferButton extends Rule {
|
|
|
7808
7333
|
documentation(context) {
|
|
7809
7334
|
const doc = {
|
|
7810
7335
|
description: `Prefer to use the generic \`<button>\` element instead of \`<input>\`.`,
|
|
7811
|
-
url:
|
|
7336
|
+
url: "https://html-validate.org/rules/prefer-button.html",
|
|
7812
7337
|
};
|
|
7813
7338
|
if (context) {
|
|
7814
7339
|
const src = `<input type="${context.type}">`;
|
|
@@ -7916,7 +7441,7 @@ class PreferNativeElement extends Rule {
|
|
|
7916
7441
|
documentation(context) {
|
|
7917
7442
|
const doc = {
|
|
7918
7443
|
description: `Instead of using WAI-ARIA roles prefer to use the native HTML elements.`,
|
|
7919
|
-
url:
|
|
7444
|
+
url: "https://html-validate.org/rules/prefer-native-element.html",
|
|
7920
7445
|
};
|
|
7921
7446
|
if (context) {
|
|
7922
7447
|
doc.description = `Instead of using the WAI-ARIA role "${context.role}" prefer to use the native <${context.replacement}> element.`;
|
|
@@ -7979,7 +7504,7 @@ class PreferTbody extends Rule {
|
|
|
7979
7504
|
documentation() {
|
|
7980
7505
|
return {
|
|
7981
7506
|
description: `While \`<tbody>\` is optional is relays semantic information about its contents. Where applicable it should also be combined with \`<thead>\` and \`<tfoot>\`.`,
|
|
7982
|
-
url:
|
|
7507
|
+
url: "https://html-validate.org/rules/prefer-tbody.html",
|
|
7983
7508
|
};
|
|
7984
7509
|
}
|
|
7985
7510
|
setup() {
|
|
@@ -8027,7 +7552,7 @@ class RequireCSPNonce extends Rule {
|
|
|
8027
7552
|
"The nonce should be unique per each request and set to a cryptography secure random token.",
|
|
8028
7553
|
"It is used to prevent cross site scripting (XSS) by preventing malicious actors from injecting scripts onto the page.",
|
|
8029
7554
|
].join("\n"),
|
|
8030
|
-
url:
|
|
7555
|
+
url: "https://html-validate.org/rules/require-csp-nonce.html",
|
|
8031
7556
|
};
|
|
8032
7557
|
}
|
|
8033
7558
|
setup() {
|
|
@@ -8106,7 +7631,7 @@ class RequireSri extends Rule {
|
|
|
8106
7631
|
documentation() {
|
|
8107
7632
|
return {
|
|
8108
7633
|
description: `Subresource Integrity (SRI) \`integrity\` attribute is required to prevent manipulation from Content Delivery Networks or other third-party hosting.`,
|
|
8109
|
-
url:
|
|
7634
|
+
url: "https://html-validate.org/rules/require-sri.html",
|
|
8110
7635
|
};
|
|
8111
7636
|
}
|
|
8112
7637
|
setup() {
|
|
@@ -8152,7 +7677,7 @@ class ScriptElement extends Rule {
|
|
|
8152
7677
|
documentation() {
|
|
8153
7678
|
return {
|
|
8154
7679
|
description: "The end tag for `<script>` is a hard requirement and must never be omitted even when using the `src` attribute.",
|
|
8155
|
-
url:
|
|
7680
|
+
url: "https://html-validate.org/rules/script-element.html",
|
|
8156
7681
|
};
|
|
8157
7682
|
}
|
|
8158
7683
|
setup() {
|
|
@@ -8179,7 +7704,7 @@ class ScriptType extends Rule {
|
|
|
8179
7704
|
documentation() {
|
|
8180
7705
|
return {
|
|
8181
7706
|
description: "While valid the HTML5 standard encourages authors to omit the type element for JavaScript resources.",
|
|
8182
|
-
url:
|
|
7707
|
+
url: "https://html-validate.org/rules/script-type.html",
|
|
8183
7708
|
};
|
|
8184
7709
|
}
|
|
8185
7710
|
setup() {
|
|
@@ -8210,7 +7735,7 @@ class SvgFocusable extends Rule {
|
|
|
8210
7735
|
documentation() {
|
|
8211
7736
|
return {
|
|
8212
7737
|
description: `Inline SVG elements in IE are focusable by default which may cause issues with tab-ordering. The \`focusable\` attribute should explicitly be set to avoid unintended behaviour.`,
|
|
8213
|
-
url:
|
|
7738
|
+
url: "https://html-validate.org/rules/svg-focusable.html",
|
|
8214
7739
|
};
|
|
8215
7740
|
}
|
|
8216
7741
|
setup() {
|
|
@@ -8323,7 +7848,7 @@ class TelNonBreaking extends Rule {
|
|
|
8323
7848
|
"",
|
|
8324
7849
|
...replacements,
|
|
8325
7850
|
].join("\n"),
|
|
8326
|
-
url:
|
|
7851
|
+
url: "https://html-validate.org/rules/tel-non-breaking.html",
|
|
8327
7852
|
};
|
|
8328
7853
|
}
|
|
8329
7854
|
setup() {
|
|
@@ -8442,7 +7967,7 @@ function isNonEmptyText(node) {
|
|
|
8442
7967
|
* - Elements with default text
|
|
8443
7968
|
*/
|
|
8444
7969
|
function haveAccessibleText(node) {
|
|
8445
|
-
if (!inAccessibilityTree(node)) {
|
|
7970
|
+
if (!rulesHelper.inAccessibilityTree(node)) {
|
|
8446
7971
|
return false;
|
|
8447
7972
|
}
|
|
8448
7973
|
/* check direct descendants for non-empty or dynamic text */
|
|
@@ -8470,7 +7995,7 @@ class TextContent extends Rule {
|
|
|
8470
7995
|
documentation(context) {
|
|
8471
7996
|
const doc = {
|
|
8472
7997
|
description: `The textual content for this element is not valid.`,
|
|
8473
|
-
url:
|
|
7998
|
+
url: "https://html-validate.org/rules/text-content.html",
|
|
8474
7999
|
};
|
|
8475
8000
|
if (context === null || context === void 0 ? void 0 : context.textContent) {
|
|
8476
8001
|
switch (context.textContent) {
|
|
@@ -8521,7 +8046,7 @@ class TextContent extends Rule {
|
|
|
8521
8046
|
* Validate element has empty text (inter-element whitespace is not considered text)
|
|
8522
8047
|
*/
|
|
8523
8048
|
validateNone(node) {
|
|
8524
|
-
if (classifyNodeText(node) ===
|
|
8049
|
+
if (rulesHelper.classifyNodeText(node) === rulesHelper.TextClassification.EMPTY_TEXT) {
|
|
8525
8050
|
return;
|
|
8526
8051
|
}
|
|
8527
8052
|
this.reportError(node, node.meta, `${node.annotatedName} must not have text content`);
|
|
@@ -8530,7 +8055,7 @@ class TextContent extends Rule {
|
|
|
8530
8055
|
* Validate element has any text (inter-element whitespace is not considered text)
|
|
8531
8056
|
*/
|
|
8532
8057
|
validateRequired(node) {
|
|
8533
|
-
if (classifyNodeText(node) !==
|
|
8058
|
+
if (rulesHelper.classifyNodeText(node) !== rulesHelper.TextClassification.EMPTY_TEXT) {
|
|
8534
8059
|
return;
|
|
8535
8060
|
}
|
|
8536
8061
|
this.reportError(node, node.meta, `${node.annotatedName} must have text content`);
|
|
@@ -8541,7 +8066,7 @@ class TextContent extends Rule {
|
|
|
8541
8066
|
*/
|
|
8542
8067
|
validateAccessible(node) {
|
|
8543
8068
|
/* skip this element if the element isn't present in accessibility tree */
|
|
8544
|
-
if (!inAccessibilityTree(node)) {
|
|
8069
|
+
if (!rulesHelper.inAccessibilityTree(node)) {
|
|
8545
8070
|
return;
|
|
8546
8071
|
}
|
|
8547
8072
|
/* if the element or a child has aria-label, alt or default text, etc the
|
|
@@ -8559,1737 +8084,12 @@ class TextContent extends Rule {
|
|
|
8559
8084
|
}
|
|
8560
8085
|
}
|
|
8561
8086
|
|
|
8562
|
-
var entities$1 = [
|
|
8563
|
-
"á",
|
|
8564
|
-
"ă",
|
|
8565
|
-
"∾",
|
|
8566
|
-
"∿",
|
|
8567
|
-
"&ace;",
|
|
8568
|
-
"â",
|
|
8569
|
-
"´",
|
|
8570
|
-
"а",
|
|
8571
|
-
"æ",
|
|
8572
|
-
"⁡",
|
|
8573
|
-
"𝔞",
|
|
8574
|
-
"à",
|
|
8575
|
-
"ℵ",
|
|
8576
|
-
"ℵ",
|
|
8577
|
-
"α",
|
|
8578
|
-
"ā",
|
|
8579
|
-
"⨿",
|
|
8580
|
-
"&",
|
|
8581
|
-
"∧",
|
|
8582
|
-
"⩕",
|
|
8583
|
-
"⩜",
|
|
8584
|
-
"⩘",
|
|
8585
|
-
"⩚",
|
|
8586
|
-
"∠",
|
|
8587
|
-
"⦤",
|
|
8588
|
-
"∠",
|
|
8589
|
-
"∡",
|
|
8590
|
-
"⦨",
|
|
8591
|
-
"⦩",
|
|
8592
|
-
"⦪",
|
|
8593
|
-
"⦫",
|
|
8594
|
-
"⦬",
|
|
8595
|
-
"⦭",
|
|
8596
|
-
"⦮",
|
|
8597
|
-
"⦯",
|
|
8598
|
-
"∟",
|
|
8599
|
-
"⊾",
|
|
8600
|
-
"⦝",
|
|
8601
|
-
"∢",
|
|
8602
|
-
"Å",
|
|
8603
|
-
"⍼",
|
|
8604
|
-
"ą",
|
|
8605
|
-
"𝕒",
|
|
8606
|
-
"≈",
|
|
8607
|
-
"⩯",
|
|
8608
|
-
"≊",
|
|
8609
|
-
"≋",
|
|
8610
|
-
"'",
|
|
8611
|
-
"&applyfunction;",
|
|
8612
|
-
"≈",
|
|
8613
|
-
"≊",
|
|
8614
|
-
"å",
|
|
8615
|
-
"𝒶",
|
|
8616
|
-
"&assign;",
|
|
8617
|
-
"*",
|
|
8618
|
-
"≈",
|
|
8619
|
-
"≍",
|
|
8620
|
-
"ã",
|
|
8621
|
-
"ä",
|
|
8622
|
-
"∳",
|
|
8623
|
-
"⨑",
|
|
8624
|
-
"≌",
|
|
8625
|
-
"϶",
|
|
8626
|
-
"‵",
|
|
8627
|
-
"∽",
|
|
8628
|
-
"⋍",
|
|
8629
|
-
"&backslash;",
|
|
8630
|
-
"&barv;",
|
|
8631
|
-
"⊽",
|
|
8632
|
-
"⌅",
|
|
8633
|
-
"⌅",
|
|
8634
|
-
"⎵",
|
|
8635
|
-
"⎶",
|
|
8636
|
-
"≌",
|
|
8637
|
-
"б",
|
|
8638
|
-
"„",
|
|
8639
|
-
"∵",
|
|
8640
|
-
"∵",
|
|
8641
|
-
"⦰",
|
|
8642
|
-
"϶",
|
|
8643
|
-
"ℬ",
|
|
8644
|
-
"&bernoullis;",
|
|
8645
|
-
"β",
|
|
8646
|
-
"ℶ",
|
|
8647
|
-
"≬",
|
|
8648
|
-
"𝔟",
|
|
8649
|
-
"⋂",
|
|
8650
|
-
"◯",
|
|
8651
|
-
"⋃",
|
|
8652
|
-
"⨀",
|
|
8653
|
-
"⨁",
|
|
8654
|
-
"⨂",
|
|
8655
|
-
"⨆",
|
|
8656
|
-
"★",
|
|
8657
|
-
"▽",
|
|
8658
|
-
"△",
|
|
8659
|
-
"⨄",
|
|
8660
|
-
"⋁",
|
|
8661
|
-
"⋀",
|
|
8662
|
-
"⤍",
|
|
8663
|
-
"⧫",
|
|
8664
|
-
"▪",
|
|
8665
|
-
"▴",
|
|
8666
|
-
"▾",
|
|
8667
|
-
"◂",
|
|
8668
|
-
"▸",
|
|
8669
|
-
"␣",
|
|
8670
|
-
"▒",
|
|
8671
|
-
"░",
|
|
8672
|
-
"▓",
|
|
8673
|
-
"█",
|
|
8674
|
-
"=⃥",
|
|
8675
|
-
"≡⃥",
|
|
8676
|
-
"⌐",
|
|
8677
|
-
"𝕓",
|
|
8678
|
-
"⊥",
|
|
8679
|
-
"⊥",
|
|
8680
|
-
"⋈",
|
|
8681
|
-
"⧉",
|
|
8682
|
-
"┐",
|
|
8683
|
-
"┌",
|
|
8684
|
-
"─",
|
|
8685
|
-
"┬",
|
|
8686
|
-
"┴",
|
|
8687
|
-
"⊟",
|
|
8688
|
-
"⊞",
|
|
8689
|
-
"⊠",
|
|
8690
|
-
"┘",
|
|
8691
|
-
"└",
|
|
8692
|
-
"│",
|
|
8693
|
-
"┼",
|
|
8694
|
-
"┤",
|
|
8695
|
-
"├",
|
|
8696
|
-
"‵",
|
|
8697
|
-
"˘",
|
|
8698
|
-
"¦",
|
|
8699
|
-
"𝒷",
|
|
8700
|
-
"⁏",
|
|
8701
|
-
"∽",
|
|
8702
|
-
"⋍",
|
|
8703
|
-
"\",
|
|
8704
|
-
"⧅",
|
|
8705
|
-
"⟈",
|
|
8706
|
-
"•",
|
|
8707
|
-
"•",
|
|
8708
|
-
"≎",
|
|
8709
|
-
"≏",
|
|
8710
|
-
"≏",
|
|
8711
|
-
"ć",
|
|
8712
|
-
"∩",
|
|
8713
|
-
"⩄",
|
|
8714
|
-
"⩉",
|
|
8715
|
-
"⩋",
|
|
8716
|
-
"⩇",
|
|
8717
|
-
"⩀",
|
|
8718
|
-
"&capitaldifferentiald;",
|
|
8719
|
-
"∩︀",
|
|
8720
|
-
"⁁",
|
|
8721
|
-
"ˇ",
|
|
8722
|
-
"&cayleys;",
|
|
8723
|
-
"⩍",
|
|
8724
|
-
"č",
|
|
8725
|
-
"ç",
|
|
8726
|
-
"ĉ",
|
|
8727
|
-
"&cconint;",
|
|
8728
|
-
"⩌",
|
|
8729
|
-
"⩐",
|
|
8730
|
-
"ċ",
|
|
8731
|
-
"¸",
|
|
8732
|
-
"¸la;",
|
|
8733
|
-
"⦲",
|
|
8734
|
-
"¢",
|
|
8735
|
-
"·",
|
|
8736
|
-
"𝔠",
|
|
8737
|
-
"ч",
|
|
8738
|
-
"✓",
|
|
8739
|
-
"✓",
|
|
8740
|
-
"χ",
|
|
8741
|
-
"○",
|
|
8742
|
-
"ˆ",
|
|
8743
|
-
"≗",
|
|
8744
|
-
"↺",
|
|
8745
|
-
"↻",
|
|
8746
|
-
"⊛",
|
|
8747
|
-
"⊚",
|
|
8748
|
-
"⊝",
|
|
8749
|
-
"&circledot;",
|
|
8750
|
-
"&circledr;",
|
|
8751
|
-
"&circleds;",
|
|
8752
|
-
"&circleminus;",
|
|
8753
|
-
"&circleplus;",
|
|
8754
|
-
"&circletimes;",
|
|
8755
|
-
"≗",
|
|
8756
|
-
"⨐",
|
|
8757
|
-
"⫯",
|
|
8758
|
-
"⧂",
|
|
8759
|
-
"&clockwisecontourintegral;",
|
|
8760
|
-
"&closecurlydoublequote;",
|
|
8761
|
-
"&closecurlyquote;",
|
|
8762
|
-
"♣",
|
|
8763
|
-
"♣",
|
|
8764
|
-
":",
|
|
8765
|
-
"≔",
|
|
8766
|
-
"≔",
|
|
8767
|
-
",",
|
|
8768
|
-
"@",
|
|
8769
|
-
"∁",
|
|
8770
|
-
"∘",
|
|
8771
|
-
"∁",
|
|
8772
|
-
"ℂ",
|
|
8773
|
-
"≅",
|
|
8774
|
-
"⩭",
|
|
8775
|
-
"&congruent;",
|
|
8776
|
-
"∮",
|
|
8777
|
-
"&contourintegral;",
|
|
8778
|
-
"𝕔",
|
|
8779
|
-
"∐",
|
|
8780
|
-
"&coproduct;",
|
|
8781
|
-
"©",
|
|
8782
|
-
"℗",
|
|
8783
|
-
"&counterclockwisecontourintegral;",
|
|
8784
|
-
"↵",
|
|
8785
|
-
"✗",
|
|
8786
|
-
"𝒸",
|
|
8787
|
-
"⫏",
|
|
8788
|
-
"⫑",
|
|
8789
|
-
"⫐",
|
|
8790
|
-
"⫒",
|
|
8791
|
-
"⋯",
|
|
8792
|
-
"⤸",
|
|
8793
|
-
"⤵",
|
|
8794
|
-
"⋞",
|
|
8795
|
-
"⋟",
|
|
8796
|
-
"↶",
|
|
8797
|
-
"⤽",
|
|
8798
|
-
"∪",
|
|
8799
|
-
"⩈",
|
|
8800
|
-
"⩆",
|
|
8801
|
-
"⩊",
|
|
8802
|
-
"⊍",
|
|
8803
|
-
"⩅",
|
|
8804
|
-
"∪︀",
|
|
8805
|
-
"↷",
|
|
8806
|
-
"⤼",
|
|
8807
|
-
"⋞",
|
|
8808
|
-
"⋟",
|
|
8809
|
-
"⋎",
|
|
8810
|
-
"⋏",
|
|
8811
|
-
"¤",
|
|
8812
|
-
"↶",
|
|
8813
|
-
"↷",
|
|
8814
|
-
"⋎",
|
|
8815
|
-
"⋏",
|
|
8816
|
-
"∲",
|
|
8817
|
-
"∱",
|
|
8818
|
-
"⌭",
|
|
8819
|
-
"†",
|
|
8820
|
-
"ℸ",
|
|
8821
|
-
"↓",
|
|
8822
|
-
"‐",
|
|
8823
|
-
"⊣",
|
|
8824
|
-
"⤏",
|
|
8825
|
-
"˝",
|
|
8826
|
-
"ď",
|
|
8827
|
-
"д",
|
|
8828
|
-
"ⅆ",
|
|
8829
|
-
"‡",
|
|
8830
|
-
"⇊",
|
|
8831
|
-
"&ddotrahd;",
|
|
8832
|
-
"⩷",
|
|
8833
|
-
"°",
|
|
8834
|
-
"&del;",
|
|
8835
|
-
"δ",
|
|
8836
|
-
"⦱",
|
|
8837
|
-
"⥿",
|
|
8838
|
-
"𝔡",
|
|
8839
|
-
"&dhar;",
|
|
8840
|
-
"⇃",
|
|
8841
|
-
"⇂",
|
|
8842
|
-
"&diacriticalacute;",
|
|
8843
|
-
"&diacriticaldot;",
|
|
8844
|
-
"&diacriticaldoubleacute;",
|
|
8845
|
-
"&diacriticalgrave;",
|
|
8846
|
-
"&diacriticaltilde;",
|
|
8847
|
-
"⋄",
|
|
8848
|
-
"⋄",
|
|
8849
|
-
"♦",
|
|
8850
|
-
"♦",
|
|
8851
|
-
"¨",
|
|
8852
|
-
"&differentiald;",
|
|
8853
|
-
"ϝ",
|
|
8854
|
-
"⋲",
|
|
8855
|
-
"÷",
|
|
8856
|
-
"÷",
|
|
8857
|
-
"⋇",
|
|
8858
|
-
"⋇",
|
|
8859
|
-
"ђ",
|
|
8860
|
-
"⌞",
|
|
8861
|
-
"⌍",
|
|
8862
|
-
"$",
|
|
8863
|
-
"𝕕",
|
|
8864
|
-
"˙",
|
|
8865
|
-
"&dotdot;",
|
|
8866
|
-
"≐",
|
|
8867
|
-
"≑",
|
|
8868
|
-
"&dotequal;",
|
|
8869
|
-
"∸",
|
|
8870
|
-
"∔",
|
|
8871
|
-
"⊡",
|
|
8872
|
-
"⌆",
|
|
8873
|
-
"&doublecontourintegral;",
|
|
8874
|
-
"&doubledot;",
|
|
8875
|
-
"&doubledownarrow;",
|
|
8876
|
-
"&doubleleftarrow;",
|
|
8877
|
-
"&doubleleftrightarrow;",
|
|
8878
|
-
"&doublelefttee;",
|
|
8879
|
-
"&doublelongleftarrow;",
|
|
8880
|
-
"&doublelongleftrightarrow;",
|
|
8881
|
-
"&doublelongrightarrow;",
|
|
8882
|
-
"&doublerightarrow;",
|
|
8883
|
-
"&doublerighttee;",
|
|
8884
|
-
"&doubleuparrow;",
|
|
8885
|
-
"&doubleupdownarrow;",
|
|
8886
|
-
"&doubleverticalbar;",
|
|
8887
|
-
"↓",
|
|
8888
|
-
"&downarrowbar;",
|
|
8889
|
-
"&downarrowuparrow;",
|
|
8890
|
-
"&downbreve;",
|
|
8891
|
-
"⇊",
|
|
8892
|
-
"⇃",
|
|
8893
|
-
"⇂",
|
|
8894
|
-
"&downleftrightvector;",
|
|
8895
|
-
"&downleftteevector;",
|
|
8896
|
-
"&downleftvector;",
|
|
8897
|
-
"&downleftvectorbar;",
|
|
8898
|
-
"&downrightteevector;",
|
|
8899
|
-
"&downrightvector;",
|
|
8900
|
-
"&downrightvectorbar;",
|
|
8901
|
-
"&downtee;",
|
|
8902
|
-
"&downteearrow;",
|
|
8903
|
-
"⤐",
|
|
8904
|
-
"⌟",
|
|
8905
|
-
"⌌",
|
|
8906
|
-
"𝒹",
|
|
8907
|
-
"ѕ",
|
|
8908
|
-
"⧶",
|
|
8909
|
-
"đ",
|
|
8910
|
-
"⋱",
|
|
8911
|
-
"▿",
|
|
8912
|
-
"▾",
|
|
8913
|
-
"⇵",
|
|
8914
|
-
"⥯",
|
|
8915
|
-
"⦦",
|
|
8916
|
-
"џ",
|
|
8917
|
-
"⟿",
|
|
8918
|
-
"é",
|
|
8919
|
-
"⩮",
|
|
8920
|
-
"ě",
|
|
8921
|
-
"≖",
|
|
8922
|
-
"ê",
|
|
8923
|
-
"≕",
|
|
8924
|
-
"э",
|
|
8925
|
-
"&eddot;",
|
|
8926
|
-
"ė",
|
|
8927
|
-
"ⅇ",
|
|
8928
|
-
"&efdot;",
|
|
8929
|
-
"𝔢",
|
|
8930
|
-
"⪚",
|
|
8931
|
-
"è",
|
|
8932
|
-
"⪖",
|
|
8933
|
-
"⪘",
|
|
8934
|
-
"⪙",
|
|
8935
|
-
"&element;",
|
|
8936
|
-
"⏧",
|
|
8937
|
-
"ℓ",
|
|
8938
|
-
"⪕",
|
|
8939
|
-
"⪗",
|
|
8940
|
-
"ē",
|
|
8941
|
-
"∅",
|
|
8942
|
-
"∅",
|
|
8943
|
-
"&emptysmallsquare;",
|
|
8944
|
-
"∅",
|
|
8945
|
-
"&emptyverysmallsquare;",
|
|
8946
|
-
" ",
|
|
8947
|
-
" ",
|
|
8948
|
-
" ",
|
|
8949
|
-
"ŋ",
|
|
8950
|
-
" ",
|
|
8951
|
-
"ę",
|
|
8952
|
-
"𝕖",
|
|
8953
|
-
"⋕",
|
|
8954
|
-
"⧣",
|
|
8955
|
-
"⩱",
|
|
8956
|
-
"ε",
|
|
8957
|
-
"ε",
|
|
8958
|
-
"ϵ",
|
|
8959
|
-
"≖",
|
|
8960
|
-
"≕",
|
|
8961
|
-
"≂",
|
|
8962
|
-
"⪖",
|
|
8963
|
-
"⪕",
|
|
8964
|
-
"&equal;",
|
|
8965
|
-
"=",
|
|
8966
|
-
"&equaltilde;",
|
|
8967
|
-
"≟",
|
|
8968
|
-
"&equilibrium;",
|
|
8969
|
-
"≡",
|
|
8970
|
-
"&equivdd;",
|
|
8971
|
-
"⧥",
|
|
8972
|
-
"⥱",
|
|
8973
|
-
"&erdot;",
|
|
8974
|
-
"ℯ",
|
|
8975
|
-
"≐",
|
|
8976
|
-
"≂",
|
|
8977
|
-
"η",
|
|
8978
|
-
"ð",
|
|
8979
|
-
"ë",
|
|
8980
|
-
"€",
|
|
8981
|
-
"!",
|
|
8982
|
-
"∃",
|
|
8983
|
-
"&exists;",
|
|
8984
|
-
"ℰ",
|
|
8985
|
-
"ⅇ",
|
|
8986
|
-
"≒",
|
|
8987
|
-
"ф",
|
|
8988
|
-
"♀",
|
|
8989
|
-
"ffi",
|
|
8990
|
-
"ff",
|
|
8991
|
-
"ffl",
|
|
8992
|
-
"𝔣",
|
|
8993
|
-
"fi",
|
|
8994
|
-
"&filledsmallsquare;",
|
|
8995
|
-
"&filledverysmallsquare;",
|
|
8996
|
-
"fj",
|
|
8997
|
-
"♭",
|
|
8998
|
-
"fl",
|
|
8999
|
-
"▱",
|
|
9000
|
-
"ƒ",
|
|
9001
|
-
"𝕗",
|
|
9002
|
-
"∀",
|
|
9003
|
-
"⋔",
|
|
9004
|
-
"⫙",
|
|
9005
|
-
"&fouriertrf;",
|
|
9006
|
-
"⨍",
|
|
9007
|
-
"½",
|
|
9008
|
-
"⅓",
|
|
9009
|
-
"¼",
|
|
9010
|
-
"⅕",
|
|
9011
|
-
"⅙",
|
|
9012
|
-
"⅛",
|
|
9013
|
-
"⅔",
|
|
9014
|
-
"⅖",
|
|
9015
|
-
"¾",
|
|
9016
|
-
"⅗",
|
|
9017
|
-
"⅜",
|
|
9018
|
-
"⅘",
|
|
9019
|
-
"⅚",
|
|
9020
|
-
"⅝",
|
|
9021
|
-
"⅞",
|
|
9022
|
-
"⁄",
|
|
9023
|
-
"⌢",
|
|
9024
|
-
"𝒻",
|
|
9025
|
-
"ǵ",
|
|
9026
|
-
"γ",
|
|
9027
|
-
"ϝ",
|
|
9028
|
-
"⪆",
|
|
9029
|
-
"ğ",
|
|
9030
|
-
"&gcedil;",
|
|
9031
|
-
"ĝ",
|
|
9032
|
-
"г",
|
|
9033
|
-
"ġ",
|
|
9034
|
-
"≥",
|
|
9035
|
-
"⋛",
|
|
9036
|
-
"≥",
|
|
9037
|
-
"≧",
|
|
9038
|
-
"⩾",
|
|
9039
|
-
"⩾",
|
|
9040
|
-
"⪩",
|
|
9041
|
-
"⪀",
|
|
9042
|
-
"⪂",
|
|
9043
|
-
"⪄",
|
|
9044
|
-
"⋛︀",
|
|
9045
|
-
"⪔",
|
|
9046
|
-
"𝔤",
|
|
9047
|
-
"≫",
|
|
9048
|
-
"⋙",
|
|
9049
|
-
"ℷ",
|
|
9050
|
-
"ѓ",
|
|
9051
|
-
"≷",
|
|
9052
|
-
"⪥",
|
|
9053
|
-
"&gle;",
|
|
9054
|
-
"⪤",
|
|
9055
|
-
"⪊",
|
|
9056
|
-
"⪊",
|
|
9057
|
-
"⪈",
|
|
9058
|
-
"⪈",
|
|
9059
|
-
"≩",
|
|
9060
|
-
"⋧",
|
|
9061
|
-
"𝕘",
|
|
9062
|
-
"`",
|
|
9063
|
-
"&greaterequal;",
|
|
9064
|
-
"&greaterequalless;",
|
|
9065
|
-
"&greaterfullequal;",
|
|
9066
|
-
"&greatergreater;",
|
|
9067
|
-
"&greaterless;",
|
|
9068
|
-
"&greaterslantequal;",
|
|
9069
|
-
"&greatertilde;",
|
|
9070
|
-
"ℊ",
|
|
9071
|
-
"≳",
|
|
9072
|
-
"⪎",
|
|
9073
|
-
"⪐",
|
|
9074
|
-
">",
|
|
9075
|
-
"⪧",
|
|
9076
|
-
"⩺",
|
|
9077
|
-
"⋗",
|
|
9078
|
-
">lpar;",
|
|
9079
|
-
"⩼",
|
|
9080
|
-
"⪆",
|
|
9081
|
-
"⥸",
|
|
9082
|
-
"⋗",
|
|
9083
|
-
"⋛",
|
|
9084
|
-
"⪌",
|
|
9085
|
-
"≷",
|
|
9086
|
-
"≳",
|
|
9087
|
-
"≩︀",
|
|
9088
|
-
"&gvne;",
|
|
9089
|
-
"&hacek;",
|
|
9090
|
-
" ",
|
|
9091
|
-
"½",
|
|
9092
|
-
"ℋ",
|
|
9093
|
-
"ъ",
|
|
9094
|
-
"↔",
|
|
9095
|
-
"⥈",
|
|
9096
|
-
"↭",
|
|
9097
|
-
"&hat;",
|
|
9098
|
-
"ℏ",
|
|
9099
|
-
"ĥ",
|
|
9100
|
-
"♥",
|
|
9101
|
-
"♥",
|
|
9102
|
-
"…",
|
|
9103
|
-
"⊹",
|
|
9104
|
-
"𝔥",
|
|
9105
|
-
"&hilbertspace;",
|
|
9106
|
-
"⤥",
|
|
9107
|
-
"⤦",
|
|
9108
|
-
"⇿",
|
|
9109
|
-
"∻",
|
|
9110
|
-
"↩",
|
|
9111
|
-
"↪",
|
|
9112
|
-
"𝕙",
|
|
9113
|
-
"―",
|
|
9114
|
-
"&horizontalline;",
|
|
9115
|
-
"𝒽",
|
|
9116
|
-
"ℏ",
|
|
9117
|
-
"ħ",
|
|
9118
|
-
"&humpdownhump;",
|
|
9119
|
-
"&humpequal;",
|
|
9120
|
-
"⁃",
|
|
9121
|
-
"‐",
|
|
9122
|
-
"í",
|
|
9123
|
-
"⁣",
|
|
9124
|
-
"î",
|
|
9125
|
-
"и",
|
|
9126
|
-
"&idot;",
|
|
9127
|
-
"е",
|
|
9128
|
-
"¡",
|
|
9129
|
-
"⇔",
|
|
9130
|
-
"𝔦",
|
|
9131
|
-
"ì",
|
|
9132
|
-
"ⅈ",
|
|
9133
|
-
"⨌",
|
|
9134
|
-
"∭",
|
|
9135
|
-
"⧜",
|
|
9136
|
-
"℩",
|
|
9137
|
-
"ij",
|
|
9138
|
-
"&im;",
|
|
9139
|
-
"ī",
|
|
9140
|
-
"ℑ",
|
|
9141
|
-
"&imaginaryi;",
|
|
9142
|
-
"ℐ",
|
|
9143
|
-
"ℑ",
|
|
9144
|
-
"ı",
|
|
9145
|
-
"⊷",
|
|
9146
|
-
"Ƶ",
|
|
9147
|
-
"&implies;",
|
|
9148
|
-
"∈",
|
|
9149
|
-
"℅",
|
|
9150
|
-
"∞",
|
|
9151
|
-
"⧝",
|
|
9152
|
-
"ı",
|
|
9153
|
-
"∫",
|
|
9154
|
-
"⊺",
|
|
9155
|
-
"ℤ",
|
|
9156
|
-
"&integral;",
|
|
9157
|
-
"⊺",
|
|
9158
|
-
"&intersection;",
|
|
9159
|
-
"⨗",
|
|
9160
|
-
"⨼",
|
|
9161
|
-
"&invisiblecomma;",
|
|
9162
|
-
"&invisibletimes;",
|
|
9163
|
-
"ё",
|
|
9164
|
-
"į",
|
|
9165
|
-
"𝕚",
|
|
9166
|
-
"ι",
|
|
9167
|
-
"⨼",
|
|
9168
|
-
"¿",
|
|
9169
|
-
"𝒾",
|
|
9170
|
-
"∈",
|
|
9171
|
-
"⋵",
|
|
9172
|
-
"&isine;",
|
|
9173
|
-
"⋴",
|
|
9174
|
-
"⋳",
|
|
9175
|
-
"∈",
|
|
9176
|
-
"⁢",
|
|
9177
|
-
"ĩ",
|
|
9178
|
-
"і",
|
|
9179
|
-
"ï",
|
|
9180
|
-
"ĵ",
|
|
9181
|
-
"й",
|
|
9182
|
-
"𝔧",
|
|
9183
|
-
"ȷ",
|
|
9184
|
-
"𝕛",
|
|
9185
|
-
"𝒿",
|
|
9186
|
-
"ј",
|
|
9187
|
-
"є",
|
|
9188
|
-
"κ",
|
|
9189
|
-
"ϰ",
|
|
9190
|
-
"ķ",
|
|
9191
|
-
"к",
|
|
9192
|
-
"𝔨",
|
|
9193
|
-
"ĸ",
|
|
9194
|
-
"х",
|
|
9195
|
-
"ќ",
|
|
9196
|
-
"𝕜",
|
|
9197
|
-
"𝓀",
|
|
9198
|
-
"&laarr;",
|
|
9199
|
-
"ĺ",
|
|
9200
|
-
"⦴",
|
|
9201
|
-
"ℒ",
|
|
9202
|
-
"λ",
|
|
9203
|
-
"⟨",
|
|
9204
|
-
"⦑",
|
|
9205
|
-
"⟨",
|
|
9206
|
-
"⪅",
|
|
9207
|
-
"&laplacetrf;",
|
|
9208
|
-
"«",
|
|
9209
|
-
"←",
|
|
9210
|
-
"⇤",
|
|
9211
|
-
"⤟",
|
|
9212
|
-
"⤝",
|
|
9213
|
-
"↩",
|
|
9214
|
-
"↫",
|
|
9215
|
-
"⤹",
|
|
9216
|
-
"⥳",
|
|
9217
|
-
"↢",
|
|
9218
|
-
"⪫",
|
|
9219
|
-
"⤙",
|
|
9220
|
-
"⪭",
|
|
9221
|
-
"⪭︀",
|
|
9222
|
-
"⤌",
|
|
9223
|
-
"❲",
|
|
9224
|
-
"{",
|
|
9225
|
-
"[",
|
|
9226
|
-
"⦋",
|
|
9227
|
-
"⦏",
|
|
9228
|
-
"⦍",
|
|
9229
|
-
"ľ",
|
|
9230
|
-
"ļ",
|
|
9231
|
-
"⌈",
|
|
9232
|
-
"{",
|
|
9233
|
-
"л",
|
|
9234
|
-
"⤶",
|
|
9235
|
-
"“",
|
|
9236
|
-
"„",
|
|
9237
|
-
"⥧",
|
|
9238
|
-
"⥋",
|
|
9239
|
-
"↲",
|
|
9240
|
-
"≤",
|
|
9241
|
-
"&leftanglebracket;",
|
|
9242
|
-
"←",
|
|
9243
|
-
"&leftarrowbar;",
|
|
9244
|
-
"&leftarrowrightarrow;",
|
|
9245
|
-
"↢",
|
|
9246
|
-
"&leftceiling;",
|
|
9247
|
-
"&leftdoublebracket;",
|
|
9248
|
-
"&leftdownteevector;",
|
|
9249
|
-
"&leftdownvector;",
|
|
9250
|
-
"&leftdownvectorbar;",
|
|
9251
|
-
"&leftfloor;",
|
|
9252
|
-
"↽",
|
|
9253
|
-
"↼",
|
|
9254
|
-
"⇇",
|
|
9255
|
-
"↔",
|
|
9256
|
-
"⇆",
|
|
9257
|
-
"⇋",
|
|
9258
|
-
"↭",
|
|
9259
|
-
"&leftrightvector;",
|
|
9260
|
-
"&lefttee;",
|
|
9261
|
-
"&leftteearrow;",
|
|
9262
|
-
"&leftteevector;",
|
|
9263
|
-
"⋋",
|
|
9264
|
-
"&lefttriangle;",
|
|
9265
|
-
"&lefttrianglebar;",
|
|
9266
|
-
"&lefttriangleequal;",
|
|
9267
|
-
"&leftupdownvector;",
|
|
9268
|
-
"&leftupteevector;",
|
|
9269
|
-
"&leftupvector;",
|
|
9270
|
-
"&leftupvectorbar;",
|
|
9271
|
-
"&leftvector;",
|
|
9272
|
-
"&leftvectorbar;",
|
|
9273
|
-
"⋚",
|
|
9274
|
-
"≤",
|
|
9275
|
-
"≦",
|
|
9276
|
-
"⩽",
|
|
9277
|
-
"⩽",
|
|
9278
|
-
"⪨",
|
|
9279
|
-
"⩿",
|
|
9280
|
-
"⪁",
|
|
9281
|
-
"⪃",
|
|
9282
|
-
"⋚︀",
|
|
9283
|
-
"⪓",
|
|
9284
|
-
"⪅",
|
|
9285
|
-
"⋖",
|
|
9286
|
-
"⋚",
|
|
9287
|
-
"⪋",
|
|
9288
|
-
"&lessequalgreater;",
|
|
9289
|
-
"&lessfullequal;",
|
|
9290
|
-
"&lessgreater;",
|
|
9291
|
-
"≶",
|
|
9292
|
-
"&lessless;",
|
|
9293
|
-
"≲",
|
|
9294
|
-
"&lessslantequal;",
|
|
9295
|
-
"&lesstilde;",
|
|
9296
|
-
"⥼",
|
|
9297
|
-
"⌊",
|
|
9298
|
-
"𝔩",
|
|
9299
|
-
"≶",
|
|
9300
|
-
"&lge;",
|
|
9301
|
-
"&lhar;",
|
|
9302
|
-
"↽",
|
|
9303
|
-
"↼",
|
|
9304
|
-
"⥪",
|
|
9305
|
-
"▄",
|
|
9306
|
-
"љ",
|
|
9307
|
-
"≪",
|
|
9308
|
-
"⇇",
|
|
9309
|
-
"⌞",
|
|
9310
|
-
"&lleftarrow;",
|
|
9311
|
-
"⥫",
|
|
9312
|
-
"◺",
|
|
9313
|
-
"ŀ",
|
|
9314
|
-
"⎰",
|
|
9315
|
-
"⎰",
|
|
9316
|
-
"⪉",
|
|
9317
|
-
"⪉",
|
|
9318
|
-
"⪇",
|
|
9319
|
-
"⪇",
|
|
9320
|
-
"≨",
|
|
9321
|
-
"⋦",
|
|
9322
|
-
"⟬",
|
|
9323
|
-
"⇽",
|
|
9324
|
-
"⟦",
|
|
9325
|
-
"⟵",
|
|
9326
|
-
"⟷",
|
|
9327
|
-
"⟼",
|
|
9328
|
-
"⟶",
|
|
9329
|
-
"↫",
|
|
9330
|
-
"↬",
|
|
9331
|
-
"⦅",
|
|
9332
|
-
"𝕝",
|
|
9333
|
-
"⨭",
|
|
9334
|
-
"⨴",
|
|
9335
|
-
"∗",
|
|
9336
|
-
"_",
|
|
9337
|
-
"&lowerleftarrow;",
|
|
9338
|
-
"&lowerrightarrow;",
|
|
9339
|
-
"◊",
|
|
9340
|
-
"◊",
|
|
9341
|
-
"⧫",
|
|
9342
|
-
"(",
|
|
9343
|
-
"⦓",
|
|
9344
|
-
"⇆",
|
|
9345
|
-
"⌟",
|
|
9346
|
-
"⇋",
|
|
9347
|
-
"⥭",
|
|
9348
|
-
"‎",
|
|
9349
|
-
"⊿",
|
|
9350
|
-
"‹",
|
|
9351
|
-
"𝓁",
|
|
9352
|
-
"↰",
|
|
9353
|
-
"≲",
|
|
9354
|
-
"⪍",
|
|
9355
|
-
"⪏",
|
|
9356
|
-
"[",
|
|
9357
|
-
"‘",
|
|
9358
|
-
"‚",
|
|
9359
|
-
"ł",
|
|
9360
|
-
"<",
|
|
9361
|
-
"⪦",
|
|
9362
|
-
"⩹",
|
|
9363
|
-
"⋖",
|
|
9364
|
-
"⋋",
|
|
9365
|
-
"⋉",
|
|
9366
|
-
"⥶",
|
|
9367
|
-
"⩻",
|
|
9368
|
-
"◃",
|
|
9369
|
-
"⊴",
|
|
9370
|
-
"◂",
|
|
9371
|
-
"<rpar;",
|
|
9372
|
-
"⥊",
|
|
9373
|
-
"⥦",
|
|
9374
|
-
"≨︀",
|
|
9375
|
-
"&lvne;",
|
|
9376
|
-
"¯",
|
|
9377
|
-
"♂",
|
|
9378
|
-
"✠",
|
|
9379
|
-
"✠",
|
|
9380
|
-
"↦",
|
|
9381
|
-
"↦",
|
|
9382
|
-
"↧",
|
|
9383
|
-
"↤",
|
|
9384
|
-
"↥",
|
|
9385
|
-
"▮",
|
|
9386
|
-
"⨩",
|
|
9387
|
-
"м",
|
|
9388
|
-
"—",
|
|
9389
|
-
"&mddot;",
|
|
9390
|
-
"∡",
|
|
9391
|
-
"&mediumspace;",
|
|
9392
|
-
"&mellintrf;",
|
|
9393
|
-
"𝔪",
|
|
9394
|
-
"℧",
|
|
9395
|
-
"µ",
|
|
9396
|
-
"∣",
|
|
9397
|
-
"*",
|
|
9398
|
-
"⫰",
|
|
9399
|
-
"·",
|
|
9400
|
-
"−",
|
|
9401
|
-
"⊟",
|
|
9402
|
-
"∸",
|
|
9403
|
-
"⨪",
|
|
9404
|
-
"&minusplus;",
|
|
9405
|
-
"⫛",
|
|
9406
|
-
"…",
|
|
9407
|
-
"∓",
|
|
9408
|
-
"⊧",
|
|
9409
|
-
"𝕞",
|
|
9410
|
-
"∓",
|
|
9411
|
-
"𝓂",
|
|
9412
|
-
"∾",
|
|
9413
|
-
"μ",
|
|
9414
|
-
"⊸",
|
|
9415
|
-
"⊸",
|
|
9416
|
-
"∇",
|
|
9417
|
-
"ń",
|
|
9418
|
-
"∠⃒",
|
|
9419
|
-
"≉",
|
|
9420
|
-
"&nape;",
|
|
9421
|
-
"≋̸",
|
|
9422
|
-
"ʼn",
|
|
9423
|
-
"≉",
|
|
9424
|
-
"♮",
|
|
9425
|
-
"♮",
|
|
9426
|
-
"ℕ",
|
|
9427
|
-
" ",
|
|
9428
|
-
"≎̸",
|
|
9429
|
-
"≏̸",
|
|
9430
|
-
"⩃",
|
|
9431
|
-
"ň",
|
|
9432
|
-
"ņ",
|
|
9433
|
-
"≇",
|
|
9434
|
-
"⩭̸",
|
|
9435
|
-
"⩂",
|
|
9436
|
-
"н",
|
|
9437
|
-
"–",
|
|
9438
|
-
"≠",
|
|
9439
|
-
"⤤",
|
|
9440
|
-
"↗",
|
|
9441
|
-
"↗",
|
|
9442
|
-
"≐̸",
|
|
9443
|
-
"&negativemediumspace;",
|
|
9444
|
-
"&negativethickspace;",
|
|
9445
|
-
"&negativethinspace;",
|
|
9446
|
-
"&negativeverythinspace;",
|
|
9447
|
-
"≢",
|
|
9448
|
-
"⤨",
|
|
9449
|
-
"≂̸",
|
|
9450
|
-
"&nestedgreatergreater;",
|
|
9451
|
-
"&nestedlessless;",
|
|
9452
|
-
"&newline;",
|
|
9453
|
-
"∄",
|
|
9454
|
-
"∄",
|
|
9455
|
-
"𝔫",
|
|
9456
|
-
"≱",
|
|
9457
|
-
"≱",
|
|
9458
|
-
"≧̸",
|
|
9459
|
-
"⩾̸",
|
|
9460
|
-
"⩾̸",
|
|
9461
|
-
"&ngg;",
|
|
9462
|
-
"≵",
|
|
9463
|
-
"≯",
|
|
9464
|
-
"≯",
|
|
9465
|
-
"&ngtv;",
|
|
9466
|
-
"↮",
|
|
9467
|
-
"⫲",
|
|
9468
|
-
"∋",
|
|
9469
|
-
"⋼",
|
|
9470
|
-
"⋺",
|
|
9471
|
-
"∋",
|
|
9472
|
-
"њ",
|
|
9473
|
-
"↚",
|
|
9474
|
-
"‥",
|
|
9475
|
-
"≰",
|
|
9476
|
-
"↚",
|
|
9477
|
-
"↮",
|
|
9478
|
-
"≰",
|
|
9479
|
-
"≦̸",
|
|
9480
|
-
"⩽̸",
|
|
9481
|
-
"⩽̸",
|
|
9482
|
-
"≮",
|
|
9483
|
-
"&nll;",
|
|
9484
|
-
"≴",
|
|
9485
|
-
"≮",
|
|
9486
|
-
"⋪",
|
|
9487
|
-
"⋬",
|
|
9488
|
-
"&nltv;",
|
|
9489
|
-
"∤",
|
|
9490
|
-
"&nobreak;",
|
|
9491
|
-
"&nonbreakingspace;",
|
|
9492
|
-
"𝕟",
|
|
9493
|
-
"¬",
|
|
9494
|
-
"¬congruent;",
|
|
9495
|
-
"¬cupcap;",
|
|
9496
|
-
"¬doubleverticalbar;",
|
|
9497
|
-
"¬element;",
|
|
9498
|
-
"¬equal;",
|
|
9499
|
-
"¬equaltilde;",
|
|
9500
|
-
"¬exists;",
|
|
9501
|
-
"¬greater;",
|
|
9502
|
-
"¬greaterequal;",
|
|
9503
|
-
"¬greaterfullequal;",
|
|
9504
|
-
"¬greatergreater;",
|
|
9505
|
-
"¬greaterless;",
|
|
9506
|
-
"¬greaterslantequal;",
|
|
9507
|
-
"¬greatertilde;",
|
|
9508
|
-
"¬humpdownhump;",
|
|
9509
|
-
"¬humpequal;",
|
|
9510
|
-
"∉",
|
|
9511
|
-
"⋵̸",
|
|
9512
|
-
"¬ine;",
|
|
9513
|
-
"∉",
|
|
9514
|
-
"⋷",
|
|
9515
|
-
"⋶",
|
|
9516
|
-
"¬lefttriangle;",
|
|
9517
|
-
"¬lefttrianglebar;",
|
|
9518
|
-
"¬lefttriangleequal;",
|
|
9519
|
-
"¬less;",
|
|
9520
|
-
"¬lessequal;",
|
|
9521
|
-
"¬lessgreater;",
|
|
9522
|
-
"¬lessless;",
|
|
9523
|
-
"¬lessslantequal;",
|
|
9524
|
-
"¬lesstilde;",
|
|
9525
|
-
"¬nestedgreatergreater;",
|
|
9526
|
-
"¬nestedlessless;",
|
|
9527
|
-
"∌",
|
|
9528
|
-
"∌",
|
|
9529
|
-
"⋾",
|
|
9530
|
-
"⋽",
|
|
9531
|
-
"¬precedes;",
|
|
9532
|
-
"¬precedesequal;",
|
|
9533
|
-
"¬precedesslantequal;",
|
|
9534
|
-
"¬reverseelement;",
|
|
9535
|
-
"¬righttriangle;",
|
|
9536
|
-
"¬righttrianglebar;",
|
|
9537
|
-
"¬righttriangleequal;",
|
|
9538
|
-
"¬squaresubset;",
|
|
9539
|
-
"¬squaresubsetequal;",
|
|
9540
|
-
"¬squaresuperset;",
|
|
9541
|
-
"¬squaresupersetequal;",
|
|
9542
|
-
"¬subset;",
|
|
9543
|
-
"¬subsetequal;",
|
|
9544
|
-
"¬succeeds;",
|
|
9545
|
-
"¬succeedsequal;",
|
|
9546
|
-
"¬succeedsslantequal;",
|
|
9547
|
-
"¬succeedstilde;",
|
|
9548
|
-
"¬superset;",
|
|
9549
|
-
"¬supersetequal;",
|
|
9550
|
-
"¬tilde;",
|
|
9551
|
-
"¬tildeequal;",
|
|
9552
|
-
"¬tildefullequal;",
|
|
9553
|
-
"¬tildetilde;",
|
|
9554
|
-
"¬verticalbar;",
|
|
9555
|
-
"∦",
|
|
9556
|
-
"∦",
|
|
9557
|
-
"⫽⃥",
|
|
9558
|
-
"∂̸",
|
|
9559
|
-
"⨔",
|
|
9560
|
-
"⊀",
|
|
9561
|
-
"⋠",
|
|
9562
|
-
"⪯̸",
|
|
9563
|
-
"⊀",
|
|
9564
|
-
"⪯̸",
|
|
9565
|
-
"↛",
|
|
9566
|
-
"⤳̸",
|
|
9567
|
-
"↝̸",
|
|
9568
|
-
"↛",
|
|
9569
|
-
"⋫",
|
|
9570
|
-
"⋭",
|
|
9571
|
-
"⊁",
|
|
9572
|
-
"⋡",
|
|
9573
|
-
"⪰̸",
|
|
9574
|
-
"𝓃",
|
|
9575
|
-
"∤",
|
|
9576
|
-
"∦",
|
|
9577
|
-
"≁",
|
|
9578
|
-
"≄",
|
|
9579
|
-
"≄",
|
|
9580
|
-
"∤",
|
|
9581
|
-
"∦",
|
|
9582
|
-
"⋢",
|
|
9583
|
-
"⋣",
|
|
9584
|
-
"⊄",
|
|
9585
|
-
"⊈",
|
|
9586
|
-
"⊂⃒",
|
|
9587
|
-
"⊈",
|
|
9588
|
-
"⫅̸",
|
|
9589
|
-
"⊁",
|
|
9590
|
-
"⪰̸",
|
|
9591
|
-
"⊅",
|
|
9592
|
-
"⊉",
|
|
9593
|
-
"⊃⃒",
|
|
9594
|
-
"⊉",
|
|
9595
|
-
"⫆̸",
|
|
9596
|
-
"≹",
|
|
9597
|
-
"ñ",
|
|
9598
|
-
"≸",
|
|
9599
|
-
"⋪",
|
|
9600
|
-
"⋬",
|
|
9601
|
-
"⋫",
|
|
9602
|
-
"⋭",
|
|
9603
|
-
"ν",
|
|
9604
|
-
"#",
|
|
9605
|
-
"№",
|
|
9606
|
-
" ",
|
|
9607
|
-
"≍⃒",
|
|
9608
|
-
"⊬",
|
|
9609
|
-
"≥⃒",
|
|
9610
|
-
">⃒",
|
|
9611
|
-
"&nvharr;",
|
|
9612
|
-
"⧞",
|
|
9613
|
-
"&nvlarr;",
|
|
9614
|
-
"≤⃒",
|
|
9615
|
-
"<⃒",
|
|
9616
|
-
"⊴⃒",
|
|
9617
|
-
"&nvrarr;",
|
|
9618
|
-
"⊵⃒",
|
|
9619
|
-
"∼⃒",
|
|
9620
|
-
"⤣",
|
|
9621
|
-
"↖",
|
|
9622
|
-
"↖",
|
|
9623
|
-
"⤧",
|
|
9624
|
-
"ó",
|
|
9625
|
-
"⊛",
|
|
9626
|
-
"⊚",
|
|
9627
|
-
"ô",
|
|
9628
|
-
"о",
|
|
9629
|
-
"⊝",
|
|
9630
|
-
"ő",
|
|
9631
|
-
"⨸",
|
|
9632
|
-
"⊙",
|
|
9633
|
-
"⦼",
|
|
9634
|
-
"œ",
|
|
9635
|
-
"⦿",
|
|
9636
|
-
"𝔬",
|
|
9637
|
-
"˛",
|
|
9638
|
-
"ò",
|
|
9639
|
-
"⧁",
|
|
9640
|
-
"⦵",
|
|
9641
|
-
"Ω",
|
|
9642
|
-
"∮",
|
|
9643
|
-
"↺",
|
|
9644
|
-
"⦾",
|
|
9645
|
-
"⦻",
|
|
9646
|
-
"‾",
|
|
9647
|
-
"⧀",
|
|
9648
|
-
"ō",
|
|
9649
|
-
"ω",
|
|
9650
|
-
"ο",
|
|
9651
|
-
"⦶",
|
|
9652
|
-
"⊖",
|
|
9653
|
-
"𝕠",
|
|
9654
|
-
"⦷",
|
|
9655
|
-
"&opencurlydoublequote;",
|
|
9656
|
-
"&opencurlyquote;",
|
|
9657
|
-
"⦹",
|
|
9658
|
-
"⊕",
|
|
9659
|
-
"∨",
|
|
9660
|
-
"↻",
|
|
9661
|
-
"⩝",
|
|
9662
|
-
"ℴ",
|
|
9663
|
-
"ℴ",
|
|
9664
|
-
"ª",
|
|
9665
|
-
"º",
|
|
9666
|
-
"⊶",
|
|
9667
|
-
"⩖",
|
|
9668
|
-
"⩗",
|
|
9669
|
-
"⩛",
|
|
9670
|
-
"&os;",
|
|
9671
|
-
"ℴ",
|
|
9672
|
-
"ø",
|
|
9673
|
-
"⊘",
|
|
9674
|
-
"õ",
|
|
9675
|
-
"⊗",
|
|
9676
|
-
"⨶",
|
|
9677
|
-
"ö",
|
|
9678
|
-
"⌽",
|
|
9679
|
-
"&overbar;",
|
|
9680
|
-
"&overbrace;",
|
|
9681
|
-
"&overbracket;",
|
|
9682
|
-
"&overparenthesis;",
|
|
9683
|
-
"∥",
|
|
9684
|
-
"¶",
|
|
9685
|
-
"∥",
|
|
9686
|
-
"⫳",
|
|
9687
|
-
"⫽",
|
|
9688
|
-
"∂",
|
|
9689
|
-
"&partiald;",
|
|
9690
|
-
"п",
|
|
9691
|
-
"%",
|
|
9692
|
-
".",
|
|
9693
|
-
"‰",
|
|
9694
|
-
"⊥",
|
|
9695
|
-
"‱",
|
|
9696
|
-
"𝔭",
|
|
9697
|
-
"φ",
|
|
9698
|
-
"ϕ",
|
|
9699
|
-
"ℳ",
|
|
9700
|
-
"☎",
|
|
9701
|
-
"π",
|
|
9702
|
-
"⋔",
|
|
9703
|
-
"ϖ",
|
|
9704
|
-
"ℏ",
|
|
9705
|
-
"ℎ",
|
|
9706
|
-
"ℏ",
|
|
9707
|
-
"+",
|
|
9708
|
-
"⨣",
|
|
9709
|
-
"⊞",
|
|
9710
|
-
"⨢",
|
|
9711
|
-
"∔",
|
|
9712
|
-
"⨥",
|
|
9713
|
-
"⩲",
|
|
9714
|
-
"&plusminus;",
|
|
9715
|
-
"±",
|
|
9716
|
-
"⨦",
|
|
9717
|
-
"⨧",
|
|
9718
|
-
"±",
|
|
9719
|
-
"&poincareplane;",
|
|
9720
|
-
"⨕",
|
|
9721
|
-
"𝕡",
|
|
9722
|
-
"£",
|
|
9723
|
-
"≺",
|
|
9724
|
-
"⪷",
|
|
9725
|
-
"≼",
|
|
9726
|
-
"⪯",
|
|
9727
|
-
"≺",
|
|
9728
|
-
"⪷",
|
|
9729
|
-
"≼",
|
|
9730
|
-
"&precedes;",
|
|
9731
|
-
"&precedesequal;",
|
|
9732
|
-
"&precedesslantequal;",
|
|
9733
|
-
"&precedestilde;",
|
|
9734
|
-
"⪯",
|
|
9735
|
-
"⪹",
|
|
9736
|
-
"⪵",
|
|
9737
|
-
"⋨",
|
|
9738
|
-
"≾",
|
|
9739
|
-
"′",
|
|
9740
|
-
"ℙ",
|
|
9741
|
-
"⪹",
|
|
9742
|
-
"&prne;",
|
|
9743
|
-
"⋨",
|
|
9744
|
-
"∏",
|
|
9745
|
-
"&product;",
|
|
9746
|
-
"⌮",
|
|
9747
|
-
"⌒",
|
|
9748
|
-
"⌓",
|
|
9749
|
-
"∝",
|
|
9750
|
-
"&proportion;",
|
|
9751
|
-
"&proportional;",
|
|
9752
|
-
"∝",
|
|
9753
|
-
"≾",
|
|
9754
|
-
"⊰",
|
|
9755
|
-
"𝓅",
|
|
9756
|
-
"ψ",
|
|
9757
|
-
" ",
|
|
9758
|
-
"𝔮",
|
|
9759
|
-
"⨌",
|
|
9760
|
-
"𝕢",
|
|
9761
|
-
"⁗",
|
|
9762
|
-
"𝓆",
|
|
9763
|
-
"ℍ",
|
|
9764
|
-
"⨖",
|
|
9765
|
-
"?",
|
|
9766
|
-
"≟",
|
|
9767
|
-
""",
|
|
9768
|
-
"&raarr;",
|
|
9769
|
-
"∽̱",
|
|
9770
|
-
"ŕ",
|
|
9771
|
-
"√",
|
|
9772
|
-
"⦳",
|
|
9773
|
-
"⟩",
|
|
9774
|
-
"⦒",
|
|
9775
|
-
"⦥",
|
|
9776
|
-
"⟩",
|
|
9777
|
-
"»",
|
|
9778
|
-
"→",
|
|
9779
|
-
"⥵",
|
|
9780
|
-
"⇥",
|
|
9781
|
-
"⤠",
|
|
9782
|
-
"⤳",
|
|
9783
|
-
"⤞",
|
|
9784
|
-
"↪",
|
|
9785
|
-
"↬",
|
|
9786
|
-
"⥅",
|
|
9787
|
-
"⥴",
|
|
9788
|
-
"↣",
|
|
9789
|
-
"↝",
|
|
9790
|
-
"⤚",
|
|
9791
|
-
"∶",
|
|
9792
|
-
"ℚ",
|
|
9793
|
-
"⤍",
|
|
9794
|
-
"❳",
|
|
9795
|
-
"}",
|
|
9796
|
-
"]",
|
|
9797
|
-
"⦌",
|
|
9798
|
-
"⦎",
|
|
9799
|
-
"⦐",
|
|
9800
|
-
"ř",
|
|
9801
|
-
"ŗ",
|
|
9802
|
-
"⌉",
|
|
9803
|
-
"}",
|
|
9804
|
-
"р",
|
|
9805
|
-
"⤷",
|
|
9806
|
-
"⥩",
|
|
9807
|
-
"”",
|
|
9808
|
-
"”",
|
|
9809
|
-
"↳",
|
|
9810
|
-
"&re;",
|
|
9811
|
-
"ℜ",
|
|
9812
|
-
"ℛ",
|
|
9813
|
-
"ℜ",
|
|
9814
|
-
"ℝ",
|
|
9815
|
-
"▭",
|
|
9816
|
-
"®",
|
|
9817
|
-
"&reverseelement;",
|
|
9818
|
-
"&reverseequilibrium;",
|
|
9819
|
-
"&reverseupequilibrium;",
|
|
9820
|
-
"⥽",
|
|
9821
|
-
"⌋",
|
|
9822
|
-
"𝔯",
|
|
9823
|
-
"&rhar;",
|
|
9824
|
-
"⇁",
|
|
9825
|
-
"⇀",
|
|
9826
|
-
"⥬",
|
|
9827
|
-
"ρ",
|
|
9828
|
-
"ϱ",
|
|
9829
|
-
"&rightanglebracket;",
|
|
9830
|
-
"→",
|
|
9831
|
-
"&rightarrowbar;",
|
|
9832
|
-
"&rightarrowleftarrow;",
|
|
9833
|
-
"↣",
|
|
9834
|
-
"&rightceiling;",
|
|
9835
|
-
"&rightdoublebracket;",
|
|
9836
|
-
"&rightdownteevector;",
|
|
9837
|
-
"&rightdownvector;",
|
|
9838
|
-
"&rightdownvectorbar;",
|
|
9839
|
-
"&rightfloor;",
|
|
9840
|
-
"⇁",
|
|
9841
|
-
"⇀",
|
|
9842
|
-
"⇄",
|
|
9843
|
-
"⇌",
|
|
9844
|
-
"⇉",
|
|
9845
|
-
"↝",
|
|
9846
|
-
"&righttee;",
|
|
9847
|
-
"&rightteearrow;",
|
|
9848
|
-
"&rightteevector;",
|
|
9849
|
-
"⋌",
|
|
9850
|
-
"&righttriangle;",
|
|
9851
|
-
"&righttrianglebar;",
|
|
9852
|
-
"&righttriangleequal;",
|
|
9853
|
-
"&rightupdownvector;",
|
|
9854
|
-
"&rightupteevector;",
|
|
9855
|
-
"&rightupvector;",
|
|
9856
|
-
"&rightupvectorbar;",
|
|
9857
|
-
"&rightvector;",
|
|
9858
|
-
"&rightvectorbar;",
|
|
9859
|
-
"˚",
|
|
9860
|
-
"≓",
|
|
9861
|
-
"⇄",
|
|
9862
|
-
"⇌",
|
|
9863
|
-
"‏",
|
|
9864
|
-
"⎱",
|
|
9865
|
-
"⎱",
|
|
9866
|
-
"⫮",
|
|
9867
|
-
"⟭",
|
|
9868
|
-
"⇾",
|
|
9869
|
-
"⟧",
|
|
9870
|
-
"⦆",
|
|
9871
|
-
"𝕣",
|
|
9872
|
-
"⨮",
|
|
9873
|
-
"⨵",
|
|
9874
|
-
"&roundimplies;",
|
|
9875
|
-
")",
|
|
9876
|
-
"⦔",
|
|
9877
|
-
"⨒",
|
|
9878
|
-
"⇉",
|
|
9879
|
-
"&rrightarrow;",
|
|
9880
|
-
"›",
|
|
9881
|
-
"𝓇",
|
|
9882
|
-
"↱",
|
|
9883
|
-
"]",
|
|
9884
|
-
"’",
|
|
9885
|
-
"’",
|
|
9886
|
-
"⋌",
|
|
9887
|
-
"⋊",
|
|
9888
|
-
"▹",
|
|
9889
|
-
"⊵",
|
|
9890
|
-
"▸",
|
|
9891
|
-
"⧎",
|
|
9892
|
-
"&ruledelayed;",
|
|
9893
|
-
"⥨",
|
|
9894
|
-
"℞",
|
|
9895
|
-
"ś",
|
|
9896
|
-
"‚",
|
|
9897
|
-
"≻",
|
|
9898
|
-
"⪸",
|
|
9899
|
-
"š",
|
|
9900
|
-
"≽",
|
|
9901
|
-
"⪰",
|
|
9902
|
-
"ş",
|
|
9903
|
-
"ŝ",
|
|
9904
|
-
"⪺",
|
|
9905
|
-
"&scne;",
|
|
9906
|
-
"⋩",
|
|
9907
|
-
"⨓",
|
|
9908
|
-
"≿",
|
|
9909
|
-
"с",
|
|
9910
|
-
"⋅",
|
|
9911
|
-
"⊡",
|
|
9912
|
-
"⩦",
|
|
9913
|
-
"⤥",
|
|
9914
|
-
"↘",
|
|
9915
|
-
"↘",
|
|
9916
|
-
"§",
|
|
9917
|
-
";",
|
|
9918
|
-
"⤩",
|
|
9919
|
-
"∖",
|
|
9920
|
-
"∖",
|
|
9921
|
-
"✶",
|
|
9922
|
-
"𝔰",
|
|
9923
|
-
"⌢",
|
|
9924
|
-
"♯",
|
|
9925
|
-
"щ",
|
|
9926
|
-
"ш",
|
|
9927
|
-
"&shortdownarrow;",
|
|
9928
|
-
"&shortleftarrow;",
|
|
9929
|
-
"∣",
|
|
9930
|
-
"∥",
|
|
9931
|
-
"&shortrightarrow;",
|
|
9932
|
-
"&shortuparrow;",
|
|
9933
|
-
"­",
|
|
9934
|
-
"σ",
|
|
9935
|
-
"ς",
|
|
9936
|
-
"ς",
|
|
9937
|
-
"∼",
|
|
9938
|
-
"⩪",
|
|
9939
|
-
"≃",
|
|
9940
|
-
"≃",
|
|
9941
|
-
"⪞",
|
|
9942
|
-
"&simge;",
|
|
9943
|
-
"⪝",
|
|
9944
|
-
"&simle;",
|
|
9945
|
-
"≆",
|
|
9946
|
-
"⨤",
|
|
9947
|
-
"⥲",
|
|
9948
|
-
"←",
|
|
9949
|
-
"&smallcircle;",
|
|
9950
|
-
"∖",
|
|
9951
|
-
"⨳",
|
|
9952
|
-
"⧤",
|
|
9953
|
-
"∣",
|
|
9954
|
-
"⌣",
|
|
9955
|
-
"⪪",
|
|
9956
|
-
"⪬",
|
|
9957
|
-
"⪬︀",
|
|
9958
|
-
"ь",
|
|
9959
|
-
"/",
|
|
9960
|
-
"⧄",
|
|
9961
|
-
"⌿",
|
|
9962
|
-
"𝕤",
|
|
9963
|
-
"♠",
|
|
9964
|
-
"♠",
|
|
9965
|
-
"∥",
|
|
9966
|
-
"⊓",
|
|
9967
|
-
"⊓︀",
|
|
9968
|
-
"⊔",
|
|
9969
|
-
"⊔︀",
|
|
9970
|
-
"&sqrt;",
|
|
9971
|
-
"⊏",
|
|
9972
|
-
"⊑",
|
|
9973
|
-
"⊏",
|
|
9974
|
-
"⊑",
|
|
9975
|
-
"⊐",
|
|
9976
|
-
"⊒",
|
|
9977
|
-
"⊐",
|
|
9978
|
-
"⊒",
|
|
9979
|
-
"□",
|
|
9980
|
-
"□",
|
|
9981
|
-
"&squareintersection;",
|
|
9982
|
-
"&squaresubset;",
|
|
9983
|
-
"&squaresubsetequal;",
|
|
9984
|
-
"&squaresuperset;",
|
|
9985
|
-
"&squaresupersetequal;",
|
|
9986
|
-
"&squareunion;",
|
|
9987
|
-
"▪",
|
|
9988
|
-
"▪",
|
|
9989
|
-
"→",
|
|
9990
|
-
"𝓈",
|
|
9991
|
-
"∖",
|
|
9992
|
-
"⌣",
|
|
9993
|
-
"⋆",
|
|
9994
|
-
"☆",
|
|
9995
|
-
"★",
|
|
9996
|
-
"ϵ",
|
|
9997
|
-
"ϕ",
|
|
9998
|
-
"¯",
|
|
9999
|
-
"⊂",
|
|
10000
|
-
"⪽",
|
|
10001
|
-
"⊆",
|
|
10002
|
-
"⫃",
|
|
10003
|
-
"⫁",
|
|
10004
|
-
"⊊",
|
|
10005
|
-
"⪿",
|
|
10006
|
-
"⥹",
|
|
10007
|
-
"⊂",
|
|
10008
|
-
"⊆",
|
|
10009
|
-
"⫅",
|
|
10010
|
-
"&subsetequal;",
|
|
10011
|
-
"⊊",
|
|
10012
|
-
"⫋",
|
|
10013
|
-
"⫇",
|
|
10014
|
-
"⫕",
|
|
10015
|
-
"⫓",
|
|
10016
|
-
"≻",
|
|
10017
|
-
"⪸",
|
|
10018
|
-
"≽",
|
|
10019
|
-
"&succeeds;",
|
|
10020
|
-
"&succeedsequal;",
|
|
10021
|
-
"&succeedsslantequal;",
|
|
10022
|
-
"&succeedstilde;",
|
|
10023
|
-
"⪰",
|
|
10024
|
-
"⪺",
|
|
10025
|
-
"⪶",
|
|
10026
|
-
"⋩",
|
|
10027
|
-
"≿",
|
|
10028
|
-
"&suchthat;",
|
|
10029
|
-
"∑",
|
|
10030
|
-
"♪",
|
|
10031
|
-
"¹",
|
|
10032
|
-
"²",
|
|
10033
|
-
"³",
|
|
10034
|
-
"⊃",
|
|
10035
|
-
"⪾",
|
|
10036
|
-
"⫘",
|
|
10037
|
-
"⊇",
|
|
10038
|
-
"⫄",
|
|
10039
|
-
"&superset;",
|
|
10040
|
-
"&supersetequal;",
|
|
10041
|
-
"⟉",
|
|
10042
|
-
"⫗",
|
|
10043
|
-
"⥻",
|
|
10044
|
-
"⫂",
|
|
10045
|
-
"⊋",
|
|
10046
|
-
"⫀",
|
|
10047
|
-
"⊃",
|
|
10048
|
-
"⊇",
|
|
10049
|
-
"⫆",
|
|
10050
|
-
"⊋",
|
|
10051
|
-
"⫌",
|
|
10052
|
-
"⫈",
|
|
10053
|
-
"⫔",
|
|
10054
|
-
"⫖",
|
|
10055
|
-
"⤦",
|
|
10056
|
-
"↙",
|
|
10057
|
-
"↙",
|
|
10058
|
-
"⤪",
|
|
10059
|
-
"ß",
|
|
10060
|
-
"&tab;",
|
|
10061
|
-
"⌖",
|
|
10062
|
-
"τ",
|
|
10063
|
-
"⎴",
|
|
10064
|
-
"ť",
|
|
10065
|
-
"ţ",
|
|
10066
|
-
"т",
|
|
10067
|
-
"⃛",
|
|
10068
|
-
"⌕",
|
|
10069
|
-
"𝔱",
|
|
10070
|
-
"∴",
|
|
10071
|
-
"∴",
|
|
10072
|
-
"θ",
|
|
10073
|
-
"ϑ",
|
|
10074
|
-
"ϑ",
|
|
10075
|
-
"≈",
|
|
10076
|
-
"∼",
|
|
10077
|
-
"&thickspace;",
|
|
10078
|
-
" ",
|
|
10079
|
-
"&thinspace;",
|
|
10080
|
-
"≈",
|
|
10081
|
-
"∼",
|
|
10082
|
-
"þ",
|
|
10083
|
-
"˜",
|
|
10084
|
-
"&tildeequal;",
|
|
10085
|
-
"&tildefullequal;",
|
|
10086
|
-
"&tildetilde;",
|
|
10087
|
-
"×",
|
|
10088
|
-
"⊠",
|
|
10089
|
-
"⨱",
|
|
10090
|
-
"⨰",
|
|
10091
|
-
"∭",
|
|
10092
|
-
"⤨",
|
|
10093
|
-
"⊤",
|
|
10094
|
-
"⌶",
|
|
10095
|
-
"⫱",
|
|
10096
|
-
"𝕥",
|
|
10097
|
-
"⫚",
|
|
10098
|
-
"⤩",
|
|
10099
|
-
"‴",
|
|
10100
|
-
"™",
|
|
10101
|
-
"▵",
|
|
10102
|
-
"▿",
|
|
10103
|
-
"◃",
|
|
10104
|
-
"⊴",
|
|
10105
|
-
"≜",
|
|
10106
|
-
"▹",
|
|
10107
|
-
"⊵",
|
|
10108
|
-
"◬",
|
|
10109
|
-
"≜",
|
|
10110
|
-
"⨺",
|
|
10111
|
-
"&tripledot;",
|
|
10112
|
-
"⨹",
|
|
10113
|
-
"⧍",
|
|
10114
|
-
"⨻",
|
|
10115
|
-
"⏢",
|
|
10116
|
-
"𝓉",
|
|
10117
|
-
"ц",
|
|
10118
|
-
"ћ",
|
|
10119
|
-
"ŧ",
|
|
10120
|
-
"≬",
|
|
10121
|
-
"↞",
|
|
10122
|
-
"↠",
|
|
10123
|
-
"ú",
|
|
10124
|
-
"↑",
|
|
10125
|
-
"&uarrocir;",
|
|
10126
|
-
"ў",
|
|
10127
|
-
"ŭ",
|
|
10128
|
-
"û",
|
|
10129
|
-
"у",
|
|
10130
|
-
"⇅",
|
|
10131
|
-
"ű",
|
|
10132
|
-
"⥮",
|
|
10133
|
-
"⥾",
|
|
10134
|
-
"𝔲",
|
|
10135
|
-
"ù",
|
|
10136
|
-
"&uhar;",
|
|
10137
|
-
"↿",
|
|
10138
|
-
"↾",
|
|
10139
|
-
"▀",
|
|
10140
|
-
"⌜",
|
|
10141
|
-
"⌜",
|
|
10142
|
-
"⌏",
|
|
10143
|
-
"◸",
|
|
10144
|
-
"ū",
|
|
10145
|
-
"¨",
|
|
10146
|
-
"&underbar;",
|
|
10147
|
-
"&underbrace;",
|
|
10148
|
-
"&underbracket;",
|
|
10149
|
-
"&underparenthesis;",
|
|
10150
|
-
"&union;",
|
|
10151
|
-
"&unionplus;",
|
|
10152
|
-
"ų",
|
|
10153
|
-
"𝕦",
|
|
10154
|
-
"↑",
|
|
10155
|
-
"&uparrowbar;",
|
|
10156
|
-
"&uparrowdownarrow;",
|
|
10157
|
-
"↕",
|
|
10158
|
-
"&upequilibrium;",
|
|
10159
|
-
"↿",
|
|
10160
|
-
"↾",
|
|
10161
|
-
"⊎",
|
|
10162
|
-
"&upperleftarrow;",
|
|
10163
|
-
"&upperrightarrow;",
|
|
10164
|
-
"υ",
|
|
10165
|
-
"ϒ",
|
|
10166
|
-
"υ",
|
|
10167
|
-
"&uptee;",
|
|
10168
|
-
"&upteearrow;",
|
|
10169
|
-
"⇈",
|
|
10170
|
-
"⌝",
|
|
10171
|
-
"⌝",
|
|
10172
|
-
"⌎",
|
|
10173
|
-
"ů",
|
|
10174
|
-
"◹",
|
|
10175
|
-
"𝓊",
|
|
10176
|
-
"⋰",
|
|
10177
|
-
"ũ",
|
|
10178
|
-
"▵",
|
|
10179
|
-
"▴",
|
|
10180
|
-
"⇈",
|
|
10181
|
-
"ü",
|
|
10182
|
-
"⦧",
|
|
10183
|
-
"⦜",
|
|
10184
|
-
"ϵ",
|
|
10185
|
-
"ϰ",
|
|
10186
|
-
"∅",
|
|
10187
|
-
"ϕ",
|
|
10188
|
-
"ϖ",
|
|
10189
|
-
"∝",
|
|
10190
|
-
"↕",
|
|
10191
|
-
"ϱ",
|
|
10192
|
-
"ς",
|
|
10193
|
-
"⊊︀",
|
|
10194
|
-
"⫋︀",
|
|
10195
|
-
"⊋︀",
|
|
10196
|
-
"⫌︀",
|
|
10197
|
-
"ϑ",
|
|
10198
|
-
"⊲",
|
|
10199
|
-
"⊳",
|
|
10200
|
-
"&vbar;",
|
|
10201
|
-
"&vbarv;",
|
|
10202
|
-
"в",
|
|
10203
|
-
"⊢",
|
|
10204
|
-
"&vdashl;",
|
|
10205
|
-
"∨",
|
|
10206
|
-
"⊻",
|
|
10207
|
-
"≚",
|
|
10208
|
-
"⋮",
|
|
10209
|
-
"|",
|
|
10210
|
-
"|",
|
|
10211
|
-
"&verticalbar;",
|
|
10212
|
-
"&verticalline;",
|
|
10213
|
-
"&verticalseparator;",
|
|
10214
|
-
"&verticaltilde;",
|
|
10215
|
-
"&verythinspace;",
|
|
10216
|
-
"𝔳",
|
|
10217
|
-
"⊲",
|
|
10218
|
-
"⊂⃒",
|
|
10219
|
-
"⊃⃒",
|
|
10220
|
-
"𝕧",
|
|
10221
|
-
"∝",
|
|
10222
|
-
"⊳",
|
|
10223
|
-
"𝓋",
|
|
10224
|
-
"⊊︀",
|
|
10225
|
-
"⊋︀",
|
|
10226
|
-
"&vvdash;",
|
|
10227
|
-
"⦚",
|
|
10228
|
-
"ŵ",
|
|
10229
|
-
"⩟",
|
|
10230
|
-
"∧",
|
|
10231
|
-
"≙",
|
|
10232
|
-
"℘",
|
|
10233
|
-
"𝔴",
|
|
10234
|
-
"𝕨",
|
|
10235
|
-
"℘",
|
|
10236
|
-
"≀",
|
|
10237
|
-
"≀",
|
|
10238
|
-
"𝓌",
|
|
10239
|
-
"⋂",
|
|
10240
|
-
"◯",
|
|
10241
|
-
"⋃",
|
|
10242
|
-
"▽",
|
|
10243
|
-
"𝔵",
|
|
10244
|
-
"⟷",
|
|
10245
|
-
"ξ",
|
|
10246
|
-
"⟵",
|
|
10247
|
-
"⟼",
|
|
10248
|
-
"⋻",
|
|
10249
|
-
"⨀",
|
|
10250
|
-
"𝕩",
|
|
10251
|
-
"⨁",
|
|
10252
|
-
"⨂",
|
|
10253
|
-
"⟶",
|
|
10254
|
-
"𝓍",
|
|
10255
|
-
"⨆",
|
|
10256
|
-
"⨄",
|
|
10257
|
-
"△",
|
|
10258
|
-
"⋁",
|
|
10259
|
-
"⋀",
|
|
10260
|
-
"ý",
|
|
10261
|
-
"я",
|
|
10262
|
-
"ŷ",
|
|
10263
|
-
"ы",
|
|
10264
|
-
"¥",
|
|
10265
|
-
"𝔶",
|
|
10266
|
-
"ї",
|
|
10267
|
-
"𝕪",
|
|
10268
|
-
"𝓎",
|
|
10269
|
-
"ю",
|
|
10270
|
-
"ÿ",
|
|
10271
|
-
"ź",
|
|
10272
|
-
"ž",
|
|
10273
|
-
"з",
|
|
10274
|
-
"ż",
|
|
10275
|
-
"ℨ",
|
|
10276
|
-
"&zerowidthspace;",
|
|
10277
|
-
"ζ",
|
|
10278
|
-
"𝔷",
|
|
10279
|
-
"ж",
|
|
10280
|
-
"⇝",
|
|
10281
|
-
"𝕫",
|
|
10282
|
-
"𝓏",
|
|
10283
|
-
"‍",
|
|
10284
|
-
"‌"
|
|
10285
|
-
];
|
|
10286
|
-
|
|
10287
8087
|
const regexp$1 = /&([a-z0-9]+|#x?[0-9a-f]+);/gi;
|
|
10288
8088
|
class UnknownCharReference extends Rule {
|
|
10289
8089
|
documentation(context) {
|
|
10290
8090
|
return {
|
|
10291
8091
|
description: `HTML defines a set of valid character references but ${context || "this"} is not a valid one.`,
|
|
10292
|
-
url:
|
|
8092
|
+
url: "https://html-validate.org/rules/unrecognized-char-ref.html",
|
|
10293
8093
|
};
|
|
10294
8094
|
}
|
|
10295
8095
|
setup() {
|
|
@@ -10322,7 +8122,7 @@ class UnknownCharReference extends Rule {
|
|
|
10322
8122
|
continue;
|
|
10323
8123
|
}
|
|
10324
8124
|
/* ignore if this is a known character reference name */
|
|
10325
|
-
if (entities
|
|
8125
|
+
if (elements.entities.includes(entity)) {
|
|
10326
8126
|
continue;
|
|
10327
8127
|
}
|
|
10328
8128
|
const entityLocation = sliceLocation(location, match.index, match.index + entity.length);
|
|
@@ -10374,7 +8174,7 @@ class ValidID extends Rule {
|
|
|
10374
8174
|
" - ID must not contain any whitespace characters",
|
|
10375
8175
|
...relaxedDescription,
|
|
10376
8176
|
].join("\n"),
|
|
10377
|
-
url:
|
|
8177
|
+
url: "https://html-validate.org/rules/valid-id.html",
|
|
10378
8178
|
};
|
|
10379
8179
|
}
|
|
10380
8180
|
setup() {
|
|
@@ -10449,7 +8249,7 @@ class Void extends Rule {
|
|
|
10449
8249
|
documentation() {
|
|
10450
8250
|
return {
|
|
10451
8251
|
description: "HTML void elements cannot have any content and must not have an end tag.",
|
|
10452
|
-
url:
|
|
8252
|
+
url: "https://html-validate.org/rules/void.html",
|
|
10453
8253
|
};
|
|
10454
8254
|
}
|
|
10455
8255
|
setup() {
|
|
@@ -10505,7 +8305,7 @@ class VoidContent extends Rule {
|
|
|
10505
8305
|
documentation(tagName) {
|
|
10506
8306
|
const doc = {
|
|
10507
8307
|
description: "HTML void elements cannot have any content and must not have content or end tag.",
|
|
10508
|
-
url:
|
|
8308
|
+
url: "https://html-validate.org/rules/void-content.html",
|
|
10509
8309
|
};
|
|
10510
8310
|
if (tagName) {
|
|
10511
8311
|
doc.description = `<${tagName}> is a void element and must not have content or end tag.`;
|
|
@@ -10552,7 +8352,7 @@ class VoidStyle extends Rule {
|
|
|
10552
8352
|
documentation(context) {
|
|
10553
8353
|
const doc = {
|
|
10554
8354
|
description: "The current configuration requires a specific style for ending void elements.",
|
|
10555
|
-
url:
|
|
8355
|
+
url: "https://html-validate.org/rules/void-style.html",
|
|
10556
8356
|
};
|
|
10557
8357
|
if (context) {
|
|
10558
8358
|
const [desc, end] = styleDescription(context.style);
|
|
@@ -10622,7 +8422,7 @@ class H30 extends Rule {
|
|
|
10622
8422
|
documentation() {
|
|
10623
8423
|
return {
|
|
10624
8424
|
description: "WCAG 2.1 requires each `<a>` anchor link to have a text describing the purpose of the link using either plain text or an `<img>` with the `alt` attribute set.",
|
|
10625
|
-
url:
|
|
8425
|
+
url: "https://html-validate.org/rules/wcag/h30.html",
|
|
10626
8426
|
};
|
|
10627
8427
|
}
|
|
10628
8428
|
setup() {
|
|
@@ -10630,22 +8430,22 @@ class H30 extends Rule {
|
|
|
10630
8430
|
const links = event.document.getElementsByTagName("a");
|
|
10631
8431
|
for (const link of links) {
|
|
10632
8432
|
/* ignore links with aria-hidden="true" */
|
|
10633
|
-
if (!inAccessibilityTree(link)) {
|
|
8433
|
+
if (!rulesHelper.inAccessibilityTree(link)) {
|
|
10634
8434
|
continue;
|
|
10635
8435
|
}
|
|
10636
8436
|
/* check if text content is present (or dynamic) */
|
|
10637
|
-
const textClassification = classifyNodeText(link);
|
|
10638
|
-
if (textClassification !==
|
|
8437
|
+
const textClassification = rulesHelper.classifyNodeText(link);
|
|
8438
|
+
if (textClassification !== rulesHelper.TextClassification.EMPTY_TEXT) {
|
|
10639
8439
|
continue;
|
|
10640
8440
|
}
|
|
10641
8441
|
/* check if image with alt-text is present */
|
|
10642
8442
|
const images = link.querySelectorAll("img");
|
|
10643
|
-
if (images.some((image) => hasAltText(image))) {
|
|
8443
|
+
if (images.some((image) => rulesHelper.hasAltText(image))) {
|
|
10644
8444
|
continue;
|
|
10645
8445
|
}
|
|
10646
8446
|
/* check if aria-label is present on either the <a> element or a descendant */
|
|
10647
8447
|
const labels = link.querySelectorAll("[aria-label]");
|
|
10648
|
-
if (hasAriaLabel(link) || labels.some((cur) => hasAriaLabel(cur))) {
|
|
8448
|
+
if (rulesHelper.hasAriaLabel(link) || labels.some((cur) => rulesHelper.hasAriaLabel(cur))) {
|
|
10649
8449
|
continue;
|
|
10650
8450
|
}
|
|
10651
8451
|
this.report(link, "Anchor link must have a text describing its purpose");
|
|
@@ -10658,7 +8458,7 @@ class H32 extends Rule {
|
|
|
10658
8458
|
documentation() {
|
|
10659
8459
|
return {
|
|
10660
8460
|
description: "WCAG 2.1 requires each `<form>` element to have at least one submit button.",
|
|
10661
|
-
url:
|
|
8461
|
+
url: "https://html-validate.org/rules/wcag/h32.html",
|
|
10662
8462
|
};
|
|
10663
8463
|
}
|
|
10664
8464
|
setup() {
|
|
@@ -10715,7 +8515,7 @@ class H36 extends Rule {
|
|
|
10715
8515
|
documentation() {
|
|
10716
8516
|
return {
|
|
10717
8517
|
description: 'WCAG 2.1 requires all images used as submit buttons to have a textual description using the alt attribute. The alt text cannot be empty (`alt=""`).',
|
|
10718
|
-
url:
|
|
8518
|
+
url: "https://html-validate.org/rules/wcag/h36.html",
|
|
10719
8519
|
};
|
|
10720
8520
|
}
|
|
10721
8521
|
setup() {
|
|
@@ -10728,7 +8528,7 @@ class H36 extends Rule {
|
|
|
10728
8528
|
if (node.getAttributeValue("type") !== "image") {
|
|
10729
8529
|
return;
|
|
10730
8530
|
}
|
|
10731
|
-
if (!hasAltText(node)) {
|
|
8531
|
+
if (!rulesHelper.hasAltText(node)) {
|
|
10732
8532
|
this.report(node, "image used as submit button must have alt text");
|
|
10733
8533
|
}
|
|
10734
8534
|
});
|
|
@@ -10785,7 +8585,7 @@ class H37 extends Rule {
|
|
|
10785
8585
|
documentation() {
|
|
10786
8586
|
return {
|
|
10787
8587
|
description: "Both HTML5 and WCAG 2.0 requires images to have a alternative text for each image.",
|
|
10788
|
-
url:
|
|
8588
|
+
url: "https://html-validate.org/rules/wcag/h37.html",
|
|
10789
8589
|
};
|
|
10790
8590
|
}
|
|
10791
8591
|
setup() {
|
|
@@ -10796,7 +8596,7 @@ class H37 extends Rule {
|
|
|
10796
8596
|
return;
|
|
10797
8597
|
}
|
|
10798
8598
|
/* ignore images with aria-hidden="true" or role="presentation" */
|
|
10799
|
-
if (!inAccessibilityTree(node)) {
|
|
8599
|
+
if (!rulesHelper.inAccessibilityTree(node)) {
|
|
10800
8600
|
return;
|
|
10801
8601
|
}
|
|
10802
8602
|
/* validate plain alt-attribute */
|
|
@@ -10826,7 +8626,7 @@ class H67 extends Rule {
|
|
|
10826
8626
|
documentation() {
|
|
10827
8627
|
return {
|
|
10828
8628
|
description: "A decorative image cannot have a title attribute. Either remove `title` or add a descriptive `alt` text.",
|
|
10829
|
-
url:
|
|
8629
|
+
url: "https://html-validate.org/rules/wcag/h67.html",
|
|
10830
8630
|
};
|
|
10831
8631
|
}
|
|
10832
8632
|
setup() {
|
|
@@ -10855,7 +8655,7 @@ class H71 extends Rule {
|
|
|
10855
8655
|
documentation() {
|
|
10856
8656
|
return {
|
|
10857
8657
|
description: "H71: Providing a description for groups of form controls using fieldset and legend elements",
|
|
10858
|
-
url:
|
|
8658
|
+
url: "https://html-validate.org/rules/wcag/h71.html",
|
|
10859
8659
|
};
|
|
10860
8660
|
}
|
|
10861
8661
|
setup() {
|
|
@@ -11437,15 +9237,14 @@ class Config {
|
|
|
11437
9237
|
metaTable.loadFromObject(entry);
|
|
11438
9238
|
continue;
|
|
11439
9239
|
}
|
|
11440
|
-
let filename;
|
|
11441
9240
|
/* try searching builtin metadata */
|
|
11442
|
-
|
|
11443
|
-
if (
|
|
11444
|
-
metaTable.
|
|
9241
|
+
const bundled = elements.bundledElements[entry];
|
|
9242
|
+
if (bundled) {
|
|
9243
|
+
metaTable.loadFromObject(bundled);
|
|
11445
9244
|
continue;
|
|
11446
9245
|
}
|
|
11447
9246
|
/* try as regular file */
|
|
11448
|
-
filename = entry.replace("<rootDir>", this.rootDir);
|
|
9247
|
+
const filename = entry.replace("<rootDir>", this.rootDir);
|
|
11449
9248
|
if (fs__default.default.existsSync(filename)) {
|
|
11450
9249
|
metaTable.loadFromFile(filename);
|
|
11451
9250
|
continue;
|
|
@@ -13179,6 +10978,14 @@ class HtmlValidate {
|
|
|
13179
10978
|
}
|
|
13180
10979
|
}
|
|
13181
10980
|
|
|
10981
|
+
/* generated file, changes will be overwritten */
|
|
10982
|
+
/** @public */
|
|
10983
|
+
const name = "html-validate";
|
|
10984
|
+
/** @public */
|
|
10985
|
+
const version = "7.8.0";
|
|
10986
|
+
/** @public */
|
|
10987
|
+
const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
|
|
10988
|
+
|
|
13182
10989
|
const defaults$1 = {
|
|
13183
10990
|
silent: false,
|
|
13184
10991
|
version,
|
|
@@ -13604,13 +11411,6 @@ const availableFormatters = {
|
|
|
13604
11411
|
stylish: formatter$1,
|
|
13605
11412
|
text: formatter,
|
|
13606
11413
|
};
|
|
13607
|
-
/**
|
|
13608
|
-
* Get formatter function by name.
|
|
13609
|
-
*
|
|
13610
|
-
* @internal
|
|
13611
|
-
* @param name - Name of formatter.
|
|
13612
|
-
* @returns Formatter function or null if it doesn't exist.
|
|
13613
|
-
*/
|
|
13614
11414
|
function getFormatter(name) {
|
|
13615
11415
|
var _a;
|
|
13616
11416
|
return (_a = availableFormatters[name]) !== null && _a !== void 0 ? _a : null;
|
|
@@ -13637,17 +11437,18 @@ exports.TextNode = TextNode;
|
|
|
13637
11437
|
exports.UserError = UserError;
|
|
13638
11438
|
exports.WrappedError = WrappedError;
|
|
13639
11439
|
exports.bugs = bugs;
|
|
13640
|
-
exports.classifyNodeText = classifyNodeText;
|
|
13641
11440
|
exports.codeframe = codeframe;
|
|
13642
11441
|
exports.compatibilityCheck = compatibilityCheck;
|
|
13643
11442
|
exports.configDataFromFile = configDataFromFile;
|
|
13644
|
-
exports.defineMetadata = defineMetadata;
|
|
13645
11443
|
exports.ensureError = ensureError;
|
|
11444
|
+
exports.generateIdSelector = generateIdSelector;
|
|
13646
11445
|
exports.getFormatter = getFormatter;
|
|
11446
|
+
exports.isElementNode = isElementNode;
|
|
11447
|
+
exports.isTextNode = isTextNode;
|
|
13647
11448
|
exports.legacyRequire = legacyRequire;
|
|
13648
|
-
exports.metadataHelper = metadataHelper;
|
|
13649
11449
|
exports.name = name;
|
|
13650
11450
|
exports.presets = presets;
|
|
13651
11451
|
exports.ruleExists = ruleExists;
|
|
11452
|
+
exports.sliceLocation = sliceLocation;
|
|
13652
11453
|
exports.version = version;
|
|
13653
11454
|
//# sourceMappingURL=core.js.map
|