paginate method
Implementation
List<UEpubPage> paginate(UEpubChapter chapter) {
final double width = size.width - typography.horizontalMargin * 2;
final double limit = size.height - typography.verticalMargin * 2;
if (width <= 0 || limit <= 0 || chapter.blocks.isEmpty) {
return <UEpubPage>[UEpubPage(spineIndex: chapter.spineIndex, pageIndex: 0, blocks: chapter.blocks, startBlock: 0)];
}
final List<UEpubPage> pages = <UEpubPage>[];
List<UEpubBlock> current = <UEpubBlock>[];
int startBlock = 0;
double used = 0;
for (int index = 0; index < chapter.blocks.length; index++) {
final UEpubBlock block = chapter.blocks[index];
final double height = _blockHeight(block, width);
if (height > limit && block.spans.isNotEmpty) {
if (current.isNotEmpty) {
pages.add(UEpubPage(spineIndex: chapter.spineIndex, pageIndex: pages.length, blocks: current, startBlock: startBlock));
current = <UEpubBlock>[];
used = 0;
startBlock = index;
}
for (final UEpubBlock piece in _splitBlock(block, width, limit)) {
pages.add(UEpubPage(spineIndex: chapter.spineIndex, pageIndex: pages.length, blocks: <UEpubBlock>[piece], startBlock: index));
}
startBlock = index + 1;
continue;
}
if (used + height > limit && current.isNotEmpty) {
pages.add(UEpubPage(spineIndex: chapter.spineIndex, pageIndex: pages.length, blocks: current, startBlock: startBlock));
current = <UEpubBlock>[];
used = 0;
startBlock = index;
}
current.add(block);
used += height;
}
if (current.isNotEmpty) pages.add(UEpubPage(spineIndex: chapter.spineIndex, pageIndex: pages.length, blocks: current, startBlock: startBlock));
if (pages.isEmpty) pages.add(UEpubPage(spineIndex: chapter.spineIndex, pageIndex: 0, blocks: chapter.blocks, startBlock: 0));
return pages;
}