book-source 0.3.15 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/StructuredDocument.js +35 -9
- package/lib/documentParts.js +8 -1
- package/lib/postProcesses.js +52 -32
- package/package.json +1 -1
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
const documentParts = require( './documentParts.js' ) ;
|
|
32
31
|
const Style = require( './Style.js' ) ;
|
|
33
32
|
const textPostFilters = require( './textPostFilters.js' ) ;
|
|
34
33
|
|
|
@@ -41,7 +40,8 @@ function StructuredDocument() {
|
|
|
41
40
|
this.title = 'Document' ;
|
|
42
41
|
this.metadata = null ;
|
|
43
42
|
this.theme = null ;
|
|
44
|
-
this.
|
|
43
|
+
this.toc = null ;
|
|
44
|
+
this.tocList = null ;
|
|
45
45
|
this.parts = [] ;
|
|
46
46
|
//this.idList = new Set() ;
|
|
47
47
|
}
|
|
@@ -49,6 +49,7 @@ function StructuredDocument() {
|
|
|
49
49
|
module.exports = StructuredDocument ;
|
|
50
50
|
|
|
51
51
|
// Circular require, should come after exporting
|
|
52
|
+
const documentParts = require( './documentParts.js' ) ;
|
|
52
53
|
const postProcesses = require( './postProcesses.js' ) ;
|
|
53
54
|
|
|
54
55
|
|
|
@@ -57,8 +58,8 @@ StructuredDocument.prototype.render = function( renderer , special = null ) {
|
|
|
57
58
|
let toRender ;
|
|
58
59
|
|
|
59
60
|
switch ( special ) {
|
|
60
|
-
case '
|
|
61
|
-
toRender = this.
|
|
61
|
+
case 'toc' :
|
|
62
|
+
toRender = this.tocList ? [ this.tocList ] : [] ;
|
|
62
63
|
break ;
|
|
63
64
|
default :
|
|
64
65
|
toRender = this.parts ;
|
|
@@ -813,8 +814,20 @@ function parseListItem( str , ctx , indent ) {
|
|
|
813
814
|
|
|
814
815
|
var lastPart = ctx.parts[ ctx.parts.length - 1 ] ;
|
|
815
816
|
|
|
816
|
-
|
|
817
|
-
|
|
817
|
+
switch ( lastPart?.type ) {
|
|
818
|
+
case 'listItem' :
|
|
819
|
+
case 'orderedListItem' :
|
|
820
|
+
// Create the new list as a child of this list-item
|
|
821
|
+
stack( ctx ) ;
|
|
822
|
+
ctx.parts.push( new documentParts.List( indent ) ) ;
|
|
823
|
+
break ;
|
|
824
|
+
case 'list' :
|
|
825
|
+
case 'orderedList' : // It's mixing list and ordered list, but what can we do?
|
|
826
|
+
// Nothing to do here...
|
|
827
|
+
break ;
|
|
828
|
+
default :
|
|
829
|
+
ctx.parts.push( new documentParts.List( indent ) ) ;
|
|
830
|
+
break ;
|
|
818
831
|
}
|
|
819
832
|
|
|
820
833
|
stack( ctx ) ;
|
|
@@ -836,9 +849,22 @@ function parseOrderedListItem( str , ctx , indent ) {
|
|
|
836
849
|
|
|
837
850
|
var lastPart = ctx.parts[ ctx.parts.length - 1 ] ;
|
|
838
851
|
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
852
|
+
switch ( lastPart?.type ) {
|
|
853
|
+
case 'orderedListItem' :
|
|
854
|
+
case 'listItem' :
|
|
855
|
+
// Create the new ordered list as a child of this list-item
|
|
856
|
+
stack( ctx ) ;
|
|
857
|
+
lastPart = new documentParts.OrderedList( indent ) ;
|
|
858
|
+
ctx.parts.push( lastPart ) ;
|
|
859
|
+
break ;
|
|
860
|
+
case 'orderedList' :
|
|
861
|
+
case 'list' : // It's mixing list and ordered list, but what can we do?
|
|
862
|
+
// Nothing to do here...
|
|
863
|
+
break ;
|
|
864
|
+
default :
|
|
865
|
+
lastPart = new documentParts.OrderedList( indent ) ;
|
|
866
|
+
ctx.parts.push( lastPart ) ;
|
|
867
|
+
break ;
|
|
842
868
|
}
|
|
843
869
|
|
|
844
870
|
stack( ctx ) ;
|
package/lib/documentParts.js
CHANGED
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
const documentParts = {} ;
|
|
32
32
|
module.exports = documentParts ;
|
|
33
33
|
|
|
34
|
+
// Circular require, should come after exporting
|
|
35
|
+
const StructuredDocument = require( './StructuredDocument.js' ) ;
|
|
36
|
+
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
function Part() {
|
|
@@ -39,6 +42,10 @@ function Part() {
|
|
|
39
42
|
|
|
40
43
|
documentParts.Part = Part ;
|
|
41
44
|
|
|
45
|
+
Part.prototype.getText = function() {
|
|
46
|
+
return StructuredDocument.getText( this ) ;
|
|
47
|
+
} ;
|
|
48
|
+
|
|
42
49
|
|
|
43
50
|
|
|
44
51
|
function InlinePart() {
|
|
@@ -372,7 +379,7 @@ documentParts.Anchor = Anchor ;
|
|
|
372
379
|
|
|
373
380
|
|
|
374
381
|
// All special types that could be rendered (have graphical representation)
|
|
375
|
-
const RENDERED_SPECIAL_TYPES = new Set( [ '
|
|
382
|
+
const RENDERED_SPECIAL_TYPES = new Set( [ 'toc' ] ) ;
|
|
376
383
|
|
|
377
384
|
function Special( special ) {
|
|
378
385
|
this.type = 'special' ;
|
package/lib/postProcesses.js
CHANGED
|
@@ -72,24 +72,25 @@ exports.autoId.init = ( structuredDocument , params , data ) => {
|
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
// TOC: Table of Contents
|
|
76
|
+
exports.toc = ( structuredDocument , object , params , data ) => {
|
|
76
77
|
if ( object.type === 'special' ) {
|
|
77
78
|
switch ( object.special ) {
|
|
78
|
-
case '
|
|
79
|
-
data.
|
|
79
|
+
case 'toc' :
|
|
80
|
+
data.tocObjects.push( object ) ;
|
|
80
81
|
break ;
|
|
81
|
-
case '
|
|
82
|
-
|
|
82
|
+
case 'toc-start' :
|
|
83
|
+
resetToc( data ) ;
|
|
83
84
|
break ;
|
|
84
|
-
case '
|
|
85
|
-
data.
|
|
85
|
+
case 'toc-end' :
|
|
86
|
+
data.tocEnded = true ;
|
|
86
87
|
break ;
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
return ;
|
|
90
91
|
}
|
|
91
92
|
|
|
92
|
-
if ( data.
|
|
93
|
+
if ( data.tocEnded || object.type !== 'header' || object.level > params.maxLevel ) { return ; }
|
|
93
94
|
|
|
94
95
|
let item = new documentParts.ListItem( object.level - 1 ) ;
|
|
95
96
|
let link = new documentParts.Link( '#' + object.id ) ;
|
|
@@ -97,54 +98,73 @@ exports.summary = ( structuredDocument , object , params , data ) => {
|
|
|
97
98
|
let text = new documentParts.Text( StructuredDocument.getText( object ) ) ;
|
|
98
99
|
link.parts.push( text ) ;
|
|
99
100
|
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
let simpleItem = { title: object.getText() , href: object.href , children: [] } ;
|
|
102
|
+
|
|
103
|
+
if ( ! data.tocHeaderLevelStack.length ) {
|
|
104
|
+
data.tocHeaderLevelStack.push( object.level ) ;
|
|
102
105
|
}
|
|
103
106
|
|
|
104
|
-
let lastListLevel = data.
|
|
105
|
-
let lastHeaderLevel = data.
|
|
107
|
+
let lastListLevel = data.tocHeaderLevelStack.length - 1 ;
|
|
108
|
+
let lastHeaderLevel = data.tocHeaderLevelStack[ lastListLevel ] ;
|
|
106
109
|
|
|
107
110
|
while ( object.level < lastHeaderLevel && lastListLevel > 0 ) {
|
|
108
111
|
lastListLevel -- ;
|
|
109
|
-
lastHeaderLevel = data.
|
|
110
|
-
data.
|
|
112
|
+
lastHeaderLevel = data.tocHeaderLevelStack[ lastListLevel ] ;
|
|
113
|
+
data.tocHeaderLevelStack.length = data.tocListStack.length = lastListLevel + 1 ;
|
|
111
114
|
}
|
|
112
115
|
|
|
113
116
|
if ( object.level > lastHeaderLevel ) {
|
|
114
|
-
|
|
117
|
+
data.tocHeaderLevelStack.push( object.level ) ;
|
|
118
|
+
|
|
119
|
+
let parentList = data.tocListStack[ lastListLevel ] ;
|
|
120
|
+
let parentListItem = parentList.parts[ parentList.parts.length - 1 ] ;
|
|
115
121
|
let currentList = new documentParts.List( object.level - 1 ) ;
|
|
116
|
-
data.summaryListStack.push( currentList ) ;
|
|
117
|
-
data.summaryHeaderLevelStack.push( object.level ) ;
|
|
118
122
|
currentList.parts.push( item ) ;
|
|
119
|
-
|
|
123
|
+
data.tocListStack.push( currentList ) ;
|
|
124
|
+
parentListItem.parts.push( currentList ) ;
|
|
125
|
+
|
|
126
|
+
let parentSimpleList = data.tocSimpleListStack[ lastListLevel ] ;
|
|
127
|
+
let parentSimpleItem = parentSimpleList[ parentSimpleList.length - 1 ] ;
|
|
128
|
+
let currentSimpleList = parentSimpleItem.children ;
|
|
129
|
+
currentSimpleList.push( simpleItem ) ;
|
|
130
|
+
data.tocSimpleListStack.push( currentSimpleList ) ;
|
|
120
131
|
}
|
|
121
132
|
else {
|
|
122
133
|
// It's equal OR the doc is not well-formed and it's less, nevertheless, we just act as if it's equal
|
|
123
|
-
let currentList = data.
|
|
134
|
+
let currentList = data.tocListStack[ lastListLevel ] ;
|
|
124
135
|
currentList.parts.push( item ) ;
|
|
136
|
+
|
|
137
|
+
let currentSimpleList = data.tocSimpleListStack[ lastListLevel ] ;
|
|
138
|
+
currentSimpleList.push( simpleItem ) ;
|
|
125
139
|
}
|
|
126
140
|
} ;
|
|
127
141
|
|
|
128
|
-
exports.
|
|
142
|
+
exports.toc.init = ( structuredDocument , params , data ) => {
|
|
129
143
|
params.maxLevel = params.maxLevel || Infinity ;
|
|
130
|
-
data.
|
|
131
|
-
|
|
144
|
+
data.tocObjects = [] ;
|
|
145
|
+
resetToc( data ) ;
|
|
132
146
|
} ;
|
|
133
147
|
|
|
134
|
-
function
|
|
135
|
-
data.
|
|
136
|
-
data.
|
|
137
|
-
|
|
138
|
-
|
|
148
|
+
function resetToc( data ) {
|
|
149
|
+
data.tocList = new documentParts.List( 0 ) ;
|
|
150
|
+
data.tocListStack = [ data.tocList ] ;
|
|
151
|
+
|
|
152
|
+
// Variant easier to manage for custom userland
|
|
153
|
+
data.tocSimpleList = [] ;
|
|
154
|
+
data.tocSimpleListStack = [ data.tocSimpleList ] ;
|
|
155
|
+
|
|
156
|
+
data.tocHeaderLevelStack = [] ;
|
|
157
|
+
data.tocEnded = false ;
|
|
139
158
|
}
|
|
140
159
|
|
|
141
|
-
exports.
|
|
142
|
-
structuredDocument.
|
|
160
|
+
exports.toc.finalize = ( structuredDocument , params , data ) => {
|
|
161
|
+
structuredDocument.tocList = data.tocList ;
|
|
162
|
+
structuredDocument.toc = data.tocSimpleList ;
|
|
143
163
|
|
|
144
|
-
for ( let
|
|
145
|
-
|
|
164
|
+
for ( let tocObject of data.tocObjects ) {
|
|
165
|
+
tocObject.parts.push( data.tocList ) ;
|
|
146
166
|
}
|
|
147
167
|
} ;
|
|
148
168
|
|
|
149
|
-
exports.
|
|
169
|
+
exports.toc.require = [ 'autoId' ] ;
|
|
150
170
|
|