Difference between revisions of "MediaWiki:Common.js"
Jump to navigation
Jump to search
m (try again) |
m (rm Defiant) |
||
(45 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ |
/* 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" */ |
/* replace "Coppermind:Welcome" with "Welcome to the Coppermind" */ |
||
$('h1:contains("Coppermind:Welcome")').text("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 |
/* 2014-04 |
||
Line 43: | Line 18: | ||
$(function() { |
$(function() { |
||
− | document. |
+ | 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') }) |
||
− | const search_form = document.querySelector('form#search') |
||
− | if (search_form) search_form.setAttribute('action','/wiki/Special:Search'); |
||
document.querySelectorAll('form[action*="/w/index.php"]').forEach(function(form) { |
document.querySelectorAll('form[action*="/w/index.php"]').forEach(function(form) { |
||
console.debug('changing form', form, 'with action', form.getAttribute('action'), 'to `?`') |
console.debug('changing form', form, 'with action', form.getAttribute('action'), 'to `?`') |
||
− | + | form.setAttribute('action', '?') |
|
}) |
}) |
||
}); |
}); |
||
+ | 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; |
||
+ | window.innerHTML = '<h2>⚠️ Spoiler Warning</h2>'; |
||
− | break; |
||
+ | 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>'; |
||
− | } |
||
+ | |||
− | |||
+ | var button = document.createElement('button'); |
||
− | if ( action == 'add' ) { |
||
+ | button.className = 'mw-ui-button mw-ui-destructive'; |
||
− | var node = document.getElementById( target ) |
||
+ | button.style.alignSelf = 'center'; |
||
− | .getElementsByTagName( 'div' )[0] |
||
+ | button.style.fontSize = '1em'; |
||
− | .getElementsByTagName( 'ul' )[0]; |
||
+ | button.innerHTML = 'Proceed'; |
||
− | |||
+ | button.onclick = function () { |
||
− | var aNode = document.createElement( 'a' ); |
||
+ | localStorage.setItem('defiant-spoiler-warning', 'seen'); |
||
− | var liNode = document.createElement( 'li' ); |
||
+ | document.body.removeChild(container); |
||
− | |||
+ | $(document.body).removeClass('spoiler-warning-blur'); |
||
− | 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.appendChild(button); |
||
+ | var style = document.createElement('style'); |
||
− | if (!mw.config.get('wgIsArticle') || mw.config.get('wgCanonicalNamespace') !== '') |
||
+ | style.type = 'text/css'; |
||
− | return; |
||
+ | style.innerHTML = '.spoiler-warning-blur > * { filter: blur(50px); }'; |
||
− | if (mw.config.get('wgCategories').includes('Meta')) |
||
+ | document.getElementsByTagName('head')[0].appendChild(style); |
||
− | 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 ); |
||
− | }); |
||
+ | $(document.body).addClass('spoiler-warning-blur'); |
||
− | /* 2017-11: functions for generating links and buttons */ |
||
+ | document.body.appendChild(container); |
||
− | // make an <a> with a url and some text |
||
+ | $('#spoiler-warning__time-machine-link').click(function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); }) |
||
− | function make_a(url, text) { |
||
+ | $('#spoiler-warning__spoiler-policy-link').click(function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); }) |
||
− | const el = document.createElement('a') |
||
− | el.setAttribute('href', url) |
||
− | el.innerText = text |
||
− | return el |
||
} |
} |
||
+ | if (window.localStorage.getItem('defiant-spoiler-warning') === null && !mw.config.get('wgUserGroups').includes('keeper')) { |
||
− | // make a nice link button for the edit box |
||
+ | showDialog(); |
||
− | function make_edit_button(url, text, title) { |
||
− | // create link element |
||
− | const ln = make_a(url, text) |
||
− | ln.setAttribute('target', '_blank') |
||
− | // create wrap element |
||
− | const el = document.createElement('span') |
||
− | el.setAttribute('title', title) |
||
− | el.appendChild(ln) |
||
− | // style elements |
||
− | // FIXME: these are copied from the oo-ui elements in the edit box |
||
− | ln.className = 'oo-ui-inputWidget-input oo-ui-buttonElement-button' |
||
− | el.className = 'oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-buttonInputWidget' |
||
− | // return element for insertion |
||
− | return el |
||
} |
} |
||
− | |||
− | // create a link that looks like .editsection |
||
− | function make_editsection_link(url) { |
||
− | // generate an edit link |
||
− | const ln = make_a(url, 'edit') |
||
− | // wrap the link in an '.editsection' link floated right |
||
− | const el = document.createElement('span') |
||
− | el.className = 'mw-editsection' |
||
− | el.style.float = 'right' |
||
− | // push [] around the A element into the span |
||
− | el.appendChild(document.createTextNode('[')) |
||
− | el.appendChild(ln) |
||
− | el.appendChild(document.createTextNode(']')) |
||
− | return el |
||
− | } |
||
− | |||
− | /* add links to edit box */ |
||
− | $(function () { |
||
− | |||
− | const edit_box = document.querySelector('.editButtons') |
||
− | // check that there is an edit box |
||
− | if (!edit_box || mw.config.get('wgCanonicalNamespace') !== '') return |
||
− | |||
− | const page_name = mw.config.get('wgPageName').replace(/[_]/g, '+') |
||
− | |||
− | // add a link to the Arcanum |
||
− | const wob_url = make_edit_button('https://wob.coppermind.net/adv_search/?query='+ page_name, 'Search Arcanum', 'Search Arcanum for "'+ page_name +'"') |
||
− | edit_box.appendChild(wob_url) |
||
− | |||
− | }); |
||
− | |||
− | /* 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) |
Latest revision as of 19:31, 21 February 2024
/* Any JavaScript here will be loaded for all users on every page load. */ /* replace "Coppermind:Welcome" with "Welcome to the Coppermind" */ $('h1:contains("Coppermind:Welcome")').text("Welcome to the Coppermind"); /* 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', '?') }) }); function showDialog () { var container = document.createElement('div'); container.style.display = 'flex'; container.style.alignItems = 'center'; 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'); window.className = 'coppermind-spoiler-warning'; window.style.boxShadow = '0 4px 30px 0 rgba(0, 0, 0, 0.2)'; window.style.width = '90%'; window.style.maxWidth = '600px'; window.style.borderRadius = '3px'; window.style.background = 'white'; window.style.display = 'flex'; window.style.flexDirection = 'column'; window.style.boxSizing = 'border-box'; window.style.padding = '16px'; window.style.fontSize = '1.5em'; window.style.maxHeight = '90%'; container.appendChild(window); window.innerHTML = '<h2>⚠️ Spoiler Warning</h2>'; 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>'; var button = document.createElement('button'); button.className = 'mw-ui-button mw-ui-destructive'; button.style.alignSelf = 'center'; button.style.fontSize = '1em'; button.innerHTML = 'Proceed'; button.onclick = function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); document.body.removeChild(container); $(document.body).removeClass('spoiler-warning-blur'); } window.appendChild(button); var style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = '.spoiler-warning-blur > * { filter: blur(50px); }'; document.getElementsByTagName('head')[0].appendChild(style); $(document.body).addClass('spoiler-warning-blur'); document.body.appendChild(container); $('#spoiler-warning__time-machine-link').click(function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); }) $('#spoiler-warning__spoiler-policy-link').click(function () { localStorage.setItem('defiant-spoiler-warning', 'seen'); }) } if (window.localStorage.getItem('defiant-spoiler-warning') === null && !mw.config.get('wgUserGroups').includes('keeper')) { showDialog(); }