User:PerfektesChaos/js/isbnLib/d.js

/// PerfektesChaos/js/isbnLib/d.js /// 2018-08-24 PerfektesChaos@de.wikipedia /// Fingerprint: #0#0# /// ISBN utility package /* global window: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 LIB      =  "isbnLib",       Version  =  -2.8,       PRIVATE  =  { wstmBB:  "SU" };   if ( typeof mw.libs[ LIB ]  !==  "object"   ||   ! mw.libs[ LIB ] ) {     mw.libs[ LIB ]  =  { };   }   mw.libs[ LIB ].vsn   =  Version;   mw.libs[ LIB ].type  =  LIB;   LIB                  =  mw.libs[ LIB ];

/// @license GPL [//www.mediawiki.org/w/COPYING] (+GFDL, LGPL, CC-BY-SA) /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html */

if ( typeof LIB.doc !==  "string" ) { LIB.doc =  "w:en:User:PerfektesChaos/js/" + LIB.type + ""; }  // Requires: JavaScript 1.5   RegExp non-capturing parenthese

PRIVATE.catalogs = { de: [ "http://swb.bsz-bw.de/DB=2.1/CMD?ACT=SRCHA&IKT=1007&TRM=#", // "http://gso.gbv.de/DB=2.1/CMD?ACT=SRCHA&IKT=1007&TRM=#", "https://portal.dnb.de/" + "opac.htm?method=simpleSearch&query=#" ], en: [ "http://catalog.loc.gov/vwebv/search?" + "searchCode=ISBL&searchType=1&searchArg=#" ], // "http://catalog.loc.gov/vwebv/search?" //             + "searchCode=STNO&searchType=1&searchArg=#" // British Library requires Login // "http://explore.bl.uk/" //         + "primo_library/libweb/action/search.do" //         + "?fn=search&vl(freeText0)=#" // DEPRECATED: //   "http://catalog.loc.gov/" //          + "cgi-bin/Pwebrecon.cgi?DB=local&CNT=10&CMD=#" fr: [ "http://catalogue.bnf.fr/search.do?" + "mots0=NRC;-1;0;#&pageRech=rav" ], nl: [ "http://opc4.kb.nl/LNG=NE/CMD?ACT=SRCH&IKT=1007&TRM=#" ], pl: [ "http://koha.biblos.pk.edu.pl/cgi-bin/koha/" + "opac-search.pl?idx=nb&q=#" ], pt: [ "http://aleph20.letras.up.pt/F/?" + "func=find-b&find_code=ISBN&request=#", "http://porbase.bnportugal.pt/ipac20/ipac.jsp?" + "menu=search&index=ISBN&term=#" ], sv: [ "http://libris.kb.se/hitlist?q=linkisxn:#" ], qqq: [ "http://www.worldcat.org/search?q=isbn:#" ] };  // 2017-05-18

PRIVATE.countries978 =  [ [ "bg", 954 ], [ "cs", 80 ], [ "da", 87 ], [ "de", 3 ], [ "el", 960, 9963 ], [ "en", 0, 1 ], [ "es", 84, 950, 956, 958, 959, 968, 970, 980, 987, 9942, 9945, 9962, 9968, 9972, 9974, 9977, 9978,             99905, 99922, 99923, 99924, 99925, 99926,              99934, 99939, 99953, 99954 ],      [ "et", 9949, 9985 ], [ "fi", 951, 952 ], [ "fr", 2 ], [ "he", 965 ], [ "hu", 963 ], [ "it", 88 ], [ "ja", 4 ], [ "ko", 89, 9946 ], [ "nl", 90 ], [ "nn", 82 ], [ "no", 82 ], [ "pl", 83 ], [ "pt", 85, 972, 989 ], [ "ru", 5 ], [ "sk", 80 ], [ "sl", 961 ], [ "sv", 91 ], [ "th", 974 ], [ "tr", 975, 9944 ], [ "uk", 966 ], [ "zh", 7 ] ];  // .countries978   2015-05-01

function feed( about ) { /**      Callback from external library @version 2018-08-24 PerfektesChaos@de.wikipedia @param  about  Array with details; about[0] = "U" or "S" */     var rls, s;      if ( typeof about  ===  "object"   &&           typeof about[ 0 ]  ===  "string" ) { LIB.loaded =  true; LIB.wstm[ about[ 0 ] ] =  true; for ( s in LIB.wstm ) { LIB.loaded =  LIB.loaded  &&  LIB.wstm[ s ]; } //  for s in LIB.wstm if ( LIB.loaded ) { rls  =  { }; rls[ "ext.gadget." + LIB.type + "/*" ] = "ready"; mw.loader.state( rls ); mw.hook( "isbnLib.ready" ).fire( LIB ); }     }   }   // feed

function fill { /**      Ensure minimal catalogs @version 2016-03-20 PerfektesChaos@de.wikipedia */     if ( typeof LIB.catalogs  !==  "object"           ||   ! LIB.catalogs   ||           typeof LIB.catalogs.qqq  !==  "object"           ||   ! LIB.catalogs.qqq   ||           typeof LIB.catalogs.qqq.length  !==  "number"   ||           typeof LIB.catalogs.qqq[ 0 ]  !==  "string" ) { LIB.catalogs =  PRIVATE.catalogs; }   }   // fill

function fine { /**      Retrieve pointer to external library @version 2016-03-22 PerfektesChaos@de.wikipedia @return object with external library, or undefined */     var r;      if ( typeof LIB.loaded  ===  "boolean"           &&     LIB.loaded   &&           typeof mw.libs.WikiSyntaxTextMod  ===  "object"   &&           typeof mw.libs.WikiSyntaxTextMod.util  ===  "object"   &&           typeof mw.libs.WikiSyntaxTextMod.util.isbn  ===  "object" ) { r =  mw.libs.WikiSyntaxTextMod.util.isbn; }     return  r;   }   // fine

function first { /**      Internal initialization, last attempt to attach libraries @version 2018-08-24 PerfektesChaos@de.wikipedia */     var i, rls, s, self, signature, state, sub; if ( typeof LIB.wstm !==  "object" ) { rls  =  { }; self =  "ext.gadget." + LIB.type; rls[ self + "/*" ] = "loading"; mw.loader.state( rls ); LIB.wstm =  { }; sub      =  ( Version > 0  ?  "r"  :  "d" ); for ( i = 0; i < PRIVATE.wstmBB.length;  i++ ) { s             =  PRIVATE.wstmBB.substr( i, 1 ); LIB.wstm[ s ] =  false; signature     =  "user:PerfektesChaos/WikiSyntaxTextMod/" + s;           state          =  mw.loader.getState( signature ); if ( ! state ) { rls =  { }; rls[ signature ] = "loading"; mw.loader.state( rls ); mw.loader.load( "https://en.wikipedia.org/w/index.php?"                              + "title=User:PerfektesChaos/js/"                               + "WikiSyntaxTextMod/" + sub + s + ".js"                               + "&bcache=1&maxage=604812"                               + "&action=raw&ctype=text/javascript" ); }           if ( state === "ready" ) { feed( [ s ] ); } else { mw.hook( "WikiSyntaxTextMod/" + s + ".ready" ) .add( feed ); }        }   // for i         rls          =  { }; rls[ self ] =  "ready"; mw.loader.state( rls ); }  }   // first

LIB.factory =  function ( attribute ) { /**      Make regexp string for ISBN detection @version 2013-11-04 PerfektesChaos@de.wikipedia @param  attribute  true: URLs are excluded from detection @return string for RegExp; null if no libraries */     var wstmUisbn  =  fine, r;     if ( wstmUisbn ) { r =  wstmUisbn.factory( attribute ); } else { r =  null; }     return  r;   };   // .factory

LIB.finder = function ( assign ) { /**      Retrieve set of library catalog URLs for particular languages @version 2016-04-14 PerfektesChaos@de.wikipedia @param  assign  string with language code (not "qqq"), or false @return Array of URL strings, "qqq" will always precede the list */     var r = [ ], b, g, i, k, s, u;     fill; for ( i = 0; i < LIB.catalogs.qqq.length;  i++ ) { r.push( LIB.catalogs.qqq[ i ] ); }  // for i      if ( typeof assign  ===  "string"           &&     assign !== "qqq" ) { b =  assign.split( " " ); for ( k = 0; k < b.length;  k++ ) { s =  b[ k ]; if ( typeof LIB.catalogs[ s ] ===  "object" ) { g =  LIB.catalogs[ s ]; for ( i = 0; i < g.length;  i++ ) { u =  g[ i ]; if ( $.inArray( u, r ) <  0 ) { r.push( u ); }              }   // for i            } }  // for k      } return r;  };   // .finder

LIB.flip =  function ( adjust ) { /**      Retrieve corresponding ISBN-10 for ISBN-13, or ISBN-13 for ISBN-10 @version 2013-11-04 PerfektesChaos@de.wikipedia @param  adjust  string with ISBN (ID only, freestyle, no keyword) @return string, if valid; false if invalid sequence; null else */     var wstmUisbn  =  fine, r;     if ( wstmUisbn ) { r =  wstmUisbn.flip( adjust,  function  { } ); } else { r =  null; }     return  r;   };   // .flip

LIB.focus =  function ( about ) { /**      Guess language(s) from ISBN: space separated ISO 639 codes @version 2016-03-22 PerfektesChaos@de.wikipedia @param  about  string with ISBN @return string, if valid; false if not detected */     var r = false, s = about.replace( /-/g, "" ), k = s.length, g, i, n;     if ( k === 13 ) { k =  s.substr( 0, 3 ); if ( k === "979" ) { switch ( s.substr( 3, 2 ) ) { case "10":  r = "fr";   break; case "11":  r = "ko";   break; case "12":  r = "it";   break; }  // switch substr( 3, 2 ) } else if ( k === "978" ) { k =  10; s =  s.substr( 3 ); }     }      if ( k === 10 ) { switch ( s.substr( 0, 1 ) ) { case "0": case "1":  r = "en";   break; case "2":  r = "fr";   break; case "3":  r = "de";   break; case "4":  r = "ja";   break; case "5":  r = "ru";   break; case "6": n =  s.substr( 0, 3 ); break; case "7":  r = "zh";   break; case "8": n =  s.substr( 0, 2 ); break; case "9": switch ( s.substr( 0, 2 ) ) { case "90": case "94":  r = "nl";   break; case "91":  r = "sv";   break; case "92":  r = "mul";   break; default: if ( s.substr( 1, 1 ) ===  "9" ) { if ( s.substr( 2, 1 ) ===  "9" ) { n =  5; } else { n =  4; }                    } else { n =  3; }                    n  =  s.substr( 0, n ); }  // switch substr( 0, 2 ) break; }  // switch substr( 0, 1 ) if ( n ) { n =  parseInt( n, 10 ); for ( i = 0; i < PRIVATE.countries978.length;  i++ ) { g =  PRIVATE.countries978[ i ]; for ( k = 1; k < g.length;  k++ ) { if ( g[ k ] === n ) { r =  g[ 0 ]; break;  // for k                  } }  // for k               if ( r ) { break;  // for i               } }  // for i         } }     return r;   };   // .focus

LIB.format =  function ( adjust, additional ) { /**      Retrieve formatted ISBN @version 2016-04-11 PerfektesChaos@de.wikipedia @param  adjust      string with ISBN (ID only, freestyle, no keyword) @param  additional  true: return Array rather than string @return string/Array if valid; false if invalid sequence; null else */     var wstmUisbn  =  fine, r;     if ( wstmUisbn ) { r =  wstmUisbn.format( adjust,  false,  function  { } ); if ( r[ 0 ] ) { if ( ! additional ) { r =  r[ 1 ]; }        } else { r =  false; }     } else { r =  null; }     return  r;   };   // .format

LIB.furnish = function ( add ) { /**      Add resolvers to default catalogs @version 2016-03-22 PerfektesChaos@de.wikipedia @param  add  object with language dependant resolvers */     var cat, g, i, j, s, slang, user; switch ( typeof add ) { case "string": user =  { qqq: [ add ] }; break; case "object": if ( add ) { if ( add.length ===  "number" ) { user =  { qqq: add }; } else { user =  add; }           }            break; }  // switch typeof add if ( user ) { fill; if ( typeof LIB.reLang !== "object" ) { LIB.reLang =  new RegExp( "^[a-z][a-z]+$" ); LIB.reURL1 =  new RegExp( "^\\S+$" ); LIB.reURL2 =  new RegExp( "^https?://[^/#]+\\.[^/#]+/.*#" ); }        for ( slang in user ) { if ( typeof slang ===  "string"  &&                 LIB.reLang.test( slang ) ) { g =  user[ slang ]; if ( typeof g ===  "object"   &&   g                    &&   typeof g.length  ===  "number" ) { if ( typeof LIB.catalogs[ slang ] !==  "object" ) { LIB.catalogs[ slang ] =  [ ]; }                 cat  =  LIB.catalogs[ slang ]; for ( i = 0; i < g.length;  i++ ) { s =  g[ i ]; if ( typeof s ===  "string"   &&                          LIB.reURL1.test( s )   &&                          LIB.reURL2.test( s ) ) { for ( j = 0; j < cat.length;  j++ ) { if ( cat[ j ] === s ) { s =  false; break;  // for j                           } }  // for j                        if ( s ) { cat.push( s ); }                    }                 }   // for i               } }        }   // for slang in user }  // user defined };  // .furnish

// autoInit onLoad first; }( window.mediaWiki, window.jQuery ) );

// Emacs // Local Variables: // coding: iso-8859-1-dos // fill-column: 80 // End:

/// EOF  isbnLib/d.js