Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Path: blob/master/src/packages/frontend/codemirror/mode/mediawiki/mediawiki.js
Views: 687
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45"use strict";6import * as CodeMirror from "codemirror";78function eatMnemonic(stream, style, mnemonicStyle) {9var ok;10if (stream.eat("#")) {11if (stream.eat("x")) {12ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");13} else {14ok = stream.eatWhile(/[\d]/) && stream.eat(";");15}16} else {17ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");18}19if (ok) {20mnemonicStyle += " mw-mnemonic";21return mnemonicStyle;22}23return style;24}2526CodeMirror.defineMode("mediawiki", function (config /*, parserConfig */) {27var urlProtocols = new RegExp(config.mwextUrlProtocols, "i");28var permittedHtmlTags = {29b: true,30bdi: true,31del: true,32i: true,33ins: true,34u: true,35font: true,36big: true,37small: true,38sub: true,39sup: true,40h1: true,41h2: true,42h3: true,43h4: true,44h5: true,45h6: true,46cite: true,47code: true,48em: true,49s: true,50strike: true,51strong: true,52tt: true,53var: true,54div: true,55center: true,56blockquote: true,57ol: true,58ul: true,59dl: true,60table: true,61caption: true,62pre: true,63ruby: true,64rb: true,65rp: true,66rt: true,67rtc: true,68p: true,69span: true,70abbr: true,71dfn: true,72kbd: true,73samp: true,74data: true,75time: true,76mark: true,77br: true,78wbr: true,79hr: true,80li: true,81dt: true,82dd: true,83td: true,84th: true,85tr: true,86noinclude: true,87includeonly: true,88onlyinclude: true,89};9091function makeStyle(style, state, endGround) {92if (state.isBold) {93style += " strong";94}95if (state.isItalic) {96style += " em";97}98return makeLocalStyle(style, state, endGround);99}100101function makeLocalStyle(style, state, endGround) {102var ground = "";103switch (state.nTemplate) {104case 0:105break;106case 1:107ground += "-template";108break;109case 2:110ground += "-template2";111break;112default:113ground += "-template3";114break;115}116switch (state.nExt) {117case 0:118break;119case 1:120ground += "-ext";121break;122case 2:123ground += "-ext2";124break;125default:126ground += "-ext3";127break;128}129if (state.nLink > 0) {130ground += "-link";131}132if (ground !== "") {133style = "mw" + ground + "-ground " + style;134}135if (endGround) {136state[endGround]--;137}138return style;139}140141function eatBlock(style, terminator) {142return function (stream, state) {143while (!stream.eol()) {144if (stream.match(terminator)) {145state.tokenize = state.stack.pop();146break;147}148stream.next();149}150return makeLocalStyle(style, state);151};152}153154function eatEnd(style) {155return function (stream, state) {156stream.skipToEnd();157state.tokenize = state.stack.pop();158return makeLocalStyle(style, state);159};160}161162function eatChar(char, style) {163return function (stream, state) {164state.tokenize = state.stack.pop();165if (stream.eat(char)) {166return makeLocalStyle(style, state);167}168return makeLocalStyle("error", state);169};170}171172function eatSectionHeader(count) {173return function (stream, state) {174if (stream.match(/[^&<\[\{~]+/)) {175if (stream.eol()) {176stream.backUp(count);177state.tokenize = eatEnd("mw-section-header");178}179return null; // style is null180}181return eatWikiText("", "")(stream, state);182};183}184185function inVariable(stream, state) {186if (stream.match(/[^\{\}\|]+/)) {187return makeLocalStyle("mw-templatevariable-name", state);188}189if (stream.eat("|")) {190state.tokenize = inVariableDefault;191return makeLocalStyle("mw-templatevariable-delimiter", state);192}193if (stream.match("}}}")) {194state.tokenize = state.stack.pop();195return makeLocalStyle("mw-templatevariable-bracket", state);196}197if (stream.match("{{{")) {198state.stack.push(state.tokenize);199return makeLocalStyle("mw-templatevariable-bracket", state);200}201stream.next();202return makeLocalStyle("mw-templatevariable-name", state);203}204205function inVariableDefault(stream, state) {206if (stream.match(/[^\{\}\[<\&~]+/)) {207return makeLocalStyle("mw-templatevariable", state);208}209if (stream.match("}}}")) {210state.tokenize = state.stack.pop();211return makeLocalStyle("mw-templatevariable-bracket", state);212}213return eatWikiText("mw-templatevariable", "")(stream, state);214}215216function inParserFunctionName(stream, state) {217if (stream.match(/#?[^\:\}\{~]+/)) {218// FIXME: {{#name}} and {{uc}} are wrong, must have ':'219return makeLocalStyle("mw-parserfunction-name", state);220}221if (stream.eat(":")) {222state.tokenize = inParserFunctionArguments;223return makeLocalStyle("mw-parserfunction-delimiter", state);224}225if (stream.match("}}")) {226state.tokenize = state.stack.pop();227return makeLocalStyle("mw-parserfunction-bracket", state, "nExt");228}229return eatWikiText("mw-parserfunction", "")(stream, state);230}231232function inParserFunctionArguments(stream, state) {233if (stream.match(/[^\|\}\{\[<\&~]+/)) {234return makeLocalStyle("mw-parserfunction", state);235} else if (stream.eat("|")) {236return makeLocalStyle("mw-parserfunction-delimiter", state);237} else if (stream.match("}}")) {238state.tokenize = state.stack.pop();239return makeLocalStyle("mw-parserfunction-bracket", state, "nExt");240}241return eatWikiText("mw-parserfunction", "")(stream, state);242}243244function eatTemplatePageName(haveAte) {245return function (stream, state) {246if (stream.match(/[\s\u00a0]*\|[\s\u00a0]*/)) {247state.tokenize = eatTemplateArgument(true);248return makeLocalStyle("mw-template-delimiter", state);249}250if (stream.match(/[\s\u00a0]*\}\}/)) {251state.tokenize = state.stack.pop();252return makeLocalStyle("mw-template-bracket", state, "nTemplate");253}254if (haveAte && stream.sol()) {255// @todo error message256state.nTemplate--;257state.tokenize = state.stack.pop();258return;259}260if (stream.match(/[\s\u00a0]*[^\s\u00a0\|\}<\{\&~]+/)) {261state.tokenize = eatTemplatePageName(true);262return makeLocalStyle("mw-template-name mw-pagename", state);263} else if (stream.eatSpace()) {264if (stream.eol() === true) {265return makeLocalStyle("mw-template-name", state);266}267return makeLocalStyle("mw-template-name mw-pagename", state);268}269return eatWikiText(270"mw-template-name mw-pagename",271"mw-template-name-mnemonic mw-pagename"272)(stream, state);273};274}275276function eatTemplateArgument(expectArgName) {277return function (stream, state) {278if (expectArgName && stream.eatWhile(/[^=\|\}\{\[<\&~]/)) {279if (stream.eat("=")) {280state.tokenize = eatTemplateArgument(false);281return makeLocalStyle("mw-template-argument-name", state);282}283return makeLocalStyle("mw-template", state);284} else if (stream.eatWhile(/[^\|\}\{\[<\&~]/)) {285return makeLocalStyle("mw-template", state);286} else if (stream.eat("|")) {287state.tokenize = eatTemplateArgument(true);288return makeLocalStyle("mw-template-delimiter", state);289} else if (stream.match("}}")) {290state.tokenize = state.stack.pop();291return makeLocalStyle("mw-template-bracket", state, "nTemplate");292}293return eatWikiText("mw-template", "")(stream, state);294};295}296297function eatExternalLinkProtocol(chars) {298return function (stream, state) {299while (chars > 0) {300chars--;301stream.next();302}303if (stream.eol()) {304state.nLink--;305// @todo error message306state.tokenize = state.stack.pop();307} else {308state.tokenize = inExternalLink;309}310return makeLocalStyle("mw-extlink-protocol", state);311};312}313314function inExternalLink(stream, state) {315if (stream.sol()) {316state.nLink--;317// @todo error message318state.tokenize = state.stack.pop();319return;320}321if (stream.match(/[\s\u00a0]*\]/)) {322state.tokenize = state.stack.pop();323return makeLocalStyle("mw-extlink-bracket", state, "nLink");324}325if (stream.eatSpace()) {326state.tokenize = inExternalLinkText;327return makeStyle("", state);328}329if (stream.match(/[^\s\u00a0\]\{\&~]+/) || stream.eatSpace()) {330return makeStyle("mw-extlink", state);331}332return eatWikiText("mw-extlink", "")(stream, state);333}334335function inExternalLinkText(stream, state) {336if (stream.sol()) {337state.nLink--;338// @todo error message339state.tokenize = state.stack.pop();340return;341}342if (stream.eat("]")) {343state.tokenize = state.stack.pop();344return makeLocalStyle("mw-extlink-bracket", state, "nLink");345}346if (stream.match(/[^'\]\{\&~]+/)) {347return makeStyle("mw-extlink-text", state);348}349return eatWikiText("mw-extlink-text", "")(stream, state);350}351352function inLink(stream, state) {353if (stream.sol()) {354state.nLink--;355// @todo error message356state.tokenize = state.stack.pop();357return;358}359if (stream.match(/[\s\u00a0]*#[\s\u00a0]*/)) {360state.tokenize = inLinkToSection;361return makeLocalStyle("mw-link", state);362}363if (stream.match(/[\s\u00a0]*\|[\s\u00a0]*/)) {364state.tokenize = eatLinkText();365return makeLocalStyle("mw-link-delimiter", state);366}367if (stream.match(/[\s\u00a0]*\]\]/)) {368state.tokenize = state.stack.pop();369return makeLocalStyle("mw-link-bracket", state, "nLink");370// if ( !stream.eatSpace() ) {371// state.ImInBlock.push( 'LinkTrail' );372// }373}374if (375stream.match(/[\s\u00a0]*[^\s\u00a0#\|\]\&~\{]+/) ||376stream.eatSpace()377) {378//FIXME '{{' brokes Link, sample [[z{{page]]379return makeStyle("mw-link-pagename mw-pagename", state);380}381return eatWikiText("mw-link-pagename mw-pagename", "mw-pagename")(382stream,383state384);385}386387function inLinkToSection(stream, state) {388if (stream.sol()) {389// @todo error message390state.nLink--;391state.tokenize = state.stack.pop();392return;393}394if (stream.match(/[^\|\]\&~\{\}]+/)) {395//FIXME '{{' brokes Link, sample [[z{{page]]396return makeLocalStyle("mw-link-tosection", state);397}398if (stream.eat("|")) {399state.tokenize = eatLinkText();400return makeLocalStyle("mw-link-delimiter", state);401}402if (stream.match("]]")) {403state.tokenize = state.stack.pop();404return makeLocalStyle("mw-link-bracket", state, "nLink");405// if ( !stream.eatSpace() ) {406// state.ImInBlock.push( 'LinkTrail' );407// }408}409return eatWikiText("mw-link-tosection", "")(stream, state);410}411412function eatLinkText() {413var isBold, isItalic;414return function (stream, state) {415if (stream.match("]]")) {416state.tokenize = state.stack.pop();417return makeLocalStyle("mw-link-bracket", state, "nLink");418}419if (stream.match("'''")) {420isBold = isBold ? false : true;421return makeLocalStyle("mw-link-text mw-apostrophes", state);422}423if (stream.match("''")) {424isItalic = isItalic ? false : true;425return makeLocalStyle("mw-link-text mw-apostrophes", state);426}427var tmpstyle = "mw-link-text";428if (isBold) {429tmpstyle += " strong";430}431if (isItalic) {432tmpstyle += " em";433}434if (stream.match(/[^'\]\{\&~]+/)) {435return makeStyle(tmpstyle, state);436}437return eatWikiText(tmpstyle, "")(stream, state);438};439}440441function eatTagName(chars, isCloseTag, isHtmlTag) {442return function (stream, state) {443var name = "";444while (chars > 0) {445chars--;446name = name + stream.next();447}448if (stream.eol()) {449// @todo error message450state.tokenize = state.stack.pop();451return makeLocalStyle(452isHtmlTag ? "mw-htmltag-name" : "mw-exttag-name",453state454);455}456stream.eatSpace();457if (stream.eol()) {458// @todo error message459state.tokenize = state.stack.pop();460return makeLocalStyle(461isHtmlTag ? "mw-htmltag-name" : "mw-exttag-name",462state463);464}465466if (isHtmlTag) {467if (isCloseTag) {468state.tokenize = eatChar(">", "mw-htmltag-bracket");469} else {470state.tokenize = eatHtmlTagAttribute(name);471}472return makeLocalStyle("mw-htmltag-name", state);473} // it is the extension tag474if (isCloseTag) {475state.tokenize = eatChar(">", "mw-exttag-bracket");476} else {477state.tokenize = eatExtTagAttribute(name);478}479return makeLocalStyle("mw-exttag-name", state);480};481}482483function eatHtmlTagAttribute(name) {484return function (stream, state) {485if (stream.match(/[^>\/<\{\&~]+/)) {486return makeLocalStyle("mw-htmltag-attribute", state);487}488if (stream.eat(">")) {489state.InHtmlTag.push(name);490state.tokenize = state.stack.pop();491return makeLocalStyle("mw-htmltag-bracket", state);492}493if (stream.match("/>")) {494state.tokenize = state.stack.pop();495return makeLocalStyle("mw-htmltag-bracket", state);496}497return eatWikiText("mw-htmltag-attribute", "")(stream, state);498};499}500501function eatExtTagAttribute(name) {502return function (stream, state) {503if (stream.match(/[^>\/<\{\&~]+/)) {504return makeLocalStyle("mw-exttag-attribute", state);505}506if (stream.eat(">")) {507state.extName = name;508if (name in config.mwextMode.tag) {509state.extMode = CodeMirror.getMode(510config,511config.mwextMode.tag[name]512);513state.extState = CodeMirror.startState(state.extMode);514}515state.tokenize = eatExtTagArea(name);516return makeLocalStyle("mw-exttag-bracket", state);517}518if (stream.match("/>")) {519state.tokenize = state.stack.pop();520return makeLocalStyle("mw-exttag-bracket", state);521}522return eatWikiText("mw-exttag-attribute", "")(stream, state);523};524}525526function eatExtTagArea(name) {527return function (stream, state) {528var origString = false,529from = stream.pos,530to;531var pattern = new RegExp("</" + name + "\\s*>");532var m = pattern.exec(from ? stream.string.slice(from) : stream.string);533if (m) {534if (m.index === 0) {535state.tokenize = eatExtCloseTag(name);536state.extName = false;537if (state.extMode !== false) {538state.extMode = false;539state.extState = false;540}541return state.tokenize(stream, state);542}543to = m.index + from;544origString = stream.string;545stream.string = origString.slice(0, to);546}547state.stack.push(state.tokenize);548state.tokenize = eatExtTokens(origString);549return state.tokenize(stream, state);550};551}552553function eatExtCloseTag(name) {554return function (stream, state) {555stream.next(); // eat <556stream.next(); // eat /557state.tokenize = eatTagName(name.length, true, false);558return makeLocalStyle("mw-exttag-bracket", state);559};560}561562function eatExtTokens(origString) {563return function (stream, state) {564var ret;565if (state.extMode === false) {566ret =567origString === false && stream.sol()568? "line-cm-mw-exttag"569: "mw-exttag";570stream.skipToEnd();571} else {572ret =573(origString === false && stream.sol()574? "line-cm-mw-tag-"575: "mw-tag-") + state.extName;576ret +=577" " +578state.extMode.token(stream, state.extState, origString === false);579}580if (stream.eol()) {581if (origString !== false) {582stream.string = origString;583}584state.tokenize = state.stack.pop();585}586return makeLocalStyle(ret, state);587};588}589590function inTableDefinition(stream, state) {591if (stream.sol()) {592state.tokenize = inTable;593return inTable(stream, state);594}595return eatWikiText("mw-table-definition", "")(stream, state);596}597598function inTable(stream, state) {599if (stream.sol()) {600if (stream.eat("|")) {601if (stream.eat("-")) {602stream.eatSpace();603state.tokenize = inTableDefinition;604return makeLocalStyle("mw-table-delimiter", state);605}606if (stream.eat("}")) {607state.tokenize = state.stack.pop();608return makeLocalStyle("mw-table-bracket", state);609}610stream.eatSpace();611state.tokenize = eatTableRow(true, false);612return makeLocalStyle("mw-table-delimiter", state);613}614if (stream.eat("!")) {615stream.eatSpace();616state.tokenize = eatTableRow(true, true);617return makeLocalStyle("mw-table-delimiter", state);618}619}620return eatWikiText("", "")(stream, state);621}622623function eatTableRow(isStart, isHead) {624return function (stream, state) {625if (stream.sol()) {626var peek = stream.peek();627if (peek === "|" || peek === "!") {628state.tokenize = inTable;629return state.tokenize(stream, state);630}631state.isBold = false;632state.isItalic = false;633} else {634if (stream.match(/[^'\|\{\[<\&~]+/)) {635return makeStyle(isHead ? "strong" : "", state);636}637if (638stream.match("||") ||639(isHead && stream.match("!!")) ||640(isStart && stream.eat("|"))641) {642state.isBold = false;643state.isItalic = false;644if (isStart) {645state.tokenize = eatTableRow(false, isHead);646}647return makeLocalStyle("mw-table-delimiter", state);648}649}650return eatWikiText(isHead ? "strong" : "", isHead ? "strong" : "")(651stream,652state653);654};655}656657function eatWikiText(style, mnemonicStyle) {658return function (stream, state) {659function chain(parser) {660state.stack.push(state.tokenize);661state.tokenize = parser;662return parser(stream, state);663}664var sol = stream.sol();665var ch = stream.next();666667if (sol) {668state.isBold = false;669state.isItalic = false;670switch (ch) {671case " ":672return "mw-skipformatting";673case "-":674if (stream.match("---")) {675return "mw-hr";676}677break;678case "=":679var tmp = stream.match(/(={0,5})(.+?(=\1\s*))$/);680if (tmp) {681// Title682stream.backUp(tmp[2].length);683state.stack.push(state.tokenize);684state.tokenize = eatSectionHeader(tmp[3].length);685return (686"mw-section-header line-cm-mw-section-" + (tmp[1].length + 1)687);688}689break;690case "*":691case "#":692if (stream.match(/[\*#]*:*/)) {693return "mw-list";694}695break;696case ":":697if (stream.match(/:*[\*#]*/)) {698return "mw-indenting";699}700break;701case "{":702if (stream.eat("|")) {703stream.eatSpace();704state.stack.push(state.tokenize);705state.tokenize = inTableDefinition;706return "mw-table-bracket";707}708}709}710711switch (ch) {712case "&":713return makeStyle(eatMnemonic(stream, style, mnemonicStyle), state);714case "'":715if (stream.match("''")) {716state.isBold = state.isBold ? false : true;717return makeLocalStyle("mw-apostrophes", state);718} else if (stream.eat("'")) {719state.isItalic = state.isItalic ? false : true;720return makeLocalStyle("mw-apostrophes", state);721}722break;723case "[":724if (stream.eat("[")) {725// Link Example: [[ Foo | Bar ]]726stream.eatSpace();727if (/[^\]\|\[]/.test(stream.peek())) {728state.nLink++;729state.stack.push(state.tokenize);730state.tokenize = inLink;731return makeLocalStyle("mw-link-bracket", state);732}733} else {734var mt = stream.match(urlProtocols);735if (mt) {736state.nLink++;737stream.backUp(mt[0].length);738state.stack.push(state.tokenize);739state.tokenize = eatExternalLinkProtocol(mt[0].length);740return makeLocalStyle("mw-extlink-bracket", state);741}742}743break;744case "{":745if (stream.match("{{")) {746// Variable747stream.eatSpace();748state.stack.push(state.tokenize);749state.tokenize = inVariable;750return makeLocalStyle("mw-templatevariable-bracket", state);751} else if (stream.match(/\{[\s\u00a0]*/)) {752if (stream.peek() === "#") {753// Parser function754state.nExt++;755state.stack.push(state.tokenize);756state.tokenize = inParserFunctionName;757return makeLocalStyle("mw-parserfunction-bracket", state);758}759// Check for parser function without '#'760var name = stream.match(761/([^\s\u00a0\}\[\]<\{\'\|\&\:]+)(\:|[\s\u00a0]*)(\}\}?)?(.)?/762);763if (name) {764stream.backUp(name[0].length);765if (766(name[2] === ":" ||767name[4] === undefined ||768name[3] === "}}") &&769(name[1].toLowerCase() in config.mwextFunctionSynonyms[0] ||770name[1] in config.mwextFunctionSynonyms[1])771) {772state.nExt++;773state.stack.push(state.tokenize);774state.tokenize = inParserFunctionName;775return makeLocalStyle("mw-parserfunction-bracket", state);776}777}778// Template779state.nTemplate++;780state.stack.push(state.tokenize);781state.tokenize = eatTemplatePageName(false);782return makeLocalStyle("mw-template-bracket", state);783}784break;785case "<":786if (stream.match("!--")) {787// coment788return chain(eatBlock("mw-comment", "-->"));789}790var isCloseTag = stream.eat("/") ? true : false;791var tagname = stream.match(792/[^>\/\s\u00a0\.\*\,\[\]\{\}\$\^\+\?\|\/\\'`~<=!@#%&\(\)-]+/793);794if (tagname) {795tagname = tagname[0].toLowerCase();796if (config.mwextTags && tagname in config.mwextTags) {797// Parser function798if (isCloseTag === true) {799// @todo message800return "error";801}802stream.backUp(tagname.length);803state.stack.push(state.tokenize);804state.tokenize = eatTagName(tagname.length, isCloseTag, false);805return makeLocalStyle("mw-exttag-bracket", state);806}807if (tagname in permittedHtmlTags) {808// Html tag809if (isCloseTag === true && tagname !== state.InHtmlTag.pop()) {810// @todo message811return "error";812}813stream.backUp(tagname.length);814state.stack.push(state.tokenize);815state.tokenize = eatTagName(tagname.length, isCloseTag, true);816return makeLocalStyle("mw-htmltag-bracket", state);817}818stream.backUp(tagname.length);819}820break;821case "~":822if (stream.match(/~{2,4}/)) {823return "mw-signature";824}825break;826}827stream.match(/[^\s\u00a0_>\}\[\]<\{\'\|\&\:~]+/);828var ret = makeStyle(style, state);829return ret;830};831}832833return {834startState: function () {835return {836tokenize: eatWikiText("", ""),837stack: [],838InHtmlTag: [],839isBold: false,840isItalic: false,841extName: false,842extMode: false,843extState: false,844nTemplate: 0,845nLink: 0,846nExt: 0,847};848},849copyState: function (state) {850return {851tokenize: state.tokenize,852stack: state.stack.concat([]),853InHtmlTag: state.InHtmlTag.concat([]),854isBold: state.isBold,855isItalic: state.isItalic,856extName: state.extName,857extMode: state.extMode,858extState:859state.extMode !== false &&860CodeMirror.copyState(state.extMode, state.extState),861nTemplate: state.nTemplate,862nLink: state.nLink,863nExt: state.nExt,864};865},866token: function (stream, state) {867return state.tokenize(stream, state);868},869blankLine: function (state) {870if (state.extName) {871if (state.extMode) {872var ret = "";873if (state.extMode.blankLine) {874ret = " " + state.extMode.blankLine(state.extState);875}876return "line-cm-mw-tag-" + state.extName + ret;877}878return "line-cm-mw-exttag";879}880},881};882});883884CodeMirror.defineMIME("text/mediawiki", "mediawiki");885886function eatNowiki(style, lineStyle) {887return function (stream, state, ownLine) {888if (ownLine && stream.sol()) {889state.ownLine = true;890} else if (ownLine === false && state.ownLine) {891state.ownLine = false;892}893var s = state.ownLine ? lineStyle : style;894if (stream.match(/[^&]+/)) {895return s;896}897stream.next(); // eat &898return eatMnemonic(stream, s, s);899};900}901902CodeMirror.defineMode("mw-tag-pre", function (/*config, parserConfig */) {903return {904startState: function () {905return {};906},907token: eatNowiki("mw-tag-pre", "line-cm-mw-tag-pre"),908};909});910911CodeMirror.defineMode("mw-tag-nowiki", function (/*config, parserConfig */) {912return {913startState: function () {914return {};915},916token: eatNowiki("mw-tag-nowiki", "line-cm-mw-tag-nowiki"),917};918});919920921