Parser - bhsd-harry/wikiparser-node GitHub Wiki

目录

Other Languages

简介

程序的主入口是个名为 Parser 的对象。通常情况下,所有操作的第一步都是通过 Parser.parse 方法生成一个完整的语法树,然后再对语法树进行查询和修改,最后输出维基文本。

✅ 在 MiniBrowser 版本中可用。
🌐 在 Browser 版本中可用。

const Parser = require('wikiparser-node'); // CommonJS

import Parser from 'wikiparser-node'; // ES module

import Parser = require('wikiparser-node'); // TypeScript

Properties

config

✅ 展开

type: Config | string
指定解析设置的绝对路径或相对于 WikiParser-Node 的路径,或完整的设置对象。预设的解析设置包含英文维基百科enwiki)、中文维基百科zhwiki)、日文维基百科jawiki)、萌娘百科moegirl)和 LLWikillwiki)。如需定制一个 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);

configPaths

✅ 展开

加入的版本:1.25.1

type: string[]
额外的解析设置检索路径,默认为空数组。这个数组中的路径会在默认的配置路径之前被检索。

// configPaths (Node.js)
Parser.configPaths.push("config");
Parser.config = "./enwiki";
assert.strictEqual(Parser.getConfig().articlePath, "/wiki/$1");

conversionTable

展开

type: Map<string, string>
用于设置单向语言变体转换

// conversionTable (main)
Parser.conversionTable.set("頁", "页");
assert.strictEqual(Parser.normalizeTitle("首頁").title, "首页");

debugging

展开

type: boolean
是否输出调试信息,默认为 false

i18n

✅ 展开

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");

lintConfig

✅ 展开

加入的版本:1.22.0

type: LintConfig
请查阅规则文档以了解如何配置语法检查规则。

redirects

展开

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");

rules

✅ 展开

加入的版本: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",
	],
);

templateDir

展开

加入的版本:1.10.0

type: string
指定模板文件夹的绝对路径或相对于 WikiParser-Node 的路径,用于 Token.prototype.expand。在 Windows 文件系统中,页面标题中的冒号(:)需要被替换为 Unicode 冒号)。

templates

展开

加入的版本: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");

viewOnly

展开

加入的版本:1.9.0

type: boolean
是否只解析而不修改,默认为 false。当设置为 true 时,解析器的性能会有所提升。

warning

展开

type: boolean
是否输出警告信息,默认为 true

Methods

callParserFunction

展开

加入的版本: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");

createLanguageService

✅ 展开

加入的版本:1.16.1

param: object 文档对象,可选
returns: LanguageService
创建一个语言服务任务。注意调用这个方法会自动将 viewOnly 设置为 true

fetchConfig

展开

加入的版本:1.18.4

param: string 网站别名
param: string 脚本路径
param: string 维基用户页面地址或用户的电子邮件地址,可选
returns: Promise<Config>
获取安装了 CodeMirror 扩展 的指定 MediaWiki 站点的解析设置。

Parser.fetchConfig("frwiki", "https://fr.wikipedia.org/w/", "[email protected]");

getConfig

✅ 展开

returns: Config
获取解析设置。

getWMFSite

展开

加入的版本: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"],
);

isInterwiki

展开

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}),
	}),
);

lint

✅ 展开

加入的版本:1.32.0

param: string 维基文本
param: string 页面标题,可选
param: boolean 是否嵌入
returns: LintError[] & {output?: string}
报告潜在语法错误,详见各类型节点的文档。

normalizeTitle

✅ 展开

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#參考資料");

parse

✅ 展开

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",
);

print

🌐 展开

加入的版本: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">&lt;!-- a --&gt;</span></span>`,
);

setFunctionHook

展开

加入的版本: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]]",
);

setHook

展开

加入的版本: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>',
);

toHtml

展开

加入的版本: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>',
);
⚠️ **GitHub.com Fallback** ⚠️