/// User:PerfektesChaos/js/refNames/core/d.js
/// 2023-05-01 [email protected]
// <ref name="..."> major work
// ResourceLoader: compatible;
// dependencies: user.options,
// mediawiki.API, mediawiki.storage, mediawiki.util
/// Fingerprint: #0#0#
/// License: CC-by-sa/4.0
// Documentation: ]
/// <nowiki>
/* global window: false, unescape: false */
/* jshint forin: false,
bitwise:true, curly:true, eqeqeq:true, latedef:true,
laxbreak:true,
nocomma:true, strict:true, undef:true, unused:true */
( function ( mw, $ ) {
"use strict";
var Version = -1.5,
Signature = "refNames",
THIS = { lapsus: false,
launch: false,
reUscore: false,
show: "<ref>",
sub: "core",
using: [ "mediawiki.api",
"mediawiki.storage" ],
warn: [ "^:?\\d+$",
"^:$",
"^Reference$",
"^auto(?:generated)?\\d*$",
String.fromCharCode( 0x5B,
0x09, // TAB
0x0A, // LF
0x22, // "
0x23, // #
0x25, // %
0x26, // &
0x27, // '
0x3C, // <
0x3E, // >
0x5B, // [
0x5C, // \
0x5D, // ]
0x60, // `
0xA0, // nbsp
0xAD, // shy
0xB4, // ´
0x02C6, // ˆ
0x02DC, // ˜
0x2002, // ensp
0x2003, // emsp
0x2009, // thinsp
0x200A, // HAIRsp
0x200B, // ZEROsp
0x200C, // zwnj
0x200D, // zwj
0x200E, // lrm
0x200F, // rlm
0x2018, // lsquo
0x2019, // rsquo
0x201A, // sbquo
0x201C, // ldquo
0x201D, // rdquo
0x201E, // bdquo
0x202F, // NNBSP
0x2032, // prime
0x2033, // Prime
0x2039, // ‹
0x203A, // ›
0x5D )
],
$widget: false
},
PARSER = { reQuot: false,
reWS: false,
pending: false,
$textarea: false },
SOURCE = { before: [ ".wikibase-entity-usage",
".templatesUsed",
".hiddencats",
".limitreport" ],
locked: true,
pics: { drag: [ "de", "OOjs_UI_icon_trash"
+ "-destructive.svg" ],
drop: [ "9b", "OOjs_UI_icon_trash"
+ "-invert.svg" ],
exch: [ "e9", "OOjs_UI_icon_reload"
+ "-invert.svg" ],
edit: [ "8a", "OOjs_UI_icon_edit-ltr"
+ "-progressive.svg" ],
wait:
},
section: "section",
$box: false,
$editor: false,
$wrapper: false },
VIEW = { };
function failure( apply ) {
// Analyze name syntax
// Precondition:
// apply -- string, to be analyzed
// Postcondition:
// Returns true if undesired
// Uses:
// > THIS.warn
// 2022-07-01 [email protected]
var r = false,
i;
for ( i = 0; i < THIS.warn.length; i++ ) {
if ( THIS.warn.test( apply ) ) {
r = true;
break; // for i
}
} // for i
return r;
} // failure()
function fair( apply ) {
// Decode name
// Precondition:
// apply -- string
// Postcondition:
// Returns decoded string
// Uses:
// >< THIS.reUscore
// 2022-07-01 [email protected]
var r = apply;
if ( r.indexOf( "%" ) >= 0 ) {
try {
r = decodeURIComponent( r );
} catch ( e ) {
r = unescape( r );
}
}
if ( r.indexOf( "_" ) >= 0 ) {
if ( ! THIS.reUscore ) {
THIS.reUscore = new RegExp( "_", "g" );
}
r = r.replace( THIS.reUscore, " " );
}
return r;
} // fair()
function $fault( apply ) {
// Invisible error element
// Postcondition:
// Returns <span> object
// Uses:
// > Signature
// < THIS.lapsus
// 2022-07-01 [email protected]
var $r = $( "<span>" ),
s = Signature;
if ( apply ) {
s = s + " " + apply;
}
$r.addClass( [ "mw-error", "error",
"remindErrorMessages-invisible" ] )
.hide()
.text( s );
THIS.lapsus = true;
return $r;
} // $fault()
function fiat() {
// Portlet request
// Uses:
// > PARSER.$textarea
// > THIS.$widget
// > THIS.selector
// >< SOURCE.section
// VIEW.fire()
// SOURCE.first()
// 2022-08-08 [email protected]
var learn = ( PARSER.$textarea ? true : false );
if ( THIS.$widget ) {
THIS.$widget.empty();
}
if ( learn ) {
SOURCE.section = THIS.selector + SOURCE.section;
} else {
SOURCE.section = false;
}
VIEW.fire();
if ( learn ) {
SOURCE.first( true );
}
} // fiat()
function $file( address, appearance ) {
// Create <img>
// Precondition:
// address -- Array, with image location
// -- string, with 2 hex storage path
// -- string, with signifcant ID
// appearance -- number, with pixel size
// 2022-07-01 [email protected]
var $r = $( "<img>" );
$r.attr( { "src": "https://upload.wikimedia.org/"
+ "wikipedia/commons/thumb/"
+ address.substr( 0, 1 ) + "/"
+ address + "/"
+ address
+ "/" + appearance + "px-"
+ address + ".png" } );
return $r;
} // $file()
function fire( $area ) {
// DOM ready
// Precondition:
// $area -- mw-content-text
// Uses:
// > THIS.launch
// > THIS.serial
// > THIS.show
// >< THIS.warn
// < THIS.$content
// < THIS.$references
// < THIS.ltr
// < PARSER.$textarea
// < THIS.selector
// < THIS.selItem
// < THIS.selProblem
// < THIS.selWarn
// < THIS.$widget
// fiat()
// (fiat)
// 2022-07-01 [email protected]
var dom, i, sel, $btn, $ta;
THIS.$content = $area;
THIS.$references = THIS.$content.find( ".references" );
if ( THIS.$references.length ) {
THIS.ltr = ( $( "html" ).attr( "dir" ) !== "rtl" );
THIS.selector = "gadget-" + Signature.toLowerCase() + "-";
THIS.selItem = THIS.selector + "item";
THIS.selProblem = THIS.selector + "problem";
THIS.selWarn = THIS.selector + "warn";
for ( i = 0; i < THIS.warn.length; i++ ) {
THIS.warn = new RegExp( THIS.warn );
} // for i
$ta = THIS.$content.find( "#wpTextbox1" );
if ( $ta.length === 1 ) {
PARSER.$textarea = $ta;
}
if ( THIS.launch && PARSER.$textarea ) {
fiat();
} else {
sel = THIS.selector + "portlet";
$btn = $( "<span>" );
$btn.addClass( THIS.selItem )
.attr( { "id": sel,
"title": THIS.serial } )
.click( fiat )
.html( THIS.show );
dom = mw.util.addPortletLink( "p-tb",
"#",
THIS.show,
sel,
THIS.serial );
THIS.$widget = $( dom );
if ( dom.nodeName.toLowerCase() !== "li" ) {
THIS.$widget = THIS.$widget.parent();
}
THIS.$widget.empty()
.append( $btn );
}
}
} // fire()
function fired( above ) {
// Initialize on scout request
// Precondition:
// above -- object, with scout details
// mediawiki.util has been loaded
// Uses:
// > Version
// < THIS.doc
// < THIS.serial
// < THIS.launch
// mw.hook()
// (fire)
// 2022-07-01 [email protected]
var i;
if ( typeof above === "object"
&& above ) {
if ( typeof above.doc === "object"
&& above.doc ) {
THIS.doc = above.doc;
}
if ( typeof above.serial === "string"
&& above.serial ) {
THIS.serial = above.serial;
} else {
THIS.serial = "?";
}
if ( typeof above.launch === "boolean"
&& above.launch ) {
THIS.launch = true;
}
THIS.serial = THIS.serial + " / " + Version;
if ( typeof above.warn === "object"
&& above.warn &&
typeof above.warn.length === "number" ) {
for ( i = 0; i < above.warn.length; i++ ) {
THIS.warn.push( above.warn );
} // for i
}
mw.hook( "wikipage.content" ).add( fire );
}
} // fired()
function first() {
// Autorun on loading
// Uses:
// > Signature
// > THIS.sub
// mw.loader.getState()
// mw.loader.state()
// mw.hook()
// (fired)
// 2022-07-01 [email protected]
var signature = "ext.gadget." + Signature + "." + THIS.sub,
rls;
if ( mw.loader.getState( signature ) !== "ready" ) {
rls = { };
rls = "ready";
mw.loader.state( rls );
mw.hook( Signature + "." + THIS.sub ).add( fired );
}
} // first()
function $flag( apply ) {
// Show decorated name item
// Precondition:
// apply -- string, to be displayed
// Postcondition:
// Returns <span> object
// Uses:
// > THIS.selItem
// > THIS.selWarn
// > SOURCE.section
// failure()
// $fault()
// (SOURCE.forward)
// 2022-08-08 [email protected]
var $r = $( "<span>" ),
$swap;
$r.addClass( THIS.selItem )
.text( " " + apply + " " );
if ( failure( apply ) ) {
$r.addClass( THIS.selWarn );
$swap = $r;
$r = $( "<span>" );
$r.append( $fault( apply ) )
.append( $swap );
}
if ( SOURCE.section ) {
$r.click( SOURCE.forward );
}
return $r;
} // $flag()
function flat( all, at, allow ) {
// Retrieve normalized character code
// Precondition:
// all -- string, with entire story
// at -- number, position in all
// allow -- true, if bidi permitted
// Postcondition:
// Returns character code
// 2022-07-01 [email protected]
var r = all.charCodeAt( at );
switch ( r ) {
case 0x0009: // CHARACTER TABULATION
case 0x000A: // LINE FEED
case 0x005F: // _
case 0x00A0: // nbsp
case 0x1680: // OGHAM SPACE MARK
case 0x180E: // MONGOLIAN VOWEL SEPARATOR
case 0x2000: // EN QUAD
case 0x2001: // EM QUAD
case 0x2002: // N-SPACE
case 0x2003: // M-SPACE
case 0x2004: // THREE-PER-EM SPACE
case 0x2005: // FOUR-PER-EM SPACE
case 0x2006: // SIX-PER-EM SPACE
case 0x2007: // FIGURE SPACE
case 0x2008: // PUNCTUATION SPACE
case 0x2009: // thinsp
case 0x200A: // HAIR SPACE (english typography)
case 0x200B: // ZERO WIDTH SPACE
case 0x200C: // zwnj
case 0x200D: // zwj
case 0x2028: // LINE SEPARATOR
case 0x2029: // PARAGRAPH SEPARATOR
case 0x202F: // NARROW NO-BREAK SPACE
case 0x205F: // MEDIUM MATHEMATICAL SPACE
case 0x2060: // WORD JOINER
case 0x2061: // FUNCTION APPLICATION
case 0x2062: // INVISIBLE TIMES
case 0x2063: // INVISIBLE SEPARATOR
case 0x2064: // INVISIBLE PLUS
case 0x3000: // IDEOGRAPHIC SPACE
case 0x303F: // IDEOGRAPHIC HALF FILL SPACE
case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
case 0xE0001: // LANGUAGE TAG
case 0xE0020: // TAG SPACE
r = 0x20;
break;
case 0x200E: // lrm
case 0x200F: // rlm
case 0x202A: // LEFT-TO-RIGHT EMBEDDING
case 0x202B: // RIGHT-TO-LEFT EMBEDDING
case 0x202C: // POP DIRECTIONAL FORMATTING
case 0x202D: // LEFT-TO-RIGHT OVERRIDE
case 0x202E: // RIGHT-TO-LEFT OVERRIDE
if ( ! allow ) {
r = 0x20;
}
break;
} // switch r
return r;
} // flat()
function fruit( all ) {
// Retrieve simplified string
// Precondition:
// all -- string, with entire story
// Postcondition:
// Returns string, with cleaned characters
// 2022-07-01 [email protected]
var k = 0x20,
r = "",
i, m;
for ( i = 0; i < all.length; i++ ) {
m = flat( all, i, true );
if ( m !== 0x20 || m !== k ) {
r = r + String.fromCharCode( m );
k = m;
}
} // for i
return r;
} // fruit()
PARSER.fault = function ( all, at, alert, about ) {
// Communicate error details (browser console)
// Precondition:
// all -- string, with entire story
// at -- number, position in wikitext
// alert -- string, with message
// about -- string, with detail, or not
// Uses:
// > Signature
// >< PARSER.reWS
// 2022-08-25 [email protected]
var i, n, s;
if ( typeof window.console === "object" &&
typeof window.console.warn === "function" ) {
i = -1;
n = 0;
do {
i = all.indexOf( "\n", i + 1 );
n++;
} while ( i >= 0 && i < at );
s = Signature + " #" + at + " @" + n + " " + alert;
if ( about ) {
s = s + " -- " + about;
}
if ( ! PARSER.reWS ) {
PARSER.reWS = new RegExp( "\\s+" );
}
i = at;
while ( all.charCodeAt( i ) !== 0x3C && i >= 0 ) {
i--;
} // while
n = all.indexOf( ">", i + 1 );
if ( n < 0 ) {
n = i + 100;
}
s = s + "\n"
+ all.substring( i, n + 1).replace( PARSER.reWS, " " );
window.console.warn( s );
}
}; // PARSER.fault()
PARSER.feature = function ( all, at, after, about ) {
// Retrieve attribute value
// Precondition:
// all -- string, with entire story
// at -- number, first possible position in all
// after -- number, position of '>' in all
// about -- string, with attribute name
// Postcondition:
// Returns object
// .set -- string, value
// .lock -- boolean, on error
// .more -- number, position after value
// Uses:
// PARSER.first()
// PARSER.fault()
// PARSER.focus()
// flat()
// 2022-08-24 [email protected]
var r = { "set": "",
"lock": false,
"more": after },
i = PARSER.first( all, at, after ),
k = all.charCodeAt( i ),
s;
if ( k === 0x22 || k === 0x27 ) { // " '
s = String.fromCharCode( k );
k = all.indexOf( s, i + 1 );
if ( k < 0 || k > after ) {
r.lock = true;
PARSER.fault( all,
at,
"Unbalanced delimiter",
about + "=" + s );
} else if ( k === i + 1 ) {
r.lock = true;
PARSER.fault( all,
at,
"Missing identifier",
about + "=" + s + s );
} else {
r.set = PARSER.focus( all.substring( i + 1, k ) );
r.more = k + 1;
}
} else if ( k === 0x2F || k === 0x3E ) { // / >
PARSER.fault( all, at, "Identifier missing", about + "=" );
r.lock = true;
} else {
for ( k = i; k <= after; k++ ) {
switch ( flat( all, k ) ) {
case 0x2F: // /
case 0x3E: // >
if ( k === i ) {
r.lock = true;
PARSER.fault( all,
at,
"Missing identifier",
about + "=" );
k = after + 1;
break;
} // fall through
case 0x20:
r.set = all.substring( i, k );
r.more = k;
k = after + 1;
break;
} // switch flat()
} // for k
}
return r;
}; // PARSER.feature()
PARSER.features = function ( all, at, after, alone ) {
// Retrieve <ref> or </references> tag attributes
// Precondition:
// all -- string, with entire story
// at -- number, first possible position in all
// after -- number, position of '>' in all
// alone -- boolean, for </ref>
// Postcondition:
// Returns object with name="", or not
// .name -- string, ID, or not
// .group -- string, ID, or not
// .extends -- string, text, or not
// .content -- string, content until </ref>, or not
// .lone -- boolean, unary (/)
// .next -- number, position of '>' in all
// Uses:
// < PARSER.lock
// PARSER.focus()
// PARSER.fault()
// PARSER.feature()
// PARSER.first()
// 2022-08-24 [email protected]
var i = at,
j, lock, r, s, v;
do {
j = all.indexOf( "=", i );
if ( j < 0 || j > after ) {
break; // while ! r
} else {
s = PARSER.focus( all.substring( i, j ) ).toLowerCase();
switch ( s ) {
case "name":
case "group":
case "extends":
if ( ! r ) {
r = { "name": false,
"group": false,
"extends": false,
"content": false,
"lone": false,
"multi": 0,
"next": after,
"wikitext": false };
}
if ( typeof r === "string" ) {
PARSER.fault( all, at, "Duplicated keyword", s );
lock = true;
} else {
v = PARSER.feature( all, j + 1, after, s );
r = v.set;
lock = v.lock;
i = v.more;
}
break;
default:
PARSER.fault( all, at, "Unknown keyword", s );
lock = true;
} // switch
}
} while ( ! lock );
if ( lock ) {
PARSER.lock = true;
} else if ( r ) {
i = PARSER.first( all, i, after );
if ( all.charCodeAt( i ) === 0x2F ) { // /
r.lone = true;
i = PARSER.first( all, ++i, after );
}
if ( alone || r.lone ) {
i = PARSER.first( all, i, after );
if ( i === after ) {
if ( r && ! r.name && alone ) {
r = false;
}
} else {
PARSER.lock = true;
PARSER.fault( all, i, "Trailing garbage" );
}
}
}
return r;
}; // PARSER.features()
PARSER.fiat = function ( all, at, after, about, adjust ) {
// Replace name="" identifier
// Precondition:
// all -- string, with entire story
// at -- number, position after '<' in all
// after -- number, position of '>' in all
// about -- object
// .group -- string, ID, or not
// .name -- string, ID
// .extends -- string, text, or not
// .lone -- boolean, unary (/)
// .content -- string, until </ref>, or not
// adjust -- object, with name-group to be replaced
// .group -- string, ID, or not
// .shift -- string, replacing ID
// Postcondition:
// Returns about object with modified entries
// .wikitext -- string, modified all
// .next -- number, modified after position
// Uses:
// PARSER.fix()
// 2022-07-01 [email protected]
var p = ,
r = about,
s = "ref",
i, set, sign;
for ( i = 0; i < 3; i++ ) {
sign = p;
set = ( i === 1 ? adjust.shift : about );
if ( set ) {
s = s + " " + sign + "=\"" + PARSER.fix( set ) + "\"";
}
} // for i
if ( about.lone ) {
s = s + " /";
}
r.name = adjust.shift;
r.wikitext = all.substr( 0, at ) + s + all.substr( after );
r.next = r.next + s.length + at - after;
return r;
}; // PARSER.fiat()
PARSER.finalize = function ( array ) {
// Build sorted structures
// Precondition:
// array -- Array, with raw objects of parsing
// Postcondition:
// Returns object
// groups, with Array of group IDs
// grouped, with group IDs assigned to sorted Arrays
// of objects
// 2022-07-01 [email protected]
var grouped = { },
groups = ,
c, e, g, i, k, o, p, s, v;
for ( i = 0; i < array.length; i++ ) {
e = array;
s = e.group;
if ( typeof grouped !== "object" ) {
groups.push( s );
grouped = ;
}
grouped.push( e );
} // for i
groups.sort();
for ( i = 0; i < groups.length; i++ ) {
p = groups;
g = grouped;
c = { };
o = ;
for ( k = 0; k < g.length; k++ ) {
v = g;
s = v.name;
if ( typeof c === "object" ) {
e = c;
e.linked = true;
if ( ! v.lone ) {
e.lone = false;
if ( e.content && v.content ) {
e.multi++;
}
}
c = e;
} else {
c = { name: s,
content: v.content,
lone: v.lone,
linked: v.linked || v.lone,
multi: v.multi };
o.push( s );
}
g = null;
} // for k
o.sort();
for ( k = 0; k < o.length; k++ ) {
o = c ];
} // for k
grouped = o;
c = null;
g = null;
o = null;
} // for i
return { groups: groups,
grouped: grouped };
}; // PARSER.finalize()
PARSER.finish = function ( all, at, alone ) {
// Find </ref> or </references> tag
// Precondition:
// all -- string, with entire story
// at -- number, first possible position in all
// alone -- boolean, for </ref>
// Postcondition:
// Returns Array of < >
// or false
// Uses:
// PARSER.first()
// 2022-07-28 [email protected]
var i = at,
j, kR, kE, kF, n, r, s;
do {
i = all.indexOf( "<", i );
if ( i < 0 ) {
break; // while ! r
} else {
i++;
n = all.indexOf( ">", i );
if ( n < 0 ) {
break; // while ! r
} else if ( n > i + 3 ) {
j = PARSER.first( all, i, n );
if ( n >= j + 3 &&
all.charCodeAt( j ) === 0x2F ) {
j = PARSER.first( all, j, n );
kR = all.charCodeAt( j + 1 );
kE = all.charCodeAt( j + 2 );
kF = all.charCodeAt( j + 3 );
if ( ( kR === 0x52 || kR === 0x72 ) &&
( kE === 0x45 || kE === 0x65 ) &&
( kF === 0x46 || kF === 0x66 ) ) {
if ( alone) {
if ( n === j + 4 ||
n === PARSER.first( all, j + 4, n ) ) {
r = ;
}
} else if ( n >= j + 10 ) {
kE = all.charCodeAt( j + 4 );
if ( kE === 0x45 || kE === 0x65 ) {
s = all.substring( j + 1, j + 11 )
.toLowerCase();
if ( s === "references" ) {
r = ;
}
}
}
}
}
}
}
} while ( ! r );
return r;
}; // PARSER.finish()
PARSER.fire = function ( always, adjust ) {
// Retrieve all <ref> specifications
// Precondition:
// always -- boolean, if text availability does not matter
// adjust -- object, with name-group to be replaced, or not
// Postcondition:
// Returns object, or not
// .groups Array of group names (or false)
// .grouped object, mapping group names to Array
// Each Array will contain objects
// .name -- string, ID
// .extends -- string, text, or false
// .content -- string, until </ref>
// .lone -- boolean, unary (/)
// Uses:
// > PARSER.$textarea
// < PARSER.lock
// PARSER.fired()
// PARSER.finalize()
// 2022-07-01 [email protected]
var e, k, r, s, x;
if ( PARSER.$textarea.attr( "disabled" ) ) {
if ( always ) {
r = PARSER.fired( PARSER.$textarea.val() );
}
} else {
PARSER.lock = false;
s = PARSER.$textarea.val();
if ( adjust ) {
PARSER.$textarea.attr( "disabled", true );
r = PARSER.fired( s );
if ( ! PARSER.lock ) {
x = adjust;
for ( k = 0; k < r.length; k++ ) {
e = r;
if ( e.name === x.name &&
e.group === x.group ) {
x = false;
break; // for k
}
} // for k
if ( x ) {
r = PARSER.fired( s, x, PARSER.$textarea );
}
}
PARSER.$textarea.attr( "disabled", false );
} else {
r = PARSER.fired( s );
}
}
if ( r ) {
r = PARSER.finalize( r );
}
return r;
}; // PARSER.fire()
PARSER.fired = function ( all, adjust, $assign ) {
// Retrieve all <ref> specifications
// Precondition:
// all -- string, with entire story
// adjust -- object, with name-group to be replaced, or not
// $assign -- jquery, to be updated, or not
// Postcondition:
// Returns Array of objects, or not
// .name -- string, ID
// .group -- string, ID, or false
// .extends -- string, text, or false
// .content -- string, until </ref>, or false
// .linked -- boolean, repeated
// .lone -- boolean, unary (/)
// Uses:
// PARSER.front()
// 2022-08-01 [email protected]
var i = 0,
s = all,
e, k, p, r, v;
do {
v = PARSER.front( s, i, adjust );
if ( v ) {
i = v.next;
if ( v.wikitext ) {
s = v.wikitext;
delete v.wikitext;
}
delete v.next;
if ( v.lone ) {
if ( r ) {
for ( k = 0; k < r.length; k++ ) {
e = r;
if ( e.name === v.name &&
e.group === v.group ) {
r.linked = true;
v = false;
break; // for k
}
} // for k
}
if ( v ) {
if ( p ) {
for ( k = 0; k < p.length; k++ ) {
e = p;
if ( e.name === v.name &&
e.group === v.group ) {
p.linked = true;
v = false;
break; // for k
}
} // for k
} else {
p = ;
}
if ( v ) {
v.linked = true;
p.push( v );
}
}
} else if ( r ) {
v.linked = false;
for ( k = 0; k < r.length; k++ ) {
e = r;
if ( e.name === v.name &&
e.group === v.group ) {
if ( v.content &&
e.content === v.content ) {
r.multi++;
}
r.content = e.content || v.content;
if ( r.content ) {
r.lone = false;
}
r.linked = true;
v = false;
break; // for k
}
} // for k
}
if ( v ) {
r = r || ;
r.push( v );
} else {
v = true;
}
}
} while ( v );
if ( $assign ) {
$assign.val( s );
}
if ( p ) {
for ( k = 0; k < p.length; k++ ) {
v = p;
if ( r ) {
for ( i = 0; i < r.length; i++ ) {
e = r;
if ( e === v ) {
v = false;
} else if ( e.name === v.name &&
e.group === v.group ) {
r.linked = true;
if ( e.content &&
e.content === v.content ) {
r.multi++;
}
v = false;
}
} // for i
}
if ( v ) {
r = r || ;
r.push( v );
}
} // for k
}
return r;
}; // PARSER.fired()
PARSER.first = function ( all, at, after ) {
// Find first non-space character
// Precondition:
// all -- string, with entire story
// at -- number, first position in all
// after -- number, beyond position in all
// Postcondition:
// Returns position in all, even after
// Uses:
// flat()
// 2022-07-01 [email protected]
var r = at,
i;
for ( i = at; i <= after; i++ ) {
if ( flat( all, i ) !== 0x20 ) {
r = i;
break; // for i
}
} // for i
return r;
}; // PARSER.first()
PARSER.fix = function ( ask ) {
// Escape " in a string
// Precondition:
// ask -- string
// Postcondition:
// Returns safe string
// Uses:
// >< PARSER.reQuot
// 2022-07-01 [email protected]
var r = ask;
if ( ask.indexOf( "\"" ) >= 0 ) {
if ( ! PARSER.reQuot ) {
PARSER.reQuot = new RegExp( "\"", "g" );
}
r = r.replace( PARSER.reQuot, """ );
}
return r;
}; // PARSER.fix()
PARSER.focus = function ( ask ) {
// Trim a string
// Precondition:
// ask -- string
// Postcondition:
// Returns trimmed string
// Uses:
// PARSER.first()
// flat()
// 2022-07-01 [email protected]
var r = ask.trim(),
n = r.length,
i = PARSER.first( r, 0, n );
if ( i ) {
r = r.substr( i );
}
n = r.length;
if ( n ) {
for ( i = n - 1; i >= 0; i-- ) {
if ( flat( r, i ) === 0x20 ) {
r = r.substr( 0, i );
} else {
break; // for i--
}
} // for i--
}
return r;
}; // PARSER.focus()
PARSER.front = function ( all, at, adjust ) {
// Check opening <ref> tag
// Precondition:
// all -- string, with entire story
// at -- number, first possible position in all
// adjust -- object, with name-group to be replaced, or not
// .group -- string, ID, or not
// .seek -- string, ID to be replaced
// Postcondition:
// Returns object, or not
// .name -- string, ID, or not
// .group -- string, ID, or not
// .extends -- string, text, or not
// .content -- string, content until </ref>, or not
// .lone -- boolean, unary (/)
// .multi -- number, 0
// .next -- number, position of closing '>' in all
// .wikitext -- string, modified all
// Uses:
// >< PARSER.pending
// < PARSER.lock
// PARSER.first()
// flat()
// PARSER.features()
// PARSER.fiat()
// PARSER.frontal()
// 2022-07-28 [email protected]
var i = at,
j, kR, kE, kF, n, r, v;
do {
i = all.indexOf( "<", i );
if ( i < 0 ) {
break; // while ! r
} else {
i++;
n = all.indexOf( ">", i );
if ( n < 0 ) {
break; // while ! r
} else if ( n >= i + 10 ) {
j = PARSER.first( all, i, n );
if ( n >= j + 10 ) {
kR = all.charCodeAt( j );
kE = all.charCodeAt( j + 1 );
kF = all.charCodeAt( j + 2 );
if ( ( kR === 0x52 || kR === 0x72 ) &&
( kE === 0x45 || kE === 0x65 ) &&
( kF === 0x46 || kF === 0x66 ) ) {
if ( flat( all, j + 3 ) === 0x20 ) {
r = PARSER.features( all, j + 4, n, true );
if ( r ) {
if ( ! r.lone ) {
v = PARSER.finish( all, n + 1, true );
if ( v ) {
r.content = all.substring( n + 1,
v )
.trim();
r.next = v + 1;
} else {
PARSER.lock = true;
PARSER.fault( all,
i,
"Missing </ref>" );
}
}
if ( PARSER.pending ) {
if ( r.next < PARSER.pending.max ) {
r.group = PARSER.pending.shared;
} else {
PARSER.pending = false;
}
}
if ( r.name &&
adjust &&
adjust.seek === r.name &&
( ( ! adjust.group && ! r.group ) ||
adjust.group === r.group ) &&
! PARSER.lock ) {
r = PARSER.fiat( all, i, n, r, adjust );
}
}
} else {
kE = all.charCodeAt( j + 3 );
if ( kE === 0x45 || kE === 0x65 ) {
PARSER.frontal( all, j, n );
}
}
}
}
}
}
} while ( ! r );
return r;
}; // PARSER.front()
PARSER.frontal = function ( all, at, after ) {
// Check opening <references group=""> tag
// Precondition:
// all -- string, with entire story
// at -- number, position of "ref" in all
// after -- number, position of ">" in all
// Uses:
// >< PARSER.pending
// < PARSER.lock
// flat()
// PARSER.features()
// PARSER.finish()
// 2022-08-09 [email protected]
var s = all.substring( at, at + 10 ).toLowerCase(),
k, q;
if ( s === "references" ) {
k = flat( all, at + 10 );
if ( k === 0x20 ) {
q = PARSER.features( all, at + 10, after, false );
if ( q && q.group && ! q.lone ) {
PARSER.pending = { shared: q.group };
q = PARSER.finish( all, at + 10, false );
if ( q ) {
PARSER.pending.max = q;
} else {
PARSER.pending.max = all.length;
PARSER.lock = true;
}
}
} else if ( PARSER.pending ) {
PARSER.pending = false;
}
}
}; // PARSER.frontal()
SOURCE.favour = function () {
// Open new browser tab for doc page
// Uses:
// > THIS.doc
// > Signature
// 2022-07-01 [email protected]
if ( typeof THIS.doc === "object"
&& THIS.doc &&
typeof THIS.doc.server === "string"
&& THIS.doc.server &&
typeof THIS.doc.support === "string"
&& THIS.doc.support ) {
window.open( THIS.doc.server + "Special:MyLanguage/"
+ THIS.doc.support,
Signature );
}
}; // SOURCE.favour()
SOURCE.fiat = function () {
// Execute name exchange
// Uses:
// > SOURCE.$doit
// > SOURCE.$wait
// > SOURCE.exec
// > SOURCE.$editor
// > SOURCE.$input
// >< VIEW.offered
// < SOURCE.grouped
// < SOURCE.groups
// PARSER.fire()
// SOURCE.fill()
// SOURCE.focus()
// 2022-07-01 [email protected]
var o;
SOURCE.$doit.hide();
SOURCE.$wait.show();
o = PARSER.fire( false, SOURCE.exec );
if ( o ) {
SOURCE.$editor.hide();
SOURCE.$wait.hide();
SOURCE.groups = o.groups;
SOURCE.grouped = o.grouped;
if ( typeof VIEW.offered === "object" ) {
delete VIEW.offered;
}
SOURCE.fill( false );
} else {
SOURCE.$input.css( { "border-color": "#FF0000" } );
SOURCE.focus();
}
}; // SOURCE.fiat()
SOURCE.field = function () {
// Create edit field
// Uses:
// > THIS.selector
// > THIS.ltr
// > SOURCE.pics.exch
// > SOURCE.pics.wait
// < SOURCE.$editor
// < SOURCE.$input
// < SOURCE.$deny
// < SOURCE.$doit
// < SOURCE.$wait
// < SOURCE.$abort
// < SOURCE.$story
// SOURCE.fresh()
// $file()
// 2022-07-01 [email protected]
var $buttons = $( "<div>" ),
$ruler = $( "<div>" ),
m = 22,
$img;
SOURCE.$editor = $( "<div>" );
SOURCE.$editor.addClass( THIS.selector + "editor" )
.css( { "position": "absolute",
"text-align": ( THIS.ltr ? "left"
: "right" ),
"z-index": "1" } );
SOURCE.$input = $( "<input>" );
SOURCE.$input.addClass( [ THIS.selector + "input",
"noime" ] )
.attr( { "maxlength": "100",
"size": "42",
"type": "text" } )
.css( { "border-color": "transparent",
"border-radius": "2px",
"border-style": "solid",
"border-width": "2px",
"margin-left": ( THIS.ltr ? "0"
: "auto" ),
"margin-right": ( THIS.ltr ? "auto"
: "0" ) } );
SOURCE.fresh();
$img = $file( SOURCE.pics.exch, m );
SOURCE.$deny = $( "<div>" );
SOURCE.$deny.append( $img )
.css( { "background-color": "#808080",
"border-color": "transparent",
"border-radius": "4px",
"border-style": "solid",
"border-width": "2px",
"float": ( THIS.ltr ? "left"
: "right" ) } );
SOURCE.$doit = $( "<div>" );
SOURCE.$doit.addClass( THIS.selector + "button" )
.append( $img.clone() )
.attr( { "lang": "en",
"role": "button",
"title": "exchange!" } )
.css( { // "background-color": "#3366CC",
"border-color": "transparent",
"border-radius": "4px",
"border-style": "solid",
"border-width": "4px",
"cursor": "pointer",
"float": ( THIS.ltr ? "left"
: "right" ) } )
.hide();
$img = $file( SOURCE.pics.wait, m );
SOURCE.$wait = $( "<div>" );
SOURCE.$wait.append( $img )
.attr( { "title": "..." } )
.css( { "border-color": "transparent",
"border-radius": "4px",
"border-style": "solid",
"border-width": "4px",
"float": ( THIS.ltr ? "left"
: "right" ) } )
.hide();
SOURCE.$abort = $( "<div>" );
SOURCE.$abort.addClass( THIS.selector + "abort" )
.attr( { "lang": "en",
"role": "button",
"title": "abort" } )
.css( { "border-color": "transparent",
"border-radius": "4px",
"border-style": "solid",
"border-width": "2px",
"color": "#FFFFFF",
"cursor": "pointer",
"float": ( THIS.ltr ? "right"
: "left" ),
"font-family": "sans-serif",
"font-size": ( m - 4 ) + "px",
"font-weight": "bold",
"min-width": m + "px",
"text-align": "center",
"vertical-align": "middle" } )
.text( "×" );
$buttons.append( SOURCE.$deny )
.append( SOURCE.$doit )
.append( SOURCE.$wait )
.append( SOURCE.$abort )
.css( { "margin-top": "1em",
"width": "100%" } );
$ruler.css( { "clear": "both" } );
SOURCE.$story = $( "<textarea>" );
SOURCE.$story.addClass( THIS.selector + "content" )
.attr( { "readonly": "readonly",
"rows": "5" } )
.css( { "margin-top": "1em",
"max-width": "100%",
"min-width": "100%",
"overflow-y": "auto" } );
SOURCE.$editor.append( SOURCE.$input )
.append( $buttons )
.append( $ruler )
.append( SOURCE.$story );
}; // SOURCE.field()
SOURCE.fill = function ( adjust ) {
// Show list of groups
// Precondition:
// adjust -- boolean, if assembly needs initialization
// Uses:
// > SOURCE.$box
// > SOURCE.locked
// > PARSER.lock
// > SOURCE.grouped
// > VIEW.offered
// > THIS.selItem
// > THIS.selProblem
// > SOURCE.pics.edit
// > SOURCE.pics.drag
// >< SOURCE.groups
// < SOURCE.lock
// fruit()
// $flag()
// $fault()
// $file()
// (SOURCE.further)
// (SOURCE.flip)
// (SOURCE.flopping)
// 2022-07-25 [email protected]
var css = { "display": "inline-block",
"margin-left": "1em",
"margin-right": "1em" },
n = SOURCE.groups.length,
e, group, i, k, o, s, $head, $img, $item, $li, $ul;
if ( ! adjust ) {
SOURCE.$box.empty();
}
if ( ! ( SOURCE.locked || PARSER.lock ) ) {
SOURCE.lock = false;
}
if ( n > 1 ) {
SOURCE.groups.sort();
if ( ! SOURCE.groups ) {
SOURCE.groups.pop();
SOURCE.groups.unshift( false );
}
}
for ( i = 0; i < n; i++ ) {
s = SOURCE.groups;
group = SOURCE.grouped;
for ( k = 0; k < group.length; k++ ) {
e = group;
if ( e.lone ) {
PARSER.lock = true;
}
} // for k
} // for i
for ( i = 0; i < n; i++ ) {
s = SOURCE.groups;
group = SOURCE.grouped;
if ( s ) {
$head = $( "<div>" );
$head.addClass( THIS.selItem )
.text( "<ref group=\"" + s + "\">" );
SOURCE.$box.append( $head );
}
$ul = $( "<ul>" );
for ( k = 0; k < group.length; k++ ) {
e = group;
if ( typeof VIEW.offered === "object" ) {
o = VIEW.offered;
if ( o.lone && o.content ) {
e.content = o.content;
}
} else {
o = false;
}
e.content = fruit( e.content );
$item = $flag( e.name );
$item.attr( { "title": e.content } );
$li = $( "<li>" );
$li.append( $item )
.css( { "position": "relative" } );
if ( e.lone ) {
$li.append( $fault( "<ref />" ) );
$item = $( "<span>" );
$item.addClass( THIS.selProblem )
.css( css )
.html( "<ref />" );
$li.append( $item );
} else if ( e.multi ) {
s = ( e.multi + 1 ) + "×";
$li.append( $fault() );
$item = $( "<span>" );
$item.addClass( THIS.selProblem )
.css( css )
.text( s );
$li.append( $item );
} else if ( o && o.sign ) {
$item.attr( { "role": "link" } )
.click( o.sign, SOURCE.fragment )
.css( { "cursor": "pointer" } );
}
if ( ! PARSER.lock ) {
$img = $file( SOURCE.pics.edit, 16 );
$item = $( "<span>" );
$item.append( $img )
.attr( { "lang": "en",
"role": "button",
"title": "edit" } )
.click( , SOURCE.flip )
.css( css )
.css( { "cursor": "pointer" } );
$li.append( $item );
if ( ! e.linked ) {
$img = $file( SOURCE.pics.drag, 16 );
$item = $( "<span>" );
$item.append( $img )
.attr( { "lang": "en",
"role": "button",
"title": "discard" } )
.click( ,
SOURCE.flopping )
.css( css )
.css( { "cursor": "pointer" } );
$li.append( $item );
}
}
$ul.append( $li );
} // for k
SOURCE.$box.append( $ul );
} // for i
}; // SOURCE.fill()
SOURCE.first = function ( always ) {
// Initialize source evaluation
// Precondition:
// always -- boolean, if text availability does not matter
// mediawiki.util available
// Uses:
// > SOURCE.before
// > THIS.selItem
// > THIS.selector
// > SOURCE.section
// > THIS.show
// < SOURCE.grouped
// < SOURCE.groups
// < SOURCE.$wrapper
// < SOURCE.$head
// < SOURCE.$box
// < SOURCE.locked
// PARSER.fire()
// mw.util.getParamValue()
// SOURCE.fill()
// (SOURCE.favour)
// 2022-08-08 [email protected]
var collection = PARSER.fire( always ),
i, $before, $editform, $head, $header;
if ( collection ) {
SOURCE.grouped = collection.grouped;
SOURCE.groups = collection.groups;
$editform = THIS.$content.find( ".mw-editform" );
for ( i = 0; i < SOURCE.before.length; i++ ) {
$before = $editform.find( SOURCE.before );
if ( $before.length === 1 ) {
SOURCE.$wrapper = $( "<div>" );
$header = $( "<div>" );
$head = $( "<span>" );
$head.addClass( THIS.selItem )
.attr( { "id": SOURCE.section,
"lang": "en",
"role": "link",
"title": "help" } )
.click( SOURCE.favour )
.css( { "cursor": "pointer",
"font-size": "130%" } )
.html( THIS.show );
$header.append( $head );
SOURCE.$box = $( "<div>" );
SOURCE.$wrapper.addClass( THIS.selector + "wrapper" )
.append( $header )
.append( SOURCE.$box );
$before.before( SOURCE.$wrapper );
SOURCE.locked = mw.util.getParamValue( "section" );
SOURCE.fill( true );
break; // for i
}
} // for i
}
}; // SOURCE.first()
SOURCE.flash = function ( about ) {
// Removing requested
// Precondition:
// about -- Event object, with Array .data
// Uses:
// > VIEW.offered
// < SOURCE.lock
// PARSER.fire()
// 2022-07-29 [email protected]
var $li = about.data,
pre = about.data,
group = about.data,
$drag = about.data,
$drop = about.data;
if ( $drop ) {
$drop.remove();
}
if ( PARSER.fire( false,
{ group: group,
seek: pre.name,
shift: false } ) ) {
if ( typeof VIEW.offered === "object" ) {
delete VIEW.offered;
}
pre.name = false;
$li.remove();
} else if ( $drag ) {
$drag.show();
}
SOURCE.lock = false;
}; // SOURCE.flash()
SOURCE.flip = function ( about ) {
// Editing requested
// Precondition:
// about -- Event object, with Array .data
// Uses:
// > SOURCE.$input
// > SOURCE.$story
// > SOURCE.$doit
// > SOURCE.$abort
// >< SOURCE.lock
// >< SOURCE.$editor
// < SOURCE.pre
// < SOURCE.start
// SOURCE.focus()
// SOURCE.field()
// (SOURCE.formal)
// (SOURCE.focus)
// (SOURCE.fresh)
// (SOURCE.fiat)
// (SOURCE.flush)
// 2022-07-01 [email protected]
var $li;
if ( ! SOURCE.lock ) {
SOURCE.lock = true;
$li = about.data;
SOURCE.pre = about.data;
SOURCE.pre.group = about.data;
if ( SOURCE.$editor ) {
SOURCE.$input.attr( { "readonly": null } );
SOURCE.focus();
SOURCE.$editor.show();
} else {
SOURCE.field();
}
SOURCE.start = SOURCE.pre.name;
SOURCE.$input.val( SOURCE.start );
SOURCE.$story.val( SOURCE.pre.content );
$li.append( SOURCE.$editor );
SOURCE.$input.blur( SOURCE.formal )
.focus( SOURCE.focus )
.keyup( SOURCE.fresh )
.mousedown( SOURCE.fresh )
.mouseout( SOURCE.formal )
.focus();
SOURCE.$doit.click( SOURCE.fiat );
SOURCE.$abort.click( SOURCE.flush );
}
}; // SOURCE.flip()
SOURCE.flop = function ( about ) {
// Offer removal
// Precondition:
// about -- Event object, with Array
// Uses:
// > SOURCE.lock
// (SOURCE.flash)
// 2022-07-01 [email protected]
var $drop;
if ( SOURCE.lock ) {
$drop = about;
$drop.click( about, SOURCE.flash )
.css( { "background-color": "#FF0000",
"cursor": "pointer" } );
}
}; // SOURCE.flop()
SOURCE.flopped = function ( about ) {
// Abort removal
// Precondition:
// about -- Event object, with Array .data
// Uses:
// >< SOURCE.lock
// 2022-07-29 [email protected]
var $drag, $drop;
if ( SOURCE.lock ) {
$drag = about.data;
$drop = about.data;
if ( $drop ) {
$drop.remove();
}
if ( $drag ) {
$drag.show();
}
SOURCE.lock = false;
}
}; // SOURCE.flopped()
SOURCE.flopping = function ( about ) {
// Preparing removal
// Precondition:
// about -- Event object, with Array .data
// Uses:
// > SOURCE.pics.drop
// > THIS.selector
// >< SOURCE.lock
// (SOURCE.flop)
// (SOURCE.flopped)
// 2022-07-01 [email protected]
var css, discard, e, s, $drag, $img, $drop, $li;
if ( ! SOURCE.lock ) {
SOURCE.lock = true;
$li = about.data;
e = about.data;
s = about.data;
$drag = about.data;
css = about.data;
$drag.focus()
.hide();
$img = $file( SOURCE.pics.drop, 16 );
$drop = $( "<span>" );
discard = ;
$drop.addClass( THIS.selector + "discard" )
.append( $img )
.attr( { "lang": "en",
"role": "button",
"title": "discard" } )
.css( css )
.css( { "background-color": "#FFB0B0",
"border-color": "transparent",
"border-radius": "2px",
"border-style": "solid",
"border-width": "2px",
"cursor": "none",
"transition": "background-color 2s" } )
.focusout( discard, SOURCE.flopped )
.mouseout( discard, SOURCE.flopped );
$li.append( $drop );
$drop.focus();
window.setTimeout( SOURCE.flop, 1500, discard );
}
}; // SOURCE.flopping()
SOURCE.flush = function () {
// Terminate editing
// Postcondition:
// $editor is invisible, other items ready to edit
// Uses:
// > SOURCE.$editor
// < SOURCE.lock
// 2022-07-01 [email protected]
SOURCE.$editor.detach()
.hide();
SOURCE.lock = false;
}; // SOURCE.flush()
SOURCE.focus = function () {
// Input field got focus
// Uses:
// > SOURCE.$doit
// > SOURCE.$wait
// > SOURCE.$deny
// 2022-07-01 [email protected]
SOURCE.$doit.hide();
SOURCE.$wait.hide();
SOURCE.$deny.show();
}; // SOURCE.focus()
SOURCE.formal = function () {
// Input field lost focus, check data
// Uses:
// > SOURCE.$input
// > SOURCE.start
// > SOURCE.groups
// > SOURCE.grouped
// > SOURCE.pre
// > SOURCE.start
// > SOURCE.$deny
// > SOURCE.$doit
// < SOURCE.exec
// SOURCE.fresh()
// SOURCE.focus()
// 2023-05-01 [email protected]
var s = fruit( PARSER.focus( SOURCE.$input.val() ) ),
group, i, lapsus;
SOURCE.$input.val( s );
if ( s ) {
lapsus = failure( s );
} else {
lapsus = false;
}
if ( s === SOURCE.start ) {
SOURCE.focus();
} else if ( ! lapsus ) {
SOURCE.fresh();
group = SOURCE.grouped;
if ( group ) {
for ( i = 0; i < group.length; i++ ) {
if ( s === group.name ) {
lapsus = true;
break; // for i
}
} // for i
if ( ! lapsus ) {
SOURCE.exec = { group: SOURCE.pre.group,
seek: SOURCE.start,
shift: s };
SOURCE.$deny.hide();
SOURCE.$doit.show();
}
}
}
if ( lapsus ) {
SOURCE.$input.css( { "border-color": "#FF0000" } );
SOURCE.focus();
} else {
SOURCE.fresh();
}
}; // SOURCE.formal()
SOURCE.forward = function () {
// Jump to section
// Uses:
// > SOURCE.section
// 2022-08-08 [email protected]
var url = window.location;
url.hash = "#" + SOURCE.section;
window.location = url;
}; // SOURCE.forward()
SOURCE.fragment = function ( about ) {
// Jump to fragment
// Precondition:
// about -- Event object, with string of fragment
// 2022-07-01 [email protected]
var url = window.location;
url.hash = "#" + about.data;
window.location = url;
}; // SOURCE.fragment()
SOURCE.fresh = function () {
// Input event on field
// Uses:
// > SOURCE.$input
// 2022-07-01 [email protected]
SOURCE.$input.css( { "border-color": "#3366CC" } );
}; // SOURCE.fresh()
VIEW.field = function ( at, apply ) {
// Equip references list item -- $.each()
// Precondition:
// at -- number, with sequence index
// apply -- object, with <li> DOM
// Postcondition:
// Returns true -- continue $.each()
// Uses:
// > VIEW.reNamed
// >< VIEW.offered
// fair()
// $flag()
// 2022-07-01 [email protected]
var $li = $( apply ),
sel = $li.attr( "id" ),
got, s;
if ( sel ) {
got = VIEW.reNamed.exec( sel );
if ( got ) {
s = fair( got );
$li.prepend( $flag( s ) );
if ( typeof VIEW.offered === "object" ) {
VIEW.offered = { lone: false };
} else {
VIEW.offered = {
content: $li.find( ".reference-text" )
.text()
.trim(),
lone: true,
sign: sel
};
}
}
}
return true;
}; // VIEW.field()
VIEW.fill = function ( at, apply ) {
// Equip references list -- $.each()
// Precondition:
// at -- number, with sequence index
// apply -- object, with <ol> DOM
// Postcondition:
// Returns true -- continue $.each()
// Uses:
// (VIEW.field)
// 2022-07-01 [email protected]
var $ol = $( apply );
$ol.children( "li" ).each( VIEW.field );
return true;
}; // VIEW.fill()
VIEW.fire = function () {
// Equip all references lists
// Uses:
// > THIS.$content
// > THIS.lapsus
// < THIS.$references
// < VIEW.reNamed
// < VIEW.offered
// mw.hook()
// (VIEW.fill)
// 2022-07-01 [email protected]
THIS.$references = THIS.$content.find( ".references" );
if ( THIS.$references.length ) {
VIEW.reNamed = new RegExp( "^cite_note-(.+)-\\d+$" );
VIEW.offered = { };
THIS.$references.each( VIEW.fill );
if ( THIS.lapsus ) {
mw.hook( "remindErrorMessages.refresh" )
.fire( THIS.$references );
}
}
}; // VIEW.fire()
first();
}( window.mediaWiki, window.jQuery ) );
// Emacs
// Local Variables:
// coding: utf-8-dos
// fill-column: 80
// End:
/// EOF </nowiki> refNames/core/d.js