jquery.planize_wev8.js
4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/**
* The planize jQuery plugin adds some features for dealing with hierarchical headings in a given DOM element.
*
* - adds enumerations and anchors in all headings,
* - can generates an HTML table of content and append it to an existing DOM element,
* - in an unobstrusive way.
*
* Example of use:
*
* $('html *').planize();
*
* Configuration object parameters documentation:
* - add_anchors : generates anchors for each header (automatically set to true if `generate_toc` is set to true)
* - callback : a function called when processing is finished
* - debug : prints pretty debug messages into the firebug or opera console, if available
* - generate_toc : generates an html unordered list containing the table of content of the document
* - min_level : min heading level needed to be included in toc and be renumbered (0 = all headings)
* - max_level : max heading level needed to be included in toc and be renumbered (0 = all headings)
* - number_suffix : heading identifier suffix, eg. ')' in "1.2.3)"
* - number_separator : separator for numbers, eg. '.' in "1.2.3)"
* - toc_elem : the dom element where the toc will be append
* - toc_none : the message to display if no headings have been found in the current document
* - toc_title : the title of the table of content
*
* @requires jQuery v1.2 or higher
* @author Nicolas Perriault <nperriault _at_ gmail _dot_ com>
* @license MIT (http://www.opensource.org/licenses/mit-license.php)
* @param Object config Plugin configuration
* @return jQuery(this)
*
*/
(function(jQuery){
jQuery.fn.planize = function(config) {
var self = jQuery(this);
var processed = false;
var toc = '';
var defaultConfig = {
add_anchors : false,
callback : null,
debug : false,
generate_toc : false,
min_level : 1,
max_level : 6,
number_suffix : '',
number_separator : '.',
toc_elem : null,
toc_none : 'No heading found for this document',
toc_title : 'Table of contents'
};
config = jQuery.extend(defaultConfig, config);
/**
* Prepends all headers text with the current tree number reference
* @return void
*/
var process = function() {
var level = 0;
var levels = [0,0,0,0,0,0,0];
var hLevelText = '';
var prependText = '';
var prevLevel = 0;
var n = 0;
self.children('*:header:visible').each(function(index, heading) {
log('Processing heading %o', heading);
level = parseInt(heading.tagName.substring(1));
if (config.min_level <= level && level <= config.max_level) {
n++;
levels[level]++;
for (var l = 1; l <= level; l++) {
hLevelText += levels[l] > 0 ? levels[l] + config.number_separator : '';
}
levels[level + 1] = 0;
hLevelText = hLevelText.substring(0, hLevelText.length - 1);
prependText = hLevelText;
if (config.generate_toc || config.add_anchors) {
if (config.generate_toc) {
var link = '<a href="#h' + hLevelText + '">' +jQuery('<span/>').text(jQuery(this).text()).html() + '</a>';
var elem = "\n"+'<li>' + hLevelText + (config.number_suffix ? config.number_suffix : '') + ' ' + link;
if (level < prevLevel) {
log(hLevelText + ', unnesting because:' + level + '<' + prevLevel);
var unnest = '';
while (level < prevLevel) {
unnest += '</ul>';
prevLevel--;
}
toc += unnest + elem + '</li>';
} else if (level > prevLevel) {
log(hLevelText + ', nesting because:' + level + '>' + prevLevel);
toc += '<ul>' + elem;
} else {
log(hLevelText + ', same level (' + level + ')');
toc += elem;
}
}
prependText = '<span id="h' + hLevelText + '"></span>' + hLevelText;
}
if (config.number_suffix) {
prependText += config.number_suffix;
}
jQuery(this).prepend(prependText + ' ');
prependText = hLevelText = '';
prevLevel = level;
}
});
if (config.generate_toc) {
if (config.toc_title) {
toc = '<h4>' + config.toc_title + '</h4>' + toc;
}
if (n == 0) {
toc += config.toc_none ? '<p>' + config.toc_none + '</p>' : '';
}
jQuery(config.toc_elem ? config.toc_elem : 'body').append(toc);
}
processed = true;
};
/**
* Logs a message into the firebug or opera console if available
*
*/
var log = function() {
if (!config.debug) {
return;
}
try {
console.log.apply(console, arguments);
} catch(e) {
try {
opera.postError.apply(opera, arguments);
} catch(e){}
}
}
process();
if (config.callback) {
config.callback(config.toc_elem);
}
return jQuery(this);
};
})(jQuery);