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.
@@ -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.summary = null ;
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 'summary' :
61
- toRender = this.summary ? [ this.summary ] : [] ;
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
- if ( ! lastPart || lastPart.type !== 'list' ) {
817
- ctx.parts.push( new documentParts.List( indent ) ) ;
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
- if ( ! lastPart || lastPart.type !== 'orderedList' ) {
840
- lastPart = new documentParts.OrderedList( indent ) ;
841
- ctx.parts.push( lastPart ) ;
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 ) ;
@@ -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( [ 'summary' ] ) ;
382
+ const RENDERED_SPECIAL_TYPES = new Set( [ 'toc' ] ) ;
376
383
 
377
384
  function Special( special ) {
378
385
  this.type = 'special' ;
@@ -72,24 +72,25 @@ exports.autoId.init = ( structuredDocument , params , data ) => {
72
72
 
73
73
 
74
74
 
75
- exports.summary = ( structuredDocument , object , params , data ) => {
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 'summary' :
79
- data.summaryObjects.push( object ) ;
79
+ case 'toc' :
80
+ data.tocObjects.push( object ) ;
80
81
  break ;
81
- case 'summary-start' :
82
- resetSummary( data ) ;
82
+ case 'toc-start' :
83
+ resetToc( data ) ;
83
84
  break ;
84
- case 'summary-end' :
85
- data.summaryEnded = true ;
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.summaryEnded || object.type !== 'header' || object.level > params.maxLevel ) { return ; }
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
- if ( ! data.summaryHeaderLevelStack.length ) {
101
- data.summaryHeaderLevelStack.push( object.level ) ;
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.summaryHeaderLevelStack.length - 1 ;
105
- let lastHeaderLevel = data.summaryHeaderLevelStack[ lastListLevel ] ;
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.summaryHeaderLevelStack[ lastListLevel ] ;
110
- data.summaryHeaderLevelStack.length = data.summaryListStack.length = lastListLevel + 1 ;
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
- let parentList = data.summaryListStack[ lastListLevel ] ;
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
- parentList.parts.push( currentList ) ;
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.summaryListStack[ lastListLevel ] ;
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.summary.init = ( structuredDocument , params , data ) => {
142
+ exports.toc.init = ( structuredDocument , params , data ) => {
129
143
  params.maxLevel = params.maxLevel || Infinity ;
130
- data.summaryObjects = [] ;
131
- resetSummary( data ) ;
144
+ data.tocObjects = [] ;
145
+ resetToc( data ) ;
132
146
  } ;
133
147
 
134
- function resetSummary( data ) {
135
- data.summaryList = new documentParts.List( 0 ) ;
136
- data.summaryListStack = [ data.summaryList ] ;
137
- data.summaryHeaderLevelStack = [] ;
138
- data.summaryEnded = false ;
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.summary.finalize = ( structuredDocument , params , data ) => {
142
- structuredDocument.summary = data.summaryList ;
160
+ exports.toc.finalize = ( structuredDocument , params , data ) => {
161
+ structuredDocument.tocList = data.tocList ;
162
+ structuredDocument.toc = data.tocSimpleList ;
143
163
 
144
- for ( let summaryObject of data.summaryObjects ) {
145
- summaryObject.parts.push( data.summaryList ) ;
164
+ for ( let tocObject of data.tocObjects ) {
165
+ tocObject.parts.push( data.tocList ) ;
146
166
  }
147
167
  } ;
148
168
 
149
- exports.summary.require = [ 'autoId' ] ;
169
+ exports.toc.require = [ 'autoId' ] ;
150
170
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "book-source",
3
- "version": "0.3.15",
3
+ "version": "0.3.17",
4
4
  "description": "A lightweight markup language, inspired by Markdown.",
5
5
  "main": "lib/book-source.js",
6
6
  "directories": {