User:Rholton/fixdisambig.js

From Wikipedia, the free encyclopedia

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.

addOnloadHook ( init_fixdisambig ) ;
 
fixdisambig_server = "" ;
fixdisambig_real_target = "" ;
 
function fixdisambig_get_selection ()
{
  if (window.getSelection) return window.getSelection();
  else if (document.getSelection) return document.getSelection();
  else if (document.selection) return document.selection.createRange().text;
  return "" ;
}
 
function fixdisambig_get_query(name) {
  var value=null;
  var query=window.location.search;
  if(query != "") {
    var kk=query.indexOf(name+"=");
    if(kk >= 0) {
      kk=kk+name.length+1;
      var ll=query.indexOf("&", kk);
      if(ll < 0)ll=query.length;
      value=query.substring(kk, ll);
      for(kk=0; kk<value.length; kk++) {
        if(value.charAt(kk) == '+') {
          value=value.substring(0, kk)+" "+value.substring(kk+1,value.length);
        }
      }
      value=unescape(value);
    }
  }
  return value;
}
 
function fixdisambig_get_referrer_for_disambig () {
  var catlinks = document.getElementById ( "catlinks" ) ;
  if ( !catlinks ) return "" ;
  var as = catlinks.getElementsByTagName ( "a" ) ;
  var is_disambig = 0 ;
  for ( var ai = 0 ; ai < as.length ; ai++ ) {
    var a = as[ai] ;
    var h = a.getAttribute('href').split('/Category:').pop() ;
    h = h.split('_').join(' ') ;
    if ( h != "Disambiguation" &&
         h != "Lists of ambiguous numbers" &&
         h != "Lists of ambiguous human names"
         ) continue ;
    is_disambig = 1 ;
    break ;
  }
  if ( !is_disambig ) return "" ;
 
  fixdisambig_real_target = wgPageName ;
  var sitesub = document.getElementById('contentSub') ;
  if ( sitesub ) {
    var a = sitesub.getElementsByTagName('a') ;
    if ( a.length > 0 ) {
      a = a[0] ;
      fixdisambig_real_target = a.getAttribute ( 'title' ) ;
    }
  }
 
  var r = document.referrer ;
  if ( r.substr ( 0 , 29 ) == "http://en.wikipedia.org/wiki/" ) {
    fixdisambig_server = r.substr ( 0 , 29 ) ;
    r = r.substr ( 29 ) ;
  } else if ( r.substr ( 0 , 47 ) == "https://secure.wikimedia.org/wikipedia/en/wiki/" ) {
    fixdisambig_server = r.substr ( 0 , 47 ) ;
    r = r.substr ( 47 ) ;
  }
  else r = "" ;
  return r ;
}
 
function fix_disambig_replace ( rtext , rwhat , rwith , rend ) {
  return rtext.split ( rwhat + rend ) . join ( rwith + rend ) ;
}
 
function do_fix_disambig ( fd , rwith ) {   //fd=Sir_William_Jones    rwith=William_Jones_(philologist)
  rwith = "[[" + rwith ;
  rwith = rwith.split("_").join(" ") ;
  var fd1 = fd ;
  fd = "[[" + fd ;						// [[Sir_William_Jones
  var fd2 = fd.split("_").join(" ") ; 	// [[Sir William Jones
 
  document.editform.wpMinoredit.checked = true ;
  document.editform.wpSummary.value = "Replacing disambiguation link to " + fd2 + 
                                      "]] with direct link to " + rwith + "]] (using [[User:Magnus Manske/fixdisambig.js|FixDisambig.js]])" ;
 
  var text = document.editform.wpTextbox1.value ;
  text = fix_disambig_replace ( text , fd , rwith , "|" ) ;       // if already piped, don't mess with the pipe
  text = fix_disambig_replace ( text , fd , rwith+"|"+fd1 , "]]" ) ;  // if no pipe, just add the pipe
  text = fix_disambig_replace ( text , fd2 , rwith , "|" ) ;
  text = fix_disambig_replace ( text , fd2 , rwith+"|"+fd1 , "]]" ) ;
  document.editform.wpTextbox1.value = text ;
 
  document.getElementById("wpDiff").click() ; // Run diff
}
 
function init_fixdisambig () {
  var fd = fixdisambig_get_query ( "fix_disambig" ) ;
  var rwith = fixdisambig_get_query ( "fix_disambig_with" ) ;
  if ( fd && rwith && fd != "" && rwith != "" ) {
    do_fix_disambig ( fd , rwith ) ;
    return ;
  }
  var r = fixdisambig_get_referrer_for_disambig () ;
  if ( r ==  "" ) return ;
 
  var out = '<li id="t-permalink">' ;
  out += "<a href='javascript:run_fix_disambig();'>Fix disambig</a>" ;
  out += "</li>" ;
 
  var tools = document.getElementById("p-tb") ;
  tools = tools.getElementsByTagName("ul")[0] ;
  tools.innerHTML += out ; // Yeah, I know...
}
 
function run_fix_disambig () {
  var sel = fixdisambig_get_selection () ;
  if ( sel == "" ) {
    var r2 = wgPageName.split("_").join(" ") + " ()" ;
    sel = prompt ( "Please enter the new target (you could have skipped this by selecting the new title in the page text):" , r2 ) ;
    if ( !sel || sel == "" || sel == r2 ) return ;
  }
  var r = fixdisambig_get_referrer_for_disambig () ;
  document.location = fixdisambig_server + r + "?action=edit&fix_disambig=" +
                      escape ( fixdisambig_real_target ) + "&fix_disambig_with=" + escape ( sel ) ;
}