User:PerfektesChaos/js/WikiSyntaxTextMod/dE.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:PerfektesChaos/js/WikiSyntaxTextMod/dE. |
/// PerfektesChaos/js/WikiSyntaxTextMod/dE.js
/// 2023-02-28 PerfektesChaos@de.wikipedia
/// Fingerprint: #0#0#
/// License: CC-by-sa/4.0
/// <nowiki>
// WikiSyntaxTextMod: Wiki syntax specific code, particular elements
/* global mw:true, mediaWiki:false */
/* jshint forin:false,
bitwise:true, curly:true, eqeqeq:true, latedef:true,
laxbreak:true,
nocomma:true, strict:true, undef:true, unused:true */
if ( typeof mediaWiki !== "object" ) { // disconnected
mw = { config: false,
libs: { WikiSyntaxTextMod: { }
},
log: function () {"use strict";}
};
}
( function ( mw ) {
"use strict";
var version = -7.65,
sign = "WikiSyntaxTextMod",
sub = "E",
rls, self, WSTM;
if ( typeof mw.loader === "object" ) {
rls = { };
self = "user:PerfektesChaos/" + sign + "/" + sub;
rls[ self ] = "loading";
mw.loader.state( rls );
}
if ( typeof mw.libs[ sign ] !== "object" ) { // isolated
mw.libs[ sign ] = { };
}
WSTM = mw.libs[ sign ];
if ( typeof WSTM.w !== "object" ) {
WSTM.w = { elem: { } };
}
if ( typeof WSTM.w.elem !== "object" ) {
WSTM.w.elem = { };
}
WSTM.w.elem.vsn = version;
WSTM.w.elem.self = self;
if ( typeof WSTM.bb !== "object" ) {
WSTM.bb = { };
}
if ( typeof WSTM.debugging !== "object" ) {
WSTM.debugging = { };
}
} ( mw ) );
/*
Requires: JavaScript 1.3
(String.charCodeAt String.fromCharCode String.replace)
JavaScript 1.5 RegExp non-capturing parenthese
*/
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.bbE = function (WSTM) {
// Building block and run environment support
// 2012-05-18 PerfektesChaos@de.wikipedia
"use strict";
if ( typeof WSTM.util !== "object" ) {
WSTM.util = { };
}
if ( typeof WSTM.util.fiatObjects !== "function" ) {
WSTM.util.fiatObjects = function (adult, activate, assign) {
// Ensure existence of at least empty object
// Precondition:
// adult -- parent object
// activate -- String with name of child object
// assign -- optional object with initial definition
// if containing object components,
// they will be asserted as well
// Postcondition:
// adult has been extended
// Uses:
// .util.fiatObjects() -- recursive
// 2012-05-18 PerfektesChaos@de.wikipedia
var elt,
obj,
s;
if ( typeof adult[ activate ] !== "object" ) {
adult[ activate ] = ( assign ? assign : { } );
}
if ( assign ) {
obj = adult[ activate ];
for ( s in assign ) {
elt = assign[ s ];
if ( typeof elt === "object" ) {
WSTM.util.fiatObjects( obj, s, elt );
}
} // for s in obj
}
}; // .util.fiatObjects()
}
WSTM.util.fiatObjects(WSTM, "debugging", { loud: false });
}; // .bb.bbE()
mw.libs.WikiSyntaxTextMod.bb.bbE(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.bbE;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.elem = function (WSTM) {
// Particular syntax elements
// Uses:
// .util.fiatObjects()
// 2012-10-10 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM, "w",
{ elem: { isbn: { },
tables: { }
}
} );
WSTM.w.elem.wordlist = [ "DEFAULTSORT",
"DISPLAYTITLE",
"REDIRECT" ];
// ////////////////////////////////////////////////////////////// MORE
WSTM.w.elem.defaultsort = function (adjust, assign) {
// Check "{{DEFAULTSORT:" code and localize keyword
// Precondition:
// adjust -- entire expression like "DEFAULTSORT:sortkey}}"
// assign -- keyword like "DEFAULTSORT" or localized
// Postcondition:
// Returns (updated) expression
// Uses:
// > .w.template.sort
// > .g.wTitle
// >< .w.encountered.DEFAULTSORT
// .errors.found()
// .hooks.fire()
// .w.elem.sortkey()
// 2016-01-23 PerfektesChaos@de.wikipedia
var k = adjust.indexOf(":"),
lapsus = true,
sorter = adjust.substr(k + 1),
leave,
shift,
symbol;
if ( typeof WSTM.w.encountered.DEFAULTSORT === "string" ) {
WSTM.errors.found( "defaultsortRepeated",
false,
"{{" + adjust );
} else {
if ( WSTM.hooks.fire( "defaultsort_strict" ) ) {
symbol = WSTM.w.template.sort;
symbol = symbol.substr(1, symbol.substr(1).indexOf("|"));
} else {
symbol = assign.toUpperCase();
}
sorter = sorter.slice( 0, -2 );
if ( sorter.length ) {
if ( sorter.indexOf("\n") < 0 ) {
shift = this.sortkey( sorter );
if (shift) {
sorter = shift;
}
if (WSTM.hooks.fire( "sortkey_ignorecase" )) {
leave = ( sorter.toUpperCase() ===
WSTM.g.wTitle.toUpperCase() );
} else {
leave = ( sorter === WSTM.g.wTitle );
}
if (leave) {
WSTM.errors.found( "defaultsortSuperfluous",
false,
"{{" + adjust );
} else {
lapsus = false;
}
} else {
WSTM.errors.found( "defaultsortLineBreak",
false,
"{{" + adjust );
}
} else {
WSTM.errors.found("defaultsortEmpty",
false,
"{{" + adjust);
}
WSTM.w.encountered.DEFAULTSORT = sorter;
}
return (lapsus ? adjust : symbol + ":" + sorter + "}}");
}; // .w.elem.defaultsort()
WSTM.w.elem.displaytitle = function (adjust, assign) {
// Check "{{DISPLAYTITLE:" code, delete if entirely redundant
// Precondition:
// adjust -- entire expression like "DISPLAYTITLE:title}}"
// assign -- keyword like "DISPLAYTITLE" or localized
// attach -- detected keyword
// Postcondition:
// Returns false, if to be discarded,
// or string with possibly formatted adjust string
// Uses:
// > .w.template.show
// > .g.wNsNumber
// > .g.wTitle
// >< .w.encountered.DISPLAYTITLE
// < .mod.lazy
// .str.trimL()
// .errors.found()
// .hooks.fire()
// .str.substrEnd()
// .str.trimR()
// Requires: JavaScript 1.3 charCodeAt()
// 2012-09-24 PerfektesChaos@de.wikipedia
var k = adjust.indexOf(":"),
r = adjust,
show = WSTM.str.trimL(adjust.substr(k + 1), false),
symbol;
if ( typeof WSTM.w.encountered.DISPLAYTITLE === "string" ) {
WSTM.errors.found("displaytitleRepeated",
false,
"{{" + adjust);
} else {
if (WSTM.hooks.fire("displaytitle_localize")) {
symbol = WSTM.w.template.sort;
symbol = symbol.substr(1, symbol.substr(1).indexOf("|"));
} else {
symbol = assign.toUpperCase();
}
if (WSTM.str.substrEnd(show, 2) === "}}") {
// if (show.slice(-2) === "}}") {
show = WSTM.str.trimR(show.slice(0, -2), false, false);
if (show.indexOf("\n") < 0) {
if (show === WSTM.g.wTitle && ! WSTM.g.wNsNumber) {
r = false;
WSTM.mod.lazy = false;
}
/*
k = show.charCodeAt(0);
if ((k >= 48 && k <= 57) ||
(k >= 65 && k <= 90)) {
} // digit or capital latin
*/
WSTM.w.encountered.DISPLAYTITLE = show;
} else {
WSTM.errors.found("displaytitleDubios",
false,
"{{" + adjust);
}
show = show + "}}";
} else {
WSTM.errors.found("displaytitleDubios",
false,
"{{" + adjust);
}
if (r) {
r = symbol + ":" + show;
}
}
return r;
}; // .w.elem.displaytitle()
WSTM.w.elem.exportsingle = function (ahead) {
// Process a '#WikiSyntaxTextMod EXPORT' page begin
// Precondition:
// ahead -- first block / entire wikitext
// Page starts with '#WikiSyntaxTextMod EXPORT'
// Postcondition:
// Line has been removed, import languages added.
// Uses:
// > .lang.translate.read
// > .g.wNsNumber
// > .g.wDBname
// > .o.WikiTom.WSTMinternal
// >< .text
// < .lang.write
// .g.fetchDB()
// .lang.translate.further()
// .lang.translate.flush()
// .lang.translate.finish()
// .o.WikiTom().focus()
// .o.WikiTom().fresh()
// 2014-10-10 PerfektesChaos@de.wikipedia
var re = new RegExp("^#WikiSyntaxTextMod +EXPORT +"
+ "([a-z]+(_[a-z]+)?)\n+"
+ "(<h1.+</h1>\n+)?",
"i"),
scope = false,
got,
slang,
stuff;
WSTM.lang.write = false;
got = re.exec(ahead);
if (got) {
stuff = ahead.substr(got[0].length);
// WSTM.g.wNsNumber > 0 TRANSLATE
if (WSTM.g.wNsNumber === 2 ||
WSTM.g.wNsNumber === 4 ||
WSTM.g.wNsNumber >= 100) {
scope = got[1].toLowerCase();
if (scope !== WSTM.g.wDBname) {
got = WSTM.g.fetchDB(scope);
if (got) {
slang = got[0];
WSTM.lang.write = { db: scope,
lang: slang,
lead: true,
linkproj: got[1],
linklang: slang };
WSTM.lang.translate.further(scope,
WSTM.lang.translate.read,
true);
WSTM.lang.translate.further(slang,
WSTM.lang.translate.read,
true);
WSTM.lang.translate.flush(slang, scope);
WSTM.lang.translate.finish(0);
scope = "#WikiSyntaxTextMod EXPORT " + scope
+ "\n\n\n"
+ "<h1>EXPORT " + scope + "</h1>\n\n\n";
stuff = scope + stuff;
}
}
}
got = WSTM.text.focus(0);
got.fresh(stuff);
if (scope) {
got = WSTM.text.fold(0, scope.length, false, true);
if (got) {
got.mode = WSTM.o.WikiTom.WSTMinternal;
got.lookup = false;
}
}
}
}; // .w.elem.exportsingle()
WSTM.w.elem.fair = function (all) {
// Isolate paragraph and headline ranges
// Precondition:
// all -- WikiTom to be analyzed and subdivided (root)
// Postcondition:
// all has been subdivided, where appropriate
// Uses:
// .hooks.fire()
// .o.WikiTom().find()
// .o.WikiTom().flip()
// .o.WikiTom().folder()
// .o.WikiTom().focus()
// .errors.found()
// .str.trim()
// .w.elem.fragment()
// Requires: JavaScript 1.3 charCodeAt()
// 2014-08-25 PerfektesChaos@de.wikipedia
var m = WSTM.hooks.fire("headline_spacing"),
re = [ /\r?\n(\r?\n+)([^\n]+\r?\n)?/, 1 ],
got = all.find(re, 0, 0, true, false, false),
d,
h,
j,
k,
n,
p,
s;
while (got) {
j = got.i;
k = got.k;
n = got.m.length;
if (n > 1) {
d = (WSTM.hooks.fire("linegap", got.r[2]) ? 1 : 2);
if (n > d) {
all.flip(k, j, n - d, "");
n -= d;
}
}
if (j) {
all.folder(0, k, j + 1, k);
p = all.focus(k);
if (p) {
p.limited = true;
}
k++;
j = 1;
} else {
j += n + 1;
}
got = all.find(re, j, k, false, false, false);
} // while got
re = [ /([^=])?(=+)([^=\n].*[^=\n]|[^=\n])(=+)([^=\r?\n]+)?\r?\n?/,
0 ];
got = all.find(re, 0, 0, true, false, false);
while (got) {
d = got.child;
if (d) {
j = 0;
k = got.k + 1;
this.fair(d.o);
} else {
j = got.i;
k = got.k;
n = got.m.length;
got = got.r;
if (got[1]) {
if (got[1].charCodeAt(0) === 10) {
j++;
} else {
got = false;
if (! j) {
j++;
n -= 2;
}
}
} else if (j || k) {
got = false;
if (k && ! j) {
p = all.focus(got.k - 1);
got = p.lookup;
if (! got) {
j = 1;
n--;
}
}
}
if (got) {
s = got[5];
if (s) {
s = WSTM.str.trim(s);
if (s.length) {
WSTM.errors.found("headlineEnd",
false,
got[2] + got[3] + got[4]);
got = false;
}
}
if (got) {
s = got[2];
h = s.length;
if (h === got[4].length) {
if (h === 1) {
if (WSTM.hooks.fire("headline_1")) {
WSTM.errors.found("headline1",
false,
"= " + got[3] + " =");
}
}
n = h + got[3].length + h;
if (j) {
h = all.folder(0, k, j, k);
if (h) {
p = all.focus(k);
if (p) {
p.limited = true;
}
}
k++;
j = 0;
}
if (all.folder(0, k, n, k)) {
h = all.focus(k);
if (h) {
p = WSTM.str.trim(got[3]);
// .w.polish.strong() still ???
this.fragment(p, false);
h.limited = true;
h.scope = "headline";
if (m) {
if (m > 0) {
s = s + " " + p + " " + s;
} else {
s = s + p + s;
}
if (s !== h.toString()) {
// no links nor templates defined yet
all.flip(k, 0, n, s);
}
}
}
k++;
j = 0;
}
} else {
WSTM.errors.found("headlineUnequal",
false,
got[2] + got[3] + got[4]);
j += got[2].length +
got[3].length +
got[4].length;
}
}
}
if (j) {
j += n - 2;
} else if (! k) {
j = 3;
}
}
got = all.find(re, j, k, true, false, false);
} // while got
}; // .w.elem.fair()
WSTM.w.elem.finishing = function () {
// Perform general syntax polish
// Postcondition:
// RegExp was used.
// Uses:
// > .w.chr.detected.exchange
// > .w.chr.detected.ampersand
// > .w.chr.detected.nbHyphen
// > .w.chr.detected.ordMasc
// > .w.encountered.table
// >< .text
// .w.chr.flushEntities()
// .w.chr.flushChars()
// .hooks.fire()
// .util.translate.factory()
// .o.WikiTom().replace()
// .w.elem.tables.features()
// .w.elem.tables.fire()
// .w.elem.isbn.fire()
// 2023-02-28 PerfektesChaos@de.wikipedia
var tms = [ ["([0-9])&(nbsp|#(160|x0*[aA]0));%",
"$1 %"],
["Ȃ[89];",
"\n"],
["\n\\| *(border|class|(col|row)span)"
+ " *= *(1?[0-9]) *\\|",
"\n|$1=\"$3\"|"],
["\\b(?:PMID|RFC)"
+ "(?:: | *: *)"
+ "([0-9]{1,7}(?:[ /.,;<)\n]|\\]))",
"PMID $1"],
["\\[\\[((?:PMID|RFC) [0-9]{1,7})\\]\\]",
"$1"]
],
c1, c2, c3, t;
if (WSTM.w.chr.detected.nbHyphen) {
c1 = String.fromCharCode(8209); // 2011 NON-BREAKING HYPHEN
t = [ [c1 + "( |\n|<(br|div)\\b)",
"-$1"],
["( |\n|/>)" + c1,
"$1-"] ];
tms = tms.concat(t);
}
if (WSTM.w.chr.detected.ordMasc) {
c1 = String.fromCharCode(186); // \xBA º
c2 = String.fromCharCode(176); // degree
c3 = String.fromCharCode(8722); // minus
t = [ ["([0-9][.,][0-9]+)" + c1,
"$1" + c2],
["(" + c3 + "[0-9]+[.,]?[0-9]*)" + c1,
"$1" + c2],
["( | )" + c1
+ "([CFR])\\b",
"$1" + c2 + "$2"] ];
tms = tms.concat(t);
}
if (WSTM.w.chr.detected.ampersand) {
// new RegExp("&[#A-Za-z]")
WSTM.w.chr.flushEntities(WSTM.text);
}
if (WSTM.w.chr.detected.exchange) {
WSTM.w.chr.flushChars(WSTM.text);
}
t = WSTM.hooks.fire("finishing");
if (t) {
tms = tms.concat(t);
}
tms = WSTM.util.translate.factory(tms, ".finishing");
WSTM.text.replace(tms);
if (WSTM.w.encountered.table) {
this.tables.features();
} else {
}
this.tables.fire();
this.isbn.fire(WSTM.text, false);
}; // .w.elem.finishing()
WSTM.w.elem.fire = function () {
// Start element analysis
// Uses:
// .w.elem.fair()
// .w.elem.tags()
// .w.tags.future()
// .w.elem.references()
// .w.elem.galleries()
// .w.elem.imagemaps()
// 2012-12-07 PerfektesChaos@de.wikipedia
this.fair(WSTM.text);
this.tags(); // -> plain !!!
if (WSTM.w.tags.future("references", false)) {
this.references();
}
if (WSTM.w.tags.future("gallery", false)) {
this.galleries();
}
if (WSTM.w.tags.future("imagemap", false)) {
this.imagemaps();
}
}; // .w.elem.fire()
WSTM.w.elem.fixed = function (analyze, ahead) {
// Isolate any indented paragraph
// Precondition:
// analyze -- WikiTom to be analyzed in detail
// ahead -- true: top level of entire text
// Postcondition:
// analyze has been subdivided and locked, where appropriate
// Uses:
// > WSTM.o.WikiTom.TextOnly
// .w.elem.fixing()
// 2012-04-28 PerfektesChaos@de.wikipedia
var e,
i;
if (WSTM.text.children) {
for (i = 0; i < analyze.children.length; i++) {
e = analyze.children[i];
if (e.mode <= WSTM.o.WikiTom.TextOnly) {
i = this.fixing(analyze, i);
/*
} else if (e.mode <= WSTM.o.WikiTom.Tag) {
// this.fixed(e, false); // /////////////////////////////
*/
}
} // for i
} else {
this.fixing(analyze, 0);
}
}; // .w.elem.fixed()
WSTM.w.elem.fixing = function (analyze, assign) {
// Isolate any indented paragraph in string
// Precondition:
// analyze -- WikiTom to be analyzed partially
// assign -- number of string WikiTom to be analyzed
// Postcondition:
// Returns node number
// all has been subdivided and locked, where appropriate
// RegExp was used.
// Uses:
// > WSTM.o.WikiTom.TextOnly
// > WSTM.o.WikiTom.CodeBlock
// .o.WikiTom().find()
// .o.WikiTom().focus()
// .o.WikiTom().fold()
// .o.WikiTom().fork()
// .o.WikiTom().folder()
// Requires: JavaScript 1.3 charCodeAt()
// 2012-05-03 PerfektesChaos@de.wikipedia
var beg = false,
end = false,
got = 0,
r = assign,
c;
if (! assign) {
if (analyze.fetch(0, 0, true) === 32) {
beg = { i: 0, k: 0 };
}
}
if (! beg) {
got = analyze.find("\n ", 2, r, false, true, false);
if (got) {
if (analyze.focus(got.k).mode <= WSTM.o.WikiTom.TextOnly) {
beg = { i: got.i, k: got.k };
}
}
}
if (beg) {
end = { i: beg.i + 1, k: beg.k };
do {
got = analyze.find("\n", end.i + 1, end.k,
false, true, false);
if (got) {
c = analyze.fetch(got.k, got.i + 1, true);
if (c === 32 || c === 10) {
if (got.k === beg.k) {
end = { i: got.i, k: got.k };
} else {
got = false;
}
} else {
got = false;
}
// if end.k > beg.k -> WSTM.o.WikiTom.TextOnly
} else {
end.i = analyze.fetch(end.k, 0, false).length;
got = false;
}
} while (got); // do
if (end.k > beg.k) {
if (end.i) {
analyze.fold(end.k, end.i, false);
end.i = 0;
}
if (beg.i) {
if (analyze.fold(beg.k, beg.i, true)) {
beg.k++;
beg.i = 0;
}
}
got = analyze.fork(beg.k, end.k, "code", false, false);
} else if (end.i - beg.i > 3) {
got = analyze.folder(beg.i, beg.k, end.i, beg.k);
}
if (got) {
got.mode = WSTM.o.WikiTom.CodeBlock;
got.lookup = false;
}
}
return r;
}; // .w.elem.fixed()
WSTM.w.elem.fragment = function (anchor, alone) {
// Precondition:
// anchor -- fragment id to be added
// alone -- true: do not permit existing anchor id
// Uses:
// >< .w.anchors
// .errors.found()
// 2011-03-26 PerfektesChaos@de.wikipedia
var l = false,
n = WSTM.w.anchors,
s = anchor.replace( new RegExp("( +|_)", "g"), " " ),
i;
if (! alone) {
s = s.replace( /<[^>]+>/, "" ).replace( /{{.+}}/, "" );
}
if (WSTM.w.anchors) {
for (i = 0; i < n; i++) {
l = (WSTM.w.anchors[i] === s);
if (l) {
if (alone) {
WSTM.errors.found("anchorRepeated", false, anchor);
}
break;
}
} // for i
if (! l) {
WSTM.w.anchors.push(s);
}
} else {
WSTM.w.anchors = [ s ];
}
}; // .w.elem.fragment()
WSTM.w.elem.furnish = function () {
// Uses:
// > .config.format.*
// < .elem.*
// 2015-03-03 PerfektesChaos@de.wikipedia
var cnf, p;
if ( typeof WSTM.config === "object" && WSTM.config ) {
cnf = WSTM.config;
if ( typeof cnf.format === "object" && cnf.format ) {
cnf = cnf.format;
for ( p in cnf ) {
this[ p ] = cnf[ p ];
} // for p in WSTM.config.format.*
}
}
}; // .w.elem.furnish()
WSTM.w.elem.galleries = function () {
// Adapt all <gallery>...</gallery> blocks
// Precondition:
// At least one gallery block has been detected before.
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .w.link.namespace.nsFile
// > .mod.plain.stm
// > .text
// > .children
// > .mode
// > .scope
// > .WikiTom.TagBinary
// >< .w.link.namespace.sFile
// .w.link.namespace.fetch()
// .o.WikiTom().getCount()
// .w.elem.gallery()
// 2015-03-10 PerfektesChaos@de.wikipedia
var n = 0,
x = false,
i,
p;
if ( typeof this.galleryIndent === "number"
&& this.galleryIndent >= 1) {
n = Math.floor(this.galleryIndent);
}
if ( WSTM.w.link.namespace.sFile !== "string" ) {
WSTM.w.link.namespace.sFile =
WSTM.w.link.namespace.fetch(WSTM.w.link.namespace.nsFile,
false);
}
if (WSTM.mod.plain) {
x = WSTM.mod.plain.stm;
}
for (i = WSTM.text.getCount() - 1; i >= 0; i--) {
p = WSTM.text.children[i];
if (p.mode === WSTM.o.WikiTom.TagBinary) {
if (p.scope) {
if (p.scope === "gallery") {
this.gallery(p, WSTM.w.link.namespace.sFile, x, n);
}
}
}
} // for i
}; // .w.elem.galleries()
WSTM.w.elem.gallery = function (adjust, area, apply, align) {
// Adapt one <gallery>...</gallery> block
// Precondition:
// adjust -- WikiTom to be analyzed (gallery parent)
// > .children
// >< .mode
// >< .source
// area -- namespace keyword, before ':'
// apply -- .mod.plain.stm
// align -- number of minimum indentation
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .mod.wikilink
// > .mod.luxury
// > .o.WikiTom.LinkFile
// < .mod.lazy
// .o.WikiTom().fresh()
// .str.isBlank()
// .str.makeString()
// .str.trimL()
// .str.trimR()
// .o.WikiTom()
// .o.WikiTom().toString()
// .util.translate.flip()
// .w.link.namespace.furnish()
// .w.link.wiki.decode()
// .w.link.replace.flipper()
// .str.setString()
// .o.WikiTom().folder()
// Requires: JavaScript 1.3 charCodeAt()
// 2015-11-05 PerfektesChaos@de.wikipedia
var indent = align,
q = adjust.children,
shift = "",
i,
j,
k,
knots,
last,
m,
next,
s,
seek,
single,
show,
swift,
t,
tom;
for (k = 0; k < q.length; k++) { // first run
t = q[k];
if (! t.mode && t.source) {
s = t.source;
j = (s.indexOf("\n\n") >= 0);
if (j) {
s = s.replace(/\r?\n(\r?\n)+/g, "\n");
t.fresh( s );
}
s = "\n" + t.source + "|";
j = 0;
while (j >= 0) {
j = s.indexOf("\n", j);
if (j >= 0) {
i = 0;
j++;
for ( true; true; j++) {
if (WSTM.str.isBlank(s.charCodeAt(j), false)) {
i++;
if (i > indent) {
indent = i;
}
} else {
break; // for j
}
} // for j
} // fetch single line
} // while \n
}
} // for k
if (indent) {
if (indent > 8) {
indent = 8;
}
shift = WSTM.str.makeString(32, indent);
}
knots = q.length - 1;
for ( k = knots; k >= 0; k-- ) { // second run
t = q[k];
if ( ! t.mode ) {
if ( typeof t.source === "string" ) {
next = t.source.length;
} else {
next = 0;
t.source = "";
}
j = next;
last = true;
while ( j >= 0 ) {
j = t.source.lastIndexOf("\n", j);
if ( j < 0 ) {
single = t.source.substring(0, next);
} else {
single = t.source.substring(j + 1, next);
}
if (single) {
i = single.indexOf("|");
/* 2013-07:
Mydoc.pdf|page=5|comment
MyTiff.tif|lossy|description
.svg|lang
*/
if (i > 0) {
swift = WSTM.str.trimR(single.substr(0, i),
false, false);
show = WSTM.str.trimL(single.substr(i + 1),
true);
if (show.length) {
if (show.indexOf("[") >= 0) {
tom = new WSTM.o.WikiTom(show, null);
WSTM.w.link.fire(tom, true, false, false);
show = tom.toString();
}
if (apply) {
show = WSTM.util.translate.flip(show,
apply);
}
show = "|" + show;
} else if (last && k < knots) {
show = "|";
} else {
show = "";
}
} else {
show = "";
swift = single;
}
if ( ! k || j >= 0) {
swift = WSTM.str.trimL(swift, true);
i = swift.indexOf(":");
if (i) {
if (i > 0) {
s = WSTM.str.trimR( swift.substr(0, i) );
if (WSTM.w.link.namespace.furnish(s) === 6) {
swift = WSTM.str.trimL(swift.substr(i+1),
true);
}
}
} else {
swift = WSTM.str.trimL(swift.substr(1), true);
}
s = WSTM.w.link.wiki.decode(swift, true, false,
false, true);
if (s) {
swift = s;
}
if (WSTM.mod.wikilink) {
seek = area + ":" + swift;
s = WSTM.w.link.replace.flipper(seek,
false,
false,
false);
if (s) {
swift = s.substr(area.length + 1);
}
}
// show might contain a wikilink; refine
show = shift + swift + show;
if (show !== single) {
t.fresh( WSTM.str.setString(t.source,
j + 1,
next - j - 1,
show) );
WSTM.mod.lazy = false;
}
if (WSTM.mod.luxury) {
i = j + 1 + indent;
m = adjust.folder(i,
k, i + swift.length,
k);
if (m) {
m.mode = WSTM.o.WikiTom.LinkFile;
m.lookup = false;
t = q[k];
}
}
}
}
last = false;
next = j;
j--;
} // while \n
}
} // for k--
}; // .w.elem.gallery()
WSTM.w.elem.hashmagic = function () {
// Pages beginning with #, like #REDIRECT statement
// Postcondition:
// Modifies text, if appropriate
// RegExp was used.
// Uses:
// > .text
// .o.WikiTom().fetch()
// .w.elem.exportsingle()
// .w.elem.importsingle()
// .w.elem.redirect()
// Requires: JavaScript 1.3 charCodeAt()
// 2012-09-07 PerfektesChaos@de.wikipedia
var start = WSTM.text.fetch(0, 0, false),
got,
re,
s;
// TODO leading whitespace
if (start.charCodeAt(0) === 35) { // '#'
s = start.substr(1);
if (s.substr(0, 17) === "WikiSyntaxTextMod") {
re = new RegExp("^#WikiSyntaxTextMod +([a-z]+) ", "i");
got = re.exec(start);
if (got) {
switch (got[1].toUpperCase()) {
case "EXPORT" :
this.exportsingle(start);
break;
case "IMPORT" :
this.importsingle(start);
break;
case "TRANSLATE" :
// one-liner, write project
break;
} // switch got[1]
} // got
} else {
this.redirect(s);
}
} // '#'
}; // .w.elem.hashmagic()
WSTM.w.elem.imagemaps = function () {
// Adapt all <imagemap>...</imagemap> blocks
// Precondition:
// At least one imagemap block has been detected before.
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .text
// > .children
// > .mode
// > .scope
// > .WikiTom.TagBinary
// .o.WikiTom().getCount()
// .w.elem.imagemap()
// 2012-06-20 PerfektesChaos@de.wikipedia
}; // .w.elem.imagemaps()
WSTM.w.elem.importsingle = function (ahead) {
// Process a '#WikiSyntaxTextMod IMPORT' page begin
// Precondition:
// ahead -- first block / entire wikitext
// Page starts with '#WikiSyntaxTextMod IMPORT'
// Postcondition:
// Line has been removed, import languages added.
// Uses:
// >< .text
// .lang.translate.fair()
// .o.WikiTom().focus()
// .o.WikiTom().fresh()
// 2014-10-10 PerfektesChaos@de.wikipedia
var re = new RegExp("^#WikiSyntaxTextMod +"
+ "IMPORT +([a-z][a-z][-a-z]*)\n+",
"i"),
got = re.exec(ahead);
if (got) {
WSTM.lang.translate.fair( got[1], false );
WSTM.text.focus(0).fresh(ahead.substr(got[0].length));
}
}; // .w.elem.importsingle()
WSTM.w.elem.isbn.fire = function (analyze, access) {
// Find ISBN magic codes, exchange against improvements
// Precondition:
// analyze -- WikiTom to be analyzed
// access -- object { i, k } with start position, or false
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .g.re.ISBN
// .o.WikiTom().find()
// .w.elem.isbn.fire() -- recursive
// .w.elem.isbn.format()
// .o.WikiTom().flip()
// 2017-04-04 PerfektesChaos@de.wikipedia
var target = [ WSTM.g.re.ISBN, 0 ],
deep,
details,
got,
suggest;
if (access) {
got = access;
} else {
got = { i: 0, k: 0 };
}
do {
got = analyze.find(target, got.i, got.k, true, false, false);
if (got) {
deep = got.child;
if (deep) {
this.fire(deep.o, deep);
got.i = 0;
got.k++;
} else {
details = got.r;
if (details[6] === "f") {
details[6] = "\n";
}
suggest = this.format(details);
if (suggest) {
analyze.flip(got.k, got.i, details[0].length, suggest);
got.i += suggest.length - 2;
} else {
got.i += 6;
}
}
}
} while (got); // do
}; // .w.elem.isbn.fire()
WSTM.w.elem.isbn.format = function (adjust) {
// Check and reformat ISBN magic code
// Precondition:
// adjust -- regexp result array
// [0] entire context
// [1] prolog
// preceding non-whitespace ('|': template)
// [2] "ISBN"
// 6 10 14 [3] 10 | 13
// 4 [4] '=' assignment, if any
// 15 [5] I-S-B-N
// 17 [6] epilog
// Postcondition:
// Returns string reformatted changed sequence (adjust[0])
// (without last digit and epilog **+????***)
// insert hyphens etc., spaces replaced by '-'
// x->X
// '-' inserted before language, checknumber
// at ISBN-13 bookland
// false adjust is invalid or unchanged
// Uses:
// .util.isbn.format()
// Requires: JavaScript 1.3 charCodeAt()
// 2012-05-23 PerfektesChaos@de.wikipedia
var lapsus = false,
liaison = ( typeof adjust[ 4 ] === "string" ),
need = adjust[ 3 ],
score = adjust[ 5 ],
r,
stuff;
if ( ! liaison ) {
lapsus = true;
}
if ( need ) {
need = Number(need);
}
r = WSTM.util.isbn.format( score, need );
if ( r[ 0 ] ) {
if ( r[ 1 ] ) {
lapsus = true;
score = r[1];
} else if ( typeof adjust[ 11 ] === "string" ) {
if ( adjust[ 11 ] !== " " ) {
lapsus = true;
}
} else {
lapsus = true;
}
} else {
lapsus = false;
}
if (lapsus) {
stuff = adjust[1];
if (stuff.charCodeAt(0) === 124 && liaison) { // '|' template
stuff = stuff + adjust[2] + adjust[4];
} else {
stuff = stuff + "ISBN ";
} // template ?
stuff = stuff + score + adjust[6];
if (adjust[0] === stuff) {
r = false;
} else {
r = stuff;
}
} else {
r = false;
} // validity
return r;
}; // .w.elem.isbn.format()
WSTM.w.elem.redirect = function (ahead) {
// Standardize #REDIRECT statement
// Precondition:
// ahead -- first block / entire wikitext after '#'
// Postcondition:
// // '#'
// Modifies text, if appropriate
// RegExp was used.
// Uses:
// > .lang.translate.read
// > .text
// .lang.translate.feed()
// .lang.translate.fetch()
// .hooks.fire()
// .str.capitalize()
// .o.WikiTom().flip()
// .o.WikiTom().fresh()
// Requires: JavaScript 1.3 charCodeAt()
// 2016-01-08 PerfektesChaos@de.wikipedia
var re = WSTM.lang.translate.feed("|",
"REDIRECT",
"REDIRECT",
WSTM.lang.translate.read,
true),
colon,
got,
launch,
second,
shift,
sign;
re = "(" + re + ")"
+ "(:?)"
+ "( *)"
+ "\\[\\[ *";
re = new RegExp(re, "i");
got = re.exec(ahead);
if (got) {
if (! got.index) {
colon = WSTM.hooks.fire("redirect.colon");
if (colon) {
colon = (colon > 0 ? ":" : got[2]);
} else {
colon = "";
}
shift = WSTM.hooks.fire("redirect.mode");
if (! shift) {
shift = WSTM.lang.translate.fetch("REDIRECT");
} else if ( typeof shift !== "string" ) {
shift = got[1];
}
launch = (got[2].length !== colon.length ||
got[3].length !== 1);
if (! launch) {
sign = got[1];
launch = (sign.length !== shift.length);
if (! launch) {
launch = (sign !== shift);
if (launch) {
second = WSTM.hooks.fire("redirect.variant");
if (second) {
if (second.indexOf("C") >= 0) {
launch =
(sign !== WSTM.str.capitalize(shift));
}
}
}
}
}
if (launch) {
shift = shift + colon + " [[";
WSTM.text.flip(0, 1, got[0].length, shift);
WSTM.text.fresh();
//console.log(".w.elem.redirect()",WSTM.text.toString())
} // non-standard
} // heading
// TODO single line
} // got
}; // .w.elem.redirect()
WSTM.w.elem.references = function () {
// Adapt all <references>...</references> blocks
// Precondition:
// At least one references block has been detected before.
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .text
// > .children
// > .mode
// > .scope
// >< .source
// > .WikiTom.TagBinary
// < .mod.lazy
// .o.WikiTom().getCount()
// .str.trimL()
// .o.WikiTom().fresh()
// .hooks.fire()
// Requires: JavaScript 1.3 charCodeAt()
// 2015-12-25 PerfektesChaos@de.wikipedia
var refBeg = new RegExp("([^ \n>]) *(</?ref?[ \n>])", "g"),
refEnd = new RegExp("(</?ref[^>\n]*>) *([^ \n>])", "g"),
refMid = new RegExp("</ref>\n\n+", "g"),
refPre = new RegExp("<ref[^>\n]*> *\f"),
i,
k,
lead,
m,
p,
q,
s,
t;
for (i = WSTM.text.getCount() - 1; i >= 0; i--) {
p = WSTM.text.children[i];
if (p.mode === WSTM.o.WikiTom.TagBinary) {
if ( typeof p.scope === "string"
&& p.scope === "references" ) {
m = 1;
q = p.children;
t = q[1];
if (! t.mode) {
s = "\n" + WSTM.str.trimL(t.source, true, true);
if (s !== t.source) {
t.fresh(s);
WSTM.mod.lazy = false;
}
}
lead = true;
for (k = 1; k < q.length; k++) {
t = q[k];
if ( typeof t.mode === "number" && // TODO Resolve
! t.mode ) {
s = t.source;
if (lead) {
if (s.charCodeAt(0) !== 10) {
s = "\n" + s;
}
}
m = k;
s = s.replace(refBeg, "$1\n$2")
.replace(refEnd, "$1\n$2")
.replace(refMid, "</ref>\n");
if (refPre.test(s + "\f")) {
s = s + "\n";
}
if (s !== t.source) {
t.fresh(s);
WSTM.mod.lazy = false;
}
lead = false;
}
} // for k
t = q[m];
s = t.source;
if (s.charCodeAt(s.length - 1) !== 10) {
t.fresh(s + "\n");
WSTM.mod.lazy = false;
}
WSTM.hooks.fire("references", p);
}
}
} // for i
}; // .w.elem.references()
WSTM.w.elem.refgroups = function (arglist) {
// Bookkeeping of <references group=>
// Precondition:
// arglist -- tags object
// > .props
// Postcondition:
// Returns refgroup ID, or "><" for global
// Uses:
// >< .w.encountered.refgroups
// .w.tags.furnished()
// .str.trim()
// .errors.found()
// 2012-08-23 PerfektesChaos@de.wikipedia
var r = "><",
s;
if (arglist.props) {
s = WSTM.w.tags.furnished(arglist.props, "group");
if (s) {
s = WSTM.str.trim(s);
if (s.length) {
r = s;
}
}
}
if (WSTM.w.encountered.refgroups) {
if (WSTM.w.encountered.refgroups[r]) {
if (r === "><") {
s = "";
} else {
s = "'" + r + "'";
}
WSTM.errors.found("referencesRepeated", false, s);
} else {
WSTM.w.encountered.refgroups[r] = true;
}
} else {
WSTM.w.encountered.refgroups = { };
WSTM.w.encountered.refgroups[r] = true;
}
return r;
}; // .w.elem.refgroups()
WSTM.w.elem.sortkey = function (adjust) {
// Retrieve key for sorting (currently dewiki only)
// Precondition:
// adjust -- string to be checked or modified
// Postcondition:
// Returns information about sortable string
// false if nothing to do, adjust is fine
// string changes against adjust
// RegExp is not modified
// Uses:
// > .g.wTitle
// .str.sortString()
// 2012-05-03 PerfektesChaos@de.wikipedia
var s = adjust.substr( 0, 1 ),
learn = ( s === WSTM.g.wTitle ),
shift = adjust,
sup = s.toUpperCase(),
sort;
if (s !== sup) {
shift = sup + shift.substr(1);
learn = true;
} // capitalize
sort = WSTM.str.sortString( shift );
if ( sort ) {
shift = sort;
s = shift.substr(0, 1);
sup = s.toUpperCase();
if ( s !== sup ) {
shift = sup + shift.substr(1);
} // capitalize
learn = true;
} // char changed
return ( learn ? shift : false );
}; // .w.elem.sortkey()
WSTM.w.elem.tables.fire = function () {
// Format table syntax attributes
// Postcondition:
// Nodes are modified where suitable.
// Uses:
// .w.tables.format()
// 2013-06-22 PerfektesChaos@de.wikipedia
this.format("(\n)?(:*\\{\\|)(.+)\n", true, "{|");
this.format("(\n\\|-+)([^-\n].+)\n", false, "|-");
this.format("(\n!)([- a-zA-Z]+=[^!|\n]+)\\|", false, "!");
}; // .w.elem.tables.fire()
WSTM.w.elem.tables.format = function ( access, ahead, about ) {
// Format particular table syntax attributes
// Precondition:
// access -- regexp string of table syntax
// ahead -- true: separated bracket for leading line break
// about -- activity information
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .text
// .w.tags.features()
// .w.tags.flush()
// .str.trimR()
// .o.WikiTom().flip()
// .hooks.fire()
// 2023-01-01 PerfektesChaos@de.wikipedia
var got = { i: 0, k: 0 },
j = ( ahead ? 2 : 1 ),
k = j + 1,
target = [ access, 0 ],
located,
m,
n,
props,
set,
shift;
do {
got = WSTM.text.find( target,
got.i,
got.k,
true,
false,
false );
if ( got ) {
if ( ahead ) {
located = ( ! got.i ||
got.r[ 1 ] ); // && ! got.k ????
} else {
located = true;
}
if ( located ) {
set = got.r[ k ]; // r[3]
props = WSTM.w.tags.features( set, about );
if ( props ) {
if ( about === "{|" ) {
// class prettytable
WSTM.hooks.fire( "tablehead", props );
}
shift = WSTM.w.tags.flush( props, false );
if ( shift ) {
shift = WSTM.str.trimR( shift );
if ( about === "{|" &&
shift === " border=\"0\"" ) {
shift = "";
}
} else {
shift = "";
}
} else {
shift = set;
}
if ( shift !== set ) {
m = set.length;
n = got.i + got.r[ 0 ].length - m - 1;
WSTM.text.flip( got.k, n, m, shift );
set = shift;
}
} else {
set = "";
}
got.i += got.r[ j ].length + set.length; // r[2]
}
} while ( got ); // do
}; // .w.elem.tables.format()
WSTM.w.elem.tables.furnish = function () {
// Initialize
// Postcondition:
// Nodes are modified where suitable.
// Uses:
// > .mod.table
// > .text
// < .w.encountered.table
// < .mod.luxury
// 2016-01-30 PerfektesChaos@de.wikipedia
var got;
if (WSTM.mod.table) {
got = WSTM.text.find( [ "(\n)?(:*\\{\\|)(.+)\n", 0 ],
0,
0,
true,
false,
false );
if (got && (! got.i || got.r[1])) {
WSTM.w.encountered.table = true;
WSTM.mod.luxury = true;
}
}
}; // .w.elem.tables.furnish()
WSTM.w.elem.tags = function () {
// Adapt separated textual <tags>...</tags> blocks
// Precondition:
// At least one binary block has been detected before.
// Postcondition:
// Nodes are modified where suitable.
// RegExp was used.
// Uses:
// > .text
// > .children
// > .mode
// > .scope
// > .WikiTom.TagBinary
// > .mod.lock
// > .mod.plain
// .o.WikiTom().getCount()
// .w.template.fire()
// .w.link.fire()
// .o.WikiTom().replace()
// .w.elem.isbn.fire()
// Requires: JavaScript 1.3 charCodeAt()
// 2013-05-12 PerfektesChaos@de.wikipedia
var i,
p,
s;
for (i = WSTM.text.getCount() - 1; i >= 0; i--) {
p = WSTM.text.children[i];
if (p.mode === WSTM.o.WikiTom.TagBinary) {
s = "|" + p.scope + "|";
WSTM.w.template.fire(p, true);
if ("|gallery|".indexOf(s) < 0) {
WSTM.w.link.fire(p, false, WSTM.mod.lock, false);
}
if (WSTM.mod.plain) {
if (WSTM.mod.plain.stm &&
"|gallery|imagemap|".indexOf(s) < 0) {
p.replace(WSTM.mod.plain.stm, false);
}
}
this.isbn.fire(p, false);
/*
if ("|references|".indexOf(s) < 0) {
}
*/
}
} // for i
}; // .w.elem.tags()
}; // .bb.elem()
mw.libs.WikiSyntaxTextMod.bb.elem(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.elem;
//-----------------------------------------------------------------------
( function ( WSTM ) {
"use strict";
var sub = "E",
self = WSTM.w.elem.self,
version = WSTM.w.elem.vsn,
rls;
if ( typeof WSTM.main !== "object" ) {
WSTM.main = { };
}
if ( ! WSTM.main.bb ) {
WSTM.main.bb = { };
}
WSTM.main.bb[ sub ] = { load: true,
vsn: version };
if ( typeof WSTM.main.wait === "function" ) {
// Start on import: callback to waiting ...
WSTM.main.wait( sub, version );
}
if ( typeof mw.loader === "object" &&
typeof mw.hook !== "undefined" ) {
rls = { };
rls[ self ] = "ready";
mw.loader.state( rls );
mw.hook( "WikiSyntaxTextMod/" + sub + ".ready" )
.fire( [ sub, version ] );
}
} ( mw.libs.WikiSyntaxTextMod ) );
// Emacs
// Local Variables:
// coding: iso-8859-1-dos
// fill-column: 80
// End:
/// EOF </nowiki> WikiSyntaxTextMod/dE.js