paginate method

List<UEpubPage> paginate(
  1. UEpubChapter chapter
)

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;
}