2
2
/* eslint-disable prefer-destructuring */
3
3
4
4
import * as P from '@react-pdf/primitives' ;
5
- import { isNil , omit , compose } from '@react-pdf/fns' ;
5
+ import { isNil , omit , asyncCompose } from '@react-pdf/fns' ;
6
6
7
7
import isFixed from '../node/isFixed' ;
8
8
import splitText from '../text/splitText' ;
@@ -15,6 +15,7 @@ import shouldNodeBreak from '../node/shouldBreak';
15
15
import resolveTextLayout from './resolveTextLayout' ;
16
16
import resolveInheritance from './resolveInheritance' ;
17
17
import { resolvePageDimensions } from './resolveDimensions' ;
18
+ import resolveAssets from './resolveAssets' ;
18
19
19
20
const isText = node => node . type === P . Text ;
20
21
@@ -30,7 +31,8 @@ const allFixed = nodes => nodes.every(isFixed);
30
31
31
32
const isDynamic = node => ! isNil ( node . props ?. render ) ;
32
33
33
- const relayoutPage = compose (
34
+ const relayoutPage = asyncCompose (
35
+ resolveAssets ,
34
36
resolveTextLayout ,
35
37
resolveInheritance ,
36
38
resolvePageDimensions ,
@@ -172,19 +174,20 @@ const resolveDynamicNodes = (props, node) => {
172
174
return Object . assign ( { } , node , { box, lines, children } ) ;
173
175
} ;
174
176
175
- const resolveDynamicPage = ( props , page , fontStore ) => {
177
+ const resolveDynamicPage = async ( props , page , fontStore ) => {
176
178
if ( shouldResolveDynamicNodes ( page ) ) {
177
179
const resolvedPage = resolveDynamicNodes ( props , page ) ;
178
- return relayoutPage ( resolvedPage , fontStore ) ;
180
+ const relayoutedPage = await relayoutPage ( resolvedPage , fontStore ) ;
181
+ return relayoutedPage ;
179
182
}
180
183
181
184
return page ;
182
185
} ;
183
186
184
- const splitPage = ( page , pageNumber , fontStore ) => {
187
+ const splitPage = async ( page , pageNumber , fontStore ) => {
185
188
const wrapArea = getWrapArea ( page ) ;
186
189
const contentArea = getContentArea ( page ) ;
187
- const dynamicPage = resolveDynamicPage ( { pageNumber } , page , fontStore ) ;
190
+ const dynamicPage = await resolveDynamicPage ( { pageNumber } , page , fontStore ) ;
188
191
const height = page . style . height ;
189
192
190
193
const [ currentChilds , nextChilds ] = splitNodes (
@@ -193,10 +196,10 @@ const splitPage = (page, pageNumber, fontStore) => {
193
196
dynamicPage . children ,
194
197
) ;
195
198
196
- const relayout = node => relayoutPage ( node , fontStore ) ;
199
+ const relayout = async node => relayoutPage ( node , fontStore ) ;
197
200
198
201
const currentBox = { ...page . box , height } ;
199
- const currentPage = relayout (
202
+ const currentPage = await relayout (
200
203
Object . assign ( { } , page , { box : currentBox , children : currentChilds } ) ,
201
204
) ;
202
205
@@ -206,7 +209,7 @@ const splitPage = (page, pageNumber, fontStore) => {
206
209
const nextBox = omit ( 'height' , page . box ) ;
207
210
const nextProps = omit ( 'bookmark' , page . props ) ;
208
211
209
- const nextPage = relayout (
212
+ const nextPage = await relayout (
210
213
Object . assign ( { } , page , {
211
214
props : nextProps ,
212
215
box : nextBox ,
@@ -217,7 +220,7 @@ const splitPage = (page, pageNumber, fontStore) => {
217
220
return [ currentPage , nextPage ] ;
218
221
} ;
219
222
220
- const resolvePageIndices = ( fontStore , page , pageNumber , pages ) => {
223
+ const resolvePageIndices = async ( fontStore , page , pageNumber , pages ) => {
221
224
const totalPages = pages . length ;
222
225
223
226
const props = {
@@ -242,18 +245,23 @@ const dissocSubPageData = page => {
242
245
return omit ( [ 'subPageNumber' , 'subPageTotalPages' ] , page ) ;
243
246
} ;
244
247
245
- const paginate = ( page , pageNumber , fontStore ) => {
248
+ const paginate = async ( page , pageNumber , fontStore ) => {
246
249
if ( ! page ) return [ ] ;
247
250
248
251
if ( page . props ?. wrap === false ) return [ page ] ;
249
252
250
- let splittedPage = splitPage ( page , pageNumber , fontStore ) ;
253
+ let splittedPage = await splitPage ( page , pageNumber , fontStore ) ;
251
254
252
255
const pages = [ splittedPage [ 0 ] ] ;
253
256
let nextPage = splittedPage [ 1 ] ;
254
257
255
258
while ( nextPage !== null ) {
256
- splittedPage = splitPage ( nextPage , pageNumber + pages . length , fontStore ) ;
259
+ // eslint-disable-next-line no-await-in-loop
260
+ splittedPage = await splitPage (
261
+ nextPage ,
262
+ pageNumber + pages . length ,
263
+ fontStore ,
264
+ ) ;
257
265
258
266
pages . push ( splittedPage [ 0 ] ) ;
259
267
nextPage = splittedPage [ 1 ] ;
@@ -263,28 +271,31 @@ const paginate = (page, pageNumber, fontStore) => {
263
271
} ;
264
272
265
273
/**
266
- * Performs pagination. This is the step responsible of breaking the whole document
267
- * into pages following pagiation rules, such as `fixed`, `break` and dynamic nodes.
274
+ * Performs pagination. This is the step responsible for breaking the whole document
275
+ * into pages following pagination rules, such as `fixed`, `break` and dynamic nodes.
268
276
*
269
277
* @param {Object } node
270
278
* @param {Object } fontStore font store
271
279
* @returns {Object } layout node
272
280
*/
273
- const resolvePagination = ( doc , fontStore ) => {
281
+ const resolvePagination = async ( doc , fontStore ) => {
274
282
let pages = [ ] ;
275
283
let pageNumber = 1 ;
276
284
277
- for ( let i = 0 ; i < doc . children . length ; i += 1 ) {
278
- const page = doc . children [ i ] ;
279
- let subpages = paginate ( page , pageNumber , fontStore ) ;
285
+ await Promise . all (
286
+ doc . children . map ( async page => {
287
+ let subpages = await paginate ( page , pageNumber , fontStore ) ;
280
288
281
- subpages = assocSubPageData ( subpages ) ;
282
- pageNumber += subpages . length ;
283
- pages = pages . concat ( subpages ) ;
284
- }
289
+ subpages = assocSubPageData ( subpages ) ;
290
+ pageNumber += subpages . length ;
291
+ pages . push ( ...subpages ) ;
292
+ } ) ,
293
+ ) ;
285
294
286
- pages = pages . map ( ( ...args ) =>
287
- dissocSubPageData ( resolvePageIndices ( fontStore , ...args ) ) ,
295
+ pages = await Promise . all (
296
+ pages . map ( async ( ...args ) =>
297
+ dissocSubPageData ( await resolvePageIndices ( fontStore , ...args ) ) ,
298
+ ) ,
288
299
) ;
289
300
290
301
return assingChildren ( pages , doc ) ;
0 commit comments