UNPKG

wikiparser-node

Version:

A Node.js parser for MediaWiki markup with AST

211 lines (210 loc) 10.9 kB
"use strict"; var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ImagemapToken = void 0; const lint_1 = require("../util/lint"); const debug_1 = require("../util/debug"); const rect_1 = require("../lib/rect"); const multiLine_1 = require("../mixin/multiLine"); const index_1 = __importDefault(require("../index")); const index_2 = require("./index"); const noinclude_1 = require("./nowiki/noinclude"); const galleryImage_1 = require("./link/galleryImage"); const imagemapLink_1 = require("./imagemapLink"); /* NOT FOR BROWSER */ const constants_1 = require("../util/constants"); const clone_1 = require("../mixin/clone"); const singleLine_1 = require("../mixin/singleLine"); /** * `<imagemap>` * @classdesc `{childNodes: [...NoincludeToken[], GalleryImageToken, ...(NoincludeToken|ImagemapLinkToken|AstText)[]]}` */ let ImagemapToken = (() => { let _classDecorators = [multiLine_1.multiLine]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = index_2.Token; let _instanceExtraInitializers = []; let _cloneNode_decorators; var ImagemapToken = class extends _classSuper { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0; _cloneNode_decorators = [clone_1.clone]; __esDecorate(this, null, _cloneNode_decorators, { kind: "method", name: "cloneNode", static: false, private: false, access: { has: obj => "cloneNode" in obj, get: obj => obj.cloneNode }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); ImagemapToken = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } /* NOT FOR BROWSER END */ get type() { return 'ext-inner'; } /** 图片 */ get image() { return this.childNodes.find((0, debug_1.isToken)('imagemap-image')); } /** @param inner 标签内部wikitext */ constructor(inner, config = index_1.default.getConfig(), accum = []) { super(undefined, config, accum, { GalleryImageToken: ':', ImagemapLinkToken: ':', NoincludeToken: ':', AstText: ':', }); __runInitializers(this, _instanceExtraInitializers); if (!inner) { return; } const lines = inner.split('\n'), protocols = new Set(config.protocol.split('|')), SingleLineNoincludeToken = (0, singleLine_1.singleLine)()(noinclude_1.NoincludeToken); let first = true, error = false; for (const line of lines) { const trimmed = line.trim(); if (error || !trimmed || trimmed.startsWith('#')) { // } else if (first) { const pipe = line.indexOf('|'), file = pipe === -1 ? line : line.slice(0, pipe), { valid, ns, /* NOT FOR BROWSER */ interwiki, } = this.normalizeTitle(file, 0, { halfParsed: true, temporary: true }); if (valid && !interwiki && ns === 6) { // @ts-expect-error abstract class const token = new galleryImage_1.GalleryImageToken('imagemap', file, pipe === -1 ? undefined : line.slice(pipe + 1), config, accum); super.insertAt(token); first = false; continue; } else { error = true; } } else if (line.trim().split(/[\t ]/u, 1)[0] === 'desc') { super.insertAt(line); continue; } else if (line.includes('[')) { const i = line.indexOf('['), substr = line.slice(i), mtIn = /^\[\[([^|]+)(?:\|([^\]]*))?\]\][\w\s]*$/u .exec(substr); if (mtIn) { if (this.normalizeTitle(mtIn[1], 0, { halfParsed: true, temporary: true, selfLink: true }) .valid) { // @ts-expect-error abstract class super.insertAt(new imagemapLink_1.ImagemapLinkToken(line.slice(0, i), mtIn.slice(1), substr.slice(substr.indexOf(']]') + 2), config, accum)); continue; } } else if (substr.startsWith('[//') || protocols.has(substr.slice(1, substr.indexOf(':') + 1)) || protocols.has(substr.slice(1, substr.indexOf('//') + 2))) { const mtEx = /^\[([^\]\s]+)(?:(\s+(?!\s))([^\]]*))?\][\w\s]*$/u .exec(substr); if (mtEx) { // @ts-expect-error abstract class super.insertAt(new imagemapLink_1.ImagemapLinkToken(line.slice(0, i), mtEx.slice(1), substr.slice(substr.indexOf(']') + 1), config, accum)); continue; } } } // @ts-expect-error abstract class super.insertAt(new SingleLineNoincludeToken(line, config, accum)); } } /** @private */ lint(start = this.getAbsoluteIndex(), re) { LINT: { // eslint-disable-line no-unused-labels const errors = super.lint(start, re), rect = new rect_1.BoundingRect(this, start), { childNodes, image } = this, rule = 'invalid-imagemap', { lintConfig } = index_1.default, s = lintConfig.getSeverity(rule, image ? 'link' : 'image'); if (s) { if (image) { errors.push(...childNodes.filter(child => { const str = child.toString().trim(); return child.is('noinclude') && str && !str.startsWith('#'); }).map(child => { const e = (0, lint_1.generateForChild)(child, rect, rule, 'invalid-imagemap-link', s); if (lintConfig.computeEditInfo) { e.suggestions = [ (0, lint_1.fixByRemove)(e, -1), (0, lint_1.fixBy)(e, 'comment', '# '), ]; } return e; })); } else { errors.push((0, lint_1.generateForSelf)(this, rect, rule, 'imagemap-without-image', s)); } } return errors; } } /* PRINT ONLY */ /** @private */ getAttribute(key) { return key === 'invalid' ? !this.image : super.getAttribute(key); } insertAt(token, i) { const { image } = this; if (!image && (typeof token === 'string' || token.is('imagemap-link') || token.type === 'text')) { throw new Error('Missing a valid image!'); } else if (image && typeof token !== 'string' && token.is('imagemap-image')) { throw new RangeError('Already have a valid image!'); } return super.insertAt(token, i); } /** * @override * @param i position of the child node /移除位置 * @throws `Error` 禁止移除图片 */ removeAt(i) { if (this.childNodes[i]?.is('imagemap-image')) { throw new Error('Do not remove the image in <imagemap>!'); } return super.removeAt(i); } cloneNode() { // @ts-expect-error abstract class return new ImagemapToken(undefined, this.getAttribute('config')); } }; return ImagemapToken = _classThis; })(); exports.ImagemapToken = ImagemapToken; constants_1.classes['ImagemapToken'] = __filename;