User:PerfektesChaos/js/WikiSyntaxTextMod/dU.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/dU. |
/// PerfektesChaos/js/WikiSyntaxTextMod/dU.js
/// 2022-01-30 PerfektesChaos@de.wikipedia
/// Fingerprint: #0#0#
/// @license: CC-by-sa/4.0 GPLv3
/// <nowiki>
// Utilities (non-Wiki) for WikiSyntaxTextMod
/* 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 = { libs: { WikiSyntaxTextMod: { }
},
log: function () {"use strict";}
};
}
( function ( mw ) {
"use strict";
var version = -7.59,
sign = "WikiSyntaxTextMod",
sub = "U",
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.util !== "object" ) {
WSTM.util = { };
}
WSTM.util.vsn = version;
WSTM.util.self = self;
if ( typeof WSTM.bb !== "object" ) {
WSTM.bb = { };
}
if ( typeof WSTM.debugging !== "object" ) {
WSTM.debugging = { };
}
} ( mw ) );
/*
Requires: JavaScript 1.3
(Object.toSource
String.charCodeAt String.fromCharCode String.replace)
*/
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.utilU = function ( WSTM ) {
// General Utilities
// 2021-10-26 PerfektesChaos@de.wikipedia
"use strict";
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 assign
}
}; // .util.fiatObjects()
}
WSTM.util.fiatObjects( WSTM, "debugging", { loud: false } );
WSTM.util.fiatObjects( WSTM, "util",
{ code: { },
date: { },
dnb: { },
gtin: { },
isbn: { },
issn: { },
re: { },
regexp: { },
translate: { }
} );
WSTM.util.isArray = function ( anything ) {
// Is anything an array?
// Precondition:
// anything -- thing to be tested
// Postcondition:
// Returns true, if Array
// 2012-02-01 PerfektesChaos@de.wikipedia
var r = ( anything !== null );
if ( r ) {
r = ( typeof anything === "object" );
if ( r ) {
r = ( anything.constructor.toString().substr( 0, 17 )
.indexOf( "function Array()" ) >= 0 );
}
} // non-null
return r;
}; // .util.isArray()
WSTM.util.isElement = function ( array, access ) {
// Is anything element of an array?
// Precondition:
// array -- Array to be searched; may be empty or false
// access -- thing to be found
// Postcondition:
// Returns true, if access is element of array
// 2016-01-21 PerfektesChaos@de.wikipedia
var r = false,
i;
if ( typeof array === "object"
&& array
&& typeof array.length === "number" ) {
for ( i = 0; i < array.length; i++ ) {
if ( array[ i ] === access ) {
r = true;
break; // for i
}
} // for i
}
return r;
}; // .util.isElement()
WSTM.util.isEscValid = function (attempt) {
// Are bad percent escapings in attempt?
// Precondition:
// attempt -- string with possible percent escapings
// Postcondition:
// Returns string with violating sequence
// false if correct
// Uses:
// >< .util.re.hex2
// 2021-10-26 PerfektesChaos@de.wikipedia
var i = 0,
r = false,
s;
do { // while i >= 0
i = attempt.indexOf( "%", i );
if ( i >= 0 ) {
s = attempt.substr( i + 1, 2 );
if ( s.length === 2 ) {
if ( s === "00" ) {
r = "%00";
break; // while i >= 0
}
if ( typeof WSTM.util.re.hex2 !== "object" ) {
WSTM.util.re.hex2 =
new RegExp( "[0-9A-Fa-f][0-9A-Fa-f]" );
}
if ( WSTM.util.re.hex2.test( s ) ) {
i = i + 2;
} else {
r = "%" + s;
break; // while i >= 0
}
} else {
r = "%" + s;
break; // while i >= 0
}
}
} while ( i >= 0 );
return r;
}; // .util.isEscValid()
WSTM.util.isO_639_1 = function ( ask ) {
// Is string a valid ISO 639-1 language code?
// Precondition:
// ask -- lowercase 2 letter query string
// Postcondition:
// Returns true iff ask is a valid ISO 639-1 language code
// 2016-09-14 PerfektesChaos@de.wikipedia
var s = "|aa|ab|ae|af|ak|am|an|ar|as|av|ay|az"
+ "|ba|be|bg|bh|bi|bm|bn|bo|br|bs"
+ "|ca|ce|ch|co|cr|cs|cu|cv|cy"
+ "|da|de|dv|dz"
+ "|ee|el|en|eo|es|et|eu"
+ "|fa|ff|fi|fj|fo|fr|fy"
+ "|ga|gd|gl|gn|gu|gv"
+ "|ha|he|hi|ho|hr|ht|hu|hy|hz"
+ "|ia|id|ie|ig|ii|ik|io|is|it|iu"
+ "|ja|jv"
+ "|ka|kg|kj|kk|kl|km|kn|ko|kr|ks|ku|kv|kw|ky"
+ "|la|lb|lg|li|ln|lo|lt|lv"
+ "|mg|mh|mi|mk|ml|mn|mr|ms|mt|my"
+ "|na|nb|nd|ne|ng|nl|nn|no|nr|nv"
+ "|oc|oj|om|or|os"
+ "|pa|pi|pl|ps|pt"
+ "|qu"
+ "|rm|rn|ro|ru|rw"
+ "|sa|sc|sd|se|sg|sh|si|sk|sl|sm|sn"
+ "|so|sq|sr|ss|st|su|sv|sw"
+ "|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|ty"
+ "|ug|uk|ur|uz"
+ "|ve|vi|vo"
+ "|wa|wo"
+ "|xh"
+ "|yi|yo"
+ "|za|zh|zu|";
return ( s.indexOf( ask ) > 0 );
}; // .util.isO_639_1()
WSTM.util.isURL = function ( attempt, allow, any ) {
// Is attempt a valid URL?
// Precondition:
// attempt -- string with trimmed URL
// allow -- permit other schemes than http https ftp
// any -- permit invalid www domains
// Postcondition:
// Returns string with error hint
// false if correct
// Uses:
// >< .util.re.whitespace
// < .util.re.nonAlNum2
// < .util.re.all0alpha
// < .util.re.alphaNum
// < .util.re.nonAlNumBeg
// < .util.re.nonAlNumEnd
// < .util.re.urlPort
// < .util.re.urlProtocol
// < .util.re.urlPunycode
// .str.isASCII()
// .lang.fetch()
// 2021-10-26 PerfektesChaos@de.wikipedia
var r = false,
got, i, n, parts, s, scheme;
if ( typeof this.re.whitespace !== "object" ) {
this.re.nonAlNum2 = new RegExp( "[^a-z0-9][^a-z0-9]" );
this.re.all0alpha = new RegExp( "^[^a-z]+$" );
this.re.alphaNum = new RegExp( "[a-z0-9]+" );
this.re.nonAlNumBeg = new RegExp( "^[^a-z0-9]" );
this.re.nonAlNumEnd = new RegExp( "[^a-z0-9]$" );
this.re.whitespace = new RegExp( "\\S\\s+\\S" );
this.re.urlPort = new RegExp( "^(.+):[0-9]+$" );
this.re.urlProtocol = new RegExp( "^(?:(https?|s?ftp):)?" +
"//.",
"i" );
this.re.urlPunycode = new RegExp( "^xn--[a-z0-9]+" +
"(-[a-z0-9]+)?$",
"i" );
}
if ( this.re.whitespace.test( attempt ) ) {
r = "whitespace";
} else if ( allow ) {
// TODO mailto:
} else {
got = this.re.urlProtocol.exec( attempt );
if (got) {
scheme = got[ 1 ];
if (scheme) {
scheme = scheme.toLowerCase();
} else {
scheme = "http";
}
s = attempt.substr( got[ 0 ].length - 1 );
i = s.indexOf( "/" );
if (i > 0) {
s = s.substr( 0, i );
}
} else {
r = "scheme:resource";
}
}
if ( s && s.indexOf( ":" ) > 0
&& "http https ftp".indexOf( scheme ) >= 0 ) {
got = this.re.urlPort.exec( s );
if (got) {
s = got[ 1 ];
} else {
r = "port";
s = false;
}
}
if ( s && ! any ) {
s = s.toLowerCase();
parts = s.split( "." );
n = parts.length;
if ( n > 1 ) {
for ( i = 0; i < n; i++ ) {
s = parts[ i ];
if ( ! this.re.alphaNum.test( s ) ) {
if ( WSTM.str.isASCII( s ) ) {
if ( s.substr( 0, 4 ) === "xn--" ) {
if ( ! this.re.urlPunycode.test( s ) ) {
r = "Punycode: " + s;
}
} else if ( i === n - 1
&& this.re.all0alpha.test( s ) ) {
r = "TLD: ." + s;
} else if ( this.re.nonAlNumBeg.test( s ) ||
this.re.nonAlNumEnd.test( s ) ) {
r = "." + s + ".";
break; // for i
} else if ( this.re.nonAlNum2.test( s ) ) {
r = "." + s + ".";
break; // for i
}
} else if (i === n - 1) {
if ( ! WSTM.lang.fetch( "TLD.IDN" ).test( s ) ) {
r = "TLD (IDN): ." + s;
}
}
}
} // for i
} else {
r = "TLD-";
}
}
return r;
}; // .util.isURL()
WSTM.util.roman2int = function ( attempt ) {
// What does this roman number mean?
// Precondition:
// attempt -- string with trimmed roman number
// Postcondition:
// Returns string with original code or digits
// Uses:
// >< .util.romanDigits
// 2019-08-20 PerfektesChaos@de.wikipedia
var s = attempt.toUpperCase(),
d, i, j, k, l, r;
if ( typeof this.romanDigits !== "object" ) {
this.romanDigits = { "I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000 };
}
for ( i = 0; i < s.length; i++ ) {
k = this.romanDigits[ s.charAt( i ) ];
if ( k ) {
d = d || [ ];
d.push( k );
} else {
d = false;
break; // for i
}
} // for i
if ( d ) {
r = 0;
j = 0;
l = true;
for ( i = d.length - 1; i >= 0; i-- ) {
k = d[ i ];
if ( k > j ) {
r = r + k;
l = true;
} else if ( k < j ) {
r = r - k;
l = false;
} else if ( l ) {
r = r + k;
} else {
r = r - k;
}
j = k;
} // for i--
r = r + "";
}
return r || attempt;
}; // .util.roman2int()
}; // .bb.utilU()
mw.libs.WikiSyntaxTextMod.bb.utilU( mw.libs.WikiSyntaxTextMod );
delete mw.libs.WikiSyntaxTextMod.bb.utilU;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.dating = function ( WSTM ) {
// Date and time analysis, error message
// Public:
// .util.date.fetch()
// .util.date.format()
// 2019-11-29 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "date",
{ domax: [ false, 31, 29, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 ],
units: [ "era",
"year",
"month",
"dom",
"hour",
"minute",
"second",
"msec",
"mysec" ],
words: { doweek: [ "Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday" ],
dow: { n: 3 },
month: [ false,
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December" ],
mon: { n: 3 } },
re: { }
} );
WSTM.util.date.fetch = function ( attempt, ahead, alien ) {
// Retrieve date
// Precondition:
// attempt -- string with presumable date and time
// ahead -- true: future moment permitted
// alien -- string with other language code than en, or false
// Postcondition:
// Returns object of components, or false if not ISO or future
// Uses:
// >< .util.date.re.*
// .lang.l
// .str.trim()
// .util.date.formal()
// 2019-11-29 PerfektesChaos@de.wikipedia
var s = WSTM.str.trim(attempt),
got, o, r;
if ( typeof this.re.yyyy !== "object" ) {
this.re.dd = new RegExp( "^-([0-3]?[0-9])([T ].*)?$" );
this.re.hh = new RegExp( "^([0-2][0-9])(:.*)?$" );
this.re.min = new RegExp( "^:([0-5][0-9])(:.*)?$" );
this.re.mon = new RegExp( "^-([01]?[0-9])(-.+)?$" );
this.re.ss = new RegExp( "^:([0-6][0-9])([. ].*)?$" );
this.re.yyyy = new RegExp( "^([1-9][0-9]*)(-.+)?$" );
}
got = this.re.yyyy.exec( s );
if (got) {
r = { year: parseInt(got[1], 10) };
s = got[2];
if (s) {
got = this.re.mon.exec(s);
if (got) {
r.month = parseInt(got[1], 10);
s = got[2];
if (s) {
got = this.re.dd.exec(s);
if (got) {
r.dom = parseInt(got[1], 10);
s = got[2];
if (s) {
s = s.substr(1);
}
} else {
r = false;
s = false;
}
} else {
r = false;
s = false;
}
} else {
r = false;
}
}
}
if (s) {
got = this.re.hh.exec(s);
if (got) {
if ( ! r) {
r = { };
}
r.hour = parseInt(got[1], 10);
s = got[2];
if (s) {
got = this.re.min.exec(s);
if (got) {
r.minute = parseInt(got[1], 10);
s = got[2];
if (s) {
got = this.re.ss.exec(s);
if (got) {
r.second = parseInt(got[1], 10);
s = got[2];
} else {
r = false;
}
} else {
r = false;
}
} else {
r = false;
}
}
}
}
if ( ! r ) {
o = WSTM.lang.l;
if ( typeof o.en === "object" &&
typeof o.en.date === "object" &&
typeof o.en.date.fetch === "function") {
r = o.en.date.fetch( attempt );
}
if ( ! r &&
typeof o[ alien ] === "object" &&
typeof o[ alien ].date === "object" &&
typeof o[ alien ].date.fetch === "function") {
r = o[ alien ].date.fetch( attempt );
}
}
if ( r ) {
r = this.formal( r, ahead );
}
return ( r || false );
}; // .util.date.fetch()
WSTM.util.date.fiat = function ( attempt ) {
// Equip object of components with JS object
// Precondition:
// attempt -- object of components
// >< .date
// 2015-12-23 PerfektesChaos@de.wikipedia
var ih = 0,
im = 0,
ims = 0,
is = 0;
switch ( typeof attempt.date ) {
case "boolean":
case "object":
break;
default:
if ( typeof attempt.year === "number" &&
typeof attempt.month === "number" &&
typeof attempt.dom === "number" ) {
if ( typeof attempt.hour === "number" ) {
ih = attempt.hour;
if ( typeof attempt.minute === "number" ) {
im = attempt.minute;
if ( typeof attempt.second === "number" ) {
is = attempt.second;
if ( typeof attempt.msec === "number" ) {
ims = attempt.msec;
if ( typeof attempt.mysec === "number" ) {
ims = ims + 0.001 * attempt.mysec;
}
}
}
}
}
attempt.date = new Date( attempt.year,
attempt.month - 1,
attempt.dom - 1,
ih, im, is, ims );
} else {
attempt.date = false;
}
} // switch typeof attempt.date
return attempt.date;
}; // .util.date.fiat()
WSTM.util.date.fill = function ( at, assembly ) {
// Create month name translation map for lang
// Precondition:
// at -- .lang.l.*.date object
// assembly -- object to collect
// Postcondition:
// assembly has been equipped by lang
// Uses:
// >< .util.date.re
// >< .util.date.re.digits
// < .lang.l.*.date.greg12
// 2019-11-29 PerfektesChaos@de.wikipedia
var m, min, r, s;
if ( typeof at.monAbbr === "object" ) {
if ( typeof at.monAbbr.n === "number" ) {
min = at.monAbbr.n;
}
for ( m in at.monAbbr ) {
if ( typeof this.re !== "object" ) {
this.re = { };
}
if ( typeof this.re.digits !== "object" ) {
this.re.digits = new RegExp( "^\\d+$" );
}
if ( typeof m === "number" ||
this.re.digits.test( m ) ) {
s = at.monAbbr[ m ].toLowerCase();
assembly[ s ] = m;
r = true;
}
} // for m in at.monAbbr
}
if ( typeof at.monFull === "object" ) {
for ( m in at.monFull ) {
s = at.monFull[ m ].toLowerCase();
assembly[ s ] = m;
r = true;
if ( min && s.length > min ) {
s = s.substr( 0, min);
assembly[ s ] = m;
}
} // for m in at.monFull
}
return r;
}; // .util.date.fill()
WSTM.util.date.filler = function ( at ) {
// Create month name translation map
// Precondition:
// at -- .lang.l.*.date object
// Postcondition:
// .lang.l.*.date object equipped by component
// Uses:
// this
// > .lang.l.*.date.consider
// < .lang.l.*.date.greg12
// .util.date.fill()
// 2015-11-26 PerfektesChaos@de.wikipedia
var o = { },
live = this.fill( at, o ),
i, l, x;
if ( typeof at.consider === "object" ) {
for ( i = 0; i < at.consider.length; i++ ) {
x = WSTM.lang.l[ at.consider[i] ];
if ( typeof x === "object" &&
typeof x.date === "object" ) {
l = this.fill( x.date, o );
live = ( live || l );
}
} // for i
}
if ( live ) {
at.greg12 = { };
for ( x in o ) {
i = o[ x ];
switch ( typeof i ) {
case "number":
at.greg12[ x ] = i;
break;
case "string":
at.greg12[ x ] = parseInt( i, 10 );
break;
} // switch typeof i
} // for x in o
} else {
at.greg12 = null;
}
}; // .util.date.filler()
WSTM.util.date.find = function ( attempt, at ) {
// Translate month name into month number
// Precondition:
// attempt -- string with presumable month name
// at -- .lang.l.*.date object
// Postcondition:
// Returns month number 1...12, or false
// Uses:
// this
// >< .lang.l.*.date.greg12
// .util.date.filler()
// 2015-11-26 PerfektesChaos@de.wikipedia
var r, s;
if ( typeof at.greg12 !== "object" ) {
this.filler( at );
}
if ( at.greg12 ) {
s = attempt.toLowerCase();
if ( typeof at.greg12[ s ] === "number" ) {
r = at.greg12[ s ];
}
}
return ( r || false );
}; // .util.date.find()
WSTM.util.date.formal = function ( attempt, ahead ) {
// Check validity of datetime components
// Precondition:
// attempt -- object of components, or false
// ahead -- true: future moment permitted
// Postcondition:
// Returns attempt, or false if invalid or unpermitted future
// Uses:
// this
// >< .util.date.current
// .util.date.further()
// .util.date.full()
// 2016-01-04 PerfektesChaos@de.wikipedia
var r = attempt,
j, m, n;
if ( r ) {
if ( typeof r.year === "number" ) {
j = r.year;
this.further( r );
} else {
r.year = false;
}
}
if ( r ) {
if ( typeof r.month === "number" ) {
m = r.month;
if ( m < 1 || m > 12 ) {
r = false;
}
} else {
r.month = false;
}
}
if ( r ) {
if ( typeof r.dom === "number" ) {
n = r.dom;
if ( n > 0 && n <= 31 ) {
if (m) {
if (n > this.full(r)) {
r = false;
}
} else if ( j ) {
r = false;
}
} else {
r = false;
}
} else {
r.dom = false;
}
}
if ( r ) {
if ( typeof r.hour === "number" ) {
if (r.hour < 0 || r.hour > 23) {
r = false;
}
} else {
r.hour = false;
}
}
if ( r ) {
if ( typeof r.minute === "number" ) {
if ( r.minute < 0 || r.minute > 59 ) {
r = false;
}
} else {
r.minute = false;
}
}
if ( r ) {
if ( typeof r.second === "number" ) {
if (r.second < 0 || r.second > 60) {
r = false;
} else {
if ( typeof r.minute === "number" ) {
if (r.second === 60 && r.minute !== 59) {
r = false;
}
} else if ( typeof r.hour === "number" ) {
r = false;
}
}
} else {
r.second = false;
}
}
if ( r && ahead && j && m && n ) {
if ( typeof this.current !== "object" ) {
this.current = new Date();
}
if ( j > this.current.getUTCFullYear() ) {
r = false;
} else if (j === this.current.getUTCFullYear() &&
m > this.current.getUTCMonth()) {
if ( m > this.current.getUTCMonth() + 1 ||
n > this.current.getUTCDate() ) {
r = false;
}
}
}
return ( r || false );
}; // .util.date.formal()
WSTM.util.date.format = function ( attempt, apply ) {
// Format date
// Precondition:
// attempt -- object of components
// apply -- Array with layout description
// number: ISO, maximum permitted components
// string: PHP
// Array: [0] country code
// [1] country subtype (lowercase)
// [2] mode
// [3] number of maximum permitted components
// Postcondition:
// Returns string
// Uses:
// this
// .util.date.formatISO()
// .util.date.formatPHP()
// 2015-12-23 PerfektesChaos@de.wikipedia
var r = "",
f, n, o;
switch ( typeof apply ) {
case "number":
r = this.formatISO( attempt, apply );
break;
case "object":
if ( apply ) {
o = WSTM.lang.l;
if ( typeof o[ apply[ 0 ] ] === "object" ) {
o = o[ apply[ 0 ] ];
if ( apply[ 1 ] &&
typeof o[ apply[ 1 ] ] === "object" &&
typeof o[ apply[ 1 ] ].date === "object" &&
typeof o[ apply[ 1 ] ].date.format
=== "function" ) {
f = o[ apply[ 1 ] ].date.format;
} else if ( typeof o.date === "object" &&
typeof o.date.format === "function" ) {
f = o.date.format;
}
}
if ( typeof apply[ 3 ] === "number" ) {
n = apply[ 3 ];
}
}
break;
case "string":
r = this.formatPHP( attempt, apply );
break;
} // switch typeof apply
if ( f ) {
r = f( attempt, apply [2 ], n );
} else if ( ! r) {
r = this.formatISO( attempt, n );
}
return r;
}; // .util.date.format()
WSTM.util.date.formatISO = function ( attempt, amount ) {
// Format date in ISO (human: space between date and time)
// Precondition:
// attempt -- object of components
// amount -- number of maximum permitted components, else max
// Postcondition:
// Returns string
// Uses:
// this
// > .util.date.units
// >< .util.date.isoFormat
// .str.makeString()
// 2015-12-23 PerfektesChaos@de.wikipedia
var r = "",
i, k, n, o;
if ( attempt.year ) {
r = "" + attempt.year;
n = 4 - r.length;
if ( n ) {
r = WSTM.str.makeString( 48, n ) + r;
}
if ( typeof this.isoFormat !== "object" ) {
this.isoFormat = { month: { n: 10, sep: "-" },
dom: { n: 10, sep: "-" },
hour: { n: 10, sep: " " },
minute: { n: 10, sep: ":" },
second: { n: 10, sep: ":" },
msec: { n: 100, sep: "." },
mysec: { n: 100, sep: "" }
};
}
k = ( typeof amount === "number" ? amount
: this.units.length );
for ( i = 2; i <= k; i++ ) {
o = this.units[ i ];
n = attempt[ o ];
if ( typeof n === "number" ) {
o = this.isoFormat[ o ];
r = r + o.sep;
if ( n < o.n ) {
r = r + "0";
if ( o.n === 100 && n < 10 ) {
r = r + "0";
}
}
r = r + n;
} else {
break; // for i
}
} // for i
}
return r;
}; // .util.date.formatISO()
WSTM.util.date.formatPHP = function (attempt, apply, assign) {
// Format date by PHP specifiers
// Precondition:
// attempt -- object of components
// apply -- string: PHP code like #time:
// assign -- object with localised names
// "month": Array of month names;
// counting from 1 (1=January)
// "mon": Array of abbreviated month names;
// counting from 1 (1=Jan)
// number: length of abbreviation
// "doweek": Array of day of week names;
// counting from 0 (0=Sunday)
// "dow": Array of abbreviated day of week names;
// counting from 0 (0=Sun)
// number: length of abbreviation
// Uses:
// this
// > .util.date.domax
// .str.substrEnd()
// .util.date.furnish()
// .util.date.formatISO()
// .util.date.fiat()
// .util.date.further()
// .util.date.formatPHP() -- self-recursive
// .util.date.full()
// 2017-01-01 PerfektesChaos@de.wikipedia
var r = "",
i, n, o, s, v;
if ( typeof this.phpCodes !== "object" ) {
this.phpCodes = { Y: { s: "year", n: 4 },
y: { s: "year", n: 2, m: 2 },
L: true,
M: { s: "month", o: "mon" },
F: { s: "month", o: "month" },
m: { s: "month", n: 1 },
n: { s: "month", n: 2 },
t: true,
W: true,
z: true,
j: { s: "dom", n: 1 },
d: { s: "dom", n: 2 },
D: true,
l: true,
w: true,
N: true,
G: { s: "hour", n: 1 },
H: { s: "hour", n: 2 },
g: true,
h: true,
a: true,
A: true,
i: { s: "minute", n: 2 },
s: { s: "second", n: 2 },
c: true,
r: true,
U: true,
e: true,
I: true,
O: true,
P: true,
T: true,
Z: true,
'"': true };
}
for ( i = 0; i <= apply.length; i++ ) {
s = apply.substr( i, 1 );
switch ( typeof this.phpCodes[ s ] ) {
case "object":
o = this.phpCodes[ s ];
if ( typeof o.s === "string" ) {
if ( typeof attempt[ o.s ] === "number") {
v = attempt[ o.s ];
if ( typeof o.n === "number" ) {
switch (o.n) {
case 2:
if ( typeof o.m === "number" ) {
if ( v < 100 ) {
if ( v < 10 ) {
v = "0" + v;
}
} else {
v = WSTM.str.substrEnd( "" + v,
2 );
}
} else {
if ( v < 10 ) {
v = "0" + v;
}
}
break;
case 4:
if ( v < 1000 ) {
v = WSTM.str.substrEnd( "000" + v,
4 );
}
break;
} // switch o.n
} else if ( typeof o.o === "string" ) {
v = this.furnish(v, o.o, assign);
}
r = r + v;
}
}
break;
case "boolean":
switch ( s ) {
case '"':
i++;
n = apply.indexOf( '"', i );
if ( n < 0 ) {
r = r + apply.substr( i );
i = apply.length;
} else {
r = r + apply.substring( i, n );
i = n;
}
break;
case "A":
case "a":
if ( typeof attempt.hour === "number" ) {
if ( attempt.hour > 12 ) {
v = "PM";
} else {
v = "AM";
}
if (s === "a") {
v = v.toLowerCase();
}
r = r + v;
}
break;
case "c": // ISO
r = r + this.formatISO( attempt );
break;
case "D":
case "l":
case "N":
case "w":
if ( this.fiat( attempt ) ) {
v = attempt.date.getDay();
switch ( s ) {
case "D":
v = this.furnish( v, "dow", assign );
break;
case "l":
v = this.furnish( v, "doweek", assign );
break;
case "N": // Sunday = 7
if ( ! v ) {
v = 7;
}
break;
case "w": // Sunday = 0
break;
} // switch s
r = r + v;
}
break;
case "e":
case "I":
case "O":
case "P":
case "T":
case "Z":
if ( this.fiat( attempt ) ) {
v = attempt.date.getTimezoneOffset();
switch ( s ) {
case "e":
case "T":
if ( ! v) {
v = "UTC";
break;
} // fall through
case "O":
case "P":
o = (v < 0);
if ( o ) {
v = v * -1;
}
n = v % 60;
v = v - n * 60;
if ( n < 10 ) {
n = "0" + n;
}
if ( v < 10 ) {
v = "0" + v;
}
if ( s === "P" ) {
v = ":" + v;
}
v = n + v;
if ( o ) {
v = "-" + v;
} else {
v = "+" + v;
}
break;
case "I":
v = "0";
break;
case "Z":
v = v * 60;
break;
} // switch s
r = r + v;
}
break;
case "g":
case "h":
if ( typeof attempt.hour === "number" ) {
v = ( attempt.hour > 12 ? attempt.hour - 12
: attempt.hour );
if ( s === "h" && v < 10 ) {
v = "0" + v;
}
r = r + v;
}
break;
case "L": // leap year
r = r + (this.further(attempt) ? "1" : "0" );
break;
case "r": // RFC 2822
r = r + this.formatPHP(attempt,
"D, j M Y H:i:s O");
break;
case "t":
r = r + this.full(attempt);
break;
case "U": // 1970-01-01
if ( this.fiat( attempt ) ) {
r = r + attempt.date.getTime() * 1000;
}
break;
case "W":
case "z":
if ( typeof attempt.month === "number" &&
typeof attempt.dom === "number" ) {
v = attempt.dom - 1;
if ( attempt.month === 2 ) {
v += 31;
}
if ( typeof attempt.year === "number" ) {
if ( attempt.month > 2 ) {
for ( n = attempt.month - 1;
n === 2;
n-- ) {
v += this.domax[ n ];
} // for n--
this.fiat( attempt );
if ( ! attempt.leap) {
v--;
}
}
if ( s === "W" ) { // woy ISO 8601
if ( typeof attempt.jan1 !== "number" ) {
o = new Date( attempt.year, 0, 0 );
attempt.jan1 = o.getDay();
}
if ( attempt.jan1 < 4 ) {
v -= attempt.jan1;
}
v = Math.ceil( ++v / 7 );
// erste Kalenderwoche im Jahr
// Woche mit dem ersten Januar-Donnerstag definiert.
}
r = r + v;
} else if ( s === "z" && attempt.month <= 2 ) {
r = r + v;
}
}
break;
} // switch s
break;
default:
r = r + s;
} // switch typeof phpCodes[ s ]
} // for i
return r;
}; // .util.date.formatPHP()
WSTM.util.date.full = function ( attempt ) {
// Number of days in month
// Precondition:
// attempt -- object of components
// > .month
// > .leap
// Postcondition:
// Returns number, may be zero if no month provided
// Uses:
// this
// > .util.date.domax
// .util.date.further()
// 2016-05-14 PerfektesChaos@de.wikipedia
var r = 0,
m;
if ( typeof attempt.month === "number" ) {
m = attempt.month;
if ( m >= 1 && m <= 12 ) {
r = this.domax[ m ];
if ( m === 2 ) {
this.further( attempt );
if ( ! attempt.leap ) {
r = 28;
}
}
}
}
return r;
}; // .util.date.full()
WSTM.util.date.furnish = function (at, as, assign, again) {
// Retrieve textual representation of date component
// Precondition:
// at -- number
// as -- string with keyword (month, mon, doweek, dow)
// assign -- object with localised names, or not
// "month": Array of month names;
// counting from 1 (1=January)
// "mon": Array of abbreviated month names;
// counting from 1 (1=Jan)
// object else:
// n: length of abbreviation
// suffix: if desired
// "doweek": Array of day of week names;
// counting from 0 (0=Sunday)
// "dow": Array of abbreviated day of week names;
// counting from 0 (0=Sun)
// object else:
// n: length of abbreviation
// suffix: if desired
// again -- true: fallback mode, not again
// Postcondition:
// Returns string
// Uses:
// this
// > .util.date.words
// .util.date.furnish() -- self-recursive
// 2016-03-22 PerfektesChaos@de.wikipedia
var o, r, s;
if ( typeof assign === "object" &&
typeof assign[ as ] === "object" ) {
o = assign[ as ];
if ( typeof o.length === "number" ) {
r = o[ at ];
} else if (as.length === 3 &&
typeof o.n === "number" ) {
s = (as === "mon" ? "month" : "doweek" );
if ( typeof assign[ s ] === "object" &&
typeof assign[ s ][ at ] === "string" ) {
r = assign[ s ][ at ].substr( 0, o.n );
if ( typeof o.suffix === "string" ) {
r = r + o.suffix;
}
}
}
}
if ( ! r ) {
if ( again ) {
r = "<" + at + ">";
} else {
r = this.furnish( at, as, this.words, true );
}
}
return r;
}; // .util.date.furnish()
WSTM.util.date.further = function ( attempt ) {
// Is this a leap year?
// Precondition:
// attempt -- object of components
// > .bc
// > .year
// >< .leap
// Postcondition:
// Returns boolean
// 2018-01-28 PerfektesChaos@de.wikipedia
var r, j;
if ( typeof attempt.leap === "boolean" ) {
r = attempt.leap;
} else {
r = false;
if ( typeof attempt.year === "number" &&
( typeof attempt.bc === "undefined" ||
! attempt.bc ) ) {
j = attempt.year;
if ( j > 0 && j <= 2100 ) {
if ( ! j % 4 &&
( j % 100 || ! j % 400 ) ) {
r = true;
}
}
}
attempt.leap = r;
}
return r;
}; // .util.date.further()
//-----------------------------------------------------------------------
}; // .bb.dating()
mw.libs.WikiSyntaxTextMod.bb.dating( mw.libs.WikiSyntaxTextMod );
delete mw.libs.WikiSyntaxTextMod.bb.dating;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.idcodes = function ( WSTM ) {
// ID code syntax analysis, error message
// Public:
// .util.code.dnb()
// .util.code.doi()
// .util.code.isbn()
// .util.code.issn()
// .util.code.lccn()
// .util.code.pmc()
// .util.code.pmid()
// .util.code.urn()
// .util.code.viaf()
// .util.code.zdb()
// Uses:
// .util.fiatObjects()
// 2020-02-07 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "code",
{ re: { } } );
WSTM.util.code.fetch = function ( attempt, amount, allowX, about ) {
// Retrieve Array with digits
// Precondition:
// attempt -- string with presumable code; digits space hyphens
// amount -- number of maximum permitted digits
// allowX -- number; of (last) position for permitted xX
// boolean; xX at last position permitted
// about -- string with thematic context
// Postcondition:
// Returns Array of digits including 10, or false if invalid
// Uses:
// > .str.sticks
// > .str.spaces
// .errors.found()
// Requires: JavaScript 1.3 charCodeAt() fromCharCode()
// 2016-06-10 PerfektesChaos@de.wikipedia
var k = 0,
n = attempt.length,
r = new Array( amount ),
c,
i;
for ( i = 0; i < n; i++ ) {
c = attempt.charCodeAt( i );
if ( c >= 48 && c <= 57 ) { // 0...9
c -= 48;
if ( k < amount ) {
r[ k ] = c;
} else {
r = false;
WSTM.errors.found( "badCodeDigitcount",
false,
about + ": " + attempt );
break; // for i
}
k++;
} else if ( c === 88 || c === 120 ) { // X x
if ( allowX && i === n - 1 ) {
if ( allowX === true || allowX === k + 1 ) {
r[ k ] = 10;
k++;
} else {
r = false;
}
} else {
r = false;
}
if ( ! r ) {
WSTM.errors.found( "badCodeX",
false,
about + ": " + attempt);
}
break; // for i
} else if ( c !== 32 && c !== 45 ) { // space hyphen
c = String.fromCharCode(c);
if ( WSTM.str.sticks.indexOf( c ) < 0 &&
WSTM.str.spaces.indexOf( c ) < 0 ) {
r = false;
WSTM.errors.found( "badCodeChar",
false,
about + ": " + attempt );
break; // for i
}
}
} // for i
if ( r ) {
if ( k < amount ) {
r.splice( k, amount - k );
}
}
return r;
}; // .util.code.fetch()
WSTM.util.code.dnb = function ( adjust ) {
// Check DNB code
// Precondition:
// adjust -- DNB code (no leading keyword)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// .util.dnb.failure()
// 2013-06-23 PerfektesChaos@de.wikipedia
return WSTM.util.dnb.failure( adjust, "DNB" );
}; // .util.code.dnb()
WSTM.util.code.doi = function ( adjust, allow ) {
// DOI syntax analysis, error message
// Precondition:
// adjust -- identifier (trimmed)
// allow -- permit Wikisyntax characters; else interwiki link
// Postcondition:
// Returns false if valid, or Array with error info [1]
// Uses:
// .util.doi.format()
// 2013-06-27 PerfektesChaos@de.wikipedia
return WSTM.util.doi.format( adjust, allow );
}; // .util.code.doi()
WSTM.util.code.ean = function ( adjust ) {
// Check EAN code
// Precondition:
// adjust -- EAN code (no leading keyword)
// Postcondition:
// Returns false if to be kept, or string if to be corrected
// Uses:
// .util.gtin.format()
// 2013-06-21 PerfektesChaos@de.wikipedia
return WSTM.util.gtin.format( adjust, "EAN" );
}; // .util.code.ean()
WSTM.util.code.gnd = function ( adjust ) {
// Check GND code
// Precondition:
// adjust -- GND code (no leading keyword)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// .util.dnb.failure()
// 2016-06-19 PerfektesChaos@de.wikipedia
return WSTM.util.dnb.failure( adjust, "GND", 8, false );
}; // .util.code.gnd()
WSTM.util.code.gtin = function ( adjust ) {
// Check GTIN code
// Precondition:
// adjust -- GTIN code (no leading keyword)
// Postcondition:
// Returns false if to be kept, or string if to be corrected
// Uses:
// .util.gtin.format()
// 2013-06-21 PerfektesChaos@de.wikipedia
return WSTM.util.gtin.format( adjust, "GTIN" );
}; // .util.code.gtin()
WSTM.util.code.isbn = function ( adjust, accept ) {
// Format ISBN code
// Precondition:
// adjust -- ISBN code (no leading keyword)
// accept -- 10, 13, false or omitted
// Uses:
// .util.isbn.format()
// Postcondition:
// Returns array[2]
// [0] number of characters successfully consumed
// at least 10, some more for hyphens etc.
// [1] string reformatted ISBN:
// insert hyphens etc.
// spaces replaced by hyphens
// x->X
// hyphens inserted
// before checknumber
// at ISBN-13
// false no formatting necessary
// false adjust is invalid sequence
// [1] error code -1,1...12
// 2012-12-22 PerfektesChaos@de.wikipedia
return WSTM.util.isbn.format( adjust,
(accept ? accept : false) );
}; // .util.code.isbn()
WSTM.util.code.issn = function ( adjust ) {
// Format ISSN code
// Precondition:
// adjust -- ISSN code (no leading keyword)
// Postcondition:
// Returns false if to be kept, or string if to be corrected
// Uses:
// .util.issn.format()
// 2013-06-02 PerfektesChaos@de.wikipedia
return WSTM.util.issn.format( adjust );
}; // .util.code.issn()
WSTM.util.code.lang = function ( adjust ) {
// Check ISO 639 code
// Precondition:
// adjust -- lang code
// Postcondition:
// Returns false if valid,
// string if to be adjusted,
// or Array with error info [1]
// Uses:
// >< .util.code.re.baselang
// .str.trim()
// .util.isO_639_1()
// .str.capitalize()
// 2021-10-26 PerfektesChaos@de.wikipedia
var r = WSTM.str.trim( adjust ),
parts = r.split( "-" ),
s;
r = parts[ 0 ].toLowerCase();
switch ( r.length ) {
case 2 :
if ( ! WSTM.util.isO_639_1( r ) ) {
r = false;
}
break;
case 3 :
if ( typeof WSTM.util.code.re.baselang !== "object" ) {
WSTM.util.code.re.baselang = new RegExp( "^[a-z]+$" );
}
if ( ! WSTM.util.code.re.baselang.test( r ) ) {
r = false;
}
break;
default :
r = false;
} // switch r.length
if ( r ) {
if ( parts.length > 1 ) {
if ( parts.length === 2 ) {
s = parts[ 1 ];
if ( typeof WSTM.util.code.re.baselang !== "object" ) {
WSTM.util.code.re.baselang =
new RegExp( "^[a-z]+$" );
}
if ( WSTM.util.code.re.baselang.test( r ) ) {
switch ( s.length ) {
case 2 :
s = s.toUpperCase();
break;
case 4 :
s = WSTM.str.capitalize( s );
break;
default :
s = false;
} // switch s.length
} else {
s = false;
}
if ( s ) {
r = r + "-" + s;
} else {
r = [ adjust, "Invalid; bad subset ID" ];
}
} else {
r = [ adjust, "Invalid; too many hyphens" ];
}
}
if ( r === adjust ) {
r = false;
}
} else {
r = [ adjust, "Invalid; bad ID" ];
}
return r;
}; // .util.code.lang()
WSTM.util.code.lccn = function ( adjust, apply ) {
// Check LCCN code
// Precondition:
// adjust -- LCCN code (no leading keyword)
// apply -- '/' or '-' or false
// Postcondition:
// Returns false if valid,
// string if to be adjusted,
// or Array with error info [1]
// Uses:
// .util.lccn.format()
// 2013-06-27 PerfektesChaos@de.wikipedia
return WSTM.util.lccn.format( adjust, apply );
}; // .util.code.lccn()
WSTM.util.code.pmc = function ( adjust ) {
// Check PMC code
// Precondition:
// adjust -- PMC code (trimmed, no leading keyword)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// >< .util.code.re.pmc
// 2021-10-26 PerfektesChaos@de.wikipedia
if ( typeof WSTM.util.code.re.pmc !== "object" ) {
WSTM.util.code.re.pmc = new RegExp( "^[1-9][0-9]{4,9}$" );
}
return ( ! WSTM.util.code.re.pmc.test( adjust ) );
}; // .util.code.pmc()
WSTM.util.code.pmid = function ( adjust ) {
// Check PMID code
// Precondition:
// adjust -- PMID code (trimmed, no leading keyword)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// >< .util.code.re.pmid
// 2021-10-26 PerfektesChaos@de.wikipedia
if ( typeof WSTM.util.code.re.pmid !== "object" ) {
WSTM.util.code.re.pmid = new RegExp( "^[1-9]([0-9]{1,9})?$" );
}
return ( ! WSTM.util.code.re.pmid.test( adjust ) );
}; // .util.code.pmid()
WSTM.util.code.urn = function ( adjust ) {
// Check URN code
// Precondition:
// adjust -- URN code (URI)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// .util.urn.failure()
// 2013-06-21 PerfektesChaos@de.wikipedia
return WSTM.util.urn.failure( adjust );
}; // .util.code.urn()
WSTM.util.code.viaf = function ( adjust ) {
// Check VIAF code
// Precondition:
// adjust -- VIAF code (trimmed, no leading keyword)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// >< .util.code.re.viaf
// 2021-10-26 PerfektesChaos@de.wikipedia
if ( typeof WSTM.util.code.re.viaf !== "object" ) {
WSTM.util.code.re.viaf = new RegExp( "^[1-9][0-9]{3,13}$" );
}
return ( ! WSTM.util.code.re.viaf.test( adjust ) );
}; // .util.code.viaf()
WSTM.util.code.zdb = function ( adjust ) {
// Check ZDB code
// Precondition:
// adjust -- ZDB code (no leading keyword)
// Postcondition:
// Returns false if valid, or true if invalid
// Uses:
// .util.dnb.failure()
// 2016-06-19 PerfektesChaos@de.wikipedia
return WSTM.util.dnb.failure( adjust, "ZDB", 4, true );
// {{ZDB|94467-1}} {{ZDB|1372-9}}
}; // .util.code.zdb()
}; // .bb.idcodes()
mw.libs.WikiSyntaxTextMod.bb.idcodes( mw.libs.WikiSyntaxTextMod );
delete mw.libs.WikiSyntaxTextMod.bb.idcodes;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.dnb = function (WSTM) {
// DNB family (DNB, GND, ZDB) code syntax analysis
// Public:
// .util.dnb.failure()
// Uses:
// .util.code.fetch()
// .errors.found()
// 2013-06-23 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "dnb" );
WSTM.util.dnb.failure = function ( attempt, about, amount, alt ) {
// Is DNB code invalid?
// Precondition:
// attempt -- DNB code (no leading keyword)
// about -- keyword
// amount -- minimum length of core
// alt -- hyphen required
// Postcondition:
// Returns false if valid, or true/string/number if invalid
// Uses:
// >< .util.re.dnbX
// .util.code.fetch()
// .util.dnb.faith()
// 2021-10-26 PerfektesChaos@de.wikipedia
var j = attempt.indexOf( "/" ),
dnb,
s,
r;
if ( j > 0 ) {
s = attempt.substr( 0, j );
} else {
s = attempt;
}
dnb = WSTM.util.code.fetch( s, 11, true, about );
if ( dnb ) {
j = dnb.length;
if ( amount && j <= amount ) {
r = amount;
}
if ( ! r && typeof alt === "boolean" ) {
if ( attempt.indexOf( "-" ) < 0 ) {
r = alt;
} else {
r = ( ! alt );
}
}
if ( ! r && j <= 8 ) {
if ( typeof WSTM.util.re.dnbX !== "object" ) {
WSTM.util.re.dnbX =
new RegExp( "^[1-9][0-9]{3,6}-[0-9xX]$" );
}
if ( WSTM.util.re.dnbX.test( s ) ) {
r = ( ( 11 - this.faith( dnb ) ) % 11
!== dnb[ j - 1 ] );
j = false;
} else {
r = true;
}
}
if ( ! r && j && ! alt ) {
r = ( this.faith( dnb ) !== dnb[ j - 1 ] );
}
} else {
r = true;
}
return r;
}; // .util.dnb.failure()
WSTM.util.dnb.faith = function ( assert ) {
// Compute DNB family (DNB, GND, ZDB) check digit
// Precondition:
// assert -- Array with digits
// Postcondition:
// Returns 0...9
// 2013-06-23 PerfektesChaos@de.wikipedia
var n = assert.length,
k = n,
r = 0,
i;
n--;
for ( i = 0; i < n; i++ ) {
r = r + k * assert[ i ];
k = k - 1;
} // for i
r = ( 11 - r % 11 ) % 11;
return r;
}; // .util.dnb.faith()
}; // .bb.dnb()
mw.libs.WikiSyntaxTextMod.bb.dnb(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.dnb;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.doi = function (WSTM) {
// DOI syntax analysis, code correction and formatting
// Public:
// .util.doi.format()
// Uses:
// .util.code.fetch()
// .errors.found()
// 2013-06-27 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "doi" );
WSTM.util.doi.failure = function ( attempt ) {
// Is DOI invalid?
// Precondition:
// attempt -- identifier (trimmed)
// Postcondition:
// Returns false if valid,
// string if to be adjusted,
// or Array with error info [1]
// Uses:
// .util.doi.format()
// .str.decodeXML()
// 2013-06-27 PerfektesChaos@de.wikipedia
var r = this.format(attempt, false),
s;
if ( r ) {
s = attempt.replace( /&(#x200[9A-F]|lrm|rlm|zwn?j);/, "" );
if ( s !== attempt ) {
r = s;
}
}
return r;
}; // .util.doi.failure()
WSTM.util.doi.format = function (adjust, allow) {
// DOI syntax analysis, error message
// Precondition:
// adjust -- identifier (trimmed)
// allow -- permit Wikisyntax characters; else interwiki link
// Postcondition:
// Returns false if valid, or Array with error info [1]
// Uses:
// >< .util.doi.re.*
// .str.decodeXML()
// 2017-07-18 PerfektesChaos@de.wikipedia
var r = false,
i, s;
if ( adjust.substr( 0, 3 ) === "10." ) {
s = adjust.substr( 3 );
i = s.indexOf( "/" );
if ( i > 3 ) {
if ( typeof this.re !== "object" ) {
this.re = { };
this.re.org = new RegExp( "^[1-9][0-9]{3,7}$", "" );
this.re.doi = "-0-9/A-Z.a-z()_;,:";
this.re.iw = new RegExp( "^["
+ this.re.doi + "&#]{3,}$",
"" );
this.re.doi = new RegExp( "^" + "[/0-9.A-Za-z(<]"
+ "(?:[" + this.re.doi
+ "<>]+|\\[|\\])+"
+ "[0-9A-Za-z#+)]$",
"" );
}
if ( this.re.org.test( s.substr( 0, i ) ) ) {
s = s.substr( i + 1 );
if ( ! allow ) {
if ( ! this.re.iw.test( s ) ) {
r = "invalid character in ID: " + adjust;
}
}
if ( ! r ) {
s = WSTM.str.decodeXML( s );
if ( ! this.re.doi.test( s ) ) {
r = "bad selector '" + s + "'";
}
}
} else {
r = "bad number '" + s.substr( 0, i ) + "'";
}
} else {
r = "missing '/'";
}
} else {
r = "leading '10.' missing";
}
return ( r ? [ false, r ] : false );
}; // .util.doi.format()
}; // .bb.doi()
mw.libs.WikiSyntaxTextMod.bb.doi(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.doi;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.gtin = function (WSTM) {
// GTIN (EAN) syntax analysis, code correction and formatting
// Public:
// .util.gtin.format()
// Uses:
// .util.fiatObjects()
// .util.code.fetch()
// .errors.found()
// 2013-06-23 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "gtin" );
WSTM.util.gtin.faith = function ( assert ) {
// Compute GTIN check digit
// Precondition:
// assert -- Array with digits
// Postcondition:
// Returns 0...9
// 2013-06-23 PerfektesChaos@de.wikipedia
var lead = true,
r = 0,
i,
k;
for ( i = 0; i < 12; i++ ) {
k = assert[i];
r += k;
if ( lead ) { // odd
lead = false;
} else { // even
r += k + k;
lead = true;
}
} // for i
r = ( 10 - r % 10 ) % 10;
return r;
}; // .util.gtin.faith()
WSTM.util.gtin.fashion = function (acquired) {
// Format GTIN code
// Precondition:
// acquired -- Array with digits
// 2013-06-23 PerfektesChaos@de.wikipedia
var r = "",
i;
for (i = 0; i < 4; i++) {
r = r + String.fromCharCode(acquired[i]+48);
} // for i
r = r + "-";
for (i = 4; i < 12; i++) {
r = r + String.fromCharCode(acquired[i]+48);
} // for i
r = r + "-" + String.fromCharCode(acquired[12]+48);
return r;
}; // .util.gtin.faith()
WSTM.util.gtin.format = function (attempt, about) {
// Format GTIN code
// Precondition:
// attempt -- GTIN code (no leading keyword)
// about -- keyword
// Postcondition:
// Returns false if valid, or string if to be corrected
// Uses:
// .util.code.fetch()
// .util.gtin.faith()
// .str.trim()
// .util.gtin.fashion()
// .errors.found()
// 2013-06-23 PerfektesChaos@de.wikipedia
var r = WSTM.util.code.fetch( attempt, 13, false, "GTIN" );
if ( r ) {
if ( r.length === 13 ) {
if ( this.faith( r ) === r[ 12 ] ) {
if ( attempt.indexOf("-") > 0 ) {
r = WSTM.str.trim( attempt );
if ( r === attempt ) {
r = false;
}
} else {
r = this.fashion(r);
}
} else {
r = false;
WSTM.errors.found( "badCodeCheckdig",
false,
about + ": " + attempt );
}
} else {
r = false;
WSTM.errors.found( "badCodeDigitcount",
false,
about + ": " + attempt );
}
}
return r;
}; // .util.gtin.format()
}; // .bb.gtin()
mw.libs.WikiSyntaxTextMod.bb.gtin(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.gtin;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.isbn = function (WSTM) {
// ISBN syntax analysis, code correction and formatting
// Public:
// .util.isbn.factory()
// .util.isbn.format()
// Uses:
// > .str.sticks
// < .util.isbn.grouping
// .util.fiatObjects()
// .util.gtin.faith()
// .errors.found()
// .str.substrEnd()
// 2016-03-20 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects(WSTM.util, "isbn");
WSTM.util.isbn.grouping = false; // segmentation data
WSTM.util.isbn.factory = function (attribute) {
// Make regexp string for ISBN detection
// Precondition:
// attribute -- URLs are excluded from detection
// Postcondition:
// Returns string for RegExp
// [1] prolog
// preceding non-whitespace
// [2] "ISBN"
// 6 10 14 [3] 10 | 13
// 4 [4] '=' assignment, if any
// 15 [5] I-S-B-N
// 17 [6] epilog
// Uses:
// > .str.sticks
// Requires: JavaScript 1.5 RegExp non-capturing parenthese
// 2013-09-26 PerfektesChaos@de.wikipedia
return "(^|" + (attribute ? "\\W"
: "[ \n]") + ")" + // 1
"(ISBN)" + // 2
"(?:" +
"(?:[" + WSTM.str.sticks + " ]?" +
"(10|13):?" + // 3
")?)" +
" *" +
"(?::? *| | |" +
"(=)" + // 4
")?" +
" *[" + WSTM.str.sticks + "]?" +
"([0-9]" +
"(?:[" + WSTM.str.sticks + " .0-9]| | )+" +
"[0-9X])" + // 5
"([ -.]*[^" + WSTM.str.sticks + ". 0-9X]|\\.? *$)"; // 6
}; // .util.isbn.factory()
WSTM.util.isbn.faith = function ( attempt, amount ) {
// Compute ISBN check digit
// Precondition:
// attempt -- string with digits and hyphens without last digit
// amount -- 10 or 13
// Postcondition:
// Returns 0...9, 40 for X, if attempt is valid; else < 0
// -1 attempt is empty
// -2 illegal char
// -3 invalid length
// Uses:
// .util.gtin.faith()
// 2013-06-23 PerfektesChaos@de.wikipedia
var d = new Array( amount ),
k = 0,
n = attempt.length,
r = -1,
c,
i;
for ( i = 0; i < n; i++ ) {
c = attempt.charCodeAt( i );
if ( c >= 48 && c <= 57 ) {
d[ k ] = c - 48;
k++;
} else if ( c !== 32 && c !== 45 ) { // space hyphen
r = -2;
i = n + 1;
}
} // for i
if ( i === n ) {
if ( amount === 13 ) { // 13
if ( k === 12 ) {
r = WSTM.util.gtin.faith( d );
} else {
r = -3;
}
} else { // 10
if ( k === 9 ) {
k = 0;
for ( i = 0; i < 9; i++ ) {
k += ( i + 1 ) * d[ i ];
} // for i
r = k % 11;
if ( r === 10 ) {
r = 40; // X(88d) - 48
}
} else {
r = -3;
}
}
} // regular
return r;
}; // .util.isbn.faith()
WSTM.util.isbn.fault = function ( alert, about, another ) {
// Manage detected error
// Precondition:
// alert -- identifier of error message
// about -- additional information as found, or false
// plain wikitext; will be HTML-escaped later
// another -- error function other than WSTM built-in
// called with: another(alert, about)
// Postcondition:
// Environment application package has been notified
// Uses:
// .errors.found()
// 2012-10-02 PerfektesChaos@de.wikipedia
if ( typeof another === "function" ) {
another.call( null, alert, about );
} else {
WSTM.errors.found( alert, false, about );
}
}; // .util.isbn.fault()
WSTM.util.isbn.flip = function ( adjust, another ) {
// Find ISBN counterpart: ISBN-10 for ISBN-13, ISBN-13 for ISBN-10
// Precondition:
// adjust -- string, should contain ISBN, may be formatted
// another -- error function other than WSTM built-in
// Postcondition:
// Returns formatted counterpart of adjust, or false
// Uses:
// .util.isbn.format()
// .util.isbn.faith()
// 2013-11-06 PerfektesChaos@de.wikipedia
var g = this.format( adjust, false, another ),
r = false,
n, s;
if ( typeof g[ 0 ] === "number" ) {
s = ( g[ 1 ] ? g[ 1 ] : adjust ).replace( /-/g, "" );
n = s.length;
s = s.substr( 0, n - 1 );
if ( n === 10 ) {
n = 13;
s = "978" + s;
} else {
n = 10;
s = s.substr( 3 );
}
n = this.faith( s, n );
if ( n >= 0 ) {
s = s + ( n === 40 ? "X" : n );
g = this.format( s, false, false );
r = g[ 1 ];
}
}
return r;
}; // .util.isbn.flip()
WSTM.util.isbn.fold = function ( ahead, area, adjust ) {
// Divide ISBN substring, separate publisher and title numbers
// Precondition:
// ahead -- true: bookland 979; false: 978 or none
// area -- numeric group (0, 3, 99999 etc.)
// adjust -- string with publisher and title numbers
// digits and hyphens only
// Postcondition:
// Returns modified area+adjust, or false
// Uses:
// > .util.isbn.grouping
// 2022-01-30 PerfektesChaos@de.wikipedia
var f = this.grouping[ ( ahead ? 1 : 0 ) ],
id = area,
j = adjust.indexOf( "-" ),
r = false,
s = adjust,
d,
g,
i,
n,
k,
m;
if ( j < 0 ) {
j = false;
} else {
if ( ! j ) {
s = adjust.substr( 1 );
j = false;
} else {
s = s.substr( 0, j ) + s.substr( j + 1 );
} // leading hyphen
k = s.indexOf( "-" );
while ( k >= 0 ) {
s = s.substr( 0, k ) + s.substr( k + 1 );
k = s.indexOf( "-" );
j = false;
} // while k
} // one hyphen
if ( f ) {
n = f.length;
for ( i = 0; i < n; i++ ) {
g = f[ i ];
m = g[ 0 ];
if ( m === area ) {
f = false;
break; // for i
}
} // for i
if ( f ) {
s = area + s;
for ( i = 0; i < n; i++ ) {
g = f[ i ];
m = g[ 0 ];
if ( m < 10 ) {
k = 1;
} else if ( m < 100 ) {
k = 2;
} else if ( m < 1000 ) {
k = 3;
} else if ( m < 10000 ) {
k = 4;
} else {
k = 5;
}
if ( m === parseInt( s.substr( 0, k ), 10 ) ) {
id = m;
s = s.substr( k );
f = false;
break; // for i
}
} // for i
}
if ( ! f ) {
n = g.length;
for ( i = 1; i < n; i++ ) {
f = g[ i ]; // certain length
k = parseInt( s.substr( 0, f[ 0 ] ), 10 );
for ( m = 1; m < f.length; m++ ) {
d = f[ m ];
if ( k >= d[ 0 ] && k <= d[ 1 ] ) {
r = d[ 2 ];
n = -1;
break; // for m
} // match
} // for m
} // for i
} // group match
} // bookland
if ( r ) {
if ( j ) {
if ( j === r && id === area ) {
r = false;
} // unchanged
} // one hyphen found
if ( r ) {
g = s.substr( r );
r = id + "-" + s.substr( 0, r );
if ( g ) {
r = r + "-" + g;
}
} // hyphen modified
} // publisher identified
return r;
}; // .util.isbn.fold()
WSTM.util.isbn.format = function (adjust, ask, another) {
// Parse ISBN string, reformat / standardize if necessary
// Precondition:
// adjust -- string, containing possible ISBN
// ask -- 10: require ISBN-10
// 13: require ISBN-13
// false: no type required
// another -- error function other than WSTM built-in
// Postcondition:
// Returns array[2]
// [0] number of characters successfully consumed
// at least 10, some more for hyphens etc.
// [1] string reformatted ISBN:
// insert hyphens etc.
// spaces replaced by hyphens
// x->X
// hyphens inserted
// before checknumber
// at ISBN-13
// false no formatting necessary
// false adjust is invalid sequence
// [1] error code -1,1...12
// Uses:
// > .util.isbn.grouping
// .util.isbn.fault()
// .util.isbn.faith()
// .str.substrEnd()
// .util.isbn.furnish()
// .util.isbn.fold()
// Requires: JavaScript 1.3 charCodeAt() fromCharCode()
// 2022-01-30 PerfektesChaos@de.wikipedia
var chain = false,
i = 0,
impact = 0,
last = false,
lazy = false,
loop = true,
max = ( ask ? ask : 13 ),
n = adjust.length,
naked = 0,
r = [ false, false ],
shift = "",
scope = "",
c,
j,
lead,
lean,
slang,
swap;
// Universelle Error-Funktion impact-Nr.->msgName + s
while ( loop ) {
c = adjust.charCodeAt(i);
lead = ( c >= 48 && c <= 57 );
if ( lead ) {
if ( last ) {
impact = 1; // digit after 'X'
this.fault( "badISBNdigitAfterX",
adjust.substr(0, i + 1),
another );
}
} else {
switch ( c ) {
case 32 : // space
case 46 : // dot
case 173 : // shy
case 8208 : // hyphen
case 8209 : // nb-hyphen
case 8210 : // figure dash
case 8211 : // ndash
case 8212 : // mdash
case 8213 : // horizontal bar
case 8259 : // hyphen bullet
case 8722 : // minus
case 9472 : // box drawings light horizontal
case 38 : // '&'
lazy = true; // fall-through
case 45 : // hyphen
if ( c === 38 ) {
swap = adjust.substr( i, 6 );
if ( swap === " " ||
swap === " " ||
swap === " " ||
swap === " " ) {
i += 5;
} else {
loop = false;
}
}
if ( chain ) {
if ( naked < max ) {
shift = shift + "-";
}
chain = false;
} else if ( naked === max ) {
if ( c === 45 ) {
impact = 2; // hyphen after last digit
this.fault( "badISBNhyphenAfterEnd",
adjust.substr( 0, i + 1 ),
another );
} else if ( ! lazy ) {
loop = false;
}
}
break;
case 88 : // X
case 120 : // x
if ( last ) {
impact = 3; // multiple 'X'
this.fault("badISBNmultipleX",
adjust.substr(0, i + 1),
another);
} else {
last = true;
if (ask) {
lead = (naked === ask - 1);
} else {
lead = (naked === 9);
}
if (lead) {
c = 88;
} else {
impact = 4; // 'X' at bad position
this.fault("badISBNXbadPosition",
adjust.substr(0, i + 1),
another);
}
}
break;
default :
loop = false;
break;
} // switch c
} // no digit
if ( lead ) {
if ( ! impact ) {
if ( naked === max ) {
impact = 5; // too many digits
this.fault( "badISBNtooManyDigits1",
adjust.substr( 0, i + 1 ),
another );
} else {
c = String.fromCharCode( c );
naked++;
shift = shift + c;
scope = scope + c;
chain = true;
} // loop
} // valid
} // lead
if ( impact > 0 ) {
loop = false;
} // invalid
if ( loop ) {
i++;
loop = ( i < n );
} // loop
} // while loop
if ( ! impact ) {
if ( ask ) {
if ( naked !== ask ) {
impact = 6; // too many digits
this.fault( "badISBNtooManyDigits2",
adjust.substr( 0, i + 1 ),
another );
}
} else if ( naked !== 10 && naked !== 13 ) {
impact = 7; // bad number of digits
this.fault("badISBNcountingDigits",
"[" + naked + "] "
+ adjust.substr( 0, i + 1 ),
another);
} // check length
if ( ! impact ) {
if ( naked === 13 ) {
j = shift.indexOf( "-" );
while ( j > 0 && j < 3 ) {
shift = shift.substr( 0, j )
+ shift.substr( j + 1 );
j = shift.indexOf( "-" );
} // while "-"
c = shift.substr( 0, 3 );
if ( c !== "978" && c !== "979" ) {
impact = 8; // bad bookland (EAN) in ISBN-13
this.fault( "badISBN13bookland",
adjust.substr( 0, i + 1 ),
another );
} else if ( shift.substr( 3, 1 ) !== "-" ) {
shift = shift.substr( 0, 3 )
+ "-" + shift.substr( 3 );
}
}
} else if (naked < 5) { // too short
impact = -1;
}
} // basically valid
if ( ! impact ) {
lean = ( naked === 13 );
if ( lean ) {
lead = ( shift.charCodeAt( 2 ) === 57 ); // 97*9*
} else {
lead = false;
}
j = shift.length;
n = j;
j--;
if ( shift.charCodeAt( j ) === 45 ) { // '-'
n--;
j--;
shift = shift.substr( 0, n );
}
c = this.faith( shift.substr( 0, j ), naked );
if ( c < 0 ) {
impact = 8 - c; // invalid checkdigit
switch ( c ) {
case -1 :
shift = "badISBNcheckdigEmpty";
break;
case -2 :
shift = "badISBNcheckdigChar";
break;
case -3 :
shift = "badISBNcheckdigLength";
break;
} // switch faith
this.fault( shift, adjust.substr( 0, i + 1 ), another );
} else if ( c !== shift.charCodeAt( j ) - 48 ) {
impact = 12; // wrong checkdigit
this.fault( "badISBNcheckdigWrong",
adjust.substr(0, i + 1),
another );
}
}
if ( ! impact ) {
c = WSTM.str.substrEnd( shift, 1 );
if ( lean ) {
if ( shift.substr( 3, 1 ) !== "-" ) {
shift = shift.substr( 0, 3 )
+ "-" + shift.substr( 3 );
n++;
}
}
if ( shift.substr( n - 2, 1 ) !== "-" ) {
shift = shift.substr( 0, n - 1 ) + "-" + c;
}
slang = shift.substr( ( lean ? 4 : 0 ) );
slang = slang.substr( 0, slang.length - 2 );
j = slang.indexOf( "-" );
while (j > 0) {
slang = slang.substr(0, j) + slang.substr(j + 1);
j = slang.indexOf("-");
} // while "-"
n = 1;
c = Number( slang.substr( 0, 1 ) );
if ( c === 1 ) {
if ( lead &&
slang.substr( 1, 1 ) === "0" ) { // 979-10 fr
n = 2;
c = 10;
//
}
} else if ( c === 6 ) {
n = -1;
c = false;
} else if ( c >= 8 ) {
n = 2;
c = Number( slang.substr( 0, n ) );
if ( c > 94 ) {
n = 3;
c = Number( slang.substr( 0, n ) );
if ( c > 989 ) {
n = 4;
c = Number( slang.substr( 0, n ) );
if ( c > 9989 ) {
n = 5; // ERROR
c = Number( slang.substr( 0, n ) );
}
}
}
}
if ( n > 0 ) {
swap = slang.substr( n );
if ( lean ) { // bookland
scope = shift.substr( 0, 3 ) + "-";
n += 4;
} else {
scope = "";
}
if ( ! this.grouping ) {
this.furnish();
}
swap = this.fold( lead, c, swap );
if ( swap ) {
shift = scope + swap + WSTM.str.substrEnd(shift, 2);
} else { // not separated
if ( scope + c + "-" !== shift.substr( 0, n ) ) {
if ( shift.charCodeAt( n ) === 45 ) { // '-'
n++;
} // already present
shift = scope + c + "-" + shift.substr( n );
}
}
}
r[ 0 ] = i;
if ( shift !== adjust.substr( 0, i ) ) {
r[ 1 ] = shift;
}
} else {
r[ 1 ] = impact;
} // result
return r;
}; // .util.isbn.format()
WSTM.util.isbn.furnish = function () {
// Define ISBN separation between publisher and title numbers
// Postcondition:
// Global variable was set
// Uses:
// < .util.isbn.grouping
// 2022-01-30 PerfektesChaos@de.wikipedia
this.grouping = [ // Commemorate LISP
[ // 978 or none
[ 0, // en
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 94, 6],
[95, 99, 7] ]
],
[ 1, // en
[2, [ 0, 9, 2],
[10, 39, 3],
[40, 54, 4],
[55, 85, 5] ],
[4, [8600, 8697, 5],
[8698, 9989, 6],
[9990, 9999, 7] ]
],
[ 2, // fr
[2, [ 0, 19, 2],
[20, 34, 3],
[35, 39, 5],
[40, 69, 3],
[70, 83, 4],
[84, 89, 5],
[90, 94, 6],
[95, 99, 7] ]
],
[ 3, // de
[2, [ 0, 0, 2],
[ 5, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 94, 6],
[96, 96, 5],
[97, 98, 7],
[99, 99, 5] ],
[3, [ 34, 36, 4],
[ 37, 39, 5],
[950, 953, 7],
[954, 969, 5] ]
],
[ 4, // ja
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 94, 6],
[95, 99, 7] ]
],
[ 5, // ru/SU
[2, [ 0, 19, 2],
[20, 41, 3],
[45, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 90, 6],
[91, 91, 5],
[92, 92, 4],
[93, 94, 5],
[96, 97, 7],
[98, 98, 5] ],
[3, [420, 420, 3],
[421, 429, 4],
[430, 430, 3],
[431, 439, 4],
[440, 440, 3],
[441, 449, 4],
[990, 990, 7],
[991, 999, 4] ],
[4, [9500, 9500, 7],
[9501, 9599, 4] ]
],
[ 7, // cn
[2, [ 0, 9, 2],
[10, 49, 3],
[50, 79, 4],
[80, 89, 5],
[90, 99, 6] ]
],
[ 80, // cz sk
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 99, 6] ]
],
[ 81, // in
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 99, 6] ]
],
[ 82, // no
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 89, 4],
[90, 98, 5],
[99, 99, 6] ]
],
[ 83, // pl
[2, [ 0, 19, 2],
[20, 59, 3],
[60, 69, 5],
[70, 84, 4],
[90, 99, 6] ]
],
[ 84, // es
[2, [ 0, 14, 2],
[15, 19, 5],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 91, 4],
[93, 94, 6],
[95, 96, 5],
[97, 99, 4] ],
[3, [920, 923, 6],
[924, 929, 5] ]
],
[ 85, // br
[2, [ 0, 19, 2],
[20, 59, 3],
[60, 69, 5],
[70, 84, 4],
[85, 89, 5],
[90, 98, 6],
[98, 99, 5] ]
],
[ 86, // rs me
[2, [ 0, 29, 2],
[30, 59, 3],
[60, 79, 4],
[80, 89, 5],
[90, 99, 6] ]
],
[ 87, // dk
[2, [ 0, 29, 2],
[40, 64, 3],
[70, 79, 4],
[85, 94, 5],
[97, 99, 6] ]
],
[ 88, // it
[2, [ 0, 19, 2],
[20, 59, 3],
[60, 84, 4],
[85, 89, 5],
[90, 94, 6],
[95, 99, 5] ]
],
[ 89, // kr
[2, [ 0, 24, 2],
[25, 54, 3],
[55, 84, 4],
[85, 94, 5],
[95, 99, 6] ]
],
[ 90, // nl
[2, [ 0, 19, 2],
[20, 49, 3],
[50, 69, 4],
[70, 79, 5],
[80, 84, 6],
[85, 89, 4],
[90, 90, 2],
[91, 93, 6],
[94, 94, 2],
[95, 99, 6] ]
],
[ 91, // se
[2, [ 0, 1, 1],
[20, 49, 2],
[50, 64, 3],
[70, 79, 4],
[85, 94, 5],
[97, 99, 6] ]
],
[ 92, // int
[2, [ 0, 5, 1],
[60, 79, 2],
[80, 89, 3],
[90, 94, 4],
[95, 98, 5],
[99, 99, 6] ]
],
// 93 in
[ 94, // nl
[1, [0, 5, 3],
[6, 8, 4],
[9, 9, 5] ]
],
[600, // ir
[2, [ 0, 9, 2],
[10, 49, 3],
[50, 89, 4],
[90, 99, 5] ]
],
[601, // kz
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 79, 4],
[80, 84, 5],
[85, 99, 2] ]
],
[602, // id
[2, [ 0, 19, 2],
[20, 79, 3],
[80, 94, 4],
[95, 99, 5] ]
],
[603, // sa
[2, [ 0, 4, 2],
[50, 79, 3],
[80, 89, 4],
[90, 99, 5] ]
],
[604, // vn
[2, [ 0, 4, 1],
[50, 89, 2],
[90, 97, 3],
[98, 99, 4] ]
],
[605, // tr
[2, [ 0, 9, 2],
[10, 39, 3],
[40, 59, 4],
[60, 89, 5] ]
],
[950, // ar
[2, [ 0, 49, 2],
[50, 89, 3],
[90, 98, 4],
[99, 99, 5] ]
],
[951, // fi
[2, [ 0, 1, 1],
[20, 54, 2],
[55, 88, 3],
[89, 94, 4],
[95, 99, 5] ]
],
[952, // fi
[2, [ 0, 19, 2],
[20, 49, 3],
[50, 59, 4],
[60, 65, 2],
[66, 66, 4],
[67, 69, 5],
[70, 79, 4],
[80, 94, 2],
[95, 98, 4],
[99, 99, 5] ]
],
[953, // hr
[2, [ 0, 0, 1],
[10, 14, 2],
[15, 54, 3],
[55, 59, 5],
[60, 94, 4],
[95, 99, 5] ]
],
[954, // bg
[2, [ 0, 20, 2],
[30, 79, 3],
[80, 89, 4],
[90, 92, 5],
[93, 99, 4] ]
],
[955, // lk
[2, [ 0, 0, 1],
[10, 19, 4],
[20, 54, 2],
[55, 79, 3],
[80, 94, 4],
[95, 99, 5] ]
],
[956, // cl
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 99, 4] ]
],
[957, // tw
[2, [ 0, 2, 2],
[ 3, 4, 4],
[ 5, 19, 2],
[20, 20, 4],
[21, 27, 2],
[28, 30, 5],
[31, 43, 2],
[44, 81, 3],
[82, 96, 4],
[97, 99, 5] ]
],
[958, // co
[2, [ 0, 59, 2],
[60, 79, 3],
[80, 94, 4],
[95, 99, 5] ]
],
[959, // cu
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4] ]
],
[960, // gr
[2, [ 0, 19, 2],
[20, 65, 3],
[66, 68, 4],
[69, 69, 3],
[70, 84, 4],
[85, 92, 5],
[93, 93, 2],
[94, 97, 4],
[98, 99, 5] ]
],
[961, // si
[2, [ 0, 19, 2],
[20, 59, 3],
[60, 89, 4],
[90, 99, 5] ]
],
[962, // hk
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 86, 5],
[87, 89, 4],
[90, 99, 3] ]
],
[963, // hu
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 89, 5],
[90, 99, 4] ]
],
[964, // ir
[2, [ 0, 14, 2],
[15, 24, 3],
[25, 29, 4],
[30, 54, 3],
[55, 89, 4],
[90, 96, 5],
[97, 98, 3],
[99, 99, 4] ]
],
[965, // il
[2, [ 0, 19, 2],
[20, 59, 3],
[70, 79, 4],
[90, 99, 5] ]
],
[966, // ua
[2, [ 0, 19, 2],
[20, 29, 4],
[30, 69, 3],
[70, 89, 4],
[90, 99, 5] ]
],
[967, // my
[2, [ 0, 29, 2],
[30, 49, 3],
[50, 59, 4],
[60, 89, 2],
[90, 98, 4] ],
[3, [990, 989, 4],
[999, 999, 5] ]
],
[968, // mx
[2, [ 0, 39, 2],
[40, 49, 3],
[50, 79, 4],
[80, 89, 5],
[90, 99, 4] ]
],
[969, // pk
[2, [ 0, 1, 1],
[20, 39, 2],
[40, 79, 3],
[80, 99, 4] ]
],
[970, // mx
[2, [ 0, 59, 2],
[60, 89, 3],
[90, 90, 4],
[91, 96, 5],
[97, 99, 4] ]
],
[971, // ph
[2, [ 0, 1, 3],
[ 2, 2, 2],
[ 3, 5, 4],
[ 6, 49, 2],
[50, 84, 3],
[85, 90, 4],
[91, 99, 5] ]
],
[972, // pt
[2, [ 0, 1, 1],
[20, 54, 2],
[55, 79, 3],
[80, 94, 4],
[95, 99, 5] ]
],
[973, // ro
[2, [ 0, 0, 1],
[10, 16, 3],
[17, 19, 4],
[20, 54, 2],
[55, 75, 3],
[76, 84, 4],
[85, 88, 5],
[89, 94, 4],
[95, 99, 5] ]
],
[974, // th
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 84, 4],
[85, 94, 5],
[95, 99, 4] ]
],
[975, // tr
[2, [ 0, 0, 5],
[ 1, 24, 2],
[25, 59, 3],
[60, 91, 4],
[92, 98, 5],
[99, 99, 3] ]
],
[976, // Caribbean Community
[2, [ 0, 30, 1],
[40, 59, 2],
[60, 79, 3],
[80, 94, 4],
[95, 99, 5] ]
],
[977, // eg
[2, [ 0, 19, 2],
[20, 49, 3],
[50, 69, 4],
[70, 99, 3] ]
],
[978, // ng
[2, [ 0, 19, 3],
[20, 29, 4],
[30, 79, 5],
[80, 89, 4],
[90, 99, 3] ]
],
[979, // id
[2, [ 0, 9, 3],
[10, 14, 4],
[15, 19, 5],
[20, 29, 2],
[30, 39, 4],
[40, 79, 4],
[95, 99, 5] ]
],
[980, // ve
[2, [ 0, 19, 2],
[20, 59, 3],
[60, 99, 4] ]
],
[981, // sg
[2, [ 0, 19, 2],
[20, 29, 3],
[30, 99, 4] ]
],
[982, // South Pacific
[2, [ 0, 9, 2],
[10, 69, 3],
[70, 89, 2],
[90, 99, 4] ]
],
[983, // my
[2, [ 0, 1, 2],
[ 2, 19, 3],
[20, 39, 4],
[40, 44, 5],
[45, 79, 2],
[80, 89, 3],
[90, 98, 4],
[99, 99, 5] ]
],
[984, // bd
[2, [ 0, 39, 2],
[40, 79, 3],
[80, 89, 4],
[90, 99, 5] ]
],
[985, // by
[2, [ 0, 39, 2],
[40, 59, 3],
[60, 89, 4],
[90, 99, 5] ]
],
[986, // tw
[2, [ 0, 11, 2],
[12, 55, 3],
[56, 79, 4],
[80, 99, 5] ]
],
[987, // ar
[2, [ 0, 9, 2],
[10, 19, 4],
[20, 29, 5],
[30, 49, 2],
[50, 89, 3],
[90, 94, 4],
[95, 99, 5] ]
],
[988, // hk
[2, [ 0, 16, 2],
[17, 19, 5],
[20, 79, 3],
[80, 96, 4],
[97, 99, 5] ]
],
[989, // pt
[2, [ 0, 19, 1],
[20, 54, 2],
[55, 79, 3],
[80, 94, 4],
[95, 99, 5] ]
],
[9937, // np
[2, [ 0, 29, 1],
[30, 49, 2],
[50, 79, 3],
[80, 99, 4] ]
],
[9938, // tn
[2, [ 0, 79, 2],
[80, 94, 3],
[95, 99, 4] ]
],
[9939, // am
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 89, 3],
[90, 99, 4] ]
],
[9940, // me
[2, [ 0, 19, 1],
[20, 49, 2],
[50, 89, 3],
[90, 99, 4] ]
],
[9941, // ge
[2, [ 0, 9, 1],
[10, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9942, // ec
[3, [ 0, 899, 2],
[900, 994, 3],
[995, 999, 4] ]
],
[9943, // uz
[2, [ 0, 29, 2],
[30, 39, 3],
[40, 99, 4] ]
],
[9944, // tr
[2, [ 0, 29, 2],
[30, 49, 3],
[50, 59, 4],
[60, 89, 2],
[90, 99, 3] ]
],
[9945, // do
[2, [ 0, 0, 2],
[ 1, 7, 3],
[ 8, 39, 2],
[40, 56, 3],
[57, 57, 2],
[58, 84, 3],
[85, 99, 4] ]
],
[9946, // kp
[2, [ 0, 19, 1],
[20, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9947, // dz
[2, [ 0, 19, 1],
[20, 79, 2],
[80, 99, 3] ]
],
[9948, // ae
[2, [ 0, 39, 2],
[40, 84, 3],
[85, 99, 4] ]
],
[9949, // ee
[2, [ 0, 9, 1],
[10, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9950, // ps
[2, [ 0, 29, 2],
[30, 84, 3],
[85, 99, 4] ]
],
[9951, // Kosova
[2, [ 0, 29, 2],
[30, 84, 3],
[85, 99, 4] ]
],
[9952, // az
[2, [ 0, 19, 1],
[20, 39, 2],
[40, 79, 3],
[80, 99, 4] ]
],
[9953, // lb
[2, [ 0, 9, 1],
[10, 39, 2],
[40, 59, 3],
[60, 89, 2],
[90, 99, 4] ]
],
[9954, // ma
[2, [ 0, 19, 1],
[20, 39, 2],
[40, 79, 3],
[80, 99, 4] ]
],
[9955, // lt
[2, [ 0, 39, 2],
[40, 92, 3],
[93, 99, 4] ]
],
[9956, // cm
[2, [ 0, 9, 1],
[10, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9957, // jo
[2, [ 0, 39, 2],
[40, 69, 3],
[70, 84, 2],
[85, 99, 4] ]
],
[9958, // ba
[2, [ 0, 9, 1],
[10, 49, 2],
[50, 89, 3],
[90, 99, 4] ]
],
[9959, // ly
[2, [ 0, 19, 1],
[20, 79, 2],
[80, 94, 3],
[95, 99, 4] ]
],
[9960, // sa
[2, [ 0, 59, 2],
[60, 89, 3],
[90, 99, 4] ]
],
[9961, // dz
[2, [ 0, 29, 1],
[30, 69, 2],
[70, 94, 3],
[95, 99, 4] ]
],
[9962, // pa
[2, [ 0, 54, 2],
[55, 55, 4],
[56, 59, 2],
[60, 84, 3],
[85, 99, 4] ]
],
[9963, // cy
[2, [ 0, 29, 1],
[30, 54, 2],
[55, 74, 3],
[75, 99, 4] ]
],
[9964, // gh
[2, [ 0, 69, 2],
[70, 94, 3],
[95, 99, 4] ]
],
[9965, // kz
[2, [ 0, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9966, // ke
[2, [ 0, 69, 2],
[70, 74, 4],
[75, 95, 3],
[96, 99, 4] ]
],
[9967, // kg
[2, [ 0, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9968, // cr
[2, [ 0, 49, 2],
[50, 93, 3],
[94, 99, 4] ]
],
[9970, // ug
[2, [ 0, 39, 2],
[40, 89, 3],
[90, 99, 4] ]
],
[9971, // sg
[2, [ 0, 59, 1],
[60, 89, 2],
[90, 98, 3],
[99, 99, 4] ]
],
[9972, // pe
[2, [ 0, 9, 2],
[10, 19, 1],
[20, 24, 3],
[25, 29, 4],
[30, 59, 2],
[60, 89, 3],
[90, 99, 4] ]
],
[9973, // tn
[2, [ 0, 5, 2],
[ 6, 8, 3],
[ 9, 9, 4],
[10, 69, 2],
[70, 96, 3],
[97, 99, 4] ]
],
[9974, // ug
[2, [ 0, 29, 1],
[30, 54, 2],
[55, 74, 3],
[75, 94, 4],
[95, 99, 2] ]
],
[9975, // md
[2, [ 0, 0, 1],
[10, 39, 3],
[40, 44, 4],
[45, 89, 2],
[90, 94, 3],
[95, 99, 4] ]
],
[9976, // tz
[2, [ 0, 50, 1],
[60, 89, 2],
[90, 98, 3],
[99, 99, 4] ]
],
[9977, // cr
[2, [ 0, 89, 2],
[90, 98, 3],
[99, 99, 4] ]
],
[9978, // ec
[2, [ 0, 29, 2],
[30, 39, 3],
[40, 94, 2],
[95, 98, 3],
[99, 99, 4] ]
],
[9979, // is
[2, [ 0, 49, 1],
[50, 64, 2],
[65, 65, 3],
[66, 75, 2],
[76, 89, 3],
[90, 99, 4] ]
],
[9980, // pg
[2, [ 0, 30, 1],
[40, 89, 2],
[90, 98, 3],
[90, 99, 4] ]
],
[9981, // ma
[2, [ 0, 9, 2],
[10, 15, 3],
[16, 19, 2],
[20, 79, 2],
[80, 94, 3],
[95, 99, 4] ]
],
[9982, // zm
[2, [ 0, 79, 2],
[80, 98, 3],
[99, 99, 4] ]
],
[9983, // gm
[2, [80, 94, 2],
[95, 98, 3],
[99, 99, 4] ]
],
[9984, // lv
[2, [ 0, 49, 2],
[50, 79, 3],
[90, 99, 4] ]
],
[9985, // ee
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 89, 3],
[90, 99, 4] ]
],
[9986, // lt
[2, [ 0, 39, 2],
[40, 89, 3],
[90, 93, 4],
[94, 96, 3],
[97, 99, 2] ]
],
[9987, // tz
[2, [ 0, 39, 2],
[40, 87, 3],
[88, 99, 4] ]
],
[9988, // gh
[2, [ 0, 29, 1],
[30, 54, 2],
[55, 74, 3],
[75, 99, 4] ]
],
[9989, // mk
[2, [ 0, 0, 1],
[10, 19, 3],
[20, 29, 4],
[60, 94, 3],
[95, 99, 4] ]
],
[99901, // bh
[2, [ 0, 49, 2],
[50, 79, 3],
[80, 99, 2] ]
],
// 99902, // ga no ranges fixed yet
[99903, // mu
[2, [ 0, 19, 1],
[20, 89, 2],
[90, 99, 3] ]
],
[99904, // an
[2, [ 0, 59, 1],
[60, 89, 2],
[90, 99, 3] ]
],
[99905, // bo
[2, [ 0, 39, 1],
[40, 79, 2],
[80, 99, 3] ]
],
[99906, // kw
[2, [ 0, 29, 1],
[30, 59, 2],
[60, 69, 2],
[70, 89, 2],
[90, 99, 1] ]
],
[99908, // mw
[2, [ 0, 0, 1],
[10, 89, 2],
[90, 99, 3] ]
],
[99909, // mt
[2, [ 0, 39, 1],
[40, 94, 2],
[95, 99, 3] ]
],
[99910, // sl
[2, [ 0, 29, 1],
[30, 89, 2],
[90, 99, 3] ]
],
[99911, // ls
[2, [ 0, 59, 2],
[60, 99, 3] ]
],
[99912, // bw
[2, [ 0, 39, 1],
[40, 59, 3],
[60, 89, 2],
[90, 99, 3] ]
],
[99913, // ad
[3, [ 0, 299, 1],
[439, 350, 2],
[600, 604, 3] ]
],
[99914, // sr
[2, [ 0, 49, 1],
[50, 89, 2],
[90, 94, 3] ]
],
[99915, // mv
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99916, // na
[2, [ 0, 29, 1],
[30, 69, 2],
[70, 99, 3] ]
],
[99917, // bn
[2, [ 0, 29, 1],
[30, 89, 2],
[90, 99, 3] ]
],
[99918, // fo
[2, [ 0, 39, 1],
[40, 79, 2],
[80, 99, 3] ]
],
[99919, // bj
[2, [ 0, 29, 1],
[40, 69, 2],
[90, 99, 3] ]
],
[99920, // ad
[2, [ 0, 49, 1],
[50, 89, 2],
[90, 99, 3] ]
],
[99921, // qa
[2, [ 0, 9, 1],
[20, 69, 2],
[70, 79, 3],
[80, 89, 1],
[90, 99, 2] ]
],
[99922, // gt
[2, [ 0, 39, 1],
[40, 69, 2],
[70, 99, 3] ]
],
[99923, // sv
[2, [ 0, 19, 1],
[20, 79, 2],
[80, 99, 3] ]
],
[99924, // ni
[2, [ 0, 29, 1],
[30, 79, 2],
[80, 99, 3] ]
],
[99925, // py
[2, [ 0, 39, 1],
[40, 79, 2],
[80, 99, 3] ]
],
[99926, // hn
[2, [ 0, 9, 1],
[10, 59, 2],
[60, 99, 3] ]
],
[99927, // al
[2, [ 0, 29, 1],
[30, 59, 2],
[60, 99, 3] ]
],
[99928, // ge
[2, [ 0, 9, 1],
[10, 79, 2],
[80, 99, 3] ]
],
[99929, // mn
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99930, // am
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99931, // sc
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99932, // mt
[2, [ 0, 9, 1],
[10, 59, 2],
[60, 69, 3],
[70, 79, 1],
[80, 99, 2] ]
],
[99933, // np
[2, [ 0, 29, 1],
[30, 59, 2],
[60, 99, 3] ]
],
[99934, // do
[2, [ 0, 19, 1],
[20, 79, 2],
[80, 99, 3] ]
],
[99935, // ht
[2, [ 0, 29, 1],
[30, 59, 2],
[60, 69, 3],
[70, 89, 1],
[90, 99, 2] ]
],
[99936, // bt
[2, [ 0, 9, 1],
[10, 59, 2],
[60, 99, 3] ]
],
[99937, // mo
[2, [ 0, 19, 1],
[20, 59, 2],
[60, 99, 3] ]
],
[99938, // Srpska
[2, [ 0, 19, 1],
[20, 59, 2],
[60, 69, 3],
[90, 99, 2] ]
],
[99939, // gt
[2, [ 0, 59, 1],
[60, 89, 2],
[90, 99, 3] ]
],
[99940, // ge
[2, [ 0, 9, 1],
[10, 69, 2],
[70, 99, 3] ]
],
[99941, // am
[2, [ 0, 29, 1],
[30, 79, 2],
[80, 99, 3] ]
],
[99942, // sd
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99943, // al
[2, [ 0, 29, 1],
[30, 59, 2],
[60, 99, 3] ]
],
[99944, // et
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99945, // na
[2, [ 0, 59, 1],
[60, 89, 2],
[90, 99, 3] ]
],
[99946, // np
[2, [ 0, 29, 1],
[30, 59, 2],
[60, 99, 3] ]
],
[99947, // tj
[2, [ 0, 29, 1],
[30, 69, 2],
[70, 99, 3] ]
],
[99948, // er
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99949, // mu
[2, [ 0, 19, 1],
[20, 89, 2],
[90, 99, 3] ]
],
[99950, // kh
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
// 99951, // cg no ranges fixed yet
[99952, // ml
[2, [ 0, 49, 1],
[50, 79, 2],
[80, 99, 3] ]
],
[99953, // py
[2, [ 0, 29, 1],
[30, 79, 2],
[80, 99, 3] ]
],
[99954, // bo
[2, [ 0, 29, 1],
[30, 69, 2],
[70, 99, 3] ]
],
[99955, // Srpska
[2, [ 0, 19, 1],
[20, 59, 2],
[60, 89, 3],
[90, 99, 2] ]
],
[99956, // al
[2, [ 0, 59, 2],
[60, 99, 3] ]
]
],
[ // 979
[ 0,
[1, [0, 9, 8] ]
],
[ 2,
[1, [0, 9, 8] ]
],
[ 3,
[1, [0, 9, 8] ]
],
[ 4,
[1, [0, 9, 8] ]
],
[ 5,
[1, [0, 9, 8] ]
],
[ 6,
[1, [0, 9, 8] ]
],
[ 7,
[1, [0, 9, 8] ]
],
[ 8, // USA
[2, [ 0, 19, 8],
[20, 21, 3],
[22, 39, 8],
[40, 79, 4] ],
[3, [800, 884, 8],
[885, 899, 5],
[900, 984, 8],
[985, 986, 7],
[987, 999, 8] ]
],
[ 9,
[1, [ 0, 9, 8] ]
],
[ 10, // fr
[2, [ 0, 19, 2],
[20, 69, 3],
[70, 89, 4] ],
[3, [900, 975, 5],
[976, 999, 6] ]
],
[ 11, // ROK
[2, [ 0, 24, 2],
[25, 54, 3],
[55, 84, 4],
[85, 94, 5],
[95, 99, 6] ]
],
[ 12, // ITA
[2, [ 0, 19, 7],
[20, 29, 3] ],
[3, [300, 544, 7],
[545, 599, 4],
[600, 799, 7],
[800, 849, 5],
[850, 999, 7] ]
],
[ 13,
[1, [0, 9, 7] ]
],
[ 14,
[1, [0, 9, 7] ]
],
[ 15,
[1, [0, 9, 7] ]
],
[ 16,
[1, [0, 9, 7] ]
],
[ 17,
[1, [0, 9, 7] ]
],
[ 18,
[1, [0, 9, 7] ]
],
[ 19,
[1, [0, 9, 7] ]
]
]
]; // .util.isbn.grouping
}; // .util.isbn.furnish()
}; // .bb.isbn()
mw.libs.WikiSyntaxTextMod.bb.isbn(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.isbn;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.issn = function (WSTM) {
// ISSN syntax analysis, code correction and formatting
// Public:
// .util.issn.format()
// Uses:
// .util.fiatObjects()
// .errors.found()
// 2013-06-27 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects(WSTM.util, "issn");
WSTM.util.issn.faith = function (acquired) {
// Compute and compare ISSN check digit (4-4)
// Precondition:
// acquired -- Array(8) with digits 0...9, or 10 at [7]
// Postcondition:
// Returns true if valid
// 2013-08-03 PerfektesChaos@de.wikipedia
var k = 0,
i;
for (i = 0; i < 7; i++) {
k += acquired[i] * (8 - i);
} // for i
k = (11 - k % 11) % 11;
return (k === acquired[7]);
}; // .util.issn.faith()
WSTM.util.issn.fashion = function (acquired) {
// Format ISSN digits for 8 or 13
// Precondition:
// acquired -- Array(8) with digits 0...9, or 10 at [7]
// Postcondition:
// Returns true if valid
// Requires: JavaScript 1.3 fromCharCode()
// 2013-06-20 PerfektesChaos@de.wikipedia
var i,
n = acquired.length,
r;
if ( n === 8 ) {
r = "";
for ( i = 0; i < 4; i++ ) {
r = r + String.fromCharCode( acquired[i] + 48 );
} // for i
r = r + "-";
for ( i = 4; i < 7; i++ ) {
r = r + String.fromCharCode( acquired[i] + 48 );
} // for i
if ( acquired[7] === 10 ) {
r = r + "X";
} else {
r = r + String.fromCharCode( acquired[7] + 48 );
}
} else if ( n === 13 ) {
r = "977-";
for ( i = 3; i < 10; i++ ) {
r = r + String.fromCharCode( acquired[i] + 48 );
} // for i
r = r + "-";
for ( i = 10; i < 12; i++ ) {
r = r + String.fromCharCode( acquired[i] + 48 );
} // for i
r = r + "-" + String.fromCharCode( acquired[12] + 48 );
}
return r;
}; // .util.issn.fashion()
WSTM.util.issn.fetch = function ( attempt ) {
// Convert presumable ISSN code into Array
// Precondition:
// attempt -- ISSN code (no leading keyword)
// Postcondition:
// Returns Array with digits 0...9, or 10 at last position
// Uses:
// .util.code.fetch()
// Requires: JavaScript 1.3 charCodeAt() fromCharCode()
// 2013-06-23 PerfektesChaos@de.wikipedia
var n = attempt.length,
m,
r;
if ( n >= 13 && attempt.substr( 0, 3 ) === "977" ) { // EAN
m = 13;
} else {
m = 8;
}
r = WSTM.util.code.fetch( attempt, m, 8, "ISSN" );
return r;
}; // .util.issn.fetch()
WSTM.util.issn.format = function (adjust) {
// Format ISSN code
// Precondition:
// adjust -- ISSN code (no leading keyword)
// Postcondition:
// Returns false if valid, or string if to be corrected
// Uses:
// .util.issn.fetch()
// .util.issn.faith()
// .util.gtin.faith()
// 2013-06-23 PerfektesChaos@de.wikipedia
var issn = this.fetch( adjust ),
r = false,
n;
if ( issn ) {
n = issn.length;
if ( n === 8 || n === 13 ) {
if ( n === 8 ) {
if ( ! this.faith( issn ) ) {
WSTM.errors.found( "badISSNcheckdig", false, adjust );
issn = false;
}
} else if ( WSTM.util.gtin.faith( issn ) !== issn[ 12 ] ) {
issn = false;
WSTM.errors.found( "badISSNcheckdig", false, adjust );
}
if (issn) {
r = this.fashion(issn);
if (r === adjust) {
r = false;
}
}
} else {
WSTM.errors.found("badISSNstrange", false, adjust);
}
}
return r;
}; // .util.issn.format()
}; // .bb.issn()
mw.libs.WikiSyntaxTextMod.bb.issn(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.issn;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.lccn = function (WSTM) {
// LCCN syntax analysis, code correction and formatting
// Public:
// .util.lccn.format()
// Uses:
// .util.fiatObjects()
// 2013-06-27 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "lccn" );
WSTM.util.lccn.format = function (attempt, apply) {
// Check LCCN code
// Precondition:
// attempt -- LCCN code (no leading keyword)
// apply -- '/' or '-' (true='-') or false
// Postcondition:
// Returns false if valid,
// Array with
// [0] string if to be adjusted, or false
// [1] error info (could be false)
// Uses:
// >< .util.urn.re.*
// 2015-03-25 PerfektesChaos@de.wikipedia
// a{1,2}9{2|4}9{1,6}
// n79022889 -> n/79/22889 -> n79-22889
// nr00001027 -> nr/00/1027
// xx2001000555 -> xx/2001/555
// yyyy>2000
var r = false,
d, got, j, s, small;
if ( typeof this.re !== "object" ) {
this.re = { };
this.re.pre = new RegExp( "^ *([A-Za-z]{1,3})?"
+ "([/0-9])"
+ "(.+[^ \n])[ \n]*$",
"" );
this.re.year = new RegExp( "^([0-9][0-9])"
+ "([0-9][0-9])"
+ "([0-9]*)$",
"" );
this.re.yearser = new RegExp( "^(([0-9][0-9])|(20[0-9][0-9]))"
+ "([/-])"
+ "(.+)",
"" );
}
if ( attempt ) {
got = this.re.pre.exec( attempt );
if ( got ) {
s = got[ 1 ];
if (s) {
small = s.toLowerCase();
if (s !== small) {
r = small + got[ 2 ] + got[ 3 ];
}
} else {
small = false;
}
if ( got[2] === "/" ) {
got = this.re.yearser.exec( got[ 3 ] );
if ( got ) {
if (got[ 4 ] !== "/") {
got = false;
}
}
if ( got ) {
j = got[ 3 ];
} else {
r = [ r, "invalid slash segmentation" ];
}
} else {
s = got[ 2 ] + got[ 3 ];
got = this.re.yearser.exec(s);
if ( got ) {
j = ( got[4] === "-" ? got[3] : false );
} else {
got = this.re.year.exec(s);
if (got) {
if (got[1] === "20") {
j = got[1] + got[2];
got[5] = got[3];
} else {
j = got[1];
got[5] = got[2] + got[3];
}
}
}
}
} else {
r = [ false, "invalid prefix" ];
}
if ( j && typeof r !== "object" ) {
d = j.length;
if ( d !== 2 && d !== 4 ) {
r = false;
} else if ( apply === "/" ) {
r = ( small ? small + "/" : "" )
+ j + "/" + got[ 5 ];
} else if ( apply === "-" || apply === true ) {
r = ( small ? small : "" ) + j + "-" + got[ 5 ];
} else {
r = ( small ? small : "" ) + j + got[ 5 ];
}
if ( r ) {
j = parseInt( j, 10 );
if ( j > 2000 ) {
d = new Date();
if ( j > d.getFullYear() ) {
r = false;
}
} else if ( j > 100 ) {
r = false;
}
}
if ( ! r ) {
r = [ r, "invalid year: " + j ];
}
}
if ( typeof r === "string" ) {
r = [ r, false ];
}
}
return r;
}; // .util.lccn.format()
}; // .bb.lccn()
mw.libs.WikiSyntaxTextMod.bb.lccn(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.lccn;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.urn = function (WSTM) {
// URN syntax analysis, code correction and formatting
// Public:
// .util.urn.failure()
// Uses:
// .util.fiatObjects()
// 2013-06-27 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "urn" );
WSTM.util.urn.sns = ":3gpp:cablelabs:cgi:clei:dgiwg:dvb:ebu:epc"
+ ":epcglobal:example:fdc:fipa:geant:ietf:iptc"
+ ":isan:isbn:iso:issn:ivis:lex:liberty:mace"
+ ":mpeg:nbn:nena:newsml:nfc:nzl:oasis:ogc:ogf"
+ ":oid:oipf:oma:pin:publicid:s1000d:schac"
+ ":service:smpte:swift:tva:uci:ucode:uuid"
+ ":web3d:xmlorg:xmpp:";
WSTM.util.urn.failure = function (attempt) {
// Is URN URI invalid?
// Precondition:
// attempt -- URN
// Postcondition:
// Returns false if valid,
// string if to be adjusted,
// or Array with error info [1]
// Uses:
// > .util.urn.sns
// >< .util.urn.re.*
// .util.isEscValid()
// 2013-06-27 PerfektesChaos@de.wikipedia
var r = false,
crash, got, small, space, subject, swap;
if ( typeof this.re !== "object" ) {
this.re = { };
this.re.chr = new RegExp( "([^-A-Za-z0-9()+,.:=@;$_!*'%].*)$",
"" );
this.re.org = new RegExp( "^ *"
+ "(urn:)"
+ "([A-Za-z0-9]+:)?"
+ "(.*[^ \n])"
+ "[ \n]*",
"i" );
}
if ( attempt ) {
got = this.re.org.exec( attempt );
if ( got ) {
space = got[2];
if ( space ) {
space = space.toLowerCase();
if (this.sns.indexOf(":" + space) >= 0) {
small = "urn:" + space;
subject = got[3];
swap = WSTM.util.isEscValid(subject);
crash = this.re.chr.exec(subject);
if (crash) {
r = [ false, "bad character: " + crash[1]];
} else if (swap) {
r = [ false, "bad escaping: " + swap];
} else if (got[1] + got[2] !== small) {
r = small + subject;
}
} else {
r = [ false, "unknown namespace" ];
}
} else {
r = [ false, "missing namespace" ];
}
} else {
r = [ false, "invalid scheme (urn:)" ];
}
}
return r;
}; // .util.urn.failure()
}; // .bb.urn()
mw.libs.WikiSyntaxTextMod.bb.urn(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.urn;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.regexp = function ( WSTM ) {
// Support for user defined regexp
// Public:
// .util.regexp.fiat()
// .util.regexp.flag()
// Uses:
// .util.fiatObjects()
// 2012-05-26 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "regexp" );
WSTM.util.regexp.fault = function ( attempt ) {
// Guess whether attempt is a RegExp object
// Precondition:
// attempt -- thing to be tested
// Postcondition:
// Return string with error info, or false if appears to be RE
// 2012-11-15 PerfektesChaos@de.wikipedia
var r = false;
if ( attempt ) {
if ( typeof attempt === "object" ) {
if ( typeof attempt.ignoreCase !== "boolean" ) {
r = "Object not RegExp";
}
} else {
r = "RegExp definition not object";
}
} else {
r = "Empty RegExp definition (" + attempt + ")";
}
return r;
}; // .util.regexp.fault()
WSTM.util.regexp.fiat = function ( attempt, adjust, alert ) {
// Safe creation of RegExp from regexp string
// Precondition:
// attempt -- pattern string to be tested
// adjust -- optional string: flags
// alert -- optional location for immediate error message
// Postcondition:
// Returns RegExp object if no error detected, or
// in case of error
// string with error message and data, if not alert, or
// false if message displayed
// Uses:
// .util.regexp.fault()
// .lang.text.fetch()
// .main.fault()
// 2013-05-28 PerfektesChaos@de.wikipedia
var r = false,
s = false,
lt, sf;
switch ( typeof attempt ) {
case "string":
if ( attempt ) {
lt = ( typeof adjust === "string" );
sf = ( lt ? adjust : "" );
try {
r = new RegExp( attempt, sf );
} catch ( err ) {
s = err + "\n" + attempt;
if ( adjust ) {
s = s + "\nflags: " + adjust;
}
} // try-catch
} else {
s = "Empty string";
}
break;
case "object":
s = this.fault( attempt );
if ( ! s ) {
r = attempt;
}
break;
default:
s = "Invalid type";
} // switch typeof attempt
if ( s ) {
if ( alert ) {
WSTM.main.fault( WSTM.lang.text.fetch( "BadRegExp" ) + s,
alert );
r = false;
} else {
r = s;
}
}
return r;
}; // .util.regexp.fiat()
WSTM.util.regexp.flag = function (attempt, apply, about) {
// Is attempt a well-formed regexp string?
// Precondition:
// attempt -- flag string to be tested, or false
// apply -- default flags
// about -- user info
// Postcondition:
// Return value -- flag string
// Versioning:
// 'm' flag applied
// available for JavaScript = 1.5+
// required by: IE 8 for "^...$" line matches
// 'y' proprietary flag applied
// Uses:
// .lang.text.fetch()
// .main.fault()
// 2012-05-26 PerfektesChaos@de.wikipedia
var r = apply,
l,
s;
if ( attempt ) {
l = ( typeof attempt === "string");
if ( l ) {
l = (attempt.search(/[^gGiImMyY]/) < 0);
if ( l ) {
s = attempt.toLowerCase();
if ( s.indexOf( "g" ) < 0 ) {
if ( r.indexOf( "g" ) >= 0 ) {
r = r.replace( /g/, "" );
}
} // not global
if ( s.indexOf( "i" ) >= 0 ) {
r = r + "i";
} // ignoreCase
if ( s.indexOf( "y" ) >= 0 ) {
r = r + "y";
}
}
}
if ( ! l ) {
WSTM.main.fault( WSTM.lang.text.fetch( "BadRegExpFlag" )
+ " " + attempt,
about );
}
}
return r;
}; // .util.regexp.flag()
}; // .bb.regexp()
mw.libs.WikiSyntaxTextMod.bb.regexp(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.regexp;
//-----------------------------------------------------------------------
mw.libs.WikiSyntaxTextMod.bb.translate = function (WSTM) {
// String translation map
// Public:
// .util.translate.factory()
// .util.translate.()
// .util.translate.flip()
// .util.translate.further()
// Uses:
// .util.fiatObjects()
// 2012-05-27 PerfektesChaos@de.wikipedia
"use strict";
WSTM.util.fiatObjects( WSTM.util, "translate" );
WSTM.util.translate.factory = function ( adjust, about ) {
// Fast definition of replacements (internal)
// Precondition:
// adjust -- array of mappings
// Each mapping is an array of strings.
// It is either [re, rp] or [re, rp, flag].
// re -- regular expression string
// rp -- replacement string or function
// flag -- RegExp-Flag; Standard is "g"
// alternatively: "gi", "i", ""
// (g for global, i for ignoreCase)
// about -- context (variable name)
// Postcondition:
// Returns array of mappings.
// Each mapping is an array [RE, rp].
// RE -- RegExp object
// rp -- replacement string (unchanged)
// Uses:
// .main.fault()
// Requires: JavaScript 1.2
// 2012-05-27 PerfektesChaos@de.wikipedia
var n = adjust.length,
r = new Array(n),
e, f, i, m, s;
for ( i = 0; i < n; i++ ) {
m = adjust[i];
f = ( m.length < 3 ? "g"
: m[ 2 ] );
s = m[ 0 ];
try {
e = new RegExp( s, f );
} catch ( err ) {
WSTM.main.fault( "RegExp error:\n"
+ err + "\n"
+ s + "\nin " + about + "[" + i + "]",
false );
r.splice( i, 1 );
i--;
break;
} // try-catch
r[ i ] = [ e, m[ 1 ] ];
} // for i
return r;
}; // .util.translate.factory()
WSTM.util.translate.fiat = function ( assign, apply, about ) {
// Transfer user defined pair of regexp string and replacement
// Precondition:
// assign -- array of strings [re, rp, flags] to be evaluated
// re -- may be string or RegExp
// if string than flags
// apply -- default flags
// about -- user info
// Postcondition:
// Return value -- false if not applicable
// array[2] with RegExp and replacement
// Uses:
// .util.isArray()
// .util.regexp.flag()
// .util.regexp.fault()
// .main.fault()
// 2012-11-15 PerfektesChaos@de.wikipedia
var r = false,
bug,
s,
sf,
sh,
sr;
if ( WSTM.util.isArray( assign ) ) {
if ( assign.length > 1 ) {
bug = false;
sh = assign[ 1 ];
s = typeof sh;
if ( s === "string" || s === "function" ) {
sr = assign[ 0 ];
if ( sr === false || sr === true || sr === "" ) {
sr = "^.*$";
}
switch ( typeof sr ) {
case "string":
if ( assign.length < 3 ) {
sf = apply;
} else {
sf = WSTM.util.regexp.flag( assign[ 2 ],
apply,
about );
}
try {
r = [ new RegExp( sr, sf ), sh ];
} catch (err) {
bug = err + "\n" + sr;
if ( typeof sf === "string") {
bug = bug + "\nflags: " + sf;
} // adjust provided
bug = [ "BadRegExp", bug ];
} // try-catch
break;
case "object":
bug = WSTM.util.regexp.fault(sr);
if ( bug ) {
bug = [ bug, false ];
} else {
r = [ sr, sh ];
}
break;
} // switch typeof assign[0]
} else {
bug = [ "IsNotStringOrFunction", sh ];
}
if ( bug ) {
WSTM.main.fault( WSTM.lang.text.fetch( bug[ 0 ] ),
bug[ 1 ] );
}
}
}
return r;
}; // .util.translate.fiat()
WSTM.util.translate.flip = function ( adjust, apply ) {
// Modify string by multiple replacement
// Precondition:
// adjust -- string to be modified
// apply -- array of mappings
// Each mapping is an array [RE, rp].
// RE -- RegExp object
// rp -- replacement string
// Postcondition:
// Returns modified string, even unchanged.
// Requires: JavaScript 1.2 replace()
// 2012-05-27 PerfektesChaos@de.wikipedia
var n = apply.length,
r = adjust,
i,
s,
t,
x;
for ( i = 0; i < n; i++ ) {
t = apply[i];
x = t[1];
s = typeof x;
if ( s === "string" ) {
r = r.replace(t[0], x);
} else if ( s === "function" ) {
r = r.replace( t[ 0 ], x( 1, i, 0, r ) );
}
} // for i
return r;
}; // .util.translate.flip()
WSTM.util.translate.further = function (add, all, adhere, already) {
// Definition of additional replacements by user
// Precondition:
// add -- array of mappings to be added
// Each mapping is an array of strings.
// For details see this.factory()
// all -- accumulated array of mappings
// false if empty (internally created)
// extended if not empty and valid array of mappings
// adhere -- User visible name of add (optional string)
// already -- optional
// User is an expert now, mapping already checked
// Postcondition:
// Return value -- all has been extended
// (created RE objects instead if re strings)
// if successful and input data valid,
// false if error detected
// Remark:
// Function can be called several times;
// mappings will cumulate in order of applying.
// Versioning:
// 'm' flag applied
// available for JavaScript = 1.5+
// required by: IE 8 for "^...$" line matches
// 'y' proprietary flag applied
// Uses:
// .util.isArray()
// .lang.text.fetch()
// .util.regexp.flag()
// .util.regexp.fiat()
// .main.fault()
// Requires: JavaScript 1.3 charCodeAt()
// 2012-07-15 PerfektesChaos@de.wikipedia
var s = false,
story = ( typeof adhere === "string"
? adhere
: "'add.further'" ),
wstmTXT = WSTM.lang.text.fetch,
c, e, f, i, j, k, learnt, n, source, x;
if ( WSTM.util.isArray( add ) ) {
learnt = ( already ? true : false );
n = add.length;
if ( ! all ) { // new
k = 0;
all = new Array(n);
} else { // expand
k = all.length;
all = all.concat( new Array( n ) );
} // all
for ( i = 0; i < n; i++ ) {
e = add[i];
if ( WSTM.util.isArray( e ) ) {
c = e.length;
if ( learnt ) { // no debug
if ( c > 2 ) {
x = e[ 2 ];
} else {
c = 2;
}
} else {
source = story + " #" + ( i+1 ) + " ";
if ( c < 2 ) {
s = source
+ wstmTXT( "Not" )
+ " min. Array(2)";
break;
} else if ( typeof e[0] !== "string" ) {
s = "regexp in " + source
+ wstmTXT( "IsNotAString" );
break;
} else if ( typeof e[1] !== "string" &&
typeof e[1] !== "function" ) {
s = wstmTXT( "ReplacementIn" )
+ " " + source
+ wstmTXT( "IsNotStringOrFunction" );
break;
} else if ( c > 4 ) {
s = source
+ wstmTXT( "HasMoreThan4Elements" );
break;
} else if ( c > 2 ) {
x = e[ 2 ];
if ( typeof x === "string") {
x = x.toLowerCase();
for ( j = x.length - 1; j >= 0; j-- ) {
switch (x.charCodeAt(j)) {
case 103 : // g
case 105 : // i
case 109 : // m
case 121 : // y
break;
default :
s = "flag '" + x[j] + "' in " + source
+ wstmTXT("Invalid")
+ ": '" + e[2] + "'";
break;
} // switch charCodeAt
} // for j--
} else {
if ( c > 3 ) {
if ( x &&
x !== null &&
x !== undefined ) {
s = "flag in " + source
+ wstmTXT( "IsNotAString" );
break;
} // skip empty element, leave flag default
} // may be ', ,'
c = 2;
} // e[2] flag
}
} // debug array
if ( ! s ) {
f = ( c > 2 ? x : "gm" ); // JS=1.5+ * IE8
if ( learnt ) { // no debug
x = new RegExp( e[ 0 ], f );
} else {
x = WSTM.util.regexp.fiat( e[ 0 ], f, false );
if ( typeof x === "string") {
s = "RegExp error:\n" + x + "\nin "
+ story + " #" + (i+1);
all.splice( k, 1 );
break; // for i
} // error detected
} // debug regexp
all[k] = [ x, e[ 1 ] ];
k++;
}
} else {
s = source + wstmTXT( "IsNotAnArray" );
break;
} // m
} // for i
} else {
s = story + wstmTXT( "IsNotAnArray" );
} // add
if ( s ) {
WSTM.main.fault( s, false );
} // s
return ( s ? false : all );
}; // .util.translate.further()
}; // .bb.translate()
mw.libs.WikiSyntaxTextMod.bb.translate(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.translate;
//-----------------------------------------------------------------------
( function ( WSTM ) {
"use strict";
var sub = "U",
self = WSTM.util.self,
version = WSTM.util.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/dU.js