daily pastebin goal
51%
SHARE
TWEET

Untitled

a guest Jul 15th, 2014 183 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* This script can display automated Wikidata item descriptions.
  2.  
  3. DEV WARNING: The code hosted here also runs OUTSIDE of mediawiki scopes on toollabs.
  4. Thus if you need something from the MediaWiki context, wrap your code in a check
  5. for the wd_auto_desc.mediawiki boolean.
  6.  
  7. USERS:
  8.  
  9. To add this to your common.js page:
  10.  
  11.   mw.loader.load("//en.wikipedia.org/w/index.php?title=MediaWiki:Wdsearch-autodesc.js&action=raw&ctype=text/javascript");
  12.  
  13. On Wikidata, to always show the automatic description, even if there is a manual one, add the following line to your common.js page:
  14.  
  15.   wd_auto_desc_wd_always_show = true ;
  16.  
  17. // PROGRAMMER ACCESS
  18. // Get a single item label
  19.  
  20. wd_auto_desc.labelItem ( "Q123" , function ( label ) {
  21.          // "label" now contains the item label
  22. } ) ;
  23.  
  24.  
  25.  
  26. // Get a description
  27.  
  28. wd_auto_desc.loadItem ( "Q123" , {
  29.         target:$('#desc') , // OPTIONAL: item to put the resulting HTML into
  30.         callback : function ( q , html , opt ) { // OPTIONAL: callback with the resulting HTML
  31.                 // q is the original item ID ("Q123"), html contains the description
  32.         } ,
  33.         links : 'wikidata' , // OPTIONAL: 'wikidata' for links to wikidata, 'wikipedia' for links to the current language wikipedia (plain text otherwise)
  34.         linktarget : '_blank' // OPTIONAL: For links, <a target='linktarget'>
  35.        
  36. } ) ;
  37.  
  38.  
  39. // ON WIKIDATA :
  40.  
  41. To load, but not run automatically, set
  42.  
  43. var prevent_wd_auto_desc = 1 ;
  44.  
  45. BEFORE including the script
  46.  
  47. */
  48.  
  49. var wd_auto_desc = {
  50.  
  51.         api : '//www.wikidata.org/w/api.php' ,
  52.         q_prefix : 'Q' ,
  53.         p_prefix : 'P' ,
  54.         running : false ,
  55.         color_not_found : '#FFFFC8' ,
  56.         lang : 'en' , // Default fallback
  57.         mediaWiki: ( typeof mw !== 'undefined' ),
  58.  
  59.         init : function () {
  60.                 var self = this;
  61.                 if ( self.mediaWiki ) {
  62.                         self.lang = mw.config.get( 'wgUserLanguage' );
  63.                 }
  64.         } ,
  65.  
  66.  
  67. // LANGUAGE-SPECIFIC DATA AND METHODS
  68.        
  69.         stock : {
  70.                 'no_auto_content' : { en:'Cannot determine auto-content', vi:'Không thể xác định nội dung tự động', nl:'Kan geen automatische omschrijving genereren' } ,
  71.                 'generating_auto_content' : { en:'Generating auto-content...' , de:'Erzeuge automatische Beschreibung...', vi:'Đang tạo nội dung tự động…' , fr:'Génération...', nl:'Automatische omschrijving laden...' } ,
  72.                 'query_error' : { en:'Query error' , de:'Abfrage-Fehler', vi:'Lỗi truy vấn' , fr:'Erreur de requête', nl:'Query-foutmelding' } ,
  73.                 'not_found' : { en:'Not found' , de:'Nicht gefunden', el:'Δεν βρέθηκε', vi:'Không tìm thấy' , fr:'Introuvable', nl:'Niet gevonden' } ,
  74.                 'cannot_describe' : { en:'Cannot auto-describe' , de:'Automatische Beschreibung nicht verfügbar', el:'Δεν μπορεί να περιγραφεί', vi:'Không thể miêu tả tự động' ,  fr:'Description automatique impossible', nl:'Geen automatische omschrijving beschikbaar' } ,
  75.                 'disambig' : { en:'Wikipedia disambiguation page' , de:'Wikipedia-Begriffsklärungsseite', el:'Σελίδα αποσαφήνισης στη Βικιπαίδεια', vi:'Trang định hướng Wikipedia' , fr:'page d\'homonymie d\'un projet Wikimédia', nl:'Wikimedia-doorverwijspagina' } ,
  76.                 'person' : { en:'person' , de:'Person', el:'Πρόσωπο', vi:'người' , fr:'être humain', nl:'mens' } ,
  77.                 'in' : { en:'in', el:'στο',  vi:'trong' , fr:'à', nl:'in' } ,
  78.                 'by' : { en:'by' , de:'von', el:'του', vi:'bởi' , fr:'par', nl:'door' } ,
  79.                 'for' : { en:'for' , de:'für', el:'για', vi:'cho' , fr:'pour', nl:'voor'  } ,
  80.                 'from' : { en:'from' , de:'von', el:'από', vi:'từ' , fr:'de', nl:'van' } ,
  81.                 'part of' : { en:'part of' , de:'Teil von', el:'μέρος του', vi:'một phần của' , fr:'partie de', nl:'onderdeel van'  } ,
  82.                 'member of' : { en:'member of' , de:'Mitglied von', el:'μέλος του', vi:'thành viên của' , fr:'membre de', nl:'lid van'  } ,
  83.                 'named after' : { en:'named after' , de:'benannt nach', vi:'đặt tên theo' , fr:'nommé en référence à', nl:'genoemd naar' } ,
  84.                 'child of' : { en:'child of' , de:'Kind von', el:'τέκνο του', vi:'con của' , fr:'enfant de', nl:'kind van' } ,
  85.                 'spouse of' : { en:'spouse of' , de:'verheiratet mit', el:'σύζυγος του', vi:'vợ/chồng của' , fr:'conjoint de', nl:'partner van' } ,
  86.                 'location' : { en:'Location' , de:'Lokalität', el:'Τοποθεσία', vi:'Vị trí', nl:'locatie' } ,
  87.                 'BC' : { en:'BC', el:'π.Χ.', vi:'TCN' , fr:'avant Jésus-Christ', nl:'A.D.' }
  88.         } ,
  89.        
  90.         language_specific : {
  91.                 en : {
  92.                         'nationality' : {'Ecuador':'Ecuadorian','Ghana':'Ghanaian','Russia':'Russian','Argentina':'Argentine','Australia':'Australian','Austria':'Austrian','Belgium':'Belgian','Brazil':'Brazilian','Canada':'Canadian','Chile':'Chilean','China':'Chinese','Denmark':'Danish','Finland':'Finnish','Faroe Islands':'Faroese','Netherlands':'Dutch','Puerto Rico':'Puerto Rican','France':'French','Luxembourg':'Luxembourgish','Germany':'German','Greece':'Greek','Holland':'Dutch','Hungary':'Hungarian','Iceland':'Icelander','India':'Indian','Iran':'Iranian','Iraq':'Iraqi','Ireland':'Irish','Israel':'Israeli','Indonesia':'Indonesian','Italy':'Italian','Japan':'Japanese','Jamaica':'Jamaican','Jordan':'Jordanian','Mexico':'Mexican','Nepal':'Nepalese','New Zealand':'New Zealander','Norway':'Norwegian','Pakistan':'Pakistani','Paraguay':'Paraguayan','Peru':'Peruvian','Poland':'Polish','Romania':'Romanian','Scotland':'Scottish','South Africa':'South African','Spain':'Spanish','Switzerland':'Swiss','Syria':'Syrian','Thailand':'Thai','Turkey':'Turkish','USA':'American','Uruguay':'Uruguayan','Venezuela':'Venezuelan','Wales':'Welsh','United Kingdom':'British','United States of America':'US-American','Sweden':'Swedish'}
  93.                 } ,
  94.                 de : {
  95.                         'nationality' : { 'Russland':'Russisch','Dänemark':'Dänisch','Norwegen':'Norwegisch','Niederlande':'Niederländisch','Deutschland':'Deutsch','Rumänien':'Rumänisch','Chile':'Chilenisch','Brasilien':'Brasilianisch' }
  96.                 } ,
  97.                 el : {
  98.                         'nationality' : {
  99.                                 'Ελλάδα':'Έλληνας', 'Ρωσία':'Ρώσος','Δανία':'Δανός','Νορβηγία':'Νορβηγός','Ολλανδία':'Ολλανδός',
  100.                                 'Γερμανία':'Γερμανός', 'Χιλή':'Χιλιανός','Βραζιλία':'Βραζιλιάνος', 'Γαλλία':'Γάλλος', 'Αγγλία':'Άγγλος',
  101.                                 'Ηνωμένο Βασίλειο':'Βρετανός', 'Ηνωμένες Πολιτείες της Αμερικής':'Αμερικανός','Ισπανία':'Ισπανός',
  102.                                 'Ιταλία':'Ιταλός', 'Τουρκία':'Τούρκος', 'Βουλγαρία':'Βούλγαρος','Αυστρία':'Αυστριακός',
  103.                                 'Ηνωμένες Πολιτείες Αμερικής':'Αμερικανός','Σουηδία':'Σουηδός', 'Πολωνία':'Πολωνός',
  104.                                 'Ουκρανία':'Ουκρανός', 'Ιρλανδία':'Ιρλανδός', 'Σερβία':'Σέρβος', 'Γιουγκοσλαβία':'Γιουγκοσλάβος'}
  105.                 } ,
  106.                 fr : {
  107.                         'nationality' : { 'Afghanistan':'afghan', 'Afrique du Sud':'sud-africain', 'Albanie':'albanais', 'Algérie':'algérien', 'Allemagne':'allemand', 'Andorre':'andorran', 'Angola':'angolais', 'Antigua-et-Barbuda':'d\'Antigua-et-Barbuda', 'Arabie saoudite':'saoudien', 'Argentine':'argentin', 'Arménie':'arménien', 'Australie':'australien', 'Autriche':'autrichien', 'Azerbaïdjan':'azerbaïdjanais', 'Bangladesh':'bangladais', 'Belgique':'belge', 'Brésil':'brésilien', 'Canada':'canadien', 'Chili':'chilien', 'Chine':'chinois', 'Danemark':'danois', 'Espagne':'espagnol', 'États-Unis':'américain', 'Finlande':'finlandais', 'France':'français', 'Grèce':'grec', 'Hongrie':'hongrois', 'Inde':'indien', 'Irlande':'irlandais', 'Islande':'islandais', 'Israël':'israélien', 'Italie':'italien', 'Japon':'japonais', 'Liban':'libanais', 'Norvège':'norvégien', 'Pays-Bas':'néerlandais', 'Pologne':'polonais', 'Portugal':'portugais', 'Roumanie':'roumain', 'Royaume-Uni':'britannique', 'Russie':'russe', 'Slovaquie':'slovaque', 'Slovénie':'slovène', 'Suisse':'suisse', 'Écosse':'écossais', 'Pays de Galles':'gallois', 'Angleterre':'anglais' }
  108.                 } ,
  109.                 vi : {
  110.                         'nationality' : {'Cộng hòa Nhân dân Trung Hoa':'Trung Quốc','Quần đảo Faroe':'Faroe','Cộng hòa Ireland':'Ireland','Nhật Bản':'Nhật','Cộng hòa Nam Phi':'Nam Phi','Hoa Kỳ':'Mỹ','Vương quốc Liên hiệp Anh và Bắc Ireland':'Anh','Cộng hòa Séc':'Séc','Cộng hòa Síp':'Síp','Cộng hòa Macedonia':'Macedonia','Cộng hòa Dân chủ Nhân dân Triều Tiên':'Triều Tiên','Cộng hòa Dân chủ Congo':'Congo','Cộng hòa Dominica':'Dominica','Cộng hòa Trung Phi':'Trung Phi'}
  111.                 } ,
  112.                 nl : {
  113.                         'nationality' : {'Ecuador':'Ecuadoraans','Ghana':'Ghanees','Russia':'Russisch','Argentina':'Argentijns','Australia':'Australisch','Austria':'Oostenrijks','Belgium':'Belgisch','Brazil':'Braziliaans','Canada':'Canadees','Chile':'Chileens','China':'Chinees','Denmark':'Deens','Finland':'Fins','Faroe Islands':'Faeröers','Netherlands':'Nederlands','Puerto Rico':'Puerto Ricaans','France':'Frans','Luxembourg':'Luxemburgs','Germany':'Duits','Greece':'Grieks','Holland':'Nederlands','Hungary':'Hongaars','Iceland':'IJslands','India':'Indiaas','Iran':'Iranees','Iraq':'Irakees','Ireland':'Ierse','Israel':'Israëlisch','Indonesia':'Indonesisch','Italy':'Italiaans','Japan':'Japans','Jamaica':'Jamaicaans','Jordan':'Jordaans','Mexico':'Mexicaans','Nepal':'Nepaleese','New Zealand':'Nieuw-Zeelands','Norway':'Noorse','Pakistan':'Pakistaanse','Paraguay':'Paraguayaans','Peru':'Peruaans','Poland':'Pools','Romania':'Roemeens','Scotland':'Schotse','South Africa':'Zuid-Afrikaans','Spain':'Spaans','Switzerland':'Zwitserse','Syria':'Syrische','Thailand':'Thaise','Turkey':'Turks','USA':'Amerikaans','Uruguay':'Uruguayaans','Venezuela':'Venezolaans','Wales':'Welshe','United Kingdom':'Brits','United States of America':'Amerikaans','Sweden':'Zweeds'}
  114.                 }
  115.         } ,
  116.        
  117.         txt : function ( k ) {
  118.                 if ( undefined !== this.stock[k] ) {
  119.                         if ( undefined !== this.stock[k][wd_auto_desc.lang] ) return this.stock[k][wd_auto_desc.lang] ;
  120.                         return this.stock[k]['en'] ;
  121.                 }
  122.                 return '???' ;
  123.         } ,
  124.  
  125.         txt2 : function ( t , k ) {
  126.                 if ( this.language_specific[wd_auto_desc.lang] === undefined ) return t ;
  127.                 if ( this.language_specific[wd_auto_desc.lang][k] === undefined ) return t ;
  128.  
  129.                 var m = t.match ( /^(<a.+>)(.+)(<\/a>)/ ) ;
  130.                 if ( null === m ) m = [ '' , '' , t , '' ] ;
  131.                 var k2 = m[2] ;
  132.                
  133.                 if ( this.language_specific[wd_auto_desc.lang][k][k2] === undefined ) return t ;
  134.                 return m[1] + this.language_specific[wd_auto_desc.lang][k][k2] + m[3] ;
  135.         } ,
  136.        
  137.         modifyWord : function ( word , hints ) {
  138.                 var self = this ;
  139.                 if ( wd_auto_desc.lang == 'en' ) {
  140.                         if ( hints.is_female ) {
  141.                                 if ( word.toLowerCase() == 'actor' ) return 'actress' ;
  142.                                 if ( word.toLowerCase() == 'actor / actress' ) return 'actress' ;
  143.                         } else if ( hints.is_male ) {
  144.                                 if ( word.toLowerCase() == 'actor / actress' ) return 'actor' ;
  145.                         }
  146.                 } else if ( wd_auto_desc.lang == 'fr' ) {
  147.                         if ( hints.is_female ) {
  148.                                 if ( word.toLowerCase() == 'acteur' ) return 'actrice' ;
  149.                                 if ( word.toLowerCase() == 'être humain' ) return 'personne' ;
  150.                         }
  151.                 } else if ( wd_auto_desc.lang == 'de' ) {
  152.                         if ( hints.is_female ) {
  153.                                 if ( hints.occupation ) {
  154.                                         word += 'in' ;
  155.                                 }
  156.                         }
  157.                 }
  158.                 return word ;
  159.         } ,
  160.  
  161.         listWords : function ( olist , hints ) {
  162.                 var self = this ;
  163.                 var list = $.merge ( [] , olist ) ;
  164.                 if ( hints !== undefined ) {
  165.                         $.each ( list , function ( k , v ) {
  166.                                 list[k] = self.modifyWord ( v , hints ) ;
  167.                         } ) ;
  168.                 }
  169.                 if ( wd_auto_desc.lang == 'en' ) {
  170.                         if ( list.length == 1 ) return list[0] ;
  171.                         if ( list.length == 2 ) return list[0] + ' and ' + list[1] ;
  172.                         var last = list.pop() ;
  173.                         return list.join ( ', ' ) + ', and ' + last ;
  174.                 } else if ( wd_auto_desc.lang == 'de' ) {
  175.                         if ( list.length == 1 ) return list[0] ;
  176.                         if ( list.length == 2 ) return list[0] + ' und ' + list[1] ;
  177.                         var last = list.pop() ;
  178.                         return list.join ( ', ' ) + ' und ' + last ;
  179.                 } else if ( wd_auto_desc.lang == 'fr' ) {
  180.                         if ( list.length == 1 ) return list[0] ;
  181.                         if ( list.length == 2 ) return list[0] + ' et ' + list[1] ;
  182.                         var last = list.pop() ;
  183.                         return list.join ( ', ' ) + ' et ' + last ;                    
  184.                 } else if ( wd_auto_desc.lang == 'vi' ) {
  185.                         if ( list.length == 1 ) return list[0] ;
  186.                         if ( list.length == 2 ) return list[0] + ' và ' + list[1] ;
  187.                         var last = list.pop() ;
  188.                         return list.join ( ', ' ) + ', và ' + last ;
  189.                 } else return list.join ( ', ' ) ;
  190.         } ,
  191.        
  192.         ucFirst : function ( s ) {
  193.                 return s.substr(0,1).toUpperCase() + s.substr(1,s.length) ;
  194.         } ,
  195.        
  196.         getNationalityFromCountry : function ( country , claims , hints ) {
  197.                 var self = this ;
  198.                 if ( hints === undefined ) hints = {} ;
  199.                 if ( wd_auto_desc.lang == 'en' ) {
  200.                         return self.txt2 ( country , 'nationality' ) ;
  201.                 } else if ( wd_auto_desc.lang == 'de' ) {
  202.                         var n = self.txt2 ( country , 'nationality' ) ;
  203.                         if ( self.language_specific[wd_auto_desc.lang]['nationality'][country] === undefined ) return n ;
  204.                         var is_female = self.hasPQ ( claims , 21 , 6581072 ) ;
  205.                         if ( hints.not_last ) n += '' ;
  206.                         else if ( is_female ) n += 'e' ;
  207.                         else n += 'er' ;
  208.                         return n ;
  209.                 } else {
  210.                         return self.txt2 ( country , 'nationality' ) ;
  211.                 }
  212.         } ,
  213.  
  214.         isPerson : function ( claims ) {
  215.                 var self = this ;
  216.                 if ( self.hasPQ ( claims , 107 , 215627 ) ) return true ; // GND:Person
  217.                 if ( self.hasPQ ( claims , 31 , 5 ) ) return true ; // Instance of: human
  218.                 return false ;
  219.         } ,
  220.        
  221.         describePerson : function ( q , claims , opt ) {
  222.                 var self = this ;
  223.                 var load_items = [] ;
  224.                 self.addItemsFromClaims ( claims , 106 , load_items ) ; // Occupation
  225.                 self.addItemsFromClaims ( claims , 39 , load_items ) ; // Office
  226.                 self.addItemsFromClaims ( claims , 27 , load_items ) ; // Country of citizenship
  227.                 self.addItemsFromClaims ( claims , 166 , load_items ) ; // Award received
  228.                 self.addItemsFromClaims ( claims , 31 , load_items ) ; // Instance of
  229.                 self.addItemsFromClaims ( claims , 22 , load_items ) ; // Father
  230.                 self.addItemsFromClaims ( claims , 25 , load_items ) ; // Mother
  231.                 self.addItemsFromClaims ( claims , 26 , load_items ) ; // Spouse
  232.                 self.addItemsFromClaims ( claims , 463 , load_items ) ; // Member of
  233.                
  234.                 var is_male = self.hasPQ ( claims , 21 , 6581097 ) ;
  235.                 var is_female = self.hasPQ ( claims , 21 , 6581072 ) ;
  236.                
  237.                 self.labelItems ( load_items , function ( item_labels ) {
  238.                         var h = [] ;
  239.                        
  240.                         // Nationality
  241.                         var h2 = '' ;
  242.                         var tmp = item_labels[27]||[] ;
  243.                         $.each ( tmp , function ( k , v ) {
  244.                                 var s = self.getNationalityFromCountry ( v , claims , { not_last:(k+1!=tmp.length) } ) ;
  245.                                 if ( k == 0 ) h2 = s ;
  246.                                 else h2 += '-' + s.toLowerCase() ; // Multi-national
  247.                         } ) ;
  248.                         if ( h2 != '' ) h.push ( h2 ) ;
  249.                        
  250.                         // Occupation
  251.                         var ol = h.length ;
  252.                         self.add2desc ( h , item_labels , [ 31 , 106 ] , { hints:{is_male:is_male,is_female:is_female,occupation:true,o:opt} } ) ;
  253.                         if ( h.length == ol ) h.push ( self.txt('person') ) ;
  254.                        
  255.                         // Office
  256.                         self.add2desc ( h , item_labels , [ 39 ] , { hints:{is_male:is_male,is_female:is_female,office:true} , prefix:',',o:opt } ) ;
  257.                        
  258.                        
  259.                         // Dates
  260.                         var born = self.getYear ( claims , 569 ) ;
  261.                         var died = self.getYear ( claims , 570 ) ;
  262.                         if ( born != '' && died != '' ) {
  263.                                 h.push ( ' (' + born + '&ndash;' + died + ')' ) ;
  264.                         } else if ( born != '' ) {
  265.                                 h.push ( ' (*' + born + ')' ) ;
  266.                         } else if ( died != '' ) {
  267.                                 h.push ( ' (&dagger;' + died + ')' ) ;
  268.                         }
  269.  
  270.                         self.add2desc ( h , item_labels , [ 166 ] , { prefix:';',o:opt } ) ;
  271.  
  272.                         self.add2desc ( h , item_labels , [ 463 ] , { prefix:';' , txt_key:'member of',o:opt } ) ;
  273.  
  274.                         self.add2desc ( h , item_labels , [ 22,25 ] , { prefix:';' , txt_key:'child of',o:opt } ) ;
  275.  
  276.                         self.add2desc ( h , item_labels , [ 26 ] , { prefix:';' , txt_key:'spouse of',o:opt } ) ;
  277.                        
  278.                         if ( h.length == 0 ) h.push ( self.txt('person') ) ;
  279.                        
  280.                         if ( self.hasPQ ( claims , 21 , 6581072 ) ) h.push ( '♀' ) ; // Female
  281.                         if ( self.hasPQ ( claims , 21 , 6581097 ) ) h.push ( '♂' ) ; // Male
  282.                        
  283.                         self.setTarget ( opt , self.ucFirst ( h.join(' ') ) , q ) ;
  284.                 } , opt ) ;
  285.        
  286.         } ,
  287.        
  288.         describeGeneric : function ( q , claims , opt ) {
  289.                 var self = this ;
  290.                 var load_items = [] ;
  291.                 self.addItemsFromClaims ( claims , 361 , load_items ) ; // Part of
  292.                 self.addItemsFromClaims ( claims , 279 , load_items ) ; // Subclass off
  293.                 self.addItemsFromClaims ( claims , 31 , load_items ) ; // Instance of
  294.                 self.addItemsFromClaims ( claims , 60 , load_items ) ; // Astronomical object
  295.  
  296.                 self.addItemsFromClaims ( claims , 175 , load_items ) ; // Performer
  297.                 self.addItemsFromClaims ( claims , 86 , load_items ) ; // Composer
  298.                 self.addItemsFromClaims ( claims , 170 , load_items ) ; // Creator
  299.                 self.addItemsFromClaims ( claims , 57 , load_items ) ; // Director
  300.                 self.addItemsFromClaims ( claims , 50 , load_items ) ; // Author
  301.                 self.addItemsFromClaims ( claims , 61 , load_items ) ; // Discoverer/inventor
  302.  
  303.                 self.addItemsFromClaims ( claims , 17 , load_items ) ; // Country
  304.                 self.addItemsFromClaims ( claims , 131 , load_items ) ; // Admin unit
  305.  
  306.                 self.addItemsFromClaims ( claims , 306 , load_items ) ; // OS
  307.                 self.addItemsFromClaims ( claims , 400 , load_items ) ; // Platform
  308.  
  309.                 self.addItemsFromClaims ( claims , 123 , load_items ) ; // Publisher
  310.                 self.addItemsFromClaims ( claims , 264 , load_items ) ; // Record label
  311.  
  312.                 self.addItemsFromClaims ( claims , 105 , load_items ) ; // Taxon rank
  313.                 self.addItemsFromClaims ( claims , 138 , load_items ) ; // Named after
  314.                
  315.                 self.labelItems ( load_items , function ( item_labels ) {
  316.                         var h = [] ;
  317.                         var h2 , x ;
  318.  
  319.                         // Date
  320.                         var pubdate = self.getYear ( claims , 577 ) ;
  321.                         if ( pubdate != '' ) h.push ( pubdate ) ;
  322.  
  323.                         // Instance/subclass/etc
  324.                         self.add2desc ( h , item_labels , [ 279,31,60,105 ] , { o:opt } ) ;
  325.                        
  326.                         // Location
  327.                         h2 = [] ;
  328.                         $.each ( item_labels[131]||[] , function ( k , v ) { h2.push ( v ) ; } ) ;
  329.                         var sep = ' / ' ;
  330.                         var h3 = [] ;
  331.                         $.each ( item_labels[17]||[] , function ( k , v ) { h3.push ( v ) ; } ) ;
  332.                         if ( h.length == 0 && ( h2.length > 0 || h3.length > 0 ) ) h.push ( self.txt('location') ) ;
  333.                         if ( h2.length > 0 && h3.length > 0 ) h.push ( self.txt('in') + ' ' + h2.join(sep) + ", " + h3.join(sep) ) ;
  334.                         else if ( h2.length > 0 ) h.push ( self.txt('in') + ' ' + h2.join(sep) ) ;
  335.                         else if ( h3.length > 0 ) h.push ( self.txt('in') + ' ' + h3.join(sep) ) ;
  336.                        
  337.                         // Creator etc.
  338.                         self.add2desc ( h , item_labels , [ 175,86,170,57,50,61 ] , { txt_key:'by',o:opt } ) ;
  339.                         self.add2desc ( h , item_labels , [ 306,400 ] , { txt_key:'for',o:opt } ) ;
  340.                         self.add2desc ( h , item_labels , [ 264,123 ] , { txt_key:'from',o:opt } ) ;
  341.                         self.add2desc ( h , item_labels , [ 361 ] , { prefix:',' , txt_key:'part of',o:opt } ) ;
  342.                         self.add2desc ( h , item_labels , [ 138 ] , { prefix:',' , txt_key:'named after',o:opt } ) ;
  343.                        
  344.                         if ( h.length == 0 ) {
  345.                                 h = '<i>'+self.txt('cannot_describe')+'</i>' ;
  346.                                 if ( opt.fallback == 'manual_desc' && self.main_data.descriptions !== undefined && self.main_data.descriptions[self.lang] !== undefined ) {
  347.                                         h = self.main_data.descriptions[self.lang].value ;
  348.                                 }
  349.                                 if ( opt.target !== undefined ) opt.target.css({'background-color':self.color_not_found}) ;
  350.                         } else h = self.ucFirst ( h.join ( ' ' ) ) ;
  351.                         self.setTarget ( opt ,  h , q ) ;
  352.                 } , opt ) ;
  353.         } ,
  354.        
  355.         add2desc : function ( h , item_labels , props , opt ) {
  356.                 if ( undefined === opt ) opt = {} ;
  357.                 var self = this ;
  358.                 var h2 = [] ;
  359.                 var x = [] ;
  360.                 $.each ( props , function ( k , prop ) {
  361.                         $.merge ( x , item_labels[prop]||[] ) ;
  362.                 } ) ;
  363.                 $.each ( x , function ( k , v ) { h2.push ( v ) ; } ) ;
  364.                 if ( h2.length > 0 ) {
  365.                         if ( undefined !== opt.prefix && h.length > 0 ) h[h.length-1] += opt.prefix ;
  366.                         var s = self.listWords ( h2 , opt.hints ) ;
  367.                         if ( undefined !== opt.txt_key ) s = self.txt(opt.txt_key) + ' ' + s ;
  368.                         h.push ( s ) ;
  369.                 }
  370.         } ,
  371.  
  372.         loadItemForPage : function ( site , page , opt ) {
  373.                 var self = this ;
  374.  
  375.                 $.getJSON ( self.api+'?action=wbgetentities&format=json&sites='+site+'&titles='+encodeURIComponent(page)+'&normalize=&callback=?' , function ( d ) {
  376.                        
  377.                         if ( d.success != 1 ) {
  378.                                 mw.log( "Failed to load item for page: ", d );
  379.                                 return self.setTarget ( opt , '<i>'+self.txt('query_error')+'</i>' , site+':'+page );
  380.                         }
  381.                         if ( d.entities === undefined ) return self.setTarget ( opt , '<i>'+self.txt('not_found')+'</i>' , site+':'+page ) ;
  382.                        
  383.                         var q ;
  384.                         $.each ( d.entities , function ( k , v ) { q = k } ) ;
  385.                         opt.q = q ;
  386.                         self.main_data = d.entities[q] ;
  387.                         var claims = d.entities[q].claims || [] ;
  388.                        
  389.                         if ( self.isPerson ( claims ) ) self.describePerson ( q , claims , opt ) ;
  390.                         else if ( self.isDisambig ( claims ) ) self.setTarget ( opt , self.txt('disambig') , q ) ;
  391.                         else return self.describeGeneric ( q , claims , opt ) ;
  392.                        
  393.                 } ) ;
  394.  
  395.         } ,
  396.  
  397.         loadItem : function ( q , opt ) {
  398.                 var self = this ;
  399.                 q = q.toUpperCase() ;
  400.                 opt.q = q ;
  401.                
  402.                 if ( undefined !== self.cache[q] && undefined === opt.skip_cache ) return self.setTarget ( opt , self.cache[q] , q ) ;
  403.        
  404.                 $.getJSON ( self.api+'?action=wbgetentities&format=json&ids='+q+'&callback=?' , function ( d ) {
  405.                         if ( d.success != 1 ) {
  406.                                 mw.log( "Failed to load item for page: ", d );
  407.                                 return self.setTarget ( opt , '<i>'+self.txt('query_error')+'</i>' , q ) ;
  408.                         }
  409.                         if ( d.entities === undefined || d.entities[q] === undefined ) return self.setTarget ( opt , '<i>'+self.txt('not_found')+'</i>' , q ) ;
  410.                         self.main_data = d.entities[q] ;
  411.                         var claims = d.entities[q].claims || [] ;
  412.                        
  413.                         if ( self.isPerson ( claims ) ) self.describePerson ( q , claims , opt ) ;
  414.                         else if ( self.isDisambig ( claims ) ) self.setTarget ( opt , self.txt('disambig') , q ) ;
  415.                         else return self.describeGeneric ( q , claims , opt ) ;
  416.                        
  417.                 } ) ;
  418.        
  419.         } ,
  420.        
  421.         isDisambig : function ( claims ) {
  422.                 var self = this ;
  423.                 return ( self.hasPQ ( claims , 107 , 11651459 ) ) ;
  424.         } ,
  425.        
  426.         hasPQ : function ( claims , p , q ) { // p,q numerical
  427.                 var self = this ;
  428.                 p = self.p_prefix+p ;
  429.                 if ( undefined === claims[p] ) return false ;
  430.                 var ret = false ;
  431.                 $.each ( claims[p] , function ( k , v ) {
  432.                         if ( undefined === v.mainsnak ) return ;
  433.                         if ( undefined === v.mainsnak.datavalue ) return ;
  434.                         if ( undefined === v.mainsnak.datavalue.value ) return ;
  435.                         if ( undefined === v.mainsnak.datavalue.value['numeric-id'] ) return ;
  436.                         if ( q != v.mainsnak.datavalue.value['numeric-id'] ) return ;
  437.                         ret = true ;
  438.                 } ) ;
  439.                 return ret ;
  440.         } ,
  441.        
  442.         addItemsFromClaims : function ( claims , p , items ) { // p numerical
  443.                 var self = this ;
  444.                 if ( undefined === claims[self.p_prefix+p] ) return ;
  445.                 $.each ( claims[self.p_prefix+p] , function ( k , v ) {
  446.                         if ( undefined === v.mainsnak ) return ;
  447.                         if ( undefined === v.mainsnak.datavalue ) return ;
  448.                         if ( undefined === v.mainsnak.datavalue.value ) return ;
  449.                         if ( undefined === v.mainsnak.datavalue.value['numeric-id'] ) return ;
  450.                         items.push ( [ p , self.q_prefix+v.mainsnak.datavalue.value['numeric-id'] ] ) ;
  451.                 } ) ;
  452.         } ,
  453.  
  454.         getYear : function ( claims , p ) { // p numerical
  455.                 var self = this ;
  456.                 p = self.p_prefix+p ;
  457.                 if ( undefined === claims[p] ) return '' ;
  458.                 var ret = '' ;
  459.                 $.each ( claims[p] , function ( k , v ) {
  460.                         if ( undefined === v.mainsnak ) return ;
  461.                         if ( undefined === v.mainsnak.datavalue ) return ;
  462.                         if ( undefined === v.mainsnak.datavalue.value ) return ;
  463.                         if ( undefined === v.mainsnak.datavalue.value['time'] ) return ;
  464.                         var m = v.mainsnak.datavalue.value['time'].match ( /^([+-])0+(\d+)/ ) ;
  465.                         if ( m == null ) return ;
  466.                         ret = m[2] ;
  467.                         if ( m[1] == '-' ) ret += self.txt('BC') ;
  468.                 } ) ;
  469.                 return ret ;
  470.         } ,
  471.        
  472.        
  473.         labelItems : function ( items , callback , opt ) {
  474.                 var self = this ;
  475.                
  476.                 if ( undefined === opt ) opt = {} ;
  477.                
  478.                 if ( items.length == 0 ) {
  479.                         callback ( {} ) ;
  480.                         return ;
  481.                 }
  482.                
  483.                 var i = [] ;
  484.                 $.each ( items , function ( k , v ) {
  485.                         i.push ( v[1] ) ;
  486.                 } ) ;
  487.                
  488.                 var additional = '' ;
  489.                 if ( opt.links != '' && opt.links != 'reasonator_local' && opt.links != 'reasonator' ) additional += '|sitelinks' ;
  490.                
  491.                 $.getJSON ( self.api+'?action=wbgetentities&format=json&props=labels'+additional+'&ids='+i.join('|')+'&callback=?' , function ( d ) { // &languages='+wd_auto_desc.lang+'
  492.                         var cb = {} ;
  493.                         $.each ( d.entities||[] , function ( q , v ) {
  494.                                 if ( v.labels === undefined ) return ;
  495.                                 var curlang = wd_auto_desc.lang ; // Try set language
  496.                                 if ( v.labels[curlang] === undefined ) { // Try main languages
  497.                                         $.each ( ['en','de','fr','es','it','pl','pt','ja','ru','hu'] , function ( k2 , v2 ) {
  498.                                                 if ( v.labels[k2] === undefined ) return ;
  499.                                                 curlang = k2 ;
  500.                                                 return false ;
  501.                                         } ) ;
  502.                                 }
  503.                                 if ( v.labels[curlang] === undefined ) { // Take any language
  504.                                         $.each ( v.labels , function ( k2 , v2 ) {
  505.                                                 curlang = k2 ;
  506.                                                 return false ;
  507.                                         } ) ;
  508.                                 }
  509.                                 if ( v.labels[curlang] === undefined ) return ;
  510.                                 var p ;
  511.                                 $.each ( items , function ( k , v ) {
  512.                                         if ( v[1] == q ) p = v[0] ;
  513.                                 } ) ;
  514.  
  515.                                 if ( q == 'Q5' && p == 31 ) return ; // Instance of: human
  516.  
  517.                                 if ( cb[p] === undefined ) cb[p] = [] ;
  518.                                
  519.                                 var label = v.labels[curlang].value ;
  520.                                 var linktarget = (opt.linktarget===undefined?'':" target='"+opt.linktarget+"'") ;
  521.                                 if ( opt.links == 'wikidata' ) {
  522.                                         cb[p].push ( "<a href='//www.wikidata.org/wiki/"+ q + "'" + linktarget +">" + label + "</a>" ) ;
  523.                                 } else if ( opt.links == 'reasonator_local' ) {
  524.                                         cb[p].push ( "<a href='?lang="+opt.reasonator_lang+"&q="+ q + "'" + linktarget +">" + label + "</a>" ) ;       
  525.                                 } else if ( opt.links == 'reasonator' ) {
  526.                                         cb[p].push ( "<a href='/reasonator/?lang="+opt.reasonator_lang+"&q="+ q + "'" + linktarget +">" + label + "</a>" ) ;   
  527.                                 } else if ( opt.links == 'wikipedia' && undefined !== v.sitelinks && undefined !== v.sitelinks[self.lang+'wiki'] ) {
  528.                                         var page = mw.util.wikiUrlencode ( v.sitelinks[self.lang+'wiki'].title ) ;
  529.                                         if ( opt.local_links ) cb[p].push ( "<a href='/wiki/"+ page + "'" + linktarget +">" + label + "</a>" ) ;
  530.                                          else cb[p].push ( "<a href='//"+self.lang+".wikipedia.org/wiki/"+ page + "'" + linktarget +">" + label + "</a>" ) ;
  531.                                 } else if ( opt.links != '' && undefined !== v.sitelinks && undefined !== v.sitelinks[self.lang+opt.links] ) {
  532.                                         var page = mw.util.wikiUrlencode ( v.sitelinks[self.lang+opt.links].title ) ;
  533.                                         if ( opt.local_links ) cb[p].push ( "<a href='/wiki/"+ page + "'" + linktarget +">" + label + "</a>" ) ;
  534.                                          else cb[p].push ( "<a href='//"+self.lang+"."+opt.links+".org/wiki/"+ page + "'" + linktarget +">" + label + "</a>" ) ;
  535.                                 } else cb[p].push ( label ) ;
  536.                         } ) ;
  537.                         callback ( cb ) ;
  538.                 } ) ;
  539.         } ,
  540.        
  541.         labelItem : function ( q , callback ) {
  542.                 this.labelItems ( [ [0,q] ] , function ( item_labels ) {
  543.                         callback ( ((item_labels||[])[0]||[])[0] ) ;
  544.                 } ) ;
  545.         } ,
  546.        
  547.         setTarget : function ( opt , html , q ) {
  548.                 var self = this ;
  549.                 if ( q !== undefined && undefined === self.cache[q] ) self.cache[q] = html ;
  550.                 if ( undefined !== opt.target ) opt.target.html ( html ) ;
  551.                 if ( undefined !== opt.callback ) opt.callback ( q , html , opt ) ;
  552.         } ,
  553.        
  554.        
  555.  
  556.         cache : {}
  557.  
  558. } ;
  559.  
  560. wd_auto_desc.init() ;
  561.  
  562. var wd_auto_desc_wd = {
  563.  
  564.         always_show : false ,
  565.         style : 'background-color:#DBEBFF;padding:2px' ,
  566.        
  567.         init : function () {
  568.                 var self = this ;
  569.                 if ( typeof(wd_auto_desc_wd_always_show) != 'undefined' ) self.always_show = wd_auto_desc_wd_always_show ;
  570.                 self.interval = setInterval ( wd_auto_desc_wd.check_dom , 500 ) ;
  571.                 self.check_search_results () ;
  572. //              setInterval ( wd_auto_desc.check_search_results , 1000 ) ;
  573.         } ,
  574.        
  575.         check_search_results : function () {
  576.                 var self = this ;
  577.                 $('div.mw-search-result-heading').each ( function ( k , o ) {
  578.                         var manual_description = $($(o).find('span.wb-itemlink-description')) ;
  579.                         var has_manual_description = manual_description.length > 0 ;
  580.                         if ( !self.always_show && has_manual_description ) return ; // Do not run if manual description is already there
  581.                         var href = $($(o).find('a')).attr('href') ;
  582.                         if ( href === undefined ) return ;
  583.                        
  584.                         var h = '<span class="wb-itemlink-description autodesc-itemlink-description" style="' + self.style + '"><i>' + wd_auto_desc.txt('generating_auto_content') + '</i></span>' ;
  585.                         if ( has_manual_description ) manual_description.prepend ( h+' / ' ) ;
  586.                         else $(o).append ( ': ' + h ) ;
  587.                         var q = href.split('/').pop() ;
  588.                         wd_auto_desc.loadItem ( q , { target:$($(o).find('span.autodesc-itemlink-description')),links:'wikidata',linktarget:'_blank' } ) ;
  589.  
  590.                        
  591.                 } ) ;
  592.         } ,
  593.        
  594.  
  595.        
  596.         check_dom : function () {
  597.                 var self = wd_auto_desc_wd ;
  598.                 if ( self.running ) return ;
  599.                 self.running = true ;
  600.                
  601.                 $( '.ui-ooMenu-item' ).each ( function ( k , v ) {
  602.                         var data = $(v).data('uiOoMenuItem')._entityStub ;
  603.                         if ( typeof data == 'undefined' ) return ;
  604.                         if ( undefined === data ) return ;
  605.                         if ( undefined === data.id ) return ;
  606.                         if ( data.id.substr ( 0 , 1 ) != wd_auto_desc.q_prefix ) return ;
  607.                         var q = data.id ;
  608.  
  609.                         var o = $(v).find('span.ui-entityselector-itemcontent').get(0) ;
  610.                         var manual_description = $($(o).find('span.ui-entityselector-description')) ;
  611.                         if ( !self.always_show && manual_description.length > 0 ) return ;
  612.                         if ( $($(o).find('.autodesc-entityselector-description')).length > 0 ) return ; // HAD THAT
  613.                        
  614.                         var h = "<span class='ui-entityselector-description autodesc-entityselector-description' style='"+self.style+"'><i>" + wd_auto_desc.txt('generating_auto_content') + "</i></span>" ; //
  615.                         $(o).append ( h ) ;
  616.                         var target = $($(o).find('.autodesc-entityselector-description')) ;
  617.                         wd_auto_desc.loadItem ( q , { target : target , callback : function () {
  618.                                 $(target).find('a').css({display:'inline-block'}) ;
  619.                         } } ) ;
  620.                 } ) ;
  621.                 self.running = false ;
  622.         } ,
  623.                
  624.         fin : 0
  625.        
  626. } ;
  627.  
  628. if (typeof mw !== 'undefined' && typeof prevent_wd_auto_desc === 'undefined' ) { // On Wikidata
  629.         $(document).ready( function() {
  630.                 if ( mw.config.get('wgSiteName') != 'Wikidata' ) return ;
  631.                 if ( mw.config.get('wgNamespaceNumber') > 0 ) return ;
  632.                 if ( mw.config.get('wgAction') != 'view' ) return ;
  633.                 wd_auto_desc_wd.init() ;
  634.         } ) ;
  635. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top