MediaWiki:Common.js

Revision as of 16:00, 27 July 2019 by Fbstj (talk | contribs) (move arcanum searcher to widget)

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/* Any JavaScript here will be loaded for all users on every page load. */

/*
  wrapper for creating new html elements
*/
function ne(tag, attrs) {
  var _ = $(document.createElement(tag));
  for (var i in attrs)
    _.attr(i, attrs[i]);
  return _;
}

/* push Notes down below infoboxes */
$('h2:contains("Notes")').attr('class','notes');

/* replace "Coppermind:Welcome" with "Welcome to the Coppermind" */
$('h1:contains("Coppermind:Welcome")').text("Welcome to the Coppermind");

/* 2014-05
  add title attributes to all ref tags, containing the text shown in the ref
*/
$('[id*="cite_ref"]').each(function (i, el) {
    var el = $(el)
    var a = $('[href="#'+el.attr('id')+'"]')
    el.attr('title', a.next('.reference-text').text() || a.parent().nextAll('.reference-text').text())
})

/* 2017-11 - protect roll back links */
$('.mw-rollback-link').attr('onclick', "return confirm('definitely roll back?')")

/* 2014-04
  augment actionpaths edits to LocalSetting.php 
*/
$('[href*="title="]').attr('href', function (i, value) {
  const old_link = value
  //console.debug('was linking to:', value)
  value = value.replace(/\/wiki\/\?title=([^&]+)\&(.+)/, "/wiki/$1?$2")
  value = value.replace(/\/w\/index.php\?title=(.+?)\&(.+?)/, "/wiki/$1?$2")
  if (old_link != value)
    console.debug('now linking to:', value, 'not:', old_link)
  return value
})
$(function() {

document.querySelectorAll('form.mw-search').forEach(function(form) { form.setAttribute('action','/wiki/Special:Search') })
document.querySelectorAll('form#search').forEach(function(form) { form.setAttribute('action', '/wiki/Special:Search') })

document.querySelectorAll('form[action*="/w/index.php"]').forEach(function(form) {
  console.debug('changing form', form, 'with action', form.getAttribute('action'), 'to `?`')
  form.setAttribute('action', '?')
})

});

/* 2015-01
  add links to Brandon's site and the interview database to the sidebar
*/
jQuery(function () {

  function ModifySidebar( action, section, name, link ) {
  /* from https://www.mediawiki.org/wiki/Manual:Interface/Sidebar#Add_or_remove_toolbox_sections_.28JavaScript.29 */
	try {
		switch ( section ) {
			case 'languages':
				var target = 'p-lang';
				break;
			case 'toolbox':
				var target = 'p-tb';
				break;
			case 'navigation':
				var target = 'p-navigation';
				break;
			default:
				var target = 'p-' + section;
				break;
		}
 
		if ( action == 'add' ) {
			var node = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];
 
			var aNode = document.createElement( 'a' );
			var liNode = document.createElement( 'li' );
 
			aNode.appendChild( document.createTextNode( name ) );
			aNode.setAttribute( 'href', link );
			liNode.appendChild( aNode );
			liNode.className = 'plainlinks';
			node.appendChild( liNode );
		}
 
		if ( action == 'remove' ) {
			var list = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];
 
			var listelements = list.getElementsByTagName( 'li' );
 
			for ( var i = 0; i < listelements.length; i++ ) {
				if (
					listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||
					listelements[i].getElementsByTagName( 'a' )[0].href == link
				)
				{
					list.removeChild( listelements[i] );
				}
			}
		}
 
	} catch( e ) {
		// let's just ignore what's happened
		return;
	}
  }

  if (!mw.config.get('wgIsArticle') || mw.config.get('wgCanonicalNamespace') !== '')
    return;
  if (mw.config.get('wgCategories').includes('Meta'))
    return;
  var title = mw.config.get('wgTitle');
  ModifySidebar( 'add', 'toolbox', "Search Brandon's website for " + title, 'https://brandonsanderson.com/?s='+ title );
  ModifySidebar( 'add', 'toolbox', 'Search Arcanum for '+ title, 'https://wob.coppermind.net/adv_search/?query='+ title );
});

/* 2018-08-22 auto-generate Cite:Arcanum pages for {{wob ref}} */
$(function () {
  // determine if this page is editing a Cite: Arcanum page
  const edit_box = document.querySelector('#editform textarea');
  // check that there is an edit box
  if (!edit_box || mw.config.get('wgCanonicalNamespace') !== 'Cite') return -1;
  // check that it's a page creation
  if (mw.config.get('wgArticleId') != 0) return -2;
  // check that it's an Arcanum page
  const page_name = mw.config.get('wgPageName');
  if (!page_name.startsWith('Cite:Arcanum-')) return -3;
  // work out the api url
  const entry = page_name.split('-')[1];
  const url = 'https://wob.coppermind.net/api/entry/'+ entry +'/';
  // start fetching from Arcanum
  fetch(url)
    .then(function(resp) { return resp.json() })
    .then(function(json) {
  if (!json || !json.event) { return; }
  // the <arcanum-entry-info> tag
  const tag = '<arcanum-entry-info date="'+ (json.date || json.event_date) +'" event="'+ json.event +'">'+ json.event_name +'</arcanum-entry-info>';
  // the rest of the page
  const page = tag +"<noinclude>\n\n== Users ==\n{{Special:WhatLinksHere/{{FULLPAGENAME}}|}}\n[[category: generated citations]]\n";
  // only fill in the edit box if it is currently blank
  if (edit_box.value == '') {
    edit_box.value = page;
    // preview the page
    document.querySelector('[name="wpPreview"]').click()
  }
    })
})

/* 2018-09-16 display Arcanum entry on Cite:Arcanum-X page */
function show_arcanum_entry() {
  // check that it's an Arcanum page
  const page_name = mw.config.get('wgPageName');
  if (!page_name.startsWith('Cite:Arcanum-')) return;
  // work out the api url
  const entry = page_name.split('-')[1];
  const url = 'https://wob.coppermind.net/api/entry/'+ entry +'/';
  // start fetching from Arcanum
  console.log('fetching '+ url);
  fetch(url)
    .then(function(resp) { return resp.json() })
    .then(function(json) {
  // debugging:
  console.log('Entry '+ entry, json);
  // create containing element
  const entry_el = document.createElement('article');
  entry_el.classList.add('arcanum-entry');
  // add lines
  json.lines.forEach(function(line) {
    // create speaker element
    const speaker = document.createElement('h4');
    speaker.innerText = line.speaker;
    if (speaker.innerText.includes('href') && speaker.innerText.includes('twitter.com')) {
      // speaker is a link to twitter, so show it as such
      speaker.innerHTML = speaker.innerText
    }
    // append the speaker and html from the line
    entry_el.appendChild(speaker);
    entry_el.innerHTML += line.text;
  });
  // place container on page
  const users_el = document.getElementById('Users').parentElement
  users_el.parentElement.insertBefore(entry_el, users_el);
    });
};
// 2018-11-27 split the above into two so the function can be used elsewhere
//$(function () { show_arcanum_entry() });
mw.hook('wikipage.content').add(show_arcanum_entry)