forked from github/kensanata.oddmuse
117 lines
3.3 KiB
Perl
117 lines
3.3 KiB
Perl
# Copyright (C) 2013 Alex Schroeder <alex@gnu.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 3 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
use strict;
|
|
use v5.10;
|
|
use utf8;
|
|
|
|
AddModuleDescription('toc-js.pl', 'Javascript Table of Contents Extension');
|
|
|
|
our ($HtmlHeaders, @MyInitVariables);
|
|
our ($TocOutlineLibrary);
|
|
|
|
$TocOutlineLibrary = 'http://h5o.googlecode.com/files/outliner.0.5.0.62.js';
|
|
|
|
# Add the dojo script to edit pages.
|
|
push (@MyInitVariables, \&TocScript);
|
|
|
|
sub TocScript {
|
|
# cookie is not initialized yet so we cannot use GetParam
|
|
# Cross browser compatibility: http://www.tek-tips.com/faqs.cfm?fid=4862
|
|
# HTML5 Outlines: http://blog.tremily.us/posts/HTML5_outlines/
|
|
# Required library: http://code.google.com/p/h5o/
|
|
if (GetParam('action', 'browse') eq 'browse') {
|
|
$HtmlHeaders .= qq{
|
|
<script type="text/javascript" src="$TocOutlineLibrary"></script>
|
|
<script type="text/javascript">
|
|
|
|
function addOnloadEvent(fnc) {
|
|
if ( typeof window.addEventListener != "undefined" )
|
|
window.addEventListener( "load", fnc, false );
|
|
else if ( typeof window.attachEvent != "undefined" ) {
|
|
window.attachEvent( "onload", fnc );
|
|
}
|
|
else {
|
|
if ( window.onload != null ) {
|
|
var oldOnload = window.onload;
|
|
window.onload = function ( e ) {
|
|
oldOnload( e );
|
|
window[fnc]();
|
|
};
|
|
}
|
|
else
|
|
window.onload = fnc;
|
|
}
|
|
}
|
|
|
|
// https://stackoverflow.com/questions/280634/endswith-in-javascript
|
|
if (typeof String.prototype.endsWith !== 'function') {
|
|
String.prototype.endsWith = function(suffix) {
|
|
return this.indexOf(suffix, this.length - suffix.length) !== -1;
|
|
};
|
|
}
|
|
|
|
var initToc=function() {
|
|
|
|
var outline = HTML5Outline(document.body);
|
|
if (outline.sections.length == 1) {
|
|
outline.sections = outline.sections[0].sections;
|
|
}
|
|
|
|
if (outline.sections.length > 1
|
|
|| outline.sections.length == 1
|
|
&& outline.sections[0].sections.length > 0) {
|
|
|
|
var toc = document.getElementById('toc');
|
|
|
|
if (!toc) {
|
|
var divs = document.getElementsByTagName('div');
|
|
for (var i = 0; i < divs.length; i++) {
|
|
if (divs[i].getAttribute('class') == 'toc') {
|
|
toc = divs[i];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!toc) {
|
|
var h2 = document.getElementsByTagName('h2')[0];
|
|
if (h2) {
|
|
toc = document.createElement('div');
|
|
toc.setAttribute('class', 'toc');
|
|
h2.parentNode.insertBefore(toc, h2);
|
|
}
|
|
}
|
|
|
|
if (toc) {
|
|
var html = outline.asHTML(true);
|
|
toc.innerHTML = html;
|
|
|
|
items = toc.getElementsByTagName('a');
|
|
for (var i = 0; i < items.length; i++) {
|
|
while (items[i].textContent.endsWith('✎')) {
|
|
var text = items[i].childNodes[0].nodeValue;
|
|
items[i].childNodes[0].nodeValue = text.substring(0, text.length - 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
addOnloadEvent(initToc);
|
|
</script>
|
|
};
|
|
}
|
|
}
|