Path: blob/main/build-assets/slideous/slideous.js
908 views
/* This work is licensed under Creative Commons GNU LGPL License.12License: http://creativecommons.org/licenses/LGPL/2.1/34Author: Stefan Goessner/2005-20065Web: http://goessner.net/6*/7var Slideous = {8version: 1.0,9// == user customisable ===10clickables: { a: true, button: true, img: true, input: true, object: true, textarea: true, select: true, option: true },11incrementables: { blockquote: { filter: "self, parent" },12dd: { filter: "self, parent" },13dt: { filter: "self, parent" },14h2: { filter: "self, parent" },15h3: { filter: "self, parent" },16h4: { filter: "self, parent" },17h5: { filter: "self, parent" },18h6: { filter: "self, parent" },19li: { filter: "self, parent" },20p: { filter: "self" },21pre: { filter: "self" },22img: { filter: "self, parent" },23object: { filter: "self, parent" },24table: { filter: "self, parent" },25td: { filter: "self, parent" },26th: { filter: "self, parent" },27tr: { filter: "parent, grandparent" }28},29autoincrementables: { ol: true, ul: true, dl: true },30autoincrement: false,31statusbar: true,32navbuttons: { incfontbutton: function(){Slideous.changefontsize(+Slideous.fontdelta);},33decfontbutton: function(){Slideous.changefontsize(-Slideous.fontdelta);},34contentbutton: function(){Slideous.gotoslide(Slideous.tocidx(), true, true);},35homebutton: function(){Slideous.gotoslide(1, true, true);},36prevslidebutton: function(){Slideous.previous(false);},37previtembutton: function(){Slideous.previous(true);},38nextitembutton: function(){Slideous.next(true);},39nextslidebutton: function(){Slideous.next(false);},40endbutton: function(){Slideous.gotoslide(Slideous.count,true,true);} },41fontsize: 125, // in percent, corresponding to body.font-size in css file42fontdelta: 5, // increase/decrease fontsize by this value43mousesensitive: true,44tocidx: 0,45tocitems: { toc: "<li><a href=\"#s{\$slideidx}\">{\$slidetitle}</a></li>",46tocbox: "<option value=\"#s{\$slideidx}\" title=\"{\$slidetitle}\">{\$slidetitle}</option>" },47keydown: function(evt) {48evt = evt || window.event;49var key = evt.keyCode || evt.which;50if (key && !evt.ctrlKey && !evt.altKey) {51switch (key) {52case 33: // page up ... previous slide53Slideous.previous(false); evt.cancel = !Slideous.showall; break;54case 37: // left arrow ... previous item55Slideous.previous(true); evt.cancel = !Slideous.showall; break;56case 32: // space bar57case 39: // right arrow58Slideous.next(true); evt.cancel = !Slideous.showall; break;59case 13: // carriage return ... next slide60case 34: // page down61Slideous.next(false); evt.cancel = !Slideous.showall; break;62case 35: // end ... last slide (not recognised by opera)63Slideous.gotoslide(Slideous.count, true, true); evt.cancel = !Slideous.showall; break;64case 36: // home ... first slide (not recognised by opera)65Slideous.gotoslide(1, true, true); evt.cancel = !Slideous.showall; break;66case 65: // A ... show All67case 80: // P ... Print mode68Slideous.toggleshowall(!Slideous.showall); evt.cancel = true; break;69case 67: // C ... goto contents70Slideous.gotoslide(Slideous.tocidx, true, true); evt.cancel = true; break;71case 77: // M ... toggle mouse sensitivity72Slideous.mousenavigation(Slideous.mousesensitive = !Slideous.mousesensitive); evt.cancel = true; break;73case 83: // S ... toggle statusbar74Slideous.togglestatusbar(); evt.cancel = true; break;75case 61: // + ... increase fontsize76case 107:77Slideous.changefontsize(+Slideous.fontdelta); evt.cancel = true; break;78case 109: // - ... decrease fontsize79Slideous.changefontsize(-Slideous.fontdelta); evt.cancel = true; break;80default: break;81}82if (evt.cancel) evt.returnValue = false;83}84return !evt.cancel;85},8687// == program logic ===88count: 0, // # of slides ..89curidx: 0, // current slide index ..90mousedownpos: null, // last mouse down position ..91contentselected: false, // indicates content selection ..92showall: true,93init: function() {94Slideous.curidx = 1;95Slideous.importproperties();96Slideous.registerslides();97document.body.innerHTML = Slideous.injectproperties(document.body.innerHTML);98Slideous.buildtocs();99Slideous.registeranchors();100Slideous.toggleshowall(false);101Slideous.updatestatus();102document.body.style.fontSize = Slideous.fontsize+"%";103document.getElementById("s1").style.display = "block";104document.onkeydown = Slideous.keydown;105Slideous.mousenavigation(Slideous.mousesensitive);106Slideous.registerbuttons();107if (window.location.hash)108Slideous.gotoslide(window.location.hash.substr(2), true, true);109},110registerslides: function() {111var div = document.getElementsByTagName("div");112Slideous.count = 0;113for (var i in div)114if (Slideous.hasclass(div[i], "slide"))115div[i].setAttribute("id", "s"+(++Slideous.count));116},117registeranchors: function() {118var a = document.getElementsByTagName("a"),119loc = (window.location.hostname+window.location.pathname).replace(/\\/g, "/");120for (var i in a) {121if (a[i].href && a[i].href.indexOf(loc) >= 0 && a[i].href.lastIndexOf("#") >= 0) {122a[i].href = "javascript:Slideous.gotoslide(" + a[i].href.substr(a[i].href.lastIndexOf("#")+2)+",true,true)";123}124}125},126registerbuttons: function() {127var button;128for (var b in Slideous.navbuttons)129if (button = document.getElementById(b))130button.onclick = Slideous.navbuttons[b];131},132importproperties: function() { // from html meta section ..133var meta = document.getElementsByTagName("meta"), elem;134for (var i in meta)135if (meta[i].attributes && meta[i].attributes["name"] && meta[i].attributes["name"].value in Slideous)136switch (typeof(Slideous[meta[i].attributes["name"].value])) {137case "number": Slideous[meta[i].attributes["name"].value] = parseInt(meta[i].attributes["content"].value); break;138case "boolean": Slideous[meta[i].attributes["name"].value] = meta[i].attributes["content"].value == "true" ? true : false; break;139default: Slideous[meta[i].attributes["name"].value] = meta[i].attributes["content"].value; break;140}141},142injectproperties: function(str) {143var meta = document.getElementsByTagName("meta"), elem;144for (var i in meta) {145if (meta[i].attributes && meta[i].attributes["name"])146str = str.replace(new RegExp("{\\$"+meta[i].attributes["name"].value+"}","g"), meta[i].attributes["content"].value);147}148return str = str.replace(/{\$generator}/g, "Slideous")149.replace(/{\$version}/g, Slideous.version)150.replace(/{\$title}/g, document.title)151.replace(/{\$slidecount}/g, Slideous.count);152},153buildtocs: function() {154var toc = document.getElementById("toc"), list = "",155tocbox = document.getElementById("tocbox");156if (toc) {157for (var i=0; i<Slideous.count; i++)158list += Slideous.tocitems.toc.replace(/{\$slideidx}/g, i+1).replace(/{\$slidetitle}/, document.getElementById("s"+(i+1)).getElementsByTagName("h1")[0].innerHTML);159toc.innerHTML = list;160while (toc && !Slideous.hasclass(toc, "slide")) toc = toc.parentNode;161if (toc) Slideous.tocidx = toc.getAttribute("id").substr(1);162}163if (tocbox) {164tocbox.innerHTML = "";165for (var i=0; i<Slideous.count; i++)166tocbox.options[tocbox.length] = new Option((i+1)+". "+document.getElementById("s"+(i+1)).getElementsByTagName("h1")[0].innerHTML, "#s"+(i+1));167tocbox.onchange = function() { Slideous.gotoslide(this.selectedIndex+1, true, true); };168}169},170next: function(deep) {171if (!Slideous.showall) {172var slide = document.getElementById("s"+Slideous.curidx),173item = Slideous.firstitem(slide, Slideous.isitemhidden);174if (deep) { // next item175if (item)176Slideous.displayitem(item, true);177else178Slideous.gotoslide(Slideous.curidx+1, false, false);179}180else if (item) // complete slide ..181while (item = Slideous.firstitem(slide, Slideous.isitemhidden))182Slideous.displayitem(item, true);183else // next slide184Slideous.gotoslide(Slideous.curidx+1, true, false);185Slideous.updatestatus();186}187},188previous: function(deep) {189if (!Slideous.showall) {190var slide = document.getElementById("s"+Slideous.curidx);191if (deep) {192var item = Slideous.lastitem(slide, Slideous.isitemvisible);193if (item)194Slideous.displayitem(item, false);195else196Slideous.gotoslide(Slideous.curidx-1, true, false);197}198else199Slideous.gotoslide(Slideous.curidx-1, true, false);200Slideous.updatestatus();201}202},203gotoslide: function(i, showitems, updatestatus) {204if (!Slideous.showall && i > 0 && i <= Slideous.count && i != Slideous.curidx) {205document.getElementById("s"+Slideous.curidx).style.display = "none";206var slide = document.getElementById("s"+(Slideous.curidx=i)), item;207while (item = Slideous.firstitem(slide, showitems ? Slideous.isitemhidden : Slideous.isitemvisible))208Slideous.displayitem(item, showitems);209slide.style.display = "block";210if (updatestatus)211Slideous.updatestatus();212}213},214firstitem: function(root, filter) {215var found = filter(root);216for (var node=root.firstChild; node!=null && !found; node = node.nextSibling)217found = Slideous.firstitem(node, filter);218return found;219},220lastitem: function(root, filter) {221var found = null;222for (var node=root.lastChild; node!=null && !found; node = node.previousSibling)223found = Slideous.lastitem(node, filter);224return found || filter(root);225},226isitem: function(node, visible) {227var nodename;228return node && node.nodeType == 1 // elements only ..229&& (nodename=node.nodeName.toLowerCase()) in Slideous.incrementables230&& ( Slideous.incrementables[nodename].filter.match("\\bself\\b") && (Slideous.hasclass(node, "incremental") || (Slideous.autoincrement && nodename in Slideous.autoincrementables))231|| Slideous.incrementables[nodename].filter.match("\\bparent\\b") && (Slideous.hasclass(node.parentNode, "incremental") || (Slideous.autoincrement && node.parentNode.nodeName.toLowerCase() in Slideous.autoincrementables))232|| Slideous.incrementables[nodename].filter.match("\\bgrandparent\\b") && (Slideous.hasclass(node.parentNode.parentNode, "incremental") || (Slideous.autoincrement && node.parentNode.parentNode.nodeName.toLowerCase() in Slideous.autoincrementables))233)234&& (visible ? (node.style.visibility != "hidden")235: (node.style.visibility == "hidden"))236? node : null;237},238isitemvisible: function(node) { return Slideous.isitem(node, true); },239isitemhidden: function(node) { return Slideous.isitem(node, false); },240displayitem: function(item, show) {241if (item) item.style.visibility = (show ? "visible" : "hidden");242},243updatestatus: function() {244if (Slideous.statusbar) {245var eos = document.getElementById("eos"),246idx = document.getElementById("slideidx"),247tocbox = document.getElementById("tocbox");248if (eos)249eos.style.visibility = Slideous.firstitem(document.getElementById("s"+Slideous.curidx), Slideous.isitemhidden) != null250? "visible" : "hidden";251if (idx)252idx.innerHTML = Slideous.curidx;253if (tocbox)254tocbox.selectedIndex = Slideous.curidx-1;255}256},257changefontsize: function(delta) {258document.body.style.fontSize = (Slideous.fontsize+=delta)+"%";259},260togglestatusbar: function() {261document.getElementById("statusbar").style.display = (Slideous.statusbar = !Slideous.statusbar) ? "block" : "none";262},263toggleshowall: function(showall) {264var slide, item;265for (var i=0; i<Slideous.count; i++) {266slide = document.getElementById("s"+(i+1));267slide.style.display = showall ? "block" : "none";268while (item = Slideous.firstitem(slide, showall ? Slideous.isitemhidden : Slideous.isitemvisible))269Slideous.displayitem(item, showall);270var divs = slide.getElementsByTagName("div");271for (var j in divs)272if (Slideous.hasclass(divs[j], "handout"))273divs[j].style.display = showall ? "block" : "none";274}275if (!showall)276document.getElementById("s"+Slideous.curidx).style.display = "block";277if (Slideous.statusbar)278document.getElementById("statusbar").style.display = showall ? "none" : "block";279Slideous.showall = showall;280},281hasclass: function(elem, classname) {282var classattr = null;283return (classattr=(elem.attributes && elem.attributes["class"]))284&& classattr.nodeValue.match("\\b"+classname+"\\b");285},286selectedcontent: function() {287return window.getSelection ? window.getSelection().toString()288: document.getSelection ? document.getSelection()289: document.selection ? document.selection.createRange().text290: "";291},292mousenavigation: function(on) {293if (on) {294document.onmousedown = Slideous.mousedown;295document.onmouseup = Slideous.mouseup;296}297else298document.onmousedown = document.onmouseup = null;299},300mousepos: function(e) {301return e.pageX ? {x: e.pageX, y: e.pageY}302: {x: e.x+document.body.scrollLeft, y: e.y+document.body.scrollTop};303},304mousedown: function(evt) {305evt = evt||window.event;306Slideous.mousedownpos = Slideous.mousepos(evt);307Slideous.contentselected = !!Slideous.selectedcontent() || ((evt.target || evt.srcElement).nodeName.toLowerCase() in Slideous.clickables);308return true;309},310mouseup: function(evt) {311evt = evt||window.event;312var pos = Slideous.mousepos(evt);313if (pos.x == Slideous.mousedownpos.x && pos.y == Slideous.mousedownpos.y && !Slideous.contentselected) {314Slideous.next(true);315return evt.returnValue = !(evt.cancel = true);316}317return false;318}319};320window.onload = Slideous.init;321322323