MediaWiki:Reveal.js
From KIproBatt Wiki
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.
$(document).ready(function () {
if ($('#p-cactions').length === 0) return; //check if tool bar exists
$menu_entry = $('#p-cactions').find('ul').children().first().clone(); //find "more" page menu and clone first entry
if ($menu_entry.length === 0) return; //check if entry exists
$menu_entry.find('a').attr('href', mw.config.get( 'wgArticlePath' ).replace('$1', mw.config.get( 'wgPageName' ) ) + '?reveal=true');
$menu_entry.attr('id', 'ca-reveal');
$menu_entry.find('a').text('Slideshow');
$menu_entry.find('a').attr('title', 'View this page as a slideshow [Alt+Shift+s]');
$menu_entry.find('a').attr('accesskey', 's');
$('#p-cactions').find('ul').append($menu_entry); //insert entry
});
$(document).ready(function () {
var recursion_object = {};
searchParams = new URLSearchParams(window.location.search);
var requested = searchParams.has('reveal') && searchParams.get('reveal') === 'true';
var req_animate = searchParams.has('animate') && searchParams.get('reveal') === 'true';
if (!requested) return;
mw.loader.load("//repolab.github.io/reveal.js/dist/reveal.css", "text/css");
mw.loader.load("//repolab.github.io/reveal.js/dist/theme/white.css", "text/css");
$.when(
$.getScript("//repolab.github.io/reveal.js/dist/reveal.js"),
$.getScript("//repolab.github.io/reveal.js/plugin/zoom/zoom.js"),
$.getScript("//repolab.github.io/reveal.js/plugin/notes/notes.js"),
$.getScript("//repolab.github.io/reveal.js/plugin/search/search.js"),
$.Deferred(function (deferred) {
$(deferred.resolve);
})
).done( async function () {
console.log("Reveal init");
var reveal_body = $('<body>\
<div class="reveal" id="reveal">\
</div></body>');
//display title and authors
var contributors;
var contributor_names = "";
await fetch(`/w/api.php?action=query&prop=contributors&titles=${mw.config.get( 'wgPageName' )}&format=json`)
.then(res => res.json())
.then(data => {
contributors = data.query.pages[Object.keys(data.query.pages)[0]].contributors;
contributors.forEach(function(contributor){
contributor_names += contributor.name + ", ";
});
contributor_names = contributor_names.slice(0, -2);
});
var reveal_slides = $(`\
<div class="slides" id=reveal-slides">\
<section style="top: 40%; font-size: 2em;"><div>${mw.config.get( 'wgPageName' )}</div><div style="font-size: 0.5em; padding-left: 10%; padding-right: 10%;">${contributor_names}</div></section>\
</div>`);
$(reveal_body).append(reveal_slides);
//remove original page
var original_page = $('body').children().detach();
//create hidden div
$('body').append('<div id="original-page" style="display:none"></div>');
//move original page content to hidden div
$(original_page).appendTo("#original-page");
$('body').append(reveal_body); //insert new content
//insert close and print link
$print_link = $('<a class="reveal-print"><i class="fa fa-caret-right" style="position: fixed; right: 140px; bottom: 30px; z-index: 30; font-size: 24px;">🖨</i></a>');
$print_link.on('click', function(){var url = new window.URL(window.location); url.searchParams.append('print-pdf', true); window.location=url;});
$close_link = $('<a class="reveal-close"><i class="fa fa-caret-right" style="position: fixed; right: 180px; bottom: 30px; z-index: 30; font-size: 24px;">🚪</i></a>');
$close_link.on('click', function(){var url = new window.URL(window.location); url.searchParams.delete('reveal'); window.location=url;});
$('body').append($close_link, $print_link); //insert links
//template
var section_template = '<section class="reveal-section"></section>';
var section_template_container = '<div class="column-container-grid"></div>';
var section_template_left = '<div class="div-left"></div>';
var section_template_center = '<div class="div-center"></div>';
var section_template_right = '<div class="div-right"></div>';
var section_template_top = '<div class="div-top"></div>';
$section = $(section_template);
$section_container = $(section_template_container);
$section_left = $(section_template_left);
$section_center = $(section_template_center);
$section_right = $(section_template_right);
$section_top = $(section_template_top);
//init section elements
$section_container.append($section_left, $section_top, $section_center, $section_right);
$section.append($section_container);
$(reveal_slides).append($section);
const elements = $('#mw-content-text').children('.mw-parser-output').children().toArray();
for(let element of elements) {
if(req_animate){
$(element).find('ul').css({
"opacity":"0.0"
});
if($(element).prop('nodeName') === 'UL'){
$(element).css({
"opacity":"0.0"
});
}}
//console.log(i + ": " + $(element).prop('nodeName'));
if ($(element).prop('nodeName') === 'H2'){
$(reveal_slides).append($section);
//reinit section elements
$section = $(section_template);
$section_container = $(section_template_container);
$section_left = $(section_template_left);
$section_center = $(section_template_center);
$section_right = $(section_template_right);
$section_top = $(section_template_top);
$section_container.append($section_left, $section_top, $section_center, $section_right);
$section.append(element);
$section.append($section_container);
//move id attr
$section.attr('id', $(element).children('span').attr('id')); //move id to section for navigation
$(element).children('span').removeAttr('id');
}
else if ($(element).find('a.image').length == 1) $section_right.append(element); //single images to the right
else if ($(element).find('.gallerybox').length > 0) $section_top.append(element); //gallery to the top
else if ($(element).hasClass( "SvgEdit" )) {$section_top.append(element);} //svgedit to the top
else $section_center.append(element); //everything else to the center
}
$(reveal_slides).append($section); //append last slide
//Reveal.initialize();
await Reveal.initialize({
disableLayout: true,
center: false,
controls: true,
controlsTutorial: true,
overview: true,
touch: true,
width: "100%",
height: "100%",
margin: 0,
//minScale: 1,
//maxScale: 1,
slideNumber: true,
showSlideNumber: 'all', //all, print, speaker
hashOneBasedIndex: true, //Use 1 based indexing for # links
hash: true, //Add the current slide number to the URL hash
respondToHashChanges: true, // Flags if we should monitor the hash and change slides accordingly
history: true, // Push each slide change to the browser history. Implies `hash: true`
plugins: [ RevealSearch, RevealNotes, RevealZoom ],
});
//override conflicting bootstrap css, temporary remove hidden attribute
Reveal.addEventListener( 'overviewshown', function( event ) { $('.reveal-section.past, .reveal-section.future').removeAttr('hidden'); } );
Reveal.addEventListener( 'overviewhidden', function( event ) { $('.reveal-section.past, .reveal-section.future').attr('hidden', ''); } );
mw.util.addCSS( '.reveal table { font-size: 50% !important; }'); //override large table css
mw.util.addCSS( '.column-container-flex{ display: flex;} .col {flex: 1;} '); //two column layout
mw.util.addCSS( '.column-container-grid{ display: grid; grid-auto-flow: column;} '); //two column layout
//Checks if only one of the set <div>s is not empty in the container
function allOtherDivsEmpty(){
var count_divs = 0;
if($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length == 4){
var grid_children_length = $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length;
var grid_children = $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children()
for(var i = 0; i < grid_children_length; i++){
if(grid_children[i].innerHTML == ""){
count_divs += 1;
}
}
};
if(count_divs == 3){
return true;
}else{
return false;
}
}
//Deletes empty <div>s in container and changes css if there is only a div-center class with text.
var div_center_only = "";
function deleteEmptyDivs(){
if($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length == 4){
var grid_children_length = $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length;
var grid_children = $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children()
for(var i = 0; i < grid_children_length; i++){
if(grid_children[i].innerHTML == ""){
$(grid_children[i]).remove();
}else{
div_center_only += $(grid_children[i]).attr('class') + " ";
}
}
var ul_inside = $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).find('ul').length;
var no_toc = $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).find('#toc').length;
if(div_center_only.includes('div-center') && !div_center_only.includes('div-top') && !div_center_only.includes('div-left') && !div_center_only.includes('div-right') && ul_inside > 0 && no_toc == 0){
$($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children()[0]).attr('class', "");
$($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children()[0]).attr('class', "div-left");
$($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children()[0]).css({
"text-align": "left",
"padding-left": "10px"
});
}
div_center_only = "";
};
}
//Changes font-size to fit it in the slide
var font_size_content = 1.0;
var rec_count = 0;
function calculateFontSize(current){
var current_old = current;
if(!(current_old in recursion_object) || rec_count > 350){console.log("stop", Reveal.getCurrentSlide()); rec_count = 0; return;}
rec_count++;
deleteEmptyDivs();
if($($(Reveal.getCurrentSlide()).find("h2")[0]).length > 0){
var body_height = $('body')[0].getBoundingClientRect().height - $(Reveal.getCurrentSlide()).find("h2")[0].getBoundingClientRect().height;
var content_height = $(Reveal.getCurrentSlide()).find(".column-container-grid")[0].getBoundingClientRect().height + 50;}
if($($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).find(".div-center")[0]).find("ul").length == 1 && $($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).find(".div-top").length == 0){
var content_ul_height = $($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).find(".div-center")[0]).find("ul")[0].getBoundingClientRect().height;
if(body_height < content_ul_height){
$($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).css('font-size', font_size_content + "em");
font_size_content -= 0.01;
calculateFontSize(current);
}else if(body_height > content_ul_height && (body_height - content_ul_height) > 50){
$($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).css('font-size', font_size_content + "em");
font_size_content += 0.01;
calculateFontSize(current);
}else{
font_size_content = 1.0;
rec_count = 0;
return;
}
}else{
if(body_height < content_height){
$($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).css('font-size', font_size_content + "em");
font_size_content -= 0.01;
calculateFontSize(current);
}else if(body_height > content_height && (body_height - content_height) > 100){
$($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).css('font-size', font_size_content + "em");
font_size_content += 0.01;
calculateFontSize(current);
}else{
font_size_content = 1.0;
rec_count = 0;
return;
}
}
}
//Changes size of images in the div-right class
function resizeImages(){
var images_count = $(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright").length;
if($($(Reveal.getCurrentSlide()).find("h2")[0]).length > 0){
var max_height = $('body')[0].getBoundingClientRect().height - $(Reveal.getCurrentSlide()).find("h2")[0].getBoundingClientRect().height - 50 - (10*images_count);}
var image_max_height = max_height/images_count;
if($(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright").length > 0){
$(Reveal.getCurrentSlide()).find(".column-container-grid").css({
"grid-template-areas": `"c c r" "c c r"`
});
for(var i = 0; i < $(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright").length; i++ ){
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright")[i]).css({
"height": "" + image_max_height + "px",
"margin-bottom": "10px"
});
$($($(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright")[i]).find(".thumbinner")).css({
"height": "" + image_max_height + "px"
});
$($($(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright")[i]).find(".thumbcaption")).css({
"font-size": "" + image_max_height/15 + "px"
});
$($($(Reveal.getCurrentSlide()).find(".column-container-grid").find(".tright")[i]).find(".thumbimage")).attr("height", "70%");
}
}
}
//Changes size of all possible content
function functionality(current_page){
document.body.style.zoom = (window.innerWidth / window.outerWidth);
/*if(window.devicePixelRatio > 1){
document.body.style.zoom = window.devicePixelRatio - 1;
}else{
document.body.style.zoom = window.devicePixelRatio + (1 - window.devicePixelRatio);
}*/
if($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length > 1){
$(Reveal.getCurrentSlide()).find(".column-container-grid").css({
"grid-template-areas": `"t t t" "l c r"`
});
}
if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=drawio-img-]")[0]).length > 0){
$($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=drawio-img-]")[0]).find('img')).css({
"max-width": ""
});
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=map_]")[0]).length > 0){
if($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length > 1){
var max_height_map = $('body')[0].getBoundingClientRect().height - $(Reveal.getCurrentSlide()).find("h2")[0].getBoundingClientRect().height - 50;
deleteEmptyDivs();
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=map_]")[0]).css({
"width": "100%",
"height": "" + max_height_map + "px"
});
$(Reveal.getCurrentSlide()).find(".column-container-grid").css({
"grid-template-areas": `"t t t" "c c c"`
});
}
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=chemViewer_]")[0]).length > 0){
if($($(Reveal.getCurrentSlide()).find(".column-container-grid")[0]).children().length > 1){
var max_height_map = $('body')[0].getBoundingClientRect().height - $(Reveal.getCurrentSlide()).find("h2")[0].getBoundingClientRect().height - 50;
deleteEmptyDivs();
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=chemViewer_]")[0]).css({
"width": "100%",
"height": "" + max_height_map + "px"
});
$(Reveal.getCurrentSlide()).find(".column-container-grid").css({
"grid-template-areas": `"t t t" "c c c"`
});
}
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("#toc")[0]).length > 0){
$(Reveal.getCurrentSlide()).find(".column-container-grid").find("#toc")[0].classList.add("center");
deleteEmptyDivs();
calculateFontSize(current_page);
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("object")[0]).length > 0){
deleteEmptyDivs();
var max_height_pdf = $('body')[0].getBoundingClientRect().height - $(Reveal.getCurrentSlide()).find("h2")[0].getBoundingClientRect().height - 50;
var max_width_pdf = $('body')[0].getBoundingClientRect().width - 100;
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("object")[0]).attr("width", ""+max_width_pdf+"px");
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("object")[0]).attr("height", ""+max_height_pdf+"px");
}else if($(Reveal.getCurrentSlide()).find(".column-container-grid").find("video").length > 0){
deleteEmptyDivs();
var max_height_video = $('body')[0].getBoundingClientRect().height - $(Reveal.getCurrentSlide()).find("h2")[0].getBoundingClientRect().height - 50;
var max_width_video = $('body')[0].getBoundingClientRect().width - 100;
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("video")[0]).css({
"width": ""+max_width_video + "px",
"height": ""+(max_height_video - 200) + "px"
});
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("video").parent()[0]).css({
"width": ""+max_width_video + "px",
"height": ""+(max_height_video - 200) + "px"
});
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find("video").parent().parent()[0]).css({
"width": ""+max_width_video + "px",
"height": ""+max_height_video + "px"
});
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid")).find(".thumb").length > 0 && allOtherDivsEmpty()){
deleteEmptyDivs();
$(Reveal.getCurrentSlide()).find(".column-container-grid").find(".thumb").parent()[0].className = "";
$(Reveal.getCurrentSlide()).find(".column-container-grid").find(".thumb").parent()[0].className = "div-center";
calculateFontSize(current_page);
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid")).find(".gallerybox").length > 0){
$(Reveal.getCurrentSlide()).find(".column-container-grid").css({
"grid-template-areas": `"t t t" "c c c"`
});
$($($(Reveal.getCurrentSlide()).find(".column-container-grid")).find(".div-center")[0]).css({
"text-align": "left",
"padding-left": "10px"
});
deleteEmptyDivs();
calculateFontSize(current_page);
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[href*='talk']")[0]).length > 0){
deleteEmptyDivs();
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid").find("[id^=svgedit]")[0]).length > 0){
deleteEmptyDivs();
$(Reveal.getCurrentSlide()).find(".column-container-grid").css({
"grid-template-areas": `"t t t" "c c c"`
});
$(Reveal.getCurrentSlide()).find(".column-container-grid").find('.mw-svgedit').css({
"padding-right": "5%"
});
if($(Reveal.getCurrentSlide()).find(".column-container-grid").children().length > 1){
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find('.SvgEdit')).css({
"height": "50%"
});
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find('img')).css({
"max-width":"35%"
});
calculateFontSize(current_page);
}else{
$($(Reveal.getCurrentSlide()).find(".column-container-grid").find('img')).css({
"max-width":"50%"
});
}
}else if($($(Reveal.getCurrentSlide()).find(".column-container-grid")).find(".InteractiveSemanticGraph").length > 0){
$($($(Reveal.getCurrentSlide()).find(".column-container-grid")).find(".InteractiveSemanticGraph")[0]).css({
"width": "" + $('body')[0].getBoundingClientRect().width + "px"
});
calculateFontSize(current_page);
}else{
deleteEmptyDivs();
calculateFontSize(current_page);
resizeImages();
}
}
//Sets animation for lists
function animateLists() {
return new Promise( function(resolve){
if($(Reveal.getCurrentSlide()).find(".column-container-grid").find("ul").length > 0){
for(j=0; j < $(Reveal.getCurrentSlide()).find(".column-container-grid").find("ul").length; j++){
var list_elements = $($(Reveal.getCurrentSlide()).find(".column-container-grid").find('ul')[j]).find('li');
for(var i=0;i < list_elements.length; i++){
$(list_elements[i]).addClass('fragment');
}
}};
resolve(true);
});
}
/*function animateLists(){
if($(Reveal.getCurrentSlide()).find(".column-container-grid").find("ul").length > 0){
for(j=0; j < $(Reveal.getCurrentSlide()).find(".column-container-grid").find("ul").length; j++){
var list_elements = $($(Reveal.getCurrentSlide()).find(".column-container-grid").find('ul')[j]).find('li');
for(var i=0;i < list_elements.length; i++){
$(list_elements[i]).addClass('fragment');
}
}}
}
function animateLists(ele){
if($(ele).prop('nodeName') === 'UL'){
$(ele).find('li').addClass('fragment');
//$(list_elements[i]).addClass('fragment');
}
}*/
//Executes script on url change
var opacity_counter = 0;
window.addEventListener('popstate', function (event) {
console.log(req_animate);
var current_href = window.location.href;
recursion_object = {};
recursion_object[""+ current_href] = "";
functionality(current_href);
//animateLists();
async function setOpacity(){
await animateLists().then(function(response){
Reveal.on( 'fragmentshown', event => {
$(event.fragment).parent().css({
"opacity": "1.0"
});
} );
});
}
if(req_animate){
setOpacity();}
});
});
});