book-source 0.3.14 → 0.3.16
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 +34 -9
- package/lib/book-source.js +1 -0
- package/lib/documentParts.js +8 -1
- package/lib/postProcesses.js +34 -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,7 @@ function StructuredDocument() {
|
|
|
41
40
|
this.title = 'Document' ;
|
|
42
41
|
this.metadata = null ;
|
|
43
42
|
this.theme = null ;
|
|
44
|
-
this.
|
|
43
|
+
this.toc = null ;
|
|
45
44
|
this.parts = [] ;
|
|
46
45
|
//this.idList = new Set() ;
|
|
47
46
|
}
|
|
@@ -49,6 +48,7 @@ function StructuredDocument() {
|
|
|
49
48
|
module.exports = StructuredDocument ;
|
|
50
49
|
|
|
51
50
|
// Circular require, should come after exporting
|
|
51
|
+
const documentParts = require( './documentParts.js' ) ;
|
|
52
52
|
const postProcesses = require( './postProcesses.js' ) ;
|
|
53
53
|
|
|
54
54
|
|
|
@@ -57,8 +57,8 @@ StructuredDocument.prototype.render = function( renderer , special = null ) {
|
|
|
57
57
|
let toRender ;
|
|
58
58
|
|
|
59
59
|
switch ( special ) {
|
|
60
|
-
case '
|
|
61
|
-
toRender = this.
|
|
60
|
+
case 'toc' :
|
|
61
|
+
toRender = this.toc ? [ this.toc ] : [] ;
|
|
62
62
|
break ;
|
|
63
63
|
default :
|
|
64
64
|
toRender = this.parts ;
|
|
@@ -813,8 +813,20 @@ function parseListItem( str , ctx , indent ) {
|
|
|
813
813
|
|
|
814
814
|
var lastPart = ctx.parts[ ctx.parts.length - 1 ] ;
|
|
815
815
|
|
|
816
|
-
|
|
817
|
-
|
|
816
|
+
switch ( lastPart?.type ) {
|
|
817
|
+
case 'listItem' :
|
|
818
|
+
case 'orderedListItem' :
|
|
819
|
+
// Create the new list as a child of this list-item
|
|
820
|
+
stack( ctx ) ;
|
|
821
|
+
ctx.parts.push( new documentParts.List( indent ) ) ;
|
|
822
|
+
break ;
|
|
823
|
+
case 'list' :
|
|
824
|
+
case 'orderedList' : // It's mixing list and ordered list, but what can we do?
|
|
825
|
+
// Nothing to do here...
|
|
826
|
+
break ;
|
|
827
|
+
default :
|
|
828
|
+
ctx.parts.push( new documentParts.List( indent ) ) ;
|
|
829
|
+
break ;
|
|
818
830
|
}
|
|
819
831
|
|
|
820
832
|
stack( ctx ) ;
|
|
@@ -836,9 +848,22 @@ function parseOrderedListItem( str , ctx , indent ) {
|
|
|
836
848
|
|
|
837
849
|
var lastPart = ctx.parts[ ctx.parts.length - 1 ] ;
|
|
838
850
|
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
851
|
+
switch ( lastPart?.type ) {
|
|
852
|
+
case 'orderedListItem' :
|
|
853
|
+
case 'listItem' :
|
|
854
|
+
// Create the new ordered list as a child of this list-item
|
|
855
|
+
stack( ctx ) ;
|
|
856
|
+
lastPart = new documentParts.OrderedList( indent ) ;
|
|
857
|
+
ctx.parts.push( lastPart ) ;
|
|
858
|
+
break ;
|
|
859
|
+
case 'orderedList' :
|
|
860
|
+
case 'list' : // It's mixing list and ordered list, but what can we do?
|
|
861
|
+
// Nothing to do here...
|
|
862
|
+
break ;
|
|
863
|
+
default :
|
|
864
|
+
lastPart = new documentParts.OrderedList( indent ) ;
|
|
865
|
+
ctx.parts.push( lastPart ) ;
|
|
866
|
+
break ;
|
|
842
867
|
}
|
|
843
868
|
|
|
844
869
|
stack( ctx ) ;
|
package/lib/book-source.js
CHANGED
|
@@ -35,6 +35,7 @@ bookSource.StructuredDocument = require( './StructuredDocument.js' ) ;
|
|
|
35
35
|
bookSource.Style = require( './Style.js' ) ;
|
|
36
36
|
bookSource.Theme = require( './Theme.js' ) ;
|
|
37
37
|
bookSource.textPostFilters = require( './textPostFilters.js' ) ;
|
|
38
|
+
bookSource.postProcesses = require( './postProcesses.js' ) ;
|
|
38
39
|
|
|
39
40
|
Object.assign( bookSource , require( './documentParts.js' ) ) ;
|
|
40
41
|
|
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,55 @@ 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
|
-
if ( ! data.
|
|
101
|
-
data.
|
|
101
|
+
if ( ! data.tocHeaderLevelStack.length ) {
|
|
102
|
+
data.tocHeaderLevelStack.push( object.level ) ;
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
let lastListLevel = data.
|
|
105
|
-
let lastHeaderLevel = data.
|
|
105
|
+
let lastListLevel = data.tocHeaderLevelStack.length - 1 ;
|
|
106
|
+
let lastHeaderLevel = data.tocHeaderLevelStack[ lastListLevel ] ;
|
|
106
107
|
|
|
107
108
|
while ( object.level < lastHeaderLevel && lastListLevel > 0 ) {
|
|
108
109
|
lastListLevel -- ;
|
|
109
|
-
lastHeaderLevel = data.
|
|
110
|
-
data.
|
|
110
|
+
lastHeaderLevel = data.tocHeaderLevelStack[ lastListLevel ] ;
|
|
111
|
+
data.tocHeaderLevelStack.length = data.tocListStack.length = lastListLevel + 1 ;
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
if ( object.level > lastHeaderLevel ) {
|
|
114
|
-
let parentList = data.
|
|
115
|
+
let parentList = data.tocListStack[ lastListLevel ] ;
|
|
116
|
+
let parentListItem = parentList.parts[ parentList.parts.length - 1 ] ;
|
|
115
117
|
let currentList = new documentParts.List( object.level - 1 ) ;
|
|
116
|
-
data.
|
|
117
|
-
data.
|
|
118
|
+
data.tocListStack.push( currentList ) ;
|
|
119
|
+
data.tocHeaderLevelStack.push( object.level ) ;
|
|
118
120
|
currentList.parts.push( item ) ;
|
|
119
|
-
|
|
121
|
+
parentListItem.parts.push( currentList ) ;
|
|
120
122
|
}
|
|
121
123
|
else {
|
|
122
124
|
// 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.
|
|
125
|
+
let currentList = data.tocListStack[ lastListLevel ] ;
|
|
124
126
|
currentList.parts.push( item ) ;
|
|
125
127
|
}
|
|
126
128
|
} ;
|
|
127
129
|
|
|
128
|
-
exports.
|
|
130
|
+
exports.toc.init = ( structuredDocument , params , data ) => {
|
|
129
131
|
params.maxLevel = params.maxLevel || Infinity ;
|
|
130
|
-
data.
|
|
131
|
-
|
|
132
|
+
data.tocObjects = [] ;
|
|
133
|
+
resetToc( data ) ;
|
|
132
134
|
} ;
|
|
133
135
|
|
|
134
|
-
function
|
|
135
|
-
data.
|
|
136
|
-
data.
|
|
137
|
-
data.
|
|
138
|
-
data.
|
|
136
|
+
function resetToc( data ) {
|
|
137
|
+
data.tocList = new documentParts.List( 0 ) ;
|
|
138
|
+
data.tocListStack = [ data.tocList ] ;
|
|
139
|
+
data.tocHeaderLevelStack = [] ;
|
|
140
|
+
data.tocEnded = false ;
|
|
139
141
|
}
|
|
140
142
|
|
|
141
|
-
exports.
|
|
142
|
-
structuredDocument.
|
|
143
|
+
exports.toc.finalize = ( structuredDocument , params , data ) => {
|
|
144
|
+
structuredDocument.toc = data.tocList ;
|
|
143
145
|
|
|
144
|
-
for ( let
|
|
145
|
-
|
|
146
|
+
for ( let tocObject of data.tocObjects ) {
|
|
147
|
+
tocObject.parts.push( data.tocList ) ;
|
|
146
148
|
}
|
|
147
149
|
} ;
|
|
148
150
|
|
|
149
|
-
exports.
|
|
151
|
+
exports.toc.require = [ 'autoId' ] ;
|
|
150
152
|
|