Utente:Ruthven/DdojePaggene.js
Notarella: Aroppo pubbreca putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe vedé 'e cagnamienti.
- Firefox / Safari: Sprémme 'o buttóne maiuscole e ffà clic ncopp'a Recarreca, o pure spremme Ctrl-F5 o Ctrl-R (⌘-R ncopp'a Mac)
- Google Chrome: spremme Ctrl-Shift-R (⌘-Shift-R ncopp'a nu Mac)
- Internet Explorer/edge: Spremme 'o buttóne Ctrl pe' tramente ca faie click ncopp'a Refresh, o pure spremmere Ctrl-F5
- Opera: Vaje addò 'o Menu → Mpustaziune (Opera → Mpustaziune ncopp' 'o Mac) e po' ncopp'a Privacy & sicurezza → Pulezza date d' 'o browser → Immaggene e file d' 'a cache.
// ==UserScript==
// @name Wikisource Double Page - Ddoje paggene
// @description Wikisource reading mode with two pages side-by-side
// @include http://*.wikisource.org/*
// @author Ruthven
// @date 2019
// ==/UserScript==
// Make sure the utilities module is loaded (will only load if not already)
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ], function () {
$twoPages = false;
// Only for NS Paggena
if ( mw.config.get( 'wgCanonicalNamespace' ) === 'Page' ) {
$( document ).ready( function () {
// Goes back to the initial page
var pageContent = document.getElementById( 'content' ).innerHTML;
$currentPage = mw.config.get( 'wgPageName' );
// Side bar Portlet
var link = mw.util.addPortletLink ( 'p-tb', '#', 'Ddoje paggene', 'pt-twopages', 'Split screen and read two pages at once' );
$( link ).click( function ( event ) {
event.preventDefault();
$twoPages = ! $twoPages;
if ( $twoPages ){
doTwoPages();
} else {
doOnePage( pageContent );
}
replacePortlet( link );
} ); // end link-event
} );
} // ns verification
} );
/**
* Loads the previous two pages.
*/
function doPrev () {
// getting the number of the page
var currentPageNum = parseInt( $currentPage.split( '/' )[1] );
var previousPage = $currentPage.split( '/' )[0] + '/' + ( currentPageNum - 1 );
var previousPrevPage = $currentPage.split( '/' )[0] + '/' + ( currentPageNum - 2 );
$ra.style.backgroundColor = "beige";
if ( (currentPageNum - 1) < 1 ) {
console.log( "Document finished!" );
$la.style.backgroundColor = "black";
return;
} else if ( ( currentPageNum - 2 ) < 1 ) {
$currentPage = previousPage;
// replace left with right
var containerFirst = document.getElementById( 'content-first' );
var replacer = containerFirst.getElementsByClassName( 'mw-parser-output' )[0].innerHTML;
var containerSecond = document.getElementById( 'content-parallel' );
var replacing = containerSecond.getElementsByClassName( 'mw-parser-output' )[0];
replacing.innerHTML = replacer;
var params = {
action: 'parse',
page: previousPage,
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var wikitext = data.parse.text['*'];
// _Heading
var q1 = document.getElementById( 'firstHeading' );
q1.innerHTML = previousPage.replace( /\_/g, ' ' );
var q2 = document.getElementById( 'secondHeading' );
q2.innerHTML = ($currentPage.split( '/' )[0] + '/' + currentPageNum).replace( /\_/g, ' ' );
console.log(currentPageNum);
display( wikitext, containerFirst );
}).fail ( function () {
console.log ( 'Api GET failed!!' );
});
return;
} // end special cases
$currentPage = previousPrevPage;
// gets page -2 and page -1
var params = {
action: 'parse',
page: previousPrevPage,
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var wikitext = data.parse.text[ '*' ];
// _Heading
var q1 = document.getElementById( 'firstHeading' );
if ( q1 !== null )
q1.innerHTML = previousPrevPage.replace( /\_/g, ' ' );
var containerFirst = document.getElementById( 'content-first' );
display(wikitext, containerFirst );
}).fail ( function () {
alert( 'API Query Failed!! (previousPrevPage)' );
});
params = {
action: 'parse',
page: previousPage,
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var wikitext = data.parse.text[ '*' ];
// _Heading
var q2 = document.getElementById( 'secondHeading' );
if ( q2 !== null)
q2.innerHTML = previousPage.replace( /\_/g, ' ' );
var containerParallel = document.getElementById( 'content-parallel' );
display( wikitext, containerParallel );
}).fail ( function () {
console.log ( 'Api GET failed!! (previousPage)' );
});
} // end doPrev
/**
* Loads the next two pages.
*/
function doNext () {
// getting the number of the page
var currentPageNum = parseInt( $currentPage.split( '/' )[1] );
var nextPage = $currentPage.split( '/' )[0] + '/' + (currentPageNum + 2);
var nextNextPage = $currentPage.split( '/' )[0] + '/' + (currentPageNum + 3);
$la.style.backgroundColor = 'beige';
var params = {
action: 'parse',
page: nextPage,
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var wikitext = data.parse.text[ '*' ];
// _Heading
var q1 = document.getElementById( 'firstHeading' );
q1.innerHTML = nextPage.replace( /\_/g, ' ' );
display( wikitext, document.getElementById( 'content-first' ) );
}).fail( function() {
console.log( "Document finished!" );
$ra.style.backgroundColor = "black";
return;
});
params = {
action: 'parse',
page: nextNextPage,
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var wikitext = data.parse.text[ '*' ];
$currentPage = nextPage;
// _Heading
var q2 = document.getElementById( 'secondHeading' );
q2.innerHTML = nextNextPage.replace( /\_/g, ' ' );
var containerParallel = document.getElementById( 'content-parallel' );
display( wikitext, containerParallel );
}).fail( function () {
console.log( "Document finished!" );
$ra.style.backgroundColor = "black";
$currentPage = nextPage;
var q2 = document.getElementById( 'secondHeading' );
q2.innerHTML = '\u00A0';
display( '\u00A0', document.getElementById( 'content-parallel' ));
});
} // end doNext
/**
* Creates empty div
* @param {string} xtext Text to be displayed
* @return {HTMLElement} mwp The HTML element of the portlet menu.
*/
function emptyDivParserOutput ( xtext ) {
var mwp = document.createElement( 'div' );
mwp.setAttribute( 'class', 'mw-parser-output' );
mwp.innerHTML = xtext;
return mwp;
}
/**
* Creates the left arrow.
*/
function rebuildLeftArrow() {
console.log( 'rebuildLeftArrow' );
var prp = document.getElementsByClassName( 'prp-tabs' ) [0];
var li = document.createElement( 'li' );
li.setAttribute( 'id', 'ca-proofreadPagePrevLink' );
li.setAttribute( 'class', 'icon' );
var sp = document.createElement( 'span' );
$la = document.createElement( 'a' );
$la.setAttribute( 'href', mw.config.get( 'wgArticlePath' ).replace( '$1', $currentPage)); // TODO Check
$la.setAttribute( 'rel', 'prev' );
$la.setAttribute( 'title', 'Paggena precedente' );
$la.setAttribute( 'class', 'oo-ui-icon-previous' );
$la.innerHTML = 'Paggena precedente';
$la.style.backgroundColor = 'black';
sp.appendChild($la);
li.appendChild(sp);
$(li).click(function (event) {
event.preventDefault();
doPrev();
});
prp.insertAdjacentElement( 'afterbegin', li);
$ra.style.backgroundColor = 'beige'; // NB_: there can be the case (1 page text) where ra doesn't exist
}
/**
* Creates the right arrow.
**/
function rebuildRightArrow() {
console.log( 'rebuildRightArrow' );
var prp = document.getElementsByClassName( 'prp-tabs' ) [0];
var li = document.createElement( 'li' );
li.setAttribute( 'id', 'ca-proofreadPageNextLink' );
li.setAttribute( 'class', 'icon' );
var sp = document.createElement( 'span' );
$ra = document.createElement( 'a' );
$ra.setAttribute( 'href', mw.config.get( 'wgArticlePath' ).replace( '$1', $currentPage) ); // TODO Check
$ra.setAttribute( 'rel', 'next' );
$ra.setAttribute( 'title', 'Paggena successiva' );
$ra.setAttribute( 'class', 'oo-ui-icon-next' );
$ra.innerHTML = 'Paggena successiva';
$ra.style.backgroundColor = 'black';
sp.appendChild($ra);
li.appendChild(sp);
$(li).click(function (event) {
event.preventDefault();
doNext();
});
prp.insertBefore(li, document.getElementById( 'ca-nstab-page' ));
$la.style.backgroundColor = 'beige';
}
/**
* Creates a parallel text with the next page.
*
* @param {string} cont The HTML content to display.
*/
function doOnePage ( cont ) {
// Navigation arrows
try {
$la.style.backgroundColor = '';
} catch (e) {
console.log( e.message );
}
try {
$ra.style.backgroundColor = '';
} catch (e) {
console.log( e.message );
}
var c = document.getElementById( 'content' );
c.innerHTML = cont;
}
/**
* Queries and displays the page contents.
*/
function doTwoPages () {
// getting the number of the page
// TODO: here put always odd page at left
var currentPageNum = parseInt( $currentPage.split( '/' )[1] );
var nextPage = $currentPage.split( '/' )[0] + '/' + ( currentPageNum + 1 );
console.log(nextPage);
var params = {
action: 'parse',
page: nextPage,
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var wikitext = data.parse.text[ '*' ];
firstDisplay( wikitext, nextPage );
}).fail( function () {
console.log( 'Next page does not exist' );
var wikitext = '\u00A0';
firstDisplay( wikitext, $currentPage) ;
});
// Navigation arrows
try {
$la.style.backgroundColor = 'beige';
} catch (e) {
console.log( e.message );
}
try {
$ra.style.backgroundColor = 'beige';
} catch (e) {
console.log( e.message );
}
}
/**
* Modifies the portlet menu element of the gadget,
* showing one or two pages visualisation mode.
*
* @param {HTMLElement} pt The HTML element of the portlet menu.
*/
function replacePortlet( pt ) {
var a = pt.getElementsByTagName( 'a' )[0];
if ( $twoPages ) {
a.setAttribute( 'title', 'go back to single page' );
a.innerHTML = "Na paggena sula";
} else {
a.setAttribute( 'title', 'Split screen and read two pages at once' );
a.innerHTML = "Doje paggene";
}
}
/**
* Displays a text.
*
* @param (string) wtext Content to display.
* @param {HTMLElement} container The HTML element where to put the content.
*/
display = function(wtext, container) {
var replacing = container.getElementsByClassName( 'mw-parser-output' )[0];
replacing.innerHTML = wtext;
} // end display
/**
* First time the gadget is called.
* Displays a text.Creates a parallel text with the next page
*
* @param (string) wtext Content to display.
* @param {string} nextPage The pagename of the next page.
*/
firstDisplay = function( wtext, nextPage ) {
// builds arrows if necessary
if ( document.getElementById('ca-proofreadPagePrevLink') !== null ) {
var leftArr = document.getElementById('ca-proofreadPagePrevLink');
$la = leftArr.getElementsByTagName('a')[0];
$la.style.backgroundColor = 'beige';
} else {
rebuildLeftArrow();
}
if ( document.getElementById( 'ca-proofreadPageNextLink' ) !== null ) {
var rightArr = document.getElementById( 'ca-proofreadPageNextLink' );
$ra = rightArr.getElementsByTagName( 'a' )[0];
$ra.style.backgroundColor = 'beige';
} else {
rebuildRightArrow();
}
var leftArr = document.getElementById( 'ca-proofreadPagePrevLink' );
var rightArr = document.getElementById( 'ca-proofreadPageNextLink' );
$la = leftArr.getElementsByTagName( 'a' )[0];
$ra = rightArr.getElementsByTagName( 'a' )[0];
$(leftArr).click( function ( event ) {
if ( $twoPages ) {
event.preventDefault();
doPrev();
}
});
$( rightArr ).click(function ( event ) {
if ( $twoPages ) {
event.preventDefault();
doNext();
}
});
// create div and set innerHTML to link
var currentPageElm = document.getElementsByClassName( 'prp-page-content' )[0];
currentPageElm.style.width = "48%";
currentPageElm.id = 'content-first';
// TODO, there is the question if ltr or rtl (?)
var i = document.getElementsByClassName( 'prp-page-image' )[0];
i.setAttribute( 'class', 'prp-page-content' );
i.removeChild( i.firstElementChild );
i.setAttribute( "id", "content-parallel" );
i.style.float = "right";
i.style.width = "48%";
var headNext = document.createElement( "h1" );
headNext.setAttribute( 'id', 'secondHeading' );
headNext.setAttribute( 'class', 'firstHeading' );
headNext.style.paddingTop = '0';
i.appendChild( headNext );
if ( $currentPage === nextPage ) { // A way to check if we're at the last page
var mwp = emptyDivParserOutput( wtext );
var myText = document.createTextNode( '\u00A0' );
headNext.appendChild( myText );
i.appendChild( mwp );
} else {
var myText = document.createTextNode( nextPage.replace( /\_/g, ' ' ) );
headNext.appendChild( myText );
}
i.insertAdjacentHTML( 'beforeend', wtext );
// _Heading
var prpcontainer = document.getElementsByClassName( 'prp-page-content' )[0];
var c = document.getElementById( 'content' );
var q = document.getElementById( 'firstHeading' );
c.removeChild( q );
prpcontainer.insertAdjacentElement( 'afterbegin', q );
// insert divContainer into the DOM
if (window.mw.config.get( 'skin' ) === 'monobook' ) {
var divContainer = document.createElement( 'div' );
divContainer.setAttribute( "class", "mw-body" );
divContainer.setAttribute( "id", "content-parallel" );
//contents.setAttribute( "lang", lang);
//contents.setAttribute( "dir", dir);
//contents.setAttribute( "xml:lang", xmllang); // probably irrelevant, but set it anyway
container.insertBefore( divContainer, document.getElementById( 'mw-data-after-content' ) );
}
} // end firstDisplay