wikiparser-node 1.3.1-b → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/.schema.json +172 -0
- package/config/llwiki.json +35 -1
- package/config/moegirl.json +44 -1
- package/config/zhwiki.json +466 -1
- package/dist/addon/table.d.ts +6 -0
- package/dist/addon/table.js +564 -0
- package/dist/base.d.ts +45 -0
- package/dist/bin/toc.js +18 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +209 -0
- package/dist/internal.d.ts +44 -0
- package/dist/lib/element.d.ts +155 -0
- package/dist/lib/element.js +634 -0
- package/dist/lib/node.d.ts +146 -0
- package/dist/lib/node.js +419 -0
- package/dist/lib/range.d.ts +104 -0
- package/dist/lib/range.js +385 -0
- package/dist/lib/ranges.d.ts +26 -0
- package/dist/lib/ranges.js +117 -0
- package/dist/lib/text.d.ts +62 -0
- package/dist/lib/text.js +248 -0
- package/dist/lib/title.d.ts +38 -0
- package/dist/lib/title.js +162 -0
- package/dist/mixin/attributesParent.js +94 -0
- package/dist/mixin/fixed.js +32 -0
- package/dist/mixin/flagsParent.js +70 -0
- package/dist/mixin/hidden.js +26 -0
- package/dist/mixin/magicLinkParent.js +41 -0
- package/dist/mixin/singleLine.js +25 -0
- package/dist/mixin/sol.js +43 -0
- package/dist/mixin/syntax.js +56 -0
- package/dist/parser/braces.js +121 -0
- package/dist/parser/commentAndExt.js +69 -0
- package/dist/parser/converter.js +40 -0
- package/dist/parser/externalLinks.js +28 -0
- package/dist/parser/hrAndDoubleUnderscore.js +38 -0
- package/dist/parser/html.js +36 -0
- package/dist/parser/links.js +94 -0
- package/dist/parser/list.js +59 -0
- package/dist/parser/magicLinks.js +40 -0
- package/dist/parser/quotes.js +67 -0
- package/dist/parser/selector.js +162 -0
- package/dist/parser/table.js +112 -0
- package/dist/src/arg.d.ts +58 -0
- package/dist/src/arg.js +189 -0
- package/dist/src/atom.d.ts +12 -0
- package/dist/src/atom.js +27 -0
- package/dist/src/attribute.d.ts +87 -0
- package/dist/src/attribute.js +392 -0
- package/dist/src/attributes.d.ts +107 -0
- package/dist/src/attributes.js +341 -0
- package/dist/src/converter.d.ts +52 -0
- package/dist/src/converter.js +79 -0
- package/dist/src/converterFlags.d.ts +87 -0
- package/dist/src/converterFlags.js +224 -0
- package/dist/src/converterRule.d.ts +81 -0
- package/dist/src/converterRule.js +212 -0
- package/dist/src/extLink.d.ts +54 -0
- package/dist/src/extLink.js +122 -0
- package/dist/src/gallery.d.ts +55 -0
- package/dist/src/gallery.js +122 -0
- package/dist/src/heading.d.ts +74 -0
- package/dist/src/heading.js +127 -0
- package/dist/src/hidden.d.ts +22 -0
- package/dist/src/hidden.js +23 -0
- package/dist/src/html.d.ts +101 -0
- package/dist/src/html.js +222 -0
- package/dist/src/imageParameter.d.ts +66 -0
- package/dist/src/imageParameter.js +247 -0
- package/dist/src/imagemap.d.ts +57 -0
- package/dist/src/imagemap.js +148 -0
- package/dist/src/imagemapLink.d.ts +59 -0
- package/dist/src/imagemapLink.js +40 -0
- package/dist/src/index.d.ts +146 -0
- package/dist/src/index.js +777 -0
- package/dist/src/link/base.d.ts +52 -0
- package/dist/src/link/base.js +209 -0
- package/dist/src/link/category.d.ts +13 -0
- package/dist/src/link/category.js +29 -0
- package/dist/src/link/file.d.ts +96 -0
- package/dist/src/link/file.js +255 -0
- package/dist/src/link/galleryImage.d.ts +44 -0
- package/dist/src/link/galleryImage.js +106 -0
- package/dist/src/link/index.d.ts +53 -0
- package/dist/src/link/index.js +123 -0
- package/dist/src/magicLink.d.ts +70 -0
- package/dist/src/magicLink.js +147 -0
- package/dist/src/nested.d.ts +44 -0
- package/dist/src/nested.js +87 -0
- package/dist/src/nowiki/base.d.ts +47 -0
- package/dist/src/nowiki/base.js +42 -0
- package/dist/src/nowiki/comment.d.ts +40 -0
- package/dist/src/nowiki/comment.js +67 -0
- package/dist/src/nowiki/dd.d.ts +8 -0
- package/dist/src/nowiki/dd.js +25 -0
- package/dist/src/nowiki/doubleUnderscore.d.ts +45 -0
- package/dist/src/nowiki/doubleUnderscore.js +50 -0
- package/dist/src/nowiki/hr.d.ts +31 -0
- package/dist/src/nowiki/hr.js +14 -0
- package/dist/src/nowiki/index.d.ts +16 -0
- package/dist/src/nowiki/index.js +21 -0
- package/dist/src/nowiki/list.d.ts +30 -0
- package/dist/src/nowiki/list.js +48 -0
- package/dist/src/nowiki/listBase.d.ts +19 -0
- package/dist/src/nowiki/listBase.js +12 -0
- package/dist/src/nowiki/noinclude.d.ts +26 -0
- package/dist/src/nowiki/noinclude.js +25 -0
- package/dist/src/nowiki/quote.d.ts +23 -0
- package/dist/src/nowiki/quote.js +45 -0
- package/dist/src/onlyinclude.d.ts +16 -0
- package/dist/src/onlyinclude.js +57 -0
- package/dist/src/paramTag/index.d.ts +37 -0
- package/dist/src/paramTag/index.js +68 -0
- package/dist/src/paramTag/inputbox.d.ts +8 -0
- package/dist/src/paramTag/inputbox.js +23 -0
- package/dist/src/parameter.d.ts +85 -0
- package/dist/src/parameter.js +205 -0
- package/dist/src/pre.d.ts +28 -0
- package/dist/src/pre.js +51 -0
- package/dist/src/syntax.d.ts +28 -0
- package/dist/src/syntax.js +34 -0
- package/dist/src/table/base.d.ts +53 -0
- package/dist/src/table/base.js +78 -0
- package/dist/src/table/index.d.ts +229 -0
- package/dist/src/table/index.js +379 -0
- package/dist/src/table/td.d.ts +104 -0
- package/dist/src/table/td.js +261 -0
- package/dist/src/table/tr.d.ts +32 -0
- package/dist/src/table/tr.js +56 -0
- package/dist/src/table/trBase.d.ts +54 -0
- package/dist/src/table/trBase.js +159 -0
- package/dist/src/tagPair/ext.d.ts +56 -0
- package/dist/src/tagPair/ext.js +142 -0
- package/dist/src/tagPair/include.d.ts +53 -0
- package/dist/src/tagPair/include.js +63 -0
- package/dist/src/tagPair/index.d.ts +48 -0
- package/dist/src/tagPair/index.js +93 -0
- package/dist/src/transclude.d.ts +167 -0
- package/dist/src/transclude.js +689 -0
- package/dist/util/constants.js +108 -0
- package/dist/util/debug.js +64 -0
- package/dist/util/diff.js +72 -0
- package/dist/util/lint.js +46 -0
- package/dist/util/string.js +61 -0
- package/errors/README +1 -0
- package/i18n/zh-hans.json +4 -3
- package/i18n/zh-hant.json +4 -3
- package/package.json +12 -32
- package/printed/README +1 -0
- package/bundle/bundle.min.js +0 -36
- package/extensions/dist/base.js +0 -68
- package/extensions/dist/editor.js +0 -159
- package/extensions/dist/highlight.js +0 -30
- package/extensions/dist/lint.js +0 -48
- package/extensions/editor.css +0 -63
- package/extensions/ui.css +0 -117
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as Parser from '../index';
|
|
2
|
+
import { Token } from './index';
|
|
3
|
+
import { GalleryImageToken } from './link/galleryImage';
|
|
4
|
+
import { NoincludeToken } from './nowiki/noinclude';
|
|
5
|
+
import type { LintError } from '../base';
|
|
6
|
+
import type { AstNodes, AstText, AttributesToken, ExtToken } from '../internal';
|
|
7
|
+
/**
|
|
8
|
+
* gallery标签
|
|
9
|
+
* @classdesc `{childNodes: ...(GalleryImageToken|NoincludeToken|AstText)}`
|
|
10
|
+
*/
|
|
11
|
+
export declare class GalleryToken extends Token {
|
|
12
|
+
#private;
|
|
13
|
+
readonly type = "ext-inner";
|
|
14
|
+
readonly name: 'gallery';
|
|
15
|
+
readonly childNodes: (GalleryImageToken | NoincludeToken | AstText)[];
|
|
16
|
+
abstract get children(): (GalleryImageToken | NoincludeToken)[];
|
|
17
|
+
abstract get firstChild(): GalleryImageToken | NoincludeToken | AstText | undefined;
|
|
18
|
+
abstract get firstElementChild(): GalleryImageToken | NoincludeToken | undefined;
|
|
19
|
+
abstract get lastChild(): GalleryImageToken | NoincludeToken | AstText | undefined;
|
|
20
|
+
abstract get lastElementChild(): GalleryImageToken | NoincludeToken | undefined;
|
|
21
|
+
abstract get nextSibling(): undefined;
|
|
22
|
+
abstract get nextElementSibling(): undefined;
|
|
23
|
+
abstract get previousSibling(): AttributesToken;
|
|
24
|
+
abstract get previousElementSibling(): AttributesToken;
|
|
25
|
+
abstract get parentNode(): ExtToken | undefined;
|
|
26
|
+
abstract get parentElement(): ExtToken | undefined;
|
|
27
|
+
/** 所有图片 */
|
|
28
|
+
get images(): readonly GalleryImageToken[];
|
|
29
|
+
/** @param inner 标签内部wikitext */
|
|
30
|
+
constructor(inner?: string, config?: Parser.Config, accum?: Token[]);
|
|
31
|
+
/** @override */
|
|
32
|
+
text(): string;
|
|
33
|
+
/** @override */
|
|
34
|
+
lint(start?: number): LintError[];
|
|
35
|
+
/** @override */
|
|
36
|
+
print(): string;
|
|
37
|
+
/** @override */
|
|
38
|
+
cloneNode(): this;
|
|
39
|
+
/**
|
|
40
|
+
* 插入图片
|
|
41
|
+
* @param file 图片文件名
|
|
42
|
+
* @param i 插入位置
|
|
43
|
+
* @throws `SyntaxError` 非法的文件名
|
|
44
|
+
*/
|
|
45
|
+
insertImage(file: string, i?: number): GalleryImageToken;
|
|
46
|
+
/**
|
|
47
|
+
* @override
|
|
48
|
+
* @param token 待插入的节点
|
|
49
|
+
* @param i 插入位置
|
|
50
|
+
* @throws `RangeError` 插入不可见内容
|
|
51
|
+
*/
|
|
52
|
+
insertAt(token: string, i?: number): AstText;
|
|
53
|
+
/** @ignore */
|
|
54
|
+
insertAt<T extends AstNodes>(token: T, i?: number): T;
|
|
55
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GalleryToken = void 0;
|
|
4
|
+
const debug_1 = require("../util/debug");
|
|
5
|
+
const constants_1 = require("../util/constants");
|
|
6
|
+
const Parser = require("../index");
|
|
7
|
+
const index_1 = require("./index");
|
|
8
|
+
const galleryImage_1 = require("./link/galleryImage");
|
|
9
|
+
const noinclude_1 = require("./nowiki/noinclude");
|
|
10
|
+
/**
|
|
11
|
+
* gallery标签
|
|
12
|
+
* @classdesc `{childNodes: ...(GalleryImageToken|NoincludeToken|AstText)}`
|
|
13
|
+
*/
|
|
14
|
+
class GalleryToken extends index_1.Token {
|
|
15
|
+
type = 'ext-inner';
|
|
16
|
+
/* NOT FOR BROWSER */
|
|
17
|
+
/** 所有图片 */
|
|
18
|
+
get images() {
|
|
19
|
+
return this.childNodes.filter((child) => child.type === 'gallery-image');
|
|
20
|
+
}
|
|
21
|
+
/* NOT FOR BROWSER END */
|
|
22
|
+
/** @param inner 标签内部wikitext */
|
|
23
|
+
constructor(inner, config = Parser.getConfig(), accum = []) {
|
|
24
|
+
super(undefined, config, accum, {
|
|
25
|
+
AstText: ':', GalleryImageToken: ':', NoincludeToken: ':',
|
|
26
|
+
});
|
|
27
|
+
for (const line of inner?.split('\n') ?? []) {
|
|
28
|
+
const matches = /^([^|]+)(?:\|(.*))?/u.exec(line);
|
|
29
|
+
if (!matches) {
|
|
30
|
+
super.insertAt((line.trim() ? new noinclude_1.NoincludeToken(line, config) : line));
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const [, file, alt] = matches;
|
|
34
|
+
if (this.#checkFile(file)) {
|
|
35
|
+
super.insertAt(new galleryImage_1.GalleryImageToken('gallery', file, alt, config, accum));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
super.insertAt(new noinclude_1.NoincludeToken(line, config));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 检查文件名是否有效
|
|
44
|
+
* @param file 文件名
|
|
45
|
+
*/
|
|
46
|
+
#checkFile(file) {
|
|
47
|
+
return this.normalizeTitle(file, 6, true, true).valid;
|
|
48
|
+
}
|
|
49
|
+
/** @private */
|
|
50
|
+
toString(omit) {
|
|
51
|
+
return super.toString(omit, '\n');
|
|
52
|
+
}
|
|
53
|
+
/** @override */
|
|
54
|
+
text() {
|
|
55
|
+
return super.text('\n').replace(/\n\s*\n/gu, '\n');
|
|
56
|
+
}
|
|
57
|
+
/** @private */
|
|
58
|
+
getGaps() {
|
|
59
|
+
return 1;
|
|
60
|
+
}
|
|
61
|
+
/** @override */
|
|
62
|
+
lint(start = this.getAbsoluteIndex()) {
|
|
63
|
+
const { top, left } = this.getRootNode().posFromIndex(start), errors = [];
|
|
64
|
+
for (let i = 0; i < this.length; i++) {
|
|
65
|
+
const child = this.childNodes[i], str = String(child), { length } = str, trimmed = str.trim(), startLine = top + i, startCol = i ? 0 : left;
|
|
66
|
+
if (child.type === 'noinclude' && trimmed && !/^<!--.*-->$/u.test(trimmed)) {
|
|
67
|
+
errors.push({
|
|
68
|
+
message: Parser.msg('invalid content in <$1>', 'gallery'),
|
|
69
|
+
severity: 'error',
|
|
70
|
+
startIndex: start,
|
|
71
|
+
endIndex: start + length,
|
|
72
|
+
startLine,
|
|
73
|
+
endLine: startLine,
|
|
74
|
+
startCol,
|
|
75
|
+
endCol: startCol + length,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (child.type !== 'noinclude' && child.type !== 'text') {
|
|
79
|
+
errors.push(...child.lint(start));
|
|
80
|
+
}
|
|
81
|
+
start += length + 1;
|
|
82
|
+
}
|
|
83
|
+
return errors;
|
|
84
|
+
}
|
|
85
|
+
/** @override */
|
|
86
|
+
print() {
|
|
87
|
+
return super.print({ sep: '\n' });
|
|
88
|
+
}
|
|
89
|
+
/* NOT FOR BROWSER */
|
|
90
|
+
/** @override */
|
|
91
|
+
cloneNode() {
|
|
92
|
+
const cloned = this.cloneChildNodes();
|
|
93
|
+
return debug_1.Shadow.run(() => {
|
|
94
|
+
const token = new GalleryToken(undefined, this.getAttribute('config'));
|
|
95
|
+
token.append(...cloned);
|
|
96
|
+
return token;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 插入图片
|
|
101
|
+
* @param file 图片文件名
|
|
102
|
+
* @param i 插入位置
|
|
103
|
+
* @throws `SyntaxError` 非法的文件名
|
|
104
|
+
*/
|
|
105
|
+
insertImage(file, i) {
|
|
106
|
+
if (this.#checkFile(file)) {
|
|
107
|
+
const token = debug_1.Shadow.run(() => new galleryImage_1.GalleryImageToken('gallery', file, undefined, this.getAttribute('config')));
|
|
108
|
+
token.afterBuild();
|
|
109
|
+
return this.insertAt(token, i);
|
|
110
|
+
}
|
|
111
|
+
throw new SyntaxError(`非法的文件名:${file}`);
|
|
112
|
+
}
|
|
113
|
+
/** @ignore */
|
|
114
|
+
insertAt(token, i = this.length) {
|
|
115
|
+
if (typeof token === 'string' && token.trim() || token instanceof noinclude_1.NoincludeToken) {
|
|
116
|
+
throw new RangeError('请勿向图库中插入不可见内容!');
|
|
117
|
+
}
|
|
118
|
+
return super.insertAt(token, i);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.GalleryToken = GalleryToken;
|
|
122
|
+
constants_1.classes['GalleryToken'] = __filename;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as Parser from '../index';
|
|
2
|
+
import { Token } from './index';
|
|
3
|
+
import { SyntaxToken } from './syntax';
|
|
4
|
+
import type { LintError } from '../base';
|
|
5
|
+
declare const HeadingToken_base: (abstract new (...args: any[]) => {
|
|
6
|
+
prependNewLine(): string;
|
|
7
|
+
toString(omit?: Set<string> | undefined): string;
|
|
8
|
+
getAttribute<S extends string>(key: S): TokenAttributeGetter<S>;
|
|
9
|
+
text(): string;
|
|
10
|
+
readonly length: number;
|
|
11
|
+
lint(start?: number | undefined): Parser.LintError[];
|
|
12
|
+
insertAt(token: unknown, i?: number | undefined): unknown;
|
|
13
|
+
afterBuild(): void;
|
|
14
|
+
setAttribute<T extends string>(key: T, value: TokenAttributeSetter<T>): void;
|
|
15
|
+
addEventListener(events: string | string[], listener: AstListener): void;
|
|
16
|
+
replaceChildren(...elements: (string | Parser.AstNodes)[]): void;
|
|
17
|
+
}) & ((abstract new (...args: any[]) => {
|
|
18
|
+
removeAt(): never;
|
|
19
|
+
insertAt(token: string, i?: number | undefined): Parser.AstText;
|
|
20
|
+
insertAt<T_1 extends Parser.AstNodes>(token: T_1, i?: number | undefined): T_1;
|
|
21
|
+
readonly length: number;
|
|
22
|
+
toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
|
|
23
|
+
text(separator?: string | undefined): string;
|
|
24
|
+
lint(start?: number | undefined): Parser.LintError[];
|
|
25
|
+
afterBuild(): void;
|
|
26
|
+
getAttribute<T_2 extends string>(key: T_2): TokenAttributeGetter<T_2>;
|
|
27
|
+
setAttribute<T extends string>(key: T, value: TokenAttributeSetter<T>): void;
|
|
28
|
+
addEventListener(events: string | string[], listener: AstListener): void;
|
|
29
|
+
replaceChildren(...elements: (string | Parser.AstNodes)[]): void;
|
|
30
|
+
}) & {
|
|
31
|
+
readonly fixed: true;
|
|
32
|
+
}) & typeof Parser.Token;
|
|
33
|
+
/**
|
|
34
|
+
* 章节标题
|
|
35
|
+
* @classdesc `{childNodes: [Token, SyntaxToken]}`
|
|
36
|
+
*/
|
|
37
|
+
export declare class HeadingToken extends HeadingToken_base {
|
|
38
|
+
#private;
|
|
39
|
+
readonly type = "heading";
|
|
40
|
+
readonly childNodes: [Token, SyntaxToken];
|
|
41
|
+
abstract get children(): [Token, SyntaxToken];
|
|
42
|
+
abstract get firstChild(): Token;
|
|
43
|
+
abstract get firstElementChild(): Token;
|
|
44
|
+
abstract get lastChild(): SyntaxToken;
|
|
45
|
+
abstract get lastElementChild(): SyntaxToken;
|
|
46
|
+
/** 标题层级 */
|
|
47
|
+
get level(): number;
|
|
48
|
+
set level(n: number);
|
|
49
|
+
/** 内部wikitext */
|
|
50
|
+
get innerText(): string;
|
|
51
|
+
/** @throws `RangeError` 首尾包含`=` */
|
|
52
|
+
set innerText(text: string);
|
|
53
|
+
/**
|
|
54
|
+
* @param level 标题层级
|
|
55
|
+
* @param input 标题文字
|
|
56
|
+
*/
|
|
57
|
+
constructor(level: number, input: readonly [string?, string?], config?: Parser.Config, accum?: Token[]);
|
|
58
|
+
/** @override */
|
|
59
|
+
text(): string;
|
|
60
|
+
/** @override */
|
|
61
|
+
lint(start?: number): LintError[];
|
|
62
|
+
/** @override */
|
|
63
|
+
print(): string;
|
|
64
|
+
/** @override */
|
|
65
|
+
cloneNode(): this;
|
|
66
|
+
/**
|
|
67
|
+
* 设置标题层级
|
|
68
|
+
* @param n 标题层级
|
|
69
|
+
*/
|
|
70
|
+
setLevel(n: number): void;
|
|
71
|
+
/** 移除标题后的不可见内容 */
|
|
72
|
+
removeTrail(): void;
|
|
73
|
+
}
|
|
74
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HeadingToken = void 0;
|
|
4
|
+
const lint_1 = require("../util/lint");
|
|
5
|
+
const debug_1 = require("../util/debug");
|
|
6
|
+
const constants_1 = require("../util/constants");
|
|
7
|
+
const fixed_1 = require("../mixin/fixed");
|
|
8
|
+
const sol_1 = require("../mixin/sol");
|
|
9
|
+
const Parser = require("../index");
|
|
10
|
+
const index_1 = require("./index");
|
|
11
|
+
const syntax_1 = require("./syntax");
|
|
12
|
+
/**
|
|
13
|
+
* 章节标题
|
|
14
|
+
* @classdesc `{childNodes: [Token, SyntaxToken]}`
|
|
15
|
+
*/
|
|
16
|
+
class HeadingToken extends (0, sol_1.sol)((0, fixed_1.fixed)(index_1.Token)) {
|
|
17
|
+
type = 'heading';
|
|
18
|
+
#level;
|
|
19
|
+
/** 标题格式的等号 */
|
|
20
|
+
get #equals() {
|
|
21
|
+
return '='.repeat(this.level);
|
|
22
|
+
}
|
|
23
|
+
/** 标题层级 */
|
|
24
|
+
get level() {
|
|
25
|
+
return this.#level;
|
|
26
|
+
}
|
|
27
|
+
/* NOT FOR BROWSER */
|
|
28
|
+
set level(n) {
|
|
29
|
+
this.setLevel(n);
|
|
30
|
+
}
|
|
31
|
+
/** 内部wikitext */
|
|
32
|
+
get innerText() {
|
|
33
|
+
return this.firstChild.text();
|
|
34
|
+
}
|
|
35
|
+
/** @throws `RangeError` 首尾包含`=` */
|
|
36
|
+
set innerText(text) {
|
|
37
|
+
if (text.length > 1 && text.startsWith('=') && text.endsWith('=')) {
|
|
38
|
+
throw new RangeError(`修改标题层级请使用 ${this.constructor.name}.setLevel 方法!`);
|
|
39
|
+
}
|
|
40
|
+
const { childNodes } = Parser.parse(text, this.getAttribute('include'), undefined, this.getAttribute('config'));
|
|
41
|
+
this.firstChild.replaceChildren(...childNodes);
|
|
42
|
+
}
|
|
43
|
+
/* NOT FOR BROWSER END */
|
|
44
|
+
/**
|
|
45
|
+
* @param level 标题层级
|
|
46
|
+
* @param input 标题文字
|
|
47
|
+
*/
|
|
48
|
+
constructor(level, input, config = Parser.getConfig(), accum = []) {
|
|
49
|
+
super(undefined, config, accum);
|
|
50
|
+
this.#level = level;
|
|
51
|
+
const token = new index_1.Token(input[0], config, accum);
|
|
52
|
+
token.type = 'heading-title';
|
|
53
|
+
token.setAttribute('stage', 2);
|
|
54
|
+
const trail = new syntax_1.SyntaxToken(input[1], /^[^\S\n]*$/u, 'heading-trail', config, accum, {
|
|
55
|
+
'Stage-1': ':', '!ExtToken': '',
|
|
56
|
+
});
|
|
57
|
+
this.append(token, trail);
|
|
58
|
+
}
|
|
59
|
+
/** @private */
|
|
60
|
+
toString(omit) {
|
|
61
|
+
const equals = this.#equals;
|
|
62
|
+
return omit && this.matchesTypes(omit)
|
|
63
|
+
? ''
|
|
64
|
+
: `${this.prependNewLine()}${equals}${this.firstChild.toString(omit)}${equals}${this.lastChild.toString(omit)}`;
|
|
65
|
+
}
|
|
66
|
+
/** @override */
|
|
67
|
+
text() {
|
|
68
|
+
const equals = this.#equals;
|
|
69
|
+
return `${this.prependNewLine()}${equals}${this.firstChild.text()}${equals}`;
|
|
70
|
+
}
|
|
71
|
+
/** @private */
|
|
72
|
+
getAttribute(key) {
|
|
73
|
+
return key === 'padding'
|
|
74
|
+
? super.getAttribute('padding') + this.level
|
|
75
|
+
: super.getAttribute(key);
|
|
76
|
+
}
|
|
77
|
+
/** @private */
|
|
78
|
+
getGaps() {
|
|
79
|
+
return this.level;
|
|
80
|
+
}
|
|
81
|
+
/** @override */
|
|
82
|
+
lint(start = this.getAbsoluteIndex()) {
|
|
83
|
+
const errors = super.lint(start), { firstChild } = this, innerStr = String(firstChild);
|
|
84
|
+
let refError;
|
|
85
|
+
if (this.level === 1) {
|
|
86
|
+
refError = (0, lint_1.generateForChild)(firstChild, { start }, '<h1>');
|
|
87
|
+
errors.push(refError);
|
|
88
|
+
}
|
|
89
|
+
if (innerStr.startsWith('=') || innerStr.endsWith('=')) {
|
|
90
|
+
refError ??= (0, lint_1.generateForChild)(firstChild, { start }, '');
|
|
91
|
+
errors.push({ ...refError, message: Parser.msg('unbalanced "=" in a section header') });
|
|
92
|
+
}
|
|
93
|
+
if (this.closest('html-attrs, table-attrs')) {
|
|
94
|
+
errors.push({ ...(0, lint_1.generateForSelf)(this, { start }, ''), message: Parser.msg('section header in a HTML tag') });
|
|
95
|
+
}
|
|
96
|
+
return errors;
|
|
97
|
+
}
|
|
98
|
+
/** @override */
|
|
99
|
+
print() {
|
|
100
|
+
const equals = this.#equals;
|
|
101
|
+
return super.print({ pre: equals, sep: equals });
|
|
102
|
+
}
|
|
103
|
+
/* NOT FOR BROWSER */
|
|
104
|
+
/** @override */
|
|
105
|
+
cloneNode() {
|
|
106
|
+
const [title, trail] = this.cloneChildNodes();
|
|
107
|
+
return debug_1.Shadow.run(() => {
|
|
108
|
+
const token = new HeadingToken(this.level, [], this.getAttribute('config'));
|
|
109
|
+
token.firstChild.safeReplaceWith(title);
|
|
110
|
+
token.lastChild.safeReplaceWith(trail);
|
|
111
|
+
return token;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 设置标题层级
|
|
116
|
+
* @param n 标题层级
|
|
117
|
+
*/
|
|
118
|
+
setLevel(n) {
|
|
119
|
+
this.#level = Math.min(Math.max(n, 1), 6);
|
|
120
|
+
}
|
|
121
|
+
/** 移除标题后的不可见内容 */
|
|
122
|
+
removeTrail() {
|
|
123
|
+
this.lastChild.replaceChildren();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.HeadingToken = HeadingToken;
|
|
127
|
+
constants_1.classes['HeadingToken'] = __filename;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Token } from './index';
|
|
2
|
+
declare const HiddenToken_base: ((abstract new (...args: any[]) => {
|
|
3
|
+
text(): string;
|
|
4
|
+
lint(): import("..").LintError[];
|
|
5
|
+
readonly length: number;
|
|
6
|
+
toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
|
|
7
|
+
insertAt(token: unknown, i?: number | undefined): unknown;
|
|
8
|
+
afterBuild(): void;
|
|
9
|
+
getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
|
|
10
|
+
setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
|
|
11
|
+
addEventListener(events: string | string[], listener: AstListener): void;
|
|
12
|
+
replaceChildren(...elements: (string | import("..").AstNodes)[]): void;
|
|
13
|
+
}) & {
|
|
14
|
+
readonly hidden: true;
|
|
15
|
+
}) & typeof Token;
|
|
16
|
+
/** 不可见的节点 */
|
|
17
|
+
export declare class HiddenToken extends HiddenToken_base {
|
|
18
|
+
readonly type = "hidden";
|
|
19
|
+
/** @override */
|
|
20
|
+
cloneNode(): this;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HiddenToken = void 0;
|
|
4
|
+
const debug_1 = require("../util/debug");
|
|
5
|
+
const constants_1 = require("../util/constants");
|
|
6
|
+
const hidden_1 = require("../mixin/hidden");
|
|
7
|
+
const index_1 = require("./index");
|
|
8
|
+
/** 不可见的节点 */
|
|
9
|
+
class HiddenToken extends (0, hidden_1.hidden)(index_1.Token) {
|
|
10
|
+
type = 'hidden';
|
|
11
|
+
/* NOT FOR BROWSER */
|
|
12
|
+
/** @override */
|
|
13
|
+
cloneNode() {
|
|
14
|
+
const cloned = this.cloneChildNodes(), config = this.getAttribute('config'), acceptable = this.getAttribute('acceptable');
|
|
15
|
+
return debug_1.Shadow.run(() => {
|
|
16
|
+
const token = new HiddenToken(undefined, config, [], acceptable);
|
|
17
|
+
token.append(...cloned);
|
|
18
|
+
return token;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.HiddenToken = HiddenToken;
|
|
23
|
+
constants_1.classes['HiddenToken'] = __filename;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as Parser from '../index';
|
|
2
|
+
import { Token } from './index';
|
|
3
|
+
import type { LintError } from '../base';
|
|
4
|
+
import type { AttributesToken } from '../internal';
|
|
5
|
+
declare const HtmlToken_base: (abstract new (...args: any[]) => {
|
|
6
|
+
readonly childNodes: Parser.AstNodes[];
|
|
7
|
+
readonly "__#7@#attributesChild": Parser.AttributesToken;
|
|
8
|
+
attributes: Record<string, string | true>;
|
|
9
|
+
className: string;
|
|
10
|
+
classList: Set<string>;
|
|
11
|
+
id: string;
|
|
12
|
+
hasAttr(key: string): boolean;
|
|
13
|
+
getAttr(key: string): string | true | undefined;
|
|
14
|
+
getAttrNames(): Set<string>;
|
|
15
|
+
getAttrs(): Record<string, string | true>;
|
|
16
|
+
setAttr(key: string, value: string | boolean): void;
|
|
17
|
+
removeAttr(key: string): void;
|
|
18
|
+
toggleAttr(key: string, force?: boolean | undefined): void;
|
|
19
|
+
readonly length: number;
|
|
20
|
+
toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
|
|
21
|
+
text(separator?: string | undefined): string;
|
|
22
|
+
lint(start?: number | undefined): Parser.LintError[];
|
|
23
|
+
insertAt(token: unknown, i?: number | undefined): unknown;
|
|
24
|
+
afterBuild(): void;
|
|
25
|
+
getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
|
|
26
|
+
setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
|
|
27
|
+
addEventListener(events: string | string[], listener: AstListener): void;
|
|
28
|
+
replaceChildren(...elements: (string | Parser.AstNodes)[]): void;
|
|
29
|
+
}) & ((abstract new (...args: any[]) => {
|
|
30
|
+
removeAt(): never;
|
|
31
|
+
insertAt(token: string, i?: number | undefined): Parser.AstText;
|
|
32
|
+
insertAt<T_2 extends Parser.AstNodes>(token: T_2, i?: number | undefined): T_2;
|
|
33
|
+
readonly length: number;
|
|
34
|
+
toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
|
|
35
|
+
text(separator?: string | undefined): string;
|
|
36
|
+
lint(start?: number | undefined): Parser.LintError[];
|
|
37
|
+
afterBuild(): void;
|
|
38
|
+
getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
|
|
39
|
+
setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
|
|
40
|
+
addEventListener(events: string | string[], listener: AstListener): void;
|
|
41
|
+
replaceChildren(...elements: (string | Parser.AstNodes)[]): void;
|
|
42
|
+
}) & {
|
|
43
|
+
readonly fixed: true;
|
|
44
|
+
}) & typeof Parser.Token;
|
|
45
|
+
/**
|
|
46
|
+
* HTML标签
|
|
47
|
+
* @classdesc `{childNodes: [AttributesToken]}`
|
|
48
|
+
*/
|
|
49
|
+
export declare class HtmlToken extends HtmlToken_base {
|
|
50
|
+
#private;
|
|
51
|
+
readonly type = "html";
|
|
52
|
+
readonly name: string;
|
|
53
|
+
readonly childNodes: [AttributesToken];
|
|
54
|
+
abstract get children(): [AttributesToken];
|
|
55
|
+
abstract get firstChild(): AttributesToken;
|
|
56
|
+
abstract get firstElementChild(): AttributesToken;
|
|
57
|
+
abstract get lastChild(): AttributesToken;
|
|
58
|
+
abstract get lastElementChild(): AttributesToken;
|
|
59
|
+
/** 是否是闭合标签 */
|
|
60
|
+
get closing(): boolean;
|
|
61
|
+
/** @throws `Error` 自封闭标签或空标签 */
|
|
62
|
+
set closing(value: boolean);
|
|
63
|
+
/** 是否自封闭 */
|
|
64
|
+
get selfClosing(): boolean;
|
|
65
|
+
/** @throws `Error` 闭合标签或无效自封闭标签 */
|
|
66
|
+
set selfClosing(value: boolean);
|
|
67
|
+
/**
|
|
68
|
+
* @param name 标签名
|
|
69
|
+
* @param attr 标签属性
|
|
70
|
+
* @param closing 是否闭合
|
|
71
|
+
* @param selfClosing 是否自封闭
|
|
72
|
+
*/
|
|
73
|
+
constructor(name: string, attr: AttributesToken, closing: boolean, selfClosing: boolean, config?: Parser.Config, accum?: Token[]);
|
|
74
|
+
/** @override */
|
|
75
|
+
text(): string;
|
|
76
|
+
/** @override */
|
|
77
|
+
lint(start?: number): LintError[];
|
|
78
|
+
/**
|
|
79
|
+
* 搜索匹配的标签
|
|
80
|
+
* @throws `SyntaxError` 同时闭合和自封闭的标签
|
|
81
|
+
* @throws `SyntaxError` 无效自封闭标签
|
|
82
|
+
* @throws `SyntaxError` 未闭合的标签
|
|
83
|
+
*/
|
|
84
|
+
findMatchingTag(): this | undefined;
|
|
85
|
+
/** @override */
|
|
86
|
+
print(): string;
|
|
87
|
+
/** @override */
|
|
88
|
+
cloneNode(): this;
|
|
89
|
+
/**
|
|
90
|
+
* 更换标签名
|
|
91
|
+
* @param tag 标签名
|
|
92
|
+
* @throws `RangeError` 非法的HTML标签
|
|
93
|
+
*/
|
|
94
|
+
replaceTag(tag: string): void;
|
|
95
|
+
/**
|
|
96
|
+
* 修复无效自封闭标签
|
|
97
|
+
* @throws `Error` 无法修复无效自封闭标签
|
|
98
|
+
*/
|
|
99
|
+
fix(): void;
|
|
100
|
+
}
|
|
101
|
+
export {};
|