mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04: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); |