/*! * jQuery TOC Plugin v1.1.x based on * samaxesJS JavaScript Library * http://code.google.com/p/samaxesjs/ * * Copyright (c) 2008 samaxes.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * 2009-10-04, guwi17: modified and extended to meet uBLAS' needs */ (function($) { /* * The TOC plugin dynamically builds a table of contents from the headings in * a document and prepends legal-style section numbers to each of the headings. */ $.fn.toc = function(options) { var opts = $.extend({}, $.fn.toc.defaults, options); return this.each(function() { var toc = $(this).append('').children('ul'); var headers = {h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0}; var index = 0; var indexes = { h1: (opts.exclude.match('h1') == null && $('h1').length > 0) ? ++index : 0, h2: (opts.exclude.match('h2') == null && $('h2').length > 0) ? ++index : 0, h3: (opts.exclude.match('h3') == null && $('h3').length > 0) ? ++index : 0, h4: (opts.exclude.match('h4') == null && $('h4').length > 0) ? ++index : 0, h5: (opts.exclude.match('h5') == null && $('h5').length > 0) ? ++index : 0, h6: (opts.exclude.match('h6') == null && $('h6').length > 0) ? ++index : 0 }; $(':header').not(opts.exclude).each(function() { var linkId = ""; if ($(this).is('h6')) { checkContainer(headers.h6, toc); updateNumeration(headers, 'h6'); $(this).text(addNumeration(headers, 'h6', $(this).text())); linkId = fixAnchor($(this)); appendToTOC(toc, indexes.h6, linkId, $(this).text(), headers); } else if ($(this).is('h5')) { checkContainer(headers.h5, toc); updateNumeration(headers, 'h5'); $(this).text(addNumeration(headers, 'h5', $(this).text())); linkId = fixAnchor($(this)); appendToTOC(toc, indexes.h5, linkId, $(this).text(), headers); } else if ($(this).is('h4')) { checkContainer(headers.h4, toc); updateNumeration(headers, 'h4'); $(this).text(addNumeration(headers, 'h4', $(this).text())); linkId = fixAnchor($(this)); appendToTOC(toc, indexes.h4, linkId, $(this).text(), headers); } else if ($(this).is('h3')) { checkContainer(headers.h3, toc); updateNumeration(headers, 'h3'); $(this).text(addNumeration(headers, 'h3', $(this).text())); linkId = fixAnchor($(this)); appendToTOC(toc, indexes.h3, linkId, $(this).text(), headers); } else if ($(this).is('h2')) { checkContainer(headers.h2, toc); updateNumeration(headers, 'h2'); $(this).text(addNumeration(headers, 'h2', $(this).text())); linkId = fixAnchor($(this)); appendToTOC(toc, indexes.h2, linkId, $(this).text(), headers); } else if ($(this).is('h1')) { updateNumeration(headers, 'h1'); $(this).text(addNumeration(headers, 'h1', $(this).text())); linkId = fixAnchor($(this)); appendToTOC(toc, indexes.h1, linkId, $(this).text(), headers); } }); }); }; /* * Checks if the last node is an 'ul' element. * If not, a new one is created. */ function checkContainer(header, toc) { if (header == 0 && !toc.find(':last').is('ul')) { toc.find('li:last').append(''); } }; /* * Updates headers numeration. */ function updateNumeration(headers, header) { $.each(headers, function(i, val) { if (i == header) { ++headers[i]; } else if (i > header) { headers[i] = 0; } }); }; /* * Prepends the numeration to a heading. */ function addNumeration(headers, header, text) { var numeration = ''; $.each(headers, function(i, val) { if (i <= header && headers[i] > 0) { numeration += headers[i] + '.'; } }); return removeFinalDot(numeration) + ' ' + text; }; function removeFinalDot(text) { return (text||"").replace(/\.$/g, "" ) } function fixAnchor(element) { // use existing id by default var linkId = element.attr('id'); // next, look for an anchor and use its id or name if ( !linkId ) { element.find('> a:first').each( function() { linkId = $(this).attr('id') || $(this).attr('name'); }); } // next, use the text content as last resort if ( !linkId ) { linkId = (element.text()||"unknown").replace(/[^a-zA-Z0-9]/g,""); } element.attr('id',linkId); return linkId; } /* * Appends a new node to the TOC. */ function appendToTOC(toc, index, id, text, headers) { var parent = toc; for (var i = 1; i < index; i++) { if (parent.find('> li:last > ul').length == 0) { parent = parent.append('
  • '); } parent = parent.find('> li:last > ul'); } if (id) { parent.append('
  • ' + text + '
  • '); } else { parent.append('
  • ' + text + '
  • '); } }; $.fn.toc.defaults = {exclude: 'h1, h5, h6'} })(jQuery);