AttributesToken - bhsd-harry/wikiparser-node GitHub Wiki

目录

Other Languages

简介

扩展和 HTML 标签及表格的属性。这个类继承了 Token 类的全部属性和方法,这里不再列出。

✅ 在 MiniBrowser 版本中可用。

Properties

attributes

展开

type: Record<string, string | true>
属性对象。

// attributes (main)
var attrs = Parser.parse('<poem COMPACT id="a/>').querySelector("ext-attrs");
assert.equal(attrs, ' COMPACT id="a');
assert.deepStrictEqual(attrs.attributes, {
	compact: true,
	id: "a",
});
attrs.attributes = {title: "b"};
assert.equal(attrs, ' title="b"');

classList

展开

type: Set<string>
以 Set 表示的 class 属性,只读。

// classList (main)
var attrs = Parser.parse('{|class="a  b"\n|}').querySelector("table-attrs");
assert.equal(attrs, 'class="a  b"');
assert.deepStrictEqual(attrs.classList, new Set(["a", "b"]));
attrs.classList.add("c");
assert.equal(attrs, 'class="a b c"');
attrs.classList.delete("a");
assert.equal(attrs, 'class="b c"');
attrs.classList.clear();
assert.equal(attrs, 'class=""');

className

展开

type: string
以字符串表示的 class 属性。

// className (main)
var attrs = Parser.parse("<p class>").querySelector("html-attrs");
assert.equal(attrs, " class");
assert.strictEqual(attrs.className, "");
attrs.className = "a  b";
assert.equal(attrs, ' class="a  b"');
assert.strictEqual(attrs.className, "a  b");
attrs.className = "";
assert.equal(attrs, " ");
assert.strictEqual(attrs.className, "");

id

展开

type: string
id 属性。

// id (main)
var attrs = Parser.parse("<p id=a>").querySelector("html-attrs");
assert.equal(attrs, " id=a");
assert.strictEqual(attrs.id, "a");
attrs.id = "b";
assert.equal(attrs, ' id="b"');
assert.strictEqual(attrs.id, "b");
attrs.id = "";
assert.equal(attrs, " ");
assert.strictEqual(attrs.id, "");

name

✅ 展开

type: string
小写的标签名,只读。

// name
var extAttrs = Parser.parse("<REF/>").querySelector("ext-attrs"),
	tableAttrs = Parser.parse("{|\n!").querySelector("td")
		.querySelector("table-attrs");
assert.strictEqual(extAttrs.name, "ref");
assert.strictEqual(tableAttrs.name, "th");

sanitized

展开

type: boolean
是否含有无效属性。

// sanitized (main)
var root = Parser.parse('{|id=a | class=b\n!! title="c"|\n|}'),
	tableAttrs = root.querySelector("table>table-attrs"),
	thAttrs = root.querySelector("td>table-attrs");
assert.equal(tableAttrs, "id=a | class=b");
assert.equal(thAttrs, '! title="c"');
assert.ok(!tableAttrs.sanitized);
tableAttrs.sanitized = true;
assert.equal(tableAttrs, "id=a class=b");
assert.ok(!thAttrs.sanitized);
thAttrs.sanitized = true;
assert.equal(thAttrs, 'title="c"');

type

✅ 展开

type: string
节点类型。

// type
var attr = Parser.parse("<poem compact/>").querySelector("ext-attrs");
assert.equal(attr, " compact");
assert.strictEqual(attr.type, "ext-attrs");

attr = Parser.parse("<br id=a/>").querySelector("html-attrs");
assert.equal(attr, " id=a");
assert.strictEqual(attr.type, "html-attrs");

attr = Parser.parse('{|class="wikitable"').querySelector("table-attrs");
assert.equal(attr, 'class="wikitable"');
assert.strictEqual(attr.type, "table-attrs");

Methods

cloneNode

展开

returns: this
深拷贝节点。

// cloneNode (main)
var [ext, html, table] = Parser.parse("<ref name=a/><p id=b>\n{|id=c\n|}")
	.querySelectorAll("ext-attrs, html-attrs, table-attrs");
assert.equal(ext, " name=a");
assert.equal(html, " id=b");
assert.equal(table, "id=c");
assert.deepStrictEqual(ext.cloneNode(), ext);
assert.deepStrictEqual(html.cloneNode(), html);
assert.deepStrictEqual(table.cloneNode(), table);

css

展开

加入的版本:1.17.1

param: string 属性名
param: string | number | undefined 属性值(可选)
returns: string | undefined
获取某一样式属性的值。

// css (main)
var attrs = Parser.parse("<p style=margin:auto;margin:0;>")
	.querySelector("html-attrs");
assert.equal(attrs, " style=margin:auto;margin:0;");
assert.strictEqual(attrs.css("margin"), "0");
attrs.css("margin", "0 0");
assert.equal(attrs, ' style="margin:auto;margin:0 0;"');
attrs.css("margin", "");
assert.equal(attrs, ' style=""');
attrs.css("padding", "0");
assert.equal(attrs, ' style="padding: 0"');
attrs.css("left", 0);
assert.equal(attrs, ' style="padding: 0; left: 0"');
attrs.css("right", "");
assert.equal(attrs, ' style="padding: 0; left: 0"');
attrs.css("padding", "");
assert.equal(attrs, ' style="left: 0"');

attrs = Parser.parse("<poem/>").querySelector("ext-attrs");
assert.equal(attrs, "");
attrs.css("left", 0);
assert.equal(attrs, ' style="left: 0"');

getAttr

✅ 展开

param: string 属性键
returns: string | true
获取指定属性。

// getAttr
var attrs = Parser.parse('<poem id="a" ID = b compact/>')
	.querySelector("ext-attrs");
assert.equal(attrs, ' id="a" ID = b compact');
assert.strictEqual(attrs.getAttr("id"), "b");
assert.strictEqual(attrs.getAttr("COMPACT"), true);
assert.strictEqual(attrs.getAttr("title"), undefined);

getAttrNames

展开

returns(): Set<string>
获取全部的属性名。

// getAttrNames (main)
var attrs = Parser.parse("<poem id=a id=b COMPACT/>")
	.querySelector("ext-attrs");
assert.equal(attrs, " id=a id=b COMPACT");
assert.deepStrictEqual(attrs.getAttrNames(), new Set(["id", "compact"]));

getAttrs

展开

returns: Record<string, string | true>
获取全部属性。

// getAttrs (main)
var attrs = Parser.parse("<poem id=a COMPACT/>").querySelector("ext-attrs");
assert.equal(attrs, " id=a COMPACT");
assert.deepStrictEqual(attrs.getAttrs(), {
	id: "a",
	compact: true,
});

getAttrToken

✅ 展开

param: string 属性名
returns: AttributeToken
指定属性名的最后一个 AttributeToken。

// getAttrToken
var attrs = Parser.parse("<p id=a ID = b>").querySelector("html-attrs"),
	[, attr] = attrs.querySelectorAll("html-attr");
assert.equal(attrs, " id=a ID = b");
assert.equal(attr, "ID = b");
assert.deepStrictEqual(attrs.getAttrToken("id"), attr);
assert.strictEqual(attrs.getAttrToken("title"), undefined);

getAttrTokens

✅ 展开

param: string 属性名,可选
returns: AttributeToken[]
所有指定属性名的 AttributeToken。

// getAttrTokens
var attrs = Parser.parse("<poem id = a COMPACT/>").querySelector("ext-attrs"),
	[id, compact] = attrs.querySelectorAll("ext-attr");
assert.equal(attrs, " id = a COMPACT");
assert.equal(id, "id = a");
assert.equal(compact, "COMPACT");
assert.deepStrictEqual(attrs.getAttrTokens(), [id, compact]);
assert.deepStrictEqual(attrs.getAttrTokens("ID"), [id]);
assert.deepStrictEqual(attrs.getAttrTokens("compact"), [compact]);

hasAttr

✅ 展开

param: string 属性键
returns: boolean
标签是否具有某属性。

// hasAttr
var attrs = Parser.parse("<poem id = a COMPACT/>").querySelector("ext-attrs");
assert.equal(attrs, " id = a COMPACT");
assert.ok(attrs.hasAttr("ID"));
assert.ok(attrs.hasAttr("compact"));
assert.ok(!attrs.hasAttr("title"));

lint

✅ 展开

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

// lint
var attrs = Parser.parse("</p id=a>").querySelector("html-attrs");
assert.equal(attrs, " id=a");
assert.deepStrictEqual(attrs.lint(), [
	{
		rule: "no-ignored",
		severity: "error",
		message: "attributes of a closing tag",
		startLine: 0,
		startCol: 3,
		startIndex: 3,
		endLine: 0,
		endCol: 8,
		endIndex: 8,
		suggestions: [
			{
				desc: "remove",
				range: [3, 8],
				text: "",
			},
			{
				desc: "open",
				range: [1, 2],
				text: "",
			},
		],
	},
]);

attrs = Parser.parse("<p / >").querySelector("html-attrs");
assert.equal(attrs, " / ");
assert.deepStrictEqual(attrs.lint(), [
	{
		rule: "no-ignored",
		severity: "warning",
		message: "element containing an invalid attribute name",
		startLine: 0,
		startCol: 2,
		startIndex: 2,
		endLine: 0,
		endCol: 5,
		endIndex: 5,
		suggestions: [
			{
				desc: "remove",
				range: [2, 5],
				text: " ",
			},
		],
	},
]);

attrs = Parser.parse('<gallery mode mode="packed" MODE = packed/>')
	.querySelector("ext-attrs");
assert.equal(attrs, ' mode mode="packed" MODE = packed');
assert.deepStrictEqual(attrs.lint(), [
	{
		rule: "no-duplicate",
		severity: "error",
		message: "duplicate mode attribute",
		startLine: 0,
		startCol: 9,
		startIndex: 9,
		endLine: 0,
		endCol: 13,
		endIndex: 13,
		fix: {
			desc: "remove",
			range: [9, 13],
			text: "",
		},
	},
	{
		rule: "no-duplicate",
		severity: "error",
		message: "duplicate mode attribute",
		startLine: 0,
		startCol: 14,
		startIndex: 14,
		endLine: 0,
		endCol: 27,
		endIndex: 27,
		suggestions: [
			{
				desc: "remove",
				range: [14, 27],
				text: "",
			},
		],
	},
	{
		rule: "no-duplicate",
		severity: "error",
		message: "duplicate mode attribute",
		startLine: 0,
		startCol: 28,
		startIndex: 28,
		endLine: 0,
		endCol: 41,
		endIndex: 41,
		fix: {
			desc: "remove",
			range: [28, 41],
			text: "",
		},
	},
]);

attrs = Parser.parse("<indicator/>").querySelector("ext-attrs");
assert.equal(attrs, "");
assert.deepStrictEqual(attrs.lint(), [
	{
		rule: "required-attr",
		severity: "error",
		message: "required name attribute is missing",
		startLine: 0,
		startCol: 10,
		startIndex: 10,
		endLine: 0,
		endCol: 10,
		endIndex: 10,
	},
]);

removeAttr

展开

param: string 属性键
移除指定属性。

// removeAttr (main)
var attrs = Parser.parse("<p id id=a>").querySelector("html-attrs");
assert.equal(attrs, " id id=a");
attrs.removeAttr("id");
assert.equal(attrs, "  ");

sanitize

展开

清理无效属性。

// sanitize (main)
var attrs = Parser.parse("<p / id=a | class=b >").querySelector("html-attrs");
assert.equal(attrs, " / id=a | class=b ");
attrs.sanitize();
assert.equal(attrs, " id=a class=b ");

setAttr

展开

param: string | Record<string, string | boolean> 属性键或属性对象
param: string | boolean 属性值
设置指定属性。

// setAttr (main)
var attrs = Parser.parse("<poem id=a/>").querySelector("ext-attrs");
assert.equal(attrs, " id=a");
attrs.setAttr("class", false);
assert.equal(attrs, " id=a");
attrs.setAttr("id", "b");
assert.equal(attrs, ' id="b"');
attrs.setAttr("TITLE", "b");
assert.equal(attrs, ' id="b" title="b"');
attrs.setAttr("compact", true);
assert.equal(attrs, ' id="b" title="b" compact');
attrs.setAttr({id: "c", title: false});
assert.equal(attrs, ' id="c"  compact');

attrs = Parser.parse("{{template|<p>}}").querySelector("html-attrs");
assert.equal(attrs, "");
attrs.setAttr("id", "a");
assert.equal(attrs, ' id{{=}}"a"');

toggleAttr

展开

param: string 属性键
开关指定属性。

// toggleAttr (main)
var attrs = Parser.parse("<poem/>").querySelector("ext-attrs");
assert.equal(attrs, "");
attrs.toggleAttr("compact");
assert.equal(attrs, " compact");
attrs.toggleAttr("COMPACT");
assert.equal(attrs, "");

toHtml

展开

加入的版本:1.10.0

returns: string
转换为 HTML。

// toHtml (main)
var {firstChild: {firstChild}} = Parser.parse("<p / id=a\nID = b>");
assert.equal(firstChild, " / id=a\nID = b");
assert.strictEqual(firstChild.toHtml(), ' id="b"');
⚠️ **GitHub.com Fallback** ⚠️