User:Dr pda/persondata.js

From Wikipedia, the free encyclopedia

If a message on your talk page led you here, please be wary of who left it. Code that you insert on this page could contain malicious content capable of compromising your account. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. If this is a .js page, the code will be executed when previewing the page.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
//<pre>
//This function adds a tab which, when clicked, extracts data from an infobox and
//populates the fields of the Persondata template. See the talk page for more details.
//
//To use this function add {{subst:js|User:Dr pda/persondata.js}} to your monobook.js
//
function format_name(x){
   NAME = x.substr(x.indexOf('=')+1);
   NAME = NAME.replace(/'''?/g,'');
   NAME = NAME.replace(/^\s*/g,'');
   NAME = NAME.replace(/\s*$/g,'');
   var comma = NAME.indexOf(',');
   var start = (comma == -1) ? NAME.length : comma;
   var lastSpace = NAME.lastIndexOf(' ',start);
   if(lastSpace != -1){
     NAME = NAME.substring(lastSpace,start)+', '+NAME.substring(0,lastSpace)+NAME.substring(start);
   }
   return NAME;
}
 
function suggestPersonData(){
  var text = document.getElementById('wpTextbox1').value;
 
  //do nothing if article already contains persondata
  if(text.match(/persondata/i)) return;
 
  var template = '';
  var NAME = '';
  var ALTERNATIVE_NAMES = '';
  var SHORT_DESCRIPTION = '';
  var PLACE_OF_BIRTH = '';
  var DATE_OF_BIRTH = '';
  var PLACE_OF_DEATH = '';
  var DATE_OF_DEATH = '';
 
  //handle cases where the template name doesn't contain infobox
  text = text.replace(/{{NFL player/i,'{{NFL player infobox');
  if(text.match(/Infobox/i)){
    start = text.lastIndexOf('{{',text.indexOf('nfobox'));
    stop = text.indexOf('}}',start);
    next = text.indexOf('{{',start+1)
    //Correctly handle other templates used within the infobox
    while (next < stop && text.indexOf('{{',start+1)!= -1){
      next = text.indexOf('{{',stop+1);
      stop = text.indexOf('}}',stop+1);
    }
    template = text.substring(start,stop);
 
    //Remove references, birth/death date and age templates
    template = template.replace(/<ref.*(\/ref>|$)/gm,'');
    template = template.replace(/{{(?:[Bb]irth|[Dd]eath) date(?: and age)?\|\s?(\d{1,4})\|\s?(\d{1,2})\|\s?(\d{1,2}).*}}/g,"$1-$2-$3");
    template = template.replace(/\[\[Image:Flag.*px\]\]/ig,'');
    template = template.replace(/{{flagicon.*}}/ig,'');
    template = template.replace(/<\/?small>/ig,'');
 
    var firstpar = template.indexOf('|');
    template = template.substr(firstpar+1);
 
    var birthplace_in_born = false;  
    var array = template.split(/(\n\s*\||\|\s*\n)/);
    for (x=0;x<array.length;x++){
      if(array[x].match(/subject_name/i)||array[x].match(/^\s*\bname\b/i)||array[x].match(/fullname/i)){
      NAME = format_name(array[x]);
    }
    if(array[x].match(/playername/i)||array[x].match(/birth_?name/i)){
      ALTERNATIVE_NAMES = (ALTERNATIVE_NAMES == '') ? format_name(array[x]):ALTERNATIVE_NAMES + ';' + format_name(array[x]);
    }
    else if(array[x].match(/date_of_birth/i)||array[x].match(/dateofbirth/i)||array[x].match(/birthdate/i)||array[x].match(/birth_date/i)||array[x].match(/date of birth/i)){
      DATE_OF_BIRTH = array[x].substr(array[x].indexOf('=')+1);
    }
    else if(array[x].match(/place_of_birth/i)||(array[x].match(/origin/i)&&birthplace_in_born==false)||array[x].match(/birthplace/i)||array[x].match(/location/i)||array[x].match(/placeofbirth/i)||array[x].match(/birth_place/i)||array[x].match(/place of birth/i)){
      PLACE_OF_BIRTH = array[x].substr(array[x].indexOf('=')+1);
    }
    else if(array[x].match(/born/i)){
      var temp =  array[x].indexOf('<br');
	  if(temp != -1){
	    DATE_OF_BIRTH = array[x].substring(array[x].indexOf('=')+1,temp);
            PLACE_OF_BIRTH = array[x].substr(array[x].indexOf('>',temp)+1);
	    birthplace_in_born = true;
	  }
	  else{
	    DATE_OF_BIRTH = array[x].substring(array[x].indexOf('=')+1);
	  }
    }
    else if(array[x].match(/lived/i)){
      var temp =  array[x].substr(array[x].indexOf('=')+1);
      temp = temp.replace(/born\s*/i,'');
      var dash = temp.search(/&ndash;\s*|-\s*/);
      if(dash >=0){
        DATE_OF_BIRTH = temp.substring(0,dash);
        DATE_OF_DEATH = temp.substring(temp.indexOf(' ',dash)+1);
      }
      else{
        DATE_OF_BIRTH = temp;
      }
    }
    else if(array[x].match(/cityofbirth/i)){
      var temp =  array[x].substr(array[x].indexOf('=')+1);
      temp = temp.match(/.*/);
      PLACE_OF_BIRTH = (PLACE_OF_BIRTH == '') ? temp : temp + ' ,' + PLACE_OF_BIRTH;
    }
    else if(array[x].match(/countryofbirth/i)){
      PLACE_OF_BIRTH = (PLACE_OF_BIRTH == '') ? array[x].substr(array[x].indexOf('=')+1) : PLACE_OF_BIRTH + ',' + array[x].substr(array[x].indexOf('=')+1);
    }
    else if(array[x].match(/date_of_death/i)||array[x].match(/dateofdeath/i)||array[x].match(/deathdate/i)||array[x].match(/death_date/i)||array[x].match(/date of death/i)){
      DATE_OF_DEATH = array[x].substr(array[x].indexOf('=')+1);
    }
    else if(array[x].match(/place_of_death/i)||array[x].match(/deathplace/i)||array[x].match(/placeofdeath/i)||array[x].match(/death_place/i)||array[x].match(/place of death/i)){
      PLACE_OF_DEATH = array[x].substr(array[x].indexOf('=')+1);
    }
    else if(array[x].match(/died/i)){
      var temp =  array[x].indexOf('<br');
	  if(temp != -1){
	    DATE_OF_DEATH = array[x].substring(array[x].indexOf('=')+1,temp);
            PLACE_OF_DEATH = array[x].substr(array[x].indexOf('>',temp)+1);
	  }
	  else{
	    DATE_OF_DEATH = array[x].substring(array[x].indexOf('=')+1);
	  }
    }
    else if(array[x].match(/cityofdeath/i)){
      var temp =  array[x].substr(array[x].indexOf('=')+1);
      temp = temp.match(/.*/);
      PLACE_OF_DEATH = (PLACE_OF_DEATH == '') ? temp : temp + ' ,' + PLACE_OF_DEATH;
    }
    else if(array[x].match(/countryofdeath/i)){
      PLACE_OF_DEATH = (PLACE_OF_DEATH == '') ? array[x].substr(array[x].indexOf('=')+1) : PLACE_OF_DEATH + ',' + array[x].substr(array[x].indexOf('=')+1);
    }
    else if(array[x].match(/occupation/i)||array[x].match(/\bfield\b\s*=/i)||array[x].match(/office/i)){
      SHORT_DESCRIPTION = array[x].substr(array[x].indexOf('=')+1);
      SHORT_DESCRIPTION = SHORT_DESCRIPTION.replace(/\s*<br\s*\/?>\s*/g,', ');
    }
  }
 
  //more tidy up
  DATE_OF_BIRTH = DATE_OF_BIRTH.replace(/\(age? \d*\)/i,'');
  DATE_OF_DEATH = DATE_OF_DEATH.replace(/\(age? \d*\)/i,'');
  }
  if(NAME == ''){
      var pagename = wgPageName.replace(/_/g,' ');
      pagename = pagename.replace(/\(.*\)/g,' ');
      NAME = format_name(pagename);
  }
  if(DATE_OF_BIRTH=='' && text.match(/Category:\d* births/)){
    var catbirth = text.search(/Category:\d* births/);
    DATE_OF_BIRTH = text.substring(catbirth+9,text.indexOf('births')-1);
  } 
  if(DATE_OF_DEATH=='' && text.match(/Category:\d* deaths/)){
    var catdeath = text.search(/Category:\d* deaths/);
    DATE_OF_DEATH = text.substring(catdeath+9,text.indexOf('deaths')-1);
  } 
 
  var persondata = "\n\n<!-- Metadata: see [[Wikipedia:Persondata]] -->\n{{Persondata\n|NAME="+NAME+"\n|ALTERNATIVE NAMES="+ALTERNATIVE_NAMES+"\n|SHORT DESCRIPTION="+SHORT_DESCRIPTION+"\n|DATE OF BIRTH="+DATE_OF_BIRTH+"\n|PLACE OF BIRTH="+PLACE_OF_BIRTH+"\n|DATE OF DEATH="+DATE_OF_DEATH+"\n|PLACE OF DEATH="+PLACE_OF_DEATH+"\n}}\n\n";
 
  var insertPosition = text.indexOf('[[Category:')-1;
  if(text.match('{{DEFAULTSORT')) insertPosition = text.indexOf('{{DEFAULTSORT')-1;
  if(insertPosition != -2){
    document.getElementById('wpTextbox1').value = text.substr(0,insertPosition)+persondata+text.substr(insertPosition+1);
  }
  else{
    alert('This article does not belong to any categories! Consider adding some.');
    document.getElementById('wpTextbox1').value = text+persondata;
  }
  document.getElementById('wpSummary').value += ' adding [[WP:PDATA|persondata]] using [[User talk:Dr pda/persondata.js|User:Dr pda/persondata.js]]';
  document.getElementById('wpDiff').click();
 
}
 
function togglePersondata() {
  var element = document.getElementById('persondata');
 
  if (element.style.display != 'block'){
    element.style.display = 'block';
  }
  else{
    element.style.display = 'none';
  }
}
 
addOnloadHook(function () {
  if(!document.forms.editform){
    if (document.getElementById('persondata') != null){
      addPortletLink('p-cactions', 'javascript:togglePersondata()', 'show/hide persondata', 'ca-pdata', 'Show/hide persondata metadata', '', '');
    }
  }
  else{
    if (wgNamespaceNumber == 0 && document.getElementById('wpTextbox1').value.match(/persondata/i) == null){
      addPortletLink('p-cactions', 'javascript:suggestPersonData()', 'add persondata', 'ca-pdata', 'add persondata metadata', '', '');
    }
  }
});
//</pre>