buildPage method

List<QpcV4RenderBlock> buildPage({
  1. required int pageNumber,
})

Builds the list of render blocks for pageNumber (1-based).

Implementation

List<QpcV4RenderBlock> buildPage({required int pageNumber}) {
  final lines = store.linesByPage[pageNumber];
  if (lines == null || lines.isEmpty) return const <QpcV4RenderBlock>[];

  final endMaps = _buildAyahEndMaps(lines);
  final endWordIdByAyahKey = endMaps.$1;
  final maxWordIndexByAyahKey = endMaps.$2;

  final blocks = <QpcV4RenderBlock>[];
  var needsSingleSpaceAtPageStart = true;

  for (var i = 0; i < lines.length; i++) {
    final line = lines[i];
    switch (line.lineType) {
      case QpcV4LineType.surahName:
        if (line.surahNumber != null) {
          blocks.add(QpcV4SurahHeaderBlock(line.surahNumber!));
        }
      case QpcV4LineType.basmallah:
        final inferred = _inferBasmalahSurahNumber(lines: lines, index: i);
        if (inferred != null) {
          blocks.add(QpcV4BasmallahBlock(inferred));
        }
      case QpcV4LineType.ayah:
        final rangeStart = line.firstWordId;
        final rangeEnd = line.lastWordId;
        if (rangeStart == null || rangeEnd == null) break;

        final result = _buildAyahSegmentsForLine(
          rangeStart: rangeStart,
          rangeEnd: rangeEnd,
          endWordIdByAyahKey: endWordIdByAyahKey,
          maxWordIndexByAyahKey: maxWordIndexByAyahKey,
          addSingleSpaceBetweenFirstTwoWords: needsSingleSpaceAtPageStart,
        );
        final segments = result.$1;
        if (segments.isNotEmpty) {
          blocks.add(QpcV4AyahLineBlock(
            isCentered: line.isCentered,
            segments: segments,
          ));
        }
        if (result.$2) {
          needsSingleSpaceAtPageStart = false;
        }
    }
  }

  return blocks;
}