mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			167 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			167 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * 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('<ul></ul>').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('<ul></ul>');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /*
							 | 
						||
| 
								 | 
							
								     * 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('<li><ul></ul></li>');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            parent = parent.find('> li:last > ul');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (id) {
							 | 
						||
| 
								 | 
							
								            parent.append('<li><a href="#' + id + '">' + text + '</a></li>');
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            parent.append('<li>' + text + '</li>');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $.fn.toc.defaults = {exclude: 'h1, h5, h6'}
							 | 
						||
| 
								 | 
							
								})(jQuery);
							 |