Skip to content
Bhsd edited this page Jul 7, 2022 · 28 revisions

简介

wikiparser-node 解析生成的语法树的每个节点均为一个 Token 对象。Token 类的父类 AstElement 是仿照 HTMLElement 类设计的,属性和方法也和 HTMLElement 类非常相似。本页面将首先简单列举 AstElement 类与 HTMLElement 类相仿的属性和方法,然后介绍 Token 类的特有属性和方法。

AstElement

以下仅简单列举 AstElement 类与 HTMLElement 类相仿的属性和方法。比较特殊的一点在于 AstElement 对象的位置由起始字符的行列号代表,高度为对应文本的行数,宽度为最后一行的字数。另外关于 matches 等依赖选择器的方法,详见选择器

实例属性

childNodes: (string|this)[]

原型属性

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

Token

这是所有特定维基语法对应节点的基础类。

实例属性

type: 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

原型方法

destroy(): void

  • 销毁节点,只能对根节点使用。

getAncestors(): Token[]

  • 获取所有祖先节点。
var root = Parser.parse('<ref/>'),
    attr = root.querySelector('ext-attr');
assert.deepStrictEqual(attr.getAncestors(), [attr.parentElement, root]);

isPlain(): boolean

  • 是否是基础类(即无特殊维基语法要求的 Token)。
var root = Parser.parse(wikitext);
assert(root.isPlain() === true); // 根节点总是基础类

toString(): string

  • 还原为完整的维基文本。
var root = Parser.parse(wikitext);
assert(root.toString() === wikitext); // 解析是可逆的

text(): string

  • 移除不可见的维基文本,包括 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,但适用于父节点有规定的子节点顺序时。

sections(): Token[][]

  • 将页面分割为章节,每个章节对应一个 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)]);

section(n: number): Token[]

  • 仅获取指定章节。
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', '*']]);

redoQuotes(): void

  • 经过一系列编辑操作后,重新局部解析'。注意这个方法会忽略所有 Token,只解析当前节点的直接纯文本子节点。
var root = Parser.parse("'''a'''");
root.lastElementChild.setText("''");
assert(root.toString() === "'''a''");
root.redoQuotes();
assert.deepStrictEqual(root.childNodes, ["'", root.firstElementChild, "a", root.lastElementChild]);
Clone this wiki locally