-
Notifications
You must be signed in to change notification settings - Fork 2
Token
wikiparser-node 解析生成的语法树的每个节点均为一个 Token 对象。Token 类的父类 AstElement 是仿照 HTMLElement 类设计的,属性和方法也和 HTMLElement 类非常相似。本页面将首先简单列举 AstElement 类与 HTMLElement 类相仿的属性和方法,然后介绍 Token 类的特有属性和方法。
以下仅简单列举 AstElement 类与 HTMLElement 类相仿的属性和方法。比较特殊的一点在于 AstElement 对象的位置由起始字符的行列号代表,高度为对应文本的行数,宽度为最后一行的字数。另外关于 matches 等依赖选择器的方法,详见选择器。
children: this[]
firstChild: string|this|undefined
firstElementChild: this|undefined
lastChild string|this|undefined
lastElementChild: this|undefined
isConnected: boolean
parentNode: this|undefined
parentElement: this|undefined
nextSibling: string|this|undefined
nextElementSibling: this|undefined
previousSibling: string|this|undefined
previousElementSibling: this|undefined
hidden: boolean
offsetHeight: number
offsetWidth: number
offsetTop: number
offsetLeft: number
style: {top: number, left: number, height: number, width: number, padding: number}
isEqualNode(node: this): boolean
cloneNode(): this
hasAttribute(key: PropertyKey): boolean
getAttribute(key: PropertyKey): string|undefined
getAttributeNames(): string[]
hasAttributes(): boolean
setAttribte(key: PropertyKey, value: any): this
removeAttribute(key: PropertyKey): void
toggleAttribute(key: PropertyKey, force?: boolean): void
hasChildNodes(): boolean
contains(node: this): boolean
removeChild(node: this): this
appendChild(node: string|this): string|this
append(...elements: string|this): void
insertBefore(node: string|this, reference: this): string|this
prepend(...elements: string|this): void
replaceChild(newChild: string|this, oldChild: this): this
replaceChildren(...elements: string|this): void
after(...element: string|this): void
before(...element: string|this): void
remove(): void
replaceWith(...elements: string|this): void
normalize(): void
getRootNode(): this
addEventListener(type: string, listener: (e: event, data: any) => void, options?: {once: boolean}): void
removeEventListener(type: string, listener: (e: event, data: any) => void): void
dispatchEvent(e: event, data: any): void
matches(selector: string): boolean
comparePosition(other: this): number
closest(selector: string): this|undefined
querySelector(selector: string): this|undefined
querySelectorAll(selector: string): this[]
getBoundingClientRect(): {height: number, width: number, top: number, left: number}
splitText(i: number, offset: number): string
这是所有特定维基语法对应节点的基础类。
- 根节点的值为
root
,下表整理了目前所有定义的type
属性。
展开
type | 说明 |
---|---|
root | 根节点 |
plain | 普通节点 |
onlyinclude | <onlyinclude> |
noinclude | <noinclude> |
include | <includeonly> |
comment | HTML 注释 |
ext | 扩展标签 |
ext-attr | 扩展标签属性 |
ext-inner | 扩展标签内部 |
arg |
{{{}}} 包裹的参数 |
arg-name | 参数名 |
arg-default | 参数预设值 |
template | 模板 |
template-name | 模板名 |
magic-word | 魔术字 |
invoke-module | Lua 模块名 |
invoke-function | Lua 函数名 |
parameter | 模板参数 |
parameter-key | 模板参数名 |
parameter-value | 模板参数值 |
heading | 章节标题 |
heading-title | 章节标题文本 |
html | HTML 标签 |
html-attr | HTML 标签属性 |
table | 表格 |
tr | 表格行 |
td | 表格单元格 |
table-attr | 表格属性 |
td-inner | 表格单元格内的文本 |
double-underscore | 状态开关 |
hr | 水平线 |
link | 内链 |
link-target | 内链目标 |
link-text | 内链文本 |
category | 分类 |
file | 文件内链 |
image-parameter | 图片内链参数 |
quote | 单引号(斜体和粗体) |
ext-link | 外链 |
ext-link-url | 外链网址 |
ext-link-text | 外链文本 |
free-ext-link | 自由外链 |
list | 位于行首的各类列表 |
dd | 不在行首的: 缩进 |
converter | 转换语法 |
converter-flags | 转换 flag 集 |
converter-flag | 单个转换 flag |
converter-rule | 单条转换规则 |
converter-rule-noconvert | 不转换的文本 |
converter-rule-variant | 单条转换规则对应的语言变体 |
converter-rule-to | 单条转换规则转换后的结果 |
converter-rule-from | 单条转换规则转换前的文本 |
var root = Parser.parse(wikitext);
assert(root.type === 'root');
print(format?: 'markup'|'json' = 'markup'): void|object
- 打印解析生成的语法树。
var root = Parser.parse("<ref>{{T|<br>\n----\n[[File:F|thumb|''[//example.net]'']]}}</ref>");
root.print(); // 这将以仿照XML的格式在屏幕上打印语法树
root.print('json', 'example'); // JSON格式的输出结果将保存至 /printed/example.json 文件
previousVisibleSibling: string|Token|undefined
nextVisibleSibling: string|Token|undefined
- 类似 previousSibling 和 nextSibling,但过滤掉了所有不可见的纯文本或 Token 子节点。
- 销毁节点,只能对根节点使用。
- 获取所有祖先节点。
var root = Parser.parse('<ref/>'),
attr = root.querySelector('ext-attr');
assert.deepStrictEqual(attr.getAncestors(), [attr.parentElement, root]);
- 是否是基础类(即无特殊维基语法要求的 Token)。
var root = Parser.parse(wikitext);
assert(root.isPlain() === true); // 根节点总是基础类
- 还原为完整的维基文本。
var root = Parser.parse(wikitext);
assert(root.toString() === wikitext); // 解析是可逆的
- 移除不可见的维基文本,包括 HTML 注释、仅用于嵌入的文字(即
<includeonly>
或<onlyinclude>
标签内部)、无效的标签属性等。
var root = Parser.parse('<!-- a -->{{{||b}}}<br */>');
assert(root.text() === '{{{|}}}<br/>');
setText(text: string, i: number): void
- 只能通过这个方法修改指定位置上的纯字符串节点。
var root = Parser.parse('');
root.setText('string', 0);
assert(root.toString() === 'string');
safeReplaceWith(token: Token): void
- 将节点替换为一个同类节点,相当于replaceWith,但适用于父节点有规定的子节点顺序时。
- 将页面分割为章节,每个章节对应一个 Token 数组。
var root = Parser.parse('a\n==b==\nc\n===d===\n'),
{childNodes} = root,
sections = root.sections();
assert.deepStrictEqual(sections, [childNodes.slice(0, 1), childNodes.slice(1), childNodes.slice(3)]);
- 仅获取指定章节。
var root = Parser.parse('a\n==b==\nc\n===d===\n'),
section = root.section(0); // 序言对应的编号为 0
assert.deepStrictEqual(section, [root.firstChild]);
findEnclosingHtml(tag?: string): [Token, Token]
- 搜索包裹当前 Token 的 HTML 标签对,不指定
tag
参数时会搜索任意 HTML 标签。
var root = Parser.parse('<p>{{a}}</p>'),
template = root.querySelector('template');
assert.deepStrictEqual(template.findEnclosingHtml('p'), [root.firstChild, root.lastChild]);
getCategories(): [string, string][]
- 获取所有分类和对应的排序关键字。
var root = Parser.parse('[[category:a|*]]');
assert.deepStrictEqual(root.getCategories(), [['Category:A', '*']]);
- 经过一系列编辑操作后,重新局部解析
'
。注意这个方法会忽略所有 Token,只解析当前节点的直接纯文本子节点。
var root = Parser.parse("'''a'''");
root.lastElementChild.setText("''");
assert(root.toString() === "'''a''");
root.redoQuotes();
assert.deepStrictEqual(root.childNodes, ["'", root.firstElementChild, "a", root.lastElementChild]);
对维基文本批量执行语法检查的命令行工具
用于维基文本的 ESLint 插件
A command-line tool that performs linting on Wikitext in bulk
ESLint plugin for Wikitext