33/* eslint-disable prefer-destructuring */
44
55import * as P from '@react-pdf/primitives' ;
6- import { isNil , omit , compose } from '@react-pdf/fns' ;
6+ import { isNil , omit , asyncCompose } from '@react-pdf/fns' ;
77
88import isFixed from '../node/isFixed' ;
99import splitText from '../text/splitText' ;
@@ -17,6 +17,7 @@ import resolveTextLayout from './resolveTextLayout';
1717import resolveInheritance from './resolveInheritance' ;
1818import { resolvePageDimensions } from './resolveDimensions' ;
1919import { resolvePageStyles } from './resolveStyles' ;
20+ import resolveAssets from './resolveAssets' ;
2021
2122const isText = ( node ) => node . type === P . Text ;
2223
@@ -32,7 +33,8 @@ const allFixed = (nodes) => nodes.every(isFixed);
3233
3334const isDynamic = ( node ) => ! isNil ( node . props ?. render ) ;
3435
35- const relayoutPage = compose (
36+ const relayoutPage = asyncCompose (
37+ resolveAssets ,
3638 resolveTextLayout ,
3739 resolvePageDimensions ,
3840 resolveInheritance ,
@@ -175,19 +177,20 @@ const resolveDynamicNodes = (props, node) => {
175177 return Object . assign ( { } , node , { box, lines, children } ) ;
176178} ;
177179
178- const resolveDynamicPage = ( props , page , fontStore , yoga ) => {
180+ const resolveDynamicPage = async ( props , page , fontStore , yoga ) => {
179181 if ( shouldResolveDynamicNodes ( page ) ) {
180182 const resolvedPage = resolveDynamicNodes ( props , page ) ;
181- return relayoutPage ( resolvedPage , fontStore , yoga ) ;
183+ const relayoutedPage = await relayoutPage ( resolvedPage , fontStore , yoga ) ;
184+ return relayoutedPage ;
182185 }
183186
184187 return page ;
185188} ;
186189
187- const splitPage = ( page , pageNumber , fontStore , yoga ) => {
190+ const splitPage = async ( page , pageNumber , fontStore , yoga ) => {
188191 const wrapArea = getWrapArea ( page ) ;
189192 const contentArea = getContentArea ( page ) ;
190- const dynamicPage = resolveDynamicPage ( { pageNumber } , page , fontStore , yoga ) ;
193+ const dynamicPage = await resolveDynamicPage ( { pageNumber } , page , fontStore , yoga ) ;
191194 const height = page . style . height ;
192195
193196 const [ currentChilds , nextChilds ] = splitNodes (
@@ -196,10 +199,10 @@ const splitPage = (page, pageNumber, fontStore, yoga) => {
196199 dynamicPage . children ,
197200 ) ;
198201
199- const relayout = ( node ) => relayoutPage ( node , fontStore , yoga ) ;
202+ const relayout = async node => relayoutPage ( node , fontStore , yoga ) ;
200203
201204 const currentBox = { ...page . box , height } ;
202- const currentPage = relayout (
205+ const currentPage = await relayout (
203206 Object . assign ( { } , page , { box : currentBox , children : currentChilds } ) ,
204207 ) ;
205208
@@ -209,7 +212,7 @@ const splitPage = (page, pageNumber, fontStore, yoga) => {
209212 const nextBox = omit ( 'height' , page . box ) ;
210213 const nextProps = omit ( 'bookmark' , page . props ) ;
211214
212- const nextPage = relayout (
215+ const nextPage = await relayout (
213216 Object . assign ( { } , page , {
214217 props : nextProps ,
215218 box : nextBox ,
@@ -220,7 +223,7 @@ const splitPage = (page, pageNumber, fontStore, yoga) => {
220223 return [ currentPage , nextPage ] ;
221224} ;
222225
223- const resolvePageIndices = ( fontStore , yoga , page , pageNumber , pages ) => {
226+ const resolvePageIndices = async ( fontStore , yoga , page , pageNumber , pages ) => {
224227 const totalPages = pages . length ;
225228
226229 const props = {
@@ -233,24 +236,25 @@ const resolvePageIndices = (fontStore, yoga, page, pageNumber, pages) => {
233236 return resolveDynamicPage ( props , page , fontStore , yoga ) ;
234237} ;
235238
236- const assocSubPageData = ( subpages ) => {
239+ const assocSubPageData = ( subpages , pageIndex ) => {
237240 return subpages . map ( ( page , i ) => ( {
238241 ...page ,
242+ pageIndex,
239243 subPageNumber : i ,
240244 subPageTotalPages : subpages . length ,
241245 } ) ) ;
242246} ;
243247
244- const dissocSubPageData = ( page ) => {
245- return omit ( [ 'subPageNumber' , 'subPageTotalPages' ] , page ) ;
248+ const dissocSubPageData = page => {
249+ return omit ( [ 'pageIndex' , ' subPageNumber', 'subPageTotalPages' ] , page ) ;
246250} ;
247251
248- const paginate = ( page , pageNumber , fontStore , yoga ) => {
252+ const paginate = async ( page , pageNumber , fontStore , yoga ) => {
249253 if ( ! page ) return [ ] ;
250254
251255 if ( page . props ?. wrap === false ) return [ page ] ;
252256
253- let splittedPage = splitPage ( page , pageNumber , fontStore , yoga ) ;
257+ let splittedPage = await splitPage ( page , pageNumber , fontStore , yoga ) ;
254258
255259 const pages = [ splittedPage [ 0 ] ] ;
256260 let nextPage = splittedPage [ 1 ] ;
@@ -271,28 +275,40 @@ const paginate = (page, pageNumber, fontStore, yoga) => {
271275} ;
272276
273277/**
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.
276280 *
277281 * @param {Object } doc node
278282 * @param {Object } fontStore font store
279283 * @returns {Object } layout node
280284 */
281- const resolvePagination = ( doc , fontStore ) => {
285+ const resolvePagination = async ( doc , fontStore ) => {
282286 let pages = [ ] ;
283287 let pageNumber = 1 ;
284288
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 ) ;
288292
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+ } ) ;
293307
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+ ) ,
296312 ) ;
297313
298314 return assingChildren ( pages , doc ) ;
0 commit comments