Difference between revisions of "MediaWiki:Common.js"

m
rm Defiant
m (move arcanum searcher to widget)
m (rm Defiant)
 
(42 intermediate revisions by 4 users not shown)
/* 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
});
 
function showDialog () {
/* 2015-01
var container = document.createElement('div');
add links to Brandon's site and the interview database to the sidebar
container.style.display = 'flex';
*/
container.style.alignItems = 'center';
jQuery(function () {
container.style.justifyContent = 'center';
container.style.position = 'fixed';
container.style.left = '0';
container.style.right = '0';
container.style.top = '0';
container.style.bottom = '0';
container.style.zIndex = '10000';
container.style.background = 'rgba(0, 0, 0, 0.5)';
container.style.filter = 'initial';
 
var window = document.createElement('div');
function ModifySidebar( action, section, name, link ) {
window.className = 'coppermind-spoiler-warning';
/* from https://www.mediawiki.org/wiki/Manual:Interface/Sidebar#Add_or_remove_toolbox_sections_.28JavaScript.29 */
window.style.boxShadow = '0 4px 30px 0 rgba(0, 0, 0, 0.2)';
try {
window.style.width = '90%';
switch ( section ) {
window.style.maxWidth = '600px';
case 'languages':
window.style.borderRadius = '3px';
var target = 'p-lang';
window.style.background = 'white';
break;
window.style.display = 'flex';
case 'toolbox':
window.style.flexDirection = 'column';
var target = 'p-tb';
window.style.boxSizing = 'border-box';
break;
window.style.padding = '16px';
case 'navigation':
window.style.fontSize = '1.5em';
var target = 'p-navigation';
window.style.maxHeight = '90%';
break;
container.appendChild(window);
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;
}
}
 
window.innerHTML = '<h2>⚠️ Spoiler Warning</h2>';
if (!mw.config.get('wgIsArticle') || mw.config.get('wgCanonicalNamespace') !== '')
window.innerHTML += '<p style="font-size: 1em; overflow-y: auto; flex: 1;">Welcome to the Coppermind! Be aware that the wiki may have spoilers for all published works by Brandon Sanderson, <b>including <em>The Sunlit Man</em></b>. By browsing this wiki, you may therefore be subject to spoilers for the entire Cosmere as well as Brandon\'s other works. Additionally, certain pages may contain information about books that have yet to be released. For our full spoiler policy and guidelines, you can visit <a id="spoiler-warning__spoiler-policy-link" href="https://coppermind.net/wiki/Help:Spoilers">our help page on spoilers</a>! If you\'d like to visit the site as it was prior to any book release, you can go to <a id="spoiler-warning__time-machine-link" href="https://coppermind.net/wiki/Special:TimeMachine">our Time Machine!</a></p>';
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 );
});
 
var button = document.createElement('button');
/* 2018-08-22 auto-generate Cite:Arcanum pages for {{wob ref}} */
button.className = 'mw-ui-button mw-ui-destructive';
$(function () {
button.style.alignSelf = 'center';
// determine if this page is editing a Cite: Arcanum page
button.style.fontSize = '1em';
const edit_box = document.querySelector('#editform textarea');
button.innerHTML = 'Proceed';
// check that there is an edit box
button.onclick = function () {
if (!edit_box || mw.config.get('wgCanonicalNamespace') !== 'Cite') return -1;
localStorage.setItem('defiant-spoiler-warning', 'seen');
// check that it's a page creation
document.body.removeChild(container);
if (mw.config.get('wgArticleId') != 0) return -2;
$(document.body).removeClass('spoiler-warning-blur');
// 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()
}
window.appendChild(button);
})
})
 
var style = document.createElement('style');
/* 2018-09-16 display Arcanum entry on Cite:Arcanum-X page */
style.type = 'text/css';
function show_arcanum_entry() {
style.innerHTML = '.spoiler-warning-blur > * { filter: blur(50px); }';
// check that it's an Arcanum page
document.getElementsByTagName('head')[0].appendChild(style);
const page_name = mw.config.get('wgPageName');
 
if (!page_name.startsWith('Cite:Arcanum-')) return;
$(document.body).addClass('spoiler-warning-blur');
// work out the api url
document.body.appendChild(container);
const entry = page_name.split('-')[1];
$('#spoiler-warning__time-machine-link').click(function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); })
const url = 'https://wob.coppermind.net/api/entry/'+ entry +'/';
$('#spoiler-warning__spoiler-policy-link').click(function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); })
// start fetching from Arcanum
}
console.log('fetching '+ url);
 
fetch(url)
if (window.localStorage.getItem('defiant-spoiler-warning') === null && !mw.config.get('wgUserGroups').includes('keeper')) {
.then(function(resp) { return resp.json() })
showDialog();
.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)