wikiparser-node
Version:
A Node.js parser for MediaWiki markup with AST
121 lines (120 loc) • 4.12 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LinkToken = void 0;
const common_1 = require("@bhsd/common");
const lint_1 = require("../../util/lint");
const index_1 = __importDefault(require("../../index"));
const base_1 = require("./base");
/* NOT FOR BROWSER */
const constants_1 = require("../../util/constants");
const string_1 = require("../../util/string");
/* NOT FOR BROWSER END */
/**
* internal link
*
* 内链
* @classdesc `{childNodes: [AtomToken, ?Token]}`
*/
class LinkToken extends base_1.LinkBaseToken {
/* NOT FOR BROWSER END */
get type() {
return 'link';
}
/** link text / 链接显示文字 */
get innerText() {
return this.length > 1
? this.lastChild.text()
: (0, common_1.rawurldecode)(this.firstChild.text().replace(/^\s*:?/u, ''));
}
/* NOT FOR BROWSER */
set innerText(text) {
this.setLinkText(text);
}
/** whether to be a self link / 是否链接到自身 */
get selfLink() {
const { link: { title, fragment } } = this;
return !title && Boolean(fragment);
}
set selfLink(selfLink) {
if (selfLink) {
this.asSelfLink();
}
}
/* NOT FOR BROWSER END */
/** @private */
lint(start = this.getAbsoluteIndex(), re) {
LINT: { // eslint-disable-line no-unused-labels
const errors = super.lint(start, re), rule = 'nested-link', { lintConfig } = index_1.default, s = lintConfig.getSeverity(rule);
if (s && this.closest('ext-link-text')) {
const e = (0, lint_1.generateForSelf)(this, { start }, rule, 'link-in-extlink', s);
if (lintConfig.computeEditInfo || lintConfig.fix) {
e.fix = (0, lint_1.fixBy)(e, 'delink', this.innerText);
}
errors.push(e);
}
return errors;
}
}
/* NOT FOR BROWSER */
/**
* Set the interlanguage link
*
* 设置跨语言链接
* @param lang language prefix / 语言前缀
* @param link page title / 页面标题
* @throws `SyntaxError` 仅有片段标识符
*/
setLangLink(lang, link) {
link = link.trim();
/* istanbul ignore if */
if (link.startsWith('#')) {
throw new SyntaxError('An interlanguage link cannot be fragment only!');
}
super.setTarget(lang + (link.startsWith(':') ? '' : ':') + link);
}
/**
* Convert to a self link
*
* 修改为到自身的链接
* @param fragment URI fragment / 片段标识符
* @throws `RangeError` 空的片段标识符
*/
asSelfLink(fragment = this.fragment) {
/* istanbul ignore if */
if (!fragment?.trim()) {
throw new RangeError('LinkToken.asSelfLink method must specify a non-empty fragment!');
}
this.setTarget(`#${(0, string_1.encode)(fragment)}`);
}
/**
* Automatically generate the link text after the pipe
*
* 自动生成管道符后的链接文字
* @throws `Error` 带有"#"或"%"时不可用
*/
pipeTrick() {
const linkText = this.firstChild.text();
/* istanbul ignore if */
if (linkText.includes('#') || linkText.includes('%')) {
throw new Error('Pipe trick cannot be used with "#" or "%"!');
}
const m1 = /^:?(?:[ \w\x80-\xFF-]+:)?([^(]+?) ?\(.+\)$/u.exec(linkText);
if (m1) {
this.setLinkText(m1[1]);
return;
}
const m2 = /^:?(?:[ \w\x80-\xFF-]+:)?([^(]+?) ?(.+)$/u.exec(linkText);
if (m2) {
this.setLinkText(m2[1]);
return;
}
const m3 = /^:?(?:[ \w\x80-\xFF-]+:)?(.*?)(?: ?(?<!\()\(.+\))?(?:(?:, |,|، ).|$)/u
.exec(linkText);
this.setLinkText(m3[1]);
}
}
exports.LinkToken = LinkToken;
constants_1.classes['LinkToken'] = __filename;
;