3
3
/* eslint-disable prefer-destructuring */
4
4
5
5
import * as P from '@react-pdf/primitives' ;
6
- import { isNil , omit , compose } from '@react-pdf/fns' ;
6
+ import { isNil , omit , asyncCompose } from '@react-pdf/fns' ;
7
7
8
8
import isFixed from '../node/isFixed' ;
9
9
import splitText from '../text/splitText' ;
@@ -17,6 +17,7 @@ import resolveTextLayout from './resolveTextLayout';
17
17
import resolveInheritance from './resolveInheritance' ;
18
18
import { resolvePageDimensions } from './resolveDimensions' ;
19
19
import { resolvePageStyles } from './resolveStyles' ;
20
+ import resolveAssets from './resolveAssets' ;
20
21
21
22
const isText = ( node ) => node . type === P . Text ;
22
23
@@ -32,7 +33,8 @@ const allFixed = (nodes) => nodes.every(isFixed);
32
33
33
34
const isDynamic = ( node ) => ! isNil ( node . props ?. render ) ;
34
35
35
- const relayoutPage = compose (
36
+ const relayoutPage = asyncCompose (
37
+ resolveAssets ,
36
38
resolveTextLayout ,
37
39
resolvePageDimensions ,
38
40
resolveInheritance ,
@@ -175,19 +177,20 @@ const resolveDynamicNodes = (props, node) => {
175
177
return Object . assign ( { } , node , { box, lines, children } ) ;
176
178
} ;
177
179
178
- const resolveDynamicPage = ( props , page , fontStore , yoga ) => {
180
+ const resolveDynamicPage = async ( props , page , fontStore , yoga ) => {
179
181
if ( shouldResolveDynamicNodes ( page ) ) {
180
182
const resolvedPage = resolveDynamicNodes ( props , page ) ;
181
- return relayoutPage ( resolvedPage , fontStore , yoga ) ;
183
+ const relayoutedPage = await relayoutPage ( resolvedPage , fontStore , yoga ) ;
184
+ return relayoutedPage ;
182
185
}
183
186
184
187
return page ;
185
188
} ;
186
189
187
- const splitPage = ( page , pageNumber , fontStore , yoga ) => {
190
+ const splitPage = async ( page , pageNumber , fontStore , yoga ) => {
188
191
const wrapArea = getWrapArea ( page ) ;
189
192
const contentArea = getContentArea ( page ) ;
190
- const dynamicPage = resolveDynamicPage ( { pageNumber } , page , fontStore , yoga ) ;
193
+ const dynamicPage = await resolveDynamicPage ( { pageNumber } , page , fontStore , yoga ) ;
191
194
const height = page . style . height ;
192
195
193
196
const [ currentChilds , nextChilds ] = splitNodes (
@@ -196,10 +199,10 @@ const splitPage = (page, pageNumber, fontStore, yoga) => {
196
199
dynamicPage . children ,
197
200
) ;
198
201
199
- const relayout = ( node ) => relayoutPage ( node , fontStore , yoga ) ;
202
+ const relayout = async node => relayoutPage ( node , fontStore , yoga ) ;
200
203
201
204
const currentBox = { ...page . box , height } ;
202
- const currentPage = relayout (
205
+ const currentPage = await relayout (
203
206
Object . assign ( { } , page , { box : currentBox , children : currentChilds } ) ,
204
207
) ;
205
208
@@ -209,7 +212,7 @@ const splitPage = (page, pageNumber, fontStore, yoga) => {
209
212
const nextBox = omit ( 'height' , page . box ) ;
210
213
const nextProps = omit ( 'bookmark' , page . props ) ;
211
214
212
- const nextPage = relayout (
215
+ const nextPage = await relayout (
213
216
Object . assign ( { } , page , {
214
217
props : nextProps ,
215
218
box : nextBox ,
@@ -220,7 +223,7 @@ const splitPage = (page, pageNumber, fontStore, yoga) => {
220
223
return [ currentPage , nextPage ] ;
221
224
} ;
222
225
223
- const resolvePageIndices = ( fontStore , yoga , page , pageNumber , pages ) => {
226
+ const resolvePageIndices = async ( fontStore , yoga , page , pageNumber , pages ) => {
224
227
const totalPages = pages . length ;
225
228
226
229
const props = {
@@ -233,24 +236,25 @@ const resolvePageIndices = (fontStore, yoga, page, pageNumber, pages) => {
233
236
return resolveDynamicPage ( props , page , fontStore , yoga ) ;
234
237
} ;
235
238
236
- const assocSubPageData = ( subpages ) => {
239
+ const assocSubPageData = ( subpages , pageIndex ) => {
237
240
return subpages . map ( ( page , i ) => ( {
238
241
...page ,
242
+ pageIndex,
239
243
subPageNumber : i ,
240
244
subPageTotalPages : subpages . length ,
241
245
} ) ) ;
242
246
} ;
243
247
244
- const dissocSubPageData = ( page ) => {
245
- return omit ( [ 'subPageNumber' , 'subPageTotalPages' ] , page ) ;
248
+ const dissocSubPageData = page => {
249
+ return omit ( [ 'pageIndex' , ' subPageNumber', 'subPageTotalPages' ] , page ) ;
246
250
} ;
247
251
248
- const paginate = ( page , pageNumber , fontStore , yoga ) => {
252
+ const paginate = async ( page , pageNumber , fontStore , yoga ) => {
249
253
if ( ! page ) return [ ] ;
250
254
251
255
if ( page . props ?. wrap === false ) return [ page ] ;
252
256
253
- let splittedPage = splitPage ( page , pageNumber , fontStore , yoga ) ;
257
+ let splittedPage = await splitPage ( page , pageNumber , fontStore , yoga ) ;
254
258
255
259
const pages = [ splittedPage [ 0 ] ] ;
256
260
let nextPage = splittedPage [ 1 ] ;
@@ -271,28 +275,40 @@ const paginate = (page, pageNumber, fontStore, yoga) => {
271
275
} ;
272
276
273
277
/**
274
- * Performs pagination. This is the step responsible of breaking the whole document
275
- * into pages following pagiation rules, such as `fixed`, `break` and dynamic nodes.
278
+ * Performs pagination. This is the step responsible for breaking the whole document
279
+ * into pages following pagination rules, such as `fixed`, `break` and dynamic nodes.
276
280
*
277
281
* @param {Object } doc node
278
282
* @param {Object } fontStore font store
279
283
* @returns {Object } layout node
280
284
*/
281
- const resolvePagination = ( doc , fontStore ) => {
285
+ const resolvePagination = async ( doc , fontStore ) => {
282
286
let pages = [ ] ;
283
287
let pageNumber = 1 ;
284
288
285
- for ( let i = 0 ; i < doc . children . length ; i += 1 ) {
286
- const page = doc . children [ i ] ;
287
- let subpages = paginate ( page , pageNumber , fontStore , doc . yoga ) ;
289
+ await Promise . all (
290
+ doc . children . map ( async ( page , pageIndex ) => {
291
+ let subpages = await paginate ( page , pageNumber , fontStore , doc . yoga ) ;
288
292
289
- subpages = assocSubPageData ( subpages ) ;
290
- pageNumber += subpages . length ;
291
- pages = pages . concat ( subpages ) ;
292
- }
293
+ subpages = assocSubPageData ( subpages , pageIndex ) ;
294
+ pageNumber += subpages . length ;
295
+ pages . push ( ...subpages ) ;
296
+ } ) ,
297
+ ) ;
298
+
299
+ // because the subpages are pushed into the array according to the speed they are paginated,
300
+ // we sort them by their initial index, while keeping the subpages order.
301
+ pages . sort ( ( a , b ) => {
302
+ if ( a . pageIndex !== b . pageIndex ) {
303
+ return a . pageIndex - b . pageIndex ;
304
+ }
305
+ return a . subPageNumber - b . subPageNumber ;
306
+ } ) ;
293
307
294
- pages = pages . map ( ( ...args ) =>
295
- dissocSubPageData ( resolvePageIndices ( fontStore , doc . yoga , ...args ) ) ,
308
+ pages = await Promise . all (
309
+ pages . map ( async ( ...args ) =>
310
+ dissocSubPageData ( await resolvePageIndices ( fontStore , doc . yoga , ...args ) ) ,
311
+ ) ,
296
312
) ;
297
313
298
314
return assingChildren ( pages , doc ) ;
0 commit comments