Parser - bhsd-harry/wikiparser-node GitHub Wiki
目录
程序的主入口是个名为 Parser 的对象。通常情况下,所有操作的第一步都是通过 Parser.parse 方法生成一个完整的语法树,然后再对语法树进行查询和修改,最后输出维基文本。
✅ 在 Mini 和 Browser 版本中可用。
🌐 在 Browser 版本中可用。
const Parser = require('wikiparser-node'); // CommonJS或
import Parser from 'wikiparser-node'; // ES module或
import Parser = require('wikiparser-node'); // TypeScript✅ 展开
type: Config | string
指定解析设置的绝对路径或相对于 WikiParser-Node 的路径,或完整的设置对象。预设的解析设置包含英文维基百科(enwiki)、中文维基百科(zhwiki)、日文维基百科(jawiki)、萌娘百科(moegirl)和 LLWiki(llwiki)。如需定制一个 MediaWiki 站点的解析设置,请参考 .schema.json 填入相关内容。
对于安装了 CodeMirror 扩展的 MediaWiki 站点,可以使用 Parser.fetchConfig 方法来自动获取解析设置。
// config (Node.js)
var config;
Parser.config = "zhwiki"; // 使用中文维基百科的设置
config = Parser.getConfig();
Parser.config = "./config/zhwiki"; // 使用相对路径也是等效的
assert.deepStrictEqual(Parser.getConfig(), config);✅ 展开
加入的版本:1.25.1
type: string[]
额外的解析设置检索路径,默认为空数组。这个数组中的路径会在默认的配置路径之前被检索。
// configPaths (Node.js)
Parser.configPaths.push("config");
Parser.config = "./enwiki";
assert.strictEqual(Parser.getConfig().articlePath, "/wiki/$1");展开
type: Map<string, string>
用于设置单向语言变体转换。
// conversionTable (main)
Parser.conversionTable.set("頁", "页");
assert.strictEqual(Parser.normalizeTitle("首頁").title, "首页");展开
type: boolean
是否输出调试信息,默认为 false。
✅ 展开
type: string
指定语法错误信息需要用到的语言文件的绝对路径或相对于 WikiParser-Node 的路径。默认语言为英文,其他预设的语言包含简体中文和繁体中文。
// i18n (Node.js)
var message;
Parser.i18n = "zh-hans";
[{message}] = Parser.parse("<!--").lint();
assert.strictEqual(message, "未闭合的HTML注释");
Parser.i18n = "./i18n/zh-hans"; // 使用相对路径也是等效的
[{message}] = Parser.parse("<!--").lint();
assert.strictEqual(message, "未闭合的HTML注释");
Parser.i18n = {"unclosed-comment": "unclosed HTML comment"};
[{message}] = Parser.parse("<!--").lint();
assert.strictEqual(message, "unclosed HTML comment");展开
type: Map<string, string>
用于设置重定向。注意页面名称必须首字母大写且空格需替换为下划线。
// redirects (main)
var title;
Parser.redirects.set("main_page", "project : 首页#EN");
title = Parser.normalizeTitle("main page");
assert.strictEqual(title.title, "Project:首页");
assert.equal(title, "Project:首页#EN");✅ 展开
加入的版本:1.5.1
type: LintError.Rule[]
全部语法检查规则。
// rules (Node.js)
assert.deepStrictEqual(
Parser.rules,
[
"arg-in-ext",
"blank-alt",
"bold-header",
"format-leakage",
"fostered-content",
"h1",
"illegal-attr",
"insecure-style",
"invalid-gallery",
"invalid-imagemap",
"invalid-invoke",
"invalid-isbn",
"invalid-json",
"invalid-url",
"lonely-apos",
"lonely-bracket",
"lonely-http",
"nested-link",
"no-arg",
"no-duplicate",
"no-ignored",
"obsolete-attr",
"obsolete-tag",
"parsing-order",
"pipe-like",
"required-attr",
"syntax-like",
"table-layout",
"tag-like",
"unbalanced-header",
"unclosed-comment",
"unclosed-quote",
"unclosed-table",
"unescaped",
"unknown-page",
"unmatched-tag",
"unterminated-url",
"url-encoding",
"var-anchor",
"void-ext",
"invalid-css",
"invalid-math",
],
);展开
加入的版本:1.10.0
type: string
指定模板文件夹的绝对路径或相对于 WikiParser-Node 的路径,用于 Token.prototype.expand。在 Windows 文件系统中,页面标题中的冒号(:)需要被替换为 Unicode 冒号(꞉)。
展开
加入的版本:1.10.0
type: Map<string, string>
除了使用 Parser.templateDir 外,也可以手动添加模板到这个 Map 对象中,以模板的标题为键,以模板的维基文本为值。
// templates (main)
Parser.templates.set("template:a", "1");
assert.equal(Parser.parse("{{a}}").expand(), "1");展开
加入的版本:1.9.0
type: boolean
是否只解析而不修改,默认为 false。当设置为 true 时,解析器的性能会有所提升。
展开
type: boolean
是否输出警告信息,默认为 true。
展开
加入的版本:1.31.0
param: string 解析器函数名
param: string | string[] | Record<string, string> 解析器函数参数,可选
returns: string
调用解析器函数。
// callParserFunction (main)
assert.strictEqual(Parser.callParserFunction("articlepath"), "/wiki/$1");
assert.strictEqual(Parser.callParserFunction("lcfirst", "HELLO"), "hELLO");
assert.strictEqual(Parser.callParserFunction("ns", ["3"]), "User talk");
assert.strictEqual(
Parser.callParserFunction("localurl", {1: "Hello World", action: "edit"}),
"/wiki/Hello_World?action=edit",
);
Parser.setFunctionHook("invoke", () => "LuaModule");
assert.strictEqual(Parser.callParserFunction("invoke"), "LuaModule");✅ 展开
加入的版本:1.16.1
param: object 文档对象,可选
returns: LanguageService
创建一个语言服务任务。注意调用这个方法会自动将 viewOnly 设置为 true。
展开
加入的版本:1.18.4
param: string 网站别名
param: string 脚本路径
param: string 维基用户页面地址或用户的电子邮件地址,可选
returns: Promise<Config>
获取安装了 CodeMirror 扩展 的指定 MediaWiki 站点的解析设置。
Parser.fetchConfig("frwiki", "https://fr.wikipedia.org/w/", "[email protected]");✅ 展开
returns: Config
获取解析设置。
展开
加入的版本:1.22.0
param: string 脚本路径
returns: [string, string]
获取一个WMF网站的简称和 hostname。
// getWMFSite (Node.js)
assert.deepStrictEqual(
Parser.getWMFSite("https://en.wikipedia.org/w/"),
["enwiki", "https://en.wikipedia.org"],
);
assert.deepStrictEqual(
Parser.getWMFSite("https://zh.wiktionary.org/w/"),
["zhwiktionary", "https://zh.wiktionary.org"],
);展开
param: string 链接标题
returns: RegExpExecArray | null
是否是跨维基链接。注意使用默认的解析设置时不会包含任何跨维基的信息。
// isInterwiki (main)
Parser.getConfig();
Parser.config.interwiki = ["mw"];
assert.deepStrictEqual(
Parser.isInterwiki("mw :Main_Page"),
Object.assign(["mw :", "mw"], {
index: 0,
input: "mw :Main Page",
groups: undefined,
indices: Object.assign([[0, 4], [0, 2]], {groups: undefined}),
}),
);✅ 展开
加入的版本:1.32.0
param: string 维基文本
param: string 页面标题,可选
param: boolean 是否嵌入
returns: LintError[] & {output?: string}
报告潜在语法错误,详见各类型节点的文档。
✅ 展开
param: string 标题(含或不含命名空间前缀)
param: number 命名空间,默认为 0
returns: Title
规范化页面标题。注意使用默认的解析设置时不会包含任何跨维基的信息。
// normalizeTitle
var title = Parser.normalizeTitle("lang#參考資料", 10);
assert.strictEqual(title.title, "Template:Lang");
assert.strictEqual(title.fragment, "參考資料");
title = Parser.normalizeTitle("File:<");
assert.ok(!title.valid);// normalizeTitle (main)
var title;
Parser.getConfig();
Parser.config.interwiki = ["zhwp"];
title = Parser.normalizeTitle("zhwp : 模板 : lang#參考資料");
assert.equal(title, "zhwp:Template:Lang#參考資料");✅ 展开
param: string 维基文本
param: string 页面标题,可选
param: boolean 是否嵌入
param: number | string | string[] 解析阶段
returns: Token
解析维基文本。注意列表元素(<ul>、<ol>、<dl>)不会被完全解析,而是额外需要调用 Token.prototype.buildLists 方法。
// parse
var wikitext = "<includeonly>i</includeonly><noinclude>n</noinclude>";
assert.strictEqual(Parser.parse(wikitext).text(), "n");
assert.strictEqual(Parser.parse(wikitext, true).text(), "i");
wikitext = "{{a}} [[b]] ";
assert.equal(Parser.parse(wikitext, false, "template").lastChild, " [[b]] ");
// 存在未知阶段时会解析到最后一个阶段
assert.equal(Parser.parse(wikitext, false, ["ext", "unknown"]).lastChild, " ");默认情况下,列表项的内容不会被整合为一个单一的 list-range 节点。但这一行为可以通过将解析阶段参数设置为 Infinity 或 'list-range' 来改变。
// parse (main)
var wikitext = "*a";
assert.strictEqual(Parser.parse(wikitext).lastChild.type, "text");
assert.strictEqual(
Parser.parse(wikitext, false, Infinity).lastChild.type,
"list-range",
);
assert.strictEqual(
Parser.parse(wikitext, false, "list-range").lastChild.type,
"list-range",
);🌐 展开
加入的版本:1.32.0
param: string 维基文本
param: string 页面标题,可选
param: boolean 是否嵌入
returns: string
以HTML格式输出,详见各类型节点的文档。
// print (print)
assert.strictEqual(
Parser.print("<!-- a -->"),
`<span class="wpb-root"><span class="wpb-comment"><!-- a --></span></span>`,
);展开
加入的版本:1.22.0
param: string 解析器函数名
param: (token: TranscludeToken, context?: TranscludeToken) => string 处理函数
定义一个解析器函数钩子。处理函数将在解析器函数的展开过程中被调用,返回值将作为展开的结果。
// setFunctionHook (main)
Parser.setFunctionHook("invoke", token => `[[${token.module}]]`);
assert.equal(
Parser.parse("{{#invoke:Foo|Bar}}").expand(),
"[[Module:Foo]]",
);展开
加入的版本:1.22.0
param: string 扩展标签名
param: (token: TranscludeToken, context?: TranscludeToken) => string 处理函数
定义一个扩展标签钩子。处理函数将在扩展标签的 HTML 转换过程中被调用,返回值将作为展开的结果。
// setHook (main)
Parser.setHook("img", token => `<img src="${token.getAttr("src")}">`);
assert.strictEqual(
Parser.parse('<img src="http://example.com/Foo.jpg"/>').toHtml(),
'<p><img src="http://example.com/Foo.jpg">\n</p>',
);展开
加入的版本:1.32.0
param: string 维基文本
param: string 页面标题,可选
param: boolean 是否嵌入
returns: string
转换为 HTML。
// toHtml (main)
Parser.templates.set("Template:Dt", ";");
assert.strictEqual(
Parser.toHtml("{{dt}}{{dt}}a:b"),
"<dl><dt></dt>\n<dt>a</dt>\n<dd>b</dd></dl>",
);
assert.strictEqual(
Parser.toHtml("[[/a]]", "Page"),
'<p><a href="/wiki/Page%2Fa" title="Page/a">/a</a>\n</p>',
);