book-source 0.2.2 → 0.2.4

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.
@@ -52,22 +52,59 @@ StructuredDocument.prototype.render = function( renderer ) {
52
52
  title: this.title
53
53
  } ;
54
54
 
55
- var str = this.renderParts( renderer , this.parts , [] ) ;
55
+ var output = this.renderParts( renderer , this.parts , [] ) ;
56
56
 
57
57
  if ( renderer.document ) {
58
- str = renderer.document( meta , str ) ;
58
+ output = renderer.document( meta , output ) ;
59
59
  }
60
60
 
61
- return str ;
61
+ return output ;
62
+ } ;
63
+
64
+
65
+
66
+ const FRAGMENT = {} ;
67
+
68
+ FRAGMENT.string = {
69
+ new: () => '' ,
70
+ append: ( stack_ , part ) => stack_ + ( part || '' ) ,
71
+ concat: ( stack_ , parts ) => stack_ + ( parts || '' )
62
72
  } ;
63
73
 
74
+ FRAGMENT.flatStructure = {
75
+ new: () => [] ,
76
+ append: ( stack_ , part ) => {
77
+ if ( part ) {
78
+ if ( Array.isArray( part ) ) { stack_.push( ... part ) ; }
79
+ else { stack_.push( part ) ; }
80
+ }
81
+ return stack_ ;
82
+ } ,
83
+ concat: ( stack_ , parts ) => {
84
+ if ( parts && parts.length ) { stack_.push( ... parts ) ; }
85
+ return stack_ ;
86
+ }
87
+ } ;
64
88
 
89
+ FRAGMENT.structure = {
90
+ new: () => [] ,
91
+ append: ( stack_ , part ) => {
92
+ if ( part ) { stack_.push( part ) ; }
93
+ return stack_ ;
94
+ } ,
95
+ concat: ( stack_ , parts ) => {
96
+ if ( parts && parts.length ) { stack_.push( ... parts ) ; }
97
+ return stack_ ;
98
+ }
99
+ } ;
65
100
 
66
101
  StructuredDocument.prototype.renderParts = function( renderer , parts , partStack ) {
67
- var str = '' , index = 0 ;
102
+ var fragment = FRAGMENT[ renderer.type || 'string' ] ,
103
+ output = fragment.new() ,
104
+ index = 0 ;
68
105
 
69
106
  for ( let part of parts ) {
70
- let partsStr = '' ;
107
+ let partsOutput = fragment.new() ;
71
108
 
72
109
  if ( part.parts ) {
73
110
  if ( renderer.group?.[ part.type ] ) {
@@ -79,27 +116,36 @@ StructuredDocument.prototype.renderParts = function( renderer , parts , partStac
79
116
  for ( let group of groupList ) {
80
117
  if ( renderer.group[ part.type ][ group.type ] ) {
81
118
  partStack.push( part ) ;
82
- let groupStr = this.renderParts( renderer , group.parts , partStack ) ;
119
+ let groupOutput = this.renderParts( renderer , group.parts , partStack ) ;
83
120
  partStack.pop() ;
84
- partsStr += renderer.group[ part.type ][ group.type ]( part , groupStr , partStack ) ;
121
+ partsOutput = fragment.concat(
122
+ partsOutput ,
123
+ renderer.group[ part.type ][ group.type ]( part , groupOutput , partStack )
124
+ ) ;
85
125
  }
86
126
  }
87
127
  }
88
128
  else {
89
129
  partStack.push( part ) ;
90
- partsStr = this.renderParts( renderer , part.parts , [ ... partStack , part ] ) ;
130
+ partsOutput = fragment.concat(
131
+ partsOutput ,
132
+ this.renderParts( renderer , part.parts , [ ... partStack , part ] )
133
+ ) ;
91
134
  partStack.pop() ;
92
135
  }
93
136
  }
94
137
 
95
138
  if ( renderer[ part.type ] ) {
96
- str += renderer[ part.type ]( part , partsStr , partStack , index ) ;
139
+ output = fragment.append(
140
+ output ,
141
+ renderer[ part.type ]( part , partsOutput , partStack , index )
142
+ ) ;
97
143
  }
98
144
 
99
145
  index ++ ;
100
146
  }
101
147
 
102
- return str ;
148
+ return output ;
103
149
  } ;
104
150
 
105
151
 
@@ -629,12 +675,13 @@ function parseOrderedListItem( str , ctx , indent ) {
629
675
  var lastPart = ctx.parts[ ctx.parts.length - 1 ] ;
630
676
 
631
677
  if ( ! lastPart || lastPart.type !== 'orderedList' ) {
632
- ctx.parts.push( new documentParts.OrderedList( indent ) ) ;
678
+ lastPart = new documentParts.OrderedList( indent ) ;
679
+ ctx.parts.push( lastPart ) ;
633
680
  }
634
681
 
635
682
  stack( ctx ) ;
636
683
 
637
- ctx.parts.push( new documentParts.OrderedListItem( indent , order ) ) ;
684
+ ctx.parts.push( new documentParts.OrderedListItem( indent , order , lastPart.autoIndex ++ ) ) ;
638
685
 
639
686
  var blockEnd = detectBlockEnd( str , ctx.i , ctx.parent?.indent , LIST_ITEM_END_PARAMS ) ;
640
687
  parseInlineChildren( str , ctx , blockEnd ) ;
@@ -247,6 +247,7 @@ documentParts.ListItem = ListItem ;
247
247
  function OrderedList( indent ) {
248
248
  this.type = 'orderedList' ;
249
249
  this.indent = indent ;
250
+ this.autoIndex = 1 ;
250
251
  BlockPart.call( this ) ;
251
252
  }
252
253
 
@@ -256,10 +257,11 @@ documentParts.OrderedList = OrderedList ;
256
257
 
257
258
 
258
259
 
259
- function OrderedListItem( indent , order ) {
260
+ function OrderedListItem( indent , order , index ) {
260
261
  this.type = 'orderedListItem' ;
261
262
  this.indent = indent ;
262
- this.order = order ;
263
+ this.order = order ; // User order value
264
+ this.index = index ; // Real index, starting at 1, and auto-incrementing
263
265
  BlockPart.call( this ) ;
264
266
  }
265
267
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "book-source",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "A lightweight markup language, inspired by Markdown.",
5
5
  "main": "lib/book-source.js",
6
6
  "directories": {