LinkBaseToken - bhsd-harry/wikiparser-node GitHub Wiki

目录

Other Languages

简介

CategoryTokenFileTokenLinkTokenRedirectTargetToken 的父类。这个类继承了 Token 类的全部属性和方法,这里不再列出。

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

Properties

fragment

🌐 展开

type: string
目标页面的片段(锚点)。在 Browser 版本中为只读属性。

// fragment (print)
var {
	firstChild,
	lastChild,
} = Parser.parse("[[a#%7B%7D]][[b]]");
assert.strictEqual(firstChild.fragment, "{}");
assert.strictEqual(lastChild.fragment, undefined);
// fragment (main)
var {firstChild} = Parser.parse("[[a#]]");
firstChild.fragment = undefined;
assert.equal(firstChild, "[[A]]"); // auto normalize the target page name
firstChild.fragment = "b";
assert.equal(firstChild, "[[A#b]]");

interwiki

展开

type: string
跨维基前缀。

// interwiki (main)
var firstChild;
Parser.getConfig();
Parser.config.interwiki = ["zhwp", "enwp"];
({firstChild} = Parser.parse("[[zhwp:a#b]]"));
assert.strictEqual(firstChild.interwiki, "zhwp");
firstChild.interwiki = "enwp";
assert.equal(firstChild, "[[enwp:A#b]]");

link

✅ 展开

type: Title
完整链接。在 MiniBrowser 版本中为只读属性。

// link
var {firstChild: {link}} = Parser.parse("[[a]]");
assert.deepStrictEqual(
	link,
	Parser.normalizeTitle("A"),
);
// link (main)
var {firstChild} = Parser.parse("[[a]]");
firstChild.link = "file:b";
assert.equal(firstChild, "[[:file:b]]"); // auto add ':' at the beginning

({firstChild} = Parser.parse("[[category:c]]"));
firstChild.link = "category:d";
assert.equal(firstChild, "[[category:d]]");

name

✅ 展开

type: string
规范化的目标页面名称,只读。

// name
var {firstChild} = Parser.parse("[[category:a b]]");
assert.strictEqual(firstChild.name, "Category:A_b");

Methods

cloneNode

展开

param: this
深拷贝节点。

// cloneNode (main)
var link = Parser.parse("[[a|b]]").firstChild;
assert.deepStrictEqual(link.cloneNode(), link);

link = Parser.parse("[[category:a|b]]").firstChild;
assert.deepStrictEqual(link.cloneNode(), link);

link = Parser.parse("#redirect [[a#b]]").querySelector("redirect-target");
assert.equal(link, "[[a#b]]");
assert.deepStrictEqual(link.cloneNode(), link);

link = Parser.parse("[[file:a|thumb|b|link=c]]").firstChild;
assert.deepStrictEqual(link.cloneNode(), link);

json

🌐 展开

将语法树保存为 JSON。

// json (print)
var root = Parser.parse("#redirect [[c#d]]"),
	target = root.querySelector("redirect-target");
assert.equal(target, "[[c#d]]");
assert.deepStrictEqual(target.json(), {
	range: [10, 17],
	type: "redirect-target",
	name: "C",
	fragment: "d",
	childNodes: [
		{
			range: [12, 15],
			type: "link-target",
			childNodes: [
				{
					range: [12, 15],
					data: "c#d",
				},
			],
		},
	],
});

lint

✅ 展开

returns: LintError[]
报告潜在语法错误。

// lint
assert.deepStrictEqual(Parser.parse("[[{{x}}]]").firstChild.lint(), [
	{
		rule: "unknown-page",
		severity: "warning",
		message: "template in an internal link target",
		startLine: 0,
		startCol: 2,
		startIndex: 2,
		endLine: 0,
		endCol: 7,
		endIndex: 7,
	},
]);
assert.deepStrictEqual(Parser.parse("[[%3F]]").firstChild.lint(), [
	{
		rule: "url-encoding",
		severity: "warning",
		message: "unnecessary percent-encoding in an internal link",
		startLine: 0,
		startCol: 2,
		startIndex: 2,
		endLine: 0,
		endCol: 5,
		endIndex: 5,
		fix: {
			desc: "decode",
			range: [2, 5],
			text: "?",
		},
	},
]);
assert.deepStrictEqual(Parser.parse("[[a|A|]]").firstChild.lint(), [
	{
		rule: "pipe-like",
		severity: "warning",
		message: 'additional "|" in the link text',
		startLine: 0,
		startCol: 4,
		startIndex: 4,
		endLine: 0,
		endCol: 6,
		endIndex: 6,
		suggestions: [
			{
				desc: "escape",
				range: [4, 6],
				text: "A|",
			},
		],
	},
]);
assert.deepStrictEqual(Parser.parse("[[category:a#b]]").firstChild.lint(), [
	{
		rule: "no-ignored",
		severity: "warning",
		message: "useless fragment",
		startLine: 0,
		startCol: 2,
		startIndex: 2,
		endLine: 0,
		endCol: 14,
		endIndex: 14,
		fix: {
			range: [12, 14],
			text: "",
			desc: "remove",
		},
	},
]);

print

🌐 展开

returns: string
以HTML格式输出。

// print (print)
var {firstChild} = Parser.parse("[[a#b|b]]");
assert.equal(
	firstChild.print(),
	`<span class="wpb-link">[[<span class="wpb-link-target">a#b</span>|<span class="wpb-link-text">b</span>]]</span>`,
);

setFragment

展开

param: string
设置fragment。

// setFragment (main)
var {firstChild} = Parser.parse("[[a#a]]");
firstChild.setFragment();
assert.equal(firstChild, "[[A]]"); // 这个方法会同时规范化页面名
firstChild.setFragment("]");
assert.equal(firstChild, "[[A#%5D]]");

setLinkText

展开

param: string
设置链接显示文字。

// setLinkText (main)
var {firstChild} = Parser.parse("[[a|a]]");
firstChild.setLinkText();
assert.equal(firstChild, "[[a]]");
firstChild.setLinkText("''b''");
assert.equal(firstChild, "[[a|''b'']]");
assert.ok(firstChild.querySelector("quote"));
firstChild.setLinkText("-{c}-");
assert.equal(firstChild, "[[a|-{c}-]]");
assert.ok(firstChild.querySelector("converter"));

setTarget

展开

param: string
设置链接目标。

// setTarget (main)
var {firstChild} = Parser.parse("[[a]]");
firstChild.setTarget("b");
assert.equal(firstChild, "[[b]]");
firstChild.setTarget("<!---->category:c");
assert.equal(firstChild, "[[:<!---->category:c]]"); // 自动在开头添加':'

toHtml

展开

加入的版本:1.10.0

returns: string
转换为 HTML。

// toHtml (main)
Parser.getConfig();
Parser.config.interwiki = ["mw"];
assert.strictEqual(
	Parser.parse('[[mw:"| c ]]').firstChild.toHtml(),
	'<a class="extiw" href="/wiki/mw%3A%22" title="mw:&quot;"> c </a>',
);
assert.strictEqual(
	Parser.parse("[[ #< ]]").firstChild.toHtml(),
	'<a href="#%3C">#&lt; </a>',
);
assert.strictEqual(
	Parser.parse("[[ media : a ]]").firstChild.toHtml(),
	'<a href="/wiki/Media%3AA" title="A">media : a </a>',
);
assert.strictEqual(
	Parser.parse("[[category:a]]").firstChild.toHtml(),
	"",
);
⚠️ **GitHub.com Fallback** ⚠️