/
tocslice.js
159 lines (135 loc) · 6.39 KB
/
tocslice.js
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
149
150
151
152
153
154
155
156
157
158
159
/* -*- Mode: Javascript; Character-encoding: utf-8; -*- */
/* ###################### metabook/simpletoc.js ###################### */
/* Copyright (C) 2009-2017 beingmeta, inc.
This file implements the "dynamic table of contents" for the metaBook
e-reader web application.
This file is part of metaBook, a Javascript/DHTML web application for reading
large structured documents.
For more information on knodules, visit www.knodules.net
For more information about beingmeta, visit www.beingmeta.com
This library uses the FDJT (www.fdjt.org) toolkit.
This program comes with absolutely NO WARRANTY, including implied
warranties of merchantability or fitness for any particular
purpose.
Use and redistribution (especially embedding in other
CC licensed content) is permitted under the terms of the
Creative Commons "Attribution-NonCommercial" license:
http://creativecommons.org/licenses/by-nc/3.0/
Other uses may be allowed based on prior agreement with
beingmeta, inc. Inquiries can be addressed to:
licensing@beingmeta.com
Enjoy!
*/
/* jshint browser: true */
/* global metaBook: false */
/* Initialize these here, even though they should always be
initialized before hand. This will cause various code checkers to
not generate unbound variable warnings when called on individual
files. */
// var fdjt=((typeof fdjt !== "undefined")?(fdjt):({}));
// var metaBook=((typeof metaBook !== "undefined")?(metaBook):({}));
// var Knodule=((typeof Knodule !== "undefined")?(Knodule):({}));
metaBook.TOCSlice=
(function(){
"use strict";
var fdjtDOM=fdjt.DOM;
var addClass=fdjtDOM.addClass;
var dropClass=fdjtDOM.dropClass;
var $=fdjtDOM.$;
var MetaBookSlice=metaBook.Slice;
var mbicon=metaBook.icon;
function navicon(kind){
switch (kind) {
case 'right': return mbicon("skim_right",64,64);
case 'left': return mbicon("skim_left",64,64);
case 'start': return mbicon("skim_left_stop",64,64);
case 'end': return mbicon("skim_right_stop",64,64);
default: return false;}}
metaBook.navicon=navicon;
function tocBar(headinfo,context){
var title=fdjtDOM("a.mbtoc_sectname",headinfo.title);
var elements=fdjtDOM("div.mbtoc_elements");
var tocbar=fdjtDOM("div.mbtoc",
fdjtDOM("div.mbtoc_text",
((context)&&(context.cloneNode(true))),
title),
elements);
var start=headinfo.starts_at, end=headinfo.ends_at;
var sectlen=end-start;
if ((headinfo.sub)&&(headinfo.sub.length)) {
var sub=headinfo.sub; var s=0, smax=sub.length;
addClass(tocbar,"mbtocbranch");
while (s<smax) {
var subsect=sub[s++], brick=fdjtDOM("a.mbtoc_sectbrick"); // ," "
var left=subsect.starts_at, size=subsect.ends_at-left;
brick.name="MBTOC4"+subsect.frag;
brick.style.left=(((left-start)/sectlen)*100)+"%";
brick.style.width=(((size)/sectlen)*100)+"%";
if (subsect.title) brick.title=subsect.title;
elements.appendChild(brick);}}
var parent=headinfo.head;
var rel_start=headinfo.starts_at-parent.starts_at;
var outer_length=parent.ends_at-parent.starts_at;
var inner_length=headinfo.ends_at-headinfo.starts_at;
var showsize=fdjtDOM("a.mbtoc_showsize");
addClass(tocbar,"mbtocleaf");
showsize.style.width=((inner_length/outer_length)*100)+"%";
showsize.style.left=((rel_start/outer_length)*100)+"%";
elements.appendChild(fdjtDOM("div.mbtoc_posbar"));
elements.appendChild(showsize);
tocbar.id="MBTOC4"+headinfo.frag;
tocbar.setAttribute("name","MBTOC4"+headinfo.frag);
tocbar.setAttribute("data-passage",headinfo.frag);
tocbar.setAttribute("data-location",headinfo.starts_at);
tocbar.setAttribute("data-level",headinfo.toclevel);
addClass(tocbar,"mbtoc"+headinfo.toclevel);
return tocbar;}
function maketoc(slice,headinfo,context){
var bar=((headinfo.toclevel)&&(tocBar(headinfo,context)));
var card=((bar)&&
({dom: bar,about: headinfo,id: headinfo._id,
head: headinfo.frag,passage: headinfo._id,
location: headinfo.starts_at}));
if (card) {
slice.addCards([card]);
slice.container.appendChild(bar);}
context=fdjtDOM("span.context",
fdjtDOM("span.tocpath","§",headinfo.title));
if ((headinfo.sub)&&(headinfo.sub.length)) {
var sub=headinfo.sub;
var s=0, slim=sub.length; while (s<slim) {
maketoc(slice,sub[s++],context);}}
return slice;}
function MetaBookTOC(rootinfo,dom){
if (!(this instanceof MetaBookTOC))
return new MetaBookTOC(rootinfo,dom);
MetaBookSlice.call(this,dom);
maketoc(this,rootinfo);
return this;}
MetaBookTOC.prototype=new MetaBookSlice();
MetaBookTOC.setHead=function setHead(headinfo){
dropClass($(".mblivetoc"),"mblivetoc");
dropClass($(".mbcurtoc"),"mbcurtoc");
if (!(headinfo)) return;
var head=headinfo;
while (head) {
var refs=document.getElementsByName("MBTOC4"+head.frag);
var j=0; var jlim=refs.length;
while (j<jlim) {
var ref=refs[j++];
addClass(ref,"mblivetoc");
if (head===headinfo) addClass(ref,"mbcurtoc");}
head=head.head;}
var toc=metaBook.slices.statictoc;
if (toc) {
var info=toc.byfrag[headinfo.frag];
if (info) toc.setSkim(info.dom);}};
MetaBookTOC.prototype.mode="statictoc";
metaBook.TOC=MetaBookTOC;
return MetaBookTOC;})();
/* Emacs local variables
;;; Local variables: ***
;;; compile-command: "cd ..; make" ***
;;; indent-tabs-mode: nil ***
;;; End: ***
*/