User:Magnus Manske/insertref.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
if ( mw.config.get('wgAction') != "submit" && mw.config.get('wgAction') != "edit" && mw.config.get('wgNamespaceNumber') == 0 ) {
  addOnloadHook ( init_insertref ) ;
}

function init_insertref () {
  var d = document.getElementById('p-tb');
  var ul = d.getElementsByTagName('ul')[0] ;
  var li = document.createElement('li');
  var a = document.createElement('a');
  a.id = 'insertref_link' ;
  a.href='#';
  a.onclick = insertref_onclick ;

  a.appendChild ( document.createTextNode('Insert reference') ) ;
  li.appendChild ( a ) ;
  ul.appendChild ( li ) ;
}

function getSelText()
{
    var txt = '';
     if (window.getSelection)
    {
        txt = window.getSelection();
             }
    else if (document.getSelection)
    {
        txt = document.getSelection();
            }
    else if (document.selection)
    {
        txt = document.selection.createRange().text;
            }
    return txt ;
}

function add_references_section ( s ) {
  var n = s.split ( "<references" ) ;
  if ( n.length > 1 ) return s ; // Already has <references/>
  s = s.split ( "\n=" ) ;
  var last = s.pop() ;
  n = last.split ( "\n" ) ;
  last = "" ;
  var added = false ;
  while ( n.length > 0 ) {
    if ( n[0].substr(0,2) != '{{' && n[0].substr(0,11) != '[[Category:' && n[0].substr(0,11) != '[[category:' ) {
      last += n.shift() + "\n" ;
      continue ;
    }
    last += "\n\n== References ==\n<references />\n\n" + n.shift() + "\n" ;
    last += n.join ( "\n" ) ;
    added = true ;
    break ;
  }
  if ( !added ) last += "\n\n== References ==\n<references />\n" ;

  s.push ( last ) ;
  s = s.join ( "\n=" ) ;
  return s ;
}

function insertref_onclick () {
  var txt = getSelText() ;
  if ( txt == '' ) {
    alert ( 'Please select some text first' ) ;
    return ;
  }

  var url = mw.config.get('wgServer') + mw.config.get('wgScript') + "?action=raw&title=" + mw.config.get('wgTitle') ;
  var request =  new XMLHttpRequest();
  request.open("GET", url, false);
  request.send(null);
  var wiki = request.responseText.split(txt) ;

  if ( wiki.length == 1 ) {
    alert ( "Selected text was not found in wiki source text. Please select a different (smaller) part of the text, with no formatting" ) ;
    return ;
  }

  if ( wiki.length > 2 ) {
    alert ( "Selected text was ambiguous. Please select more (unique) text." ) ;
    return ;
  }

  var reference = prompt ( "Enter reference:" , "<ref></ref>" ) ;

  var c = confirm ( "Insert left (OK) or right (CANCEL) of the selection?" ) ;
  if ( c ) {
    while ( wiki[0] != '' && wiki[0].substr(wiki[0].length-1,1) == '[' ) {
      txt = '[' + txt ;
      wiki[0] = wiki[0].substr(0, wiki[0].length-1) ;
    }
    wiki = wiki[0] + reference + txt + wiki[1] ;
  } else {
    while ( wiki[1] != '' && wiki[1].substr(0,1) == ']' ) {
      txt += ']' ;
      wiki[1] = wiki[1].substr(1) ;
    }
    wiki = wiki[0] + txt + reference +  wiki[1] ;
  }

  wiki = add_references_section ( wiki ) ;

  var a = document.getElementById('insertref_link');

  var f = document.createElement('form') ;
  f.action = mw.config.get('wgServer') + mw.config.get('wgScript') + "?action=edit&title=" + mw.config.get('wgTitle') ;
  f.method='post' ;
  f.style.display = 'none' ;

  var f_text = document.createElement('input') ;
  f_text.type='hidden' ;
  f_text.name='wpTextbox1' ;
  f_text.value=wiki ;

  var f_diff = document.createElement('input') ;
  f_diff.name = 'wpDiff' ;
  f_diff.type='submit' ;
  f_diff.value='Show changes' ;

  f.appendChild ( f_text ) ;
  f.appendChild ( f_diff) ;
  a.parentNode.appendChild ( f ) ;

  f_diff.click() ;

  return false ;
}