123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # 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>
- };
- }
- }
|