buildPage method

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

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.endWordIdByAyahKey;
  final maxWordIndexByAyahKey = endMaps.maxWordIndexByAyahKey;

  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!));
        }
        break;

      case QpcV4LineType.basmallah:
        final inferred = _inferBasmalahSurahNumber(lines: lines, index: i);
        if (inferred != null) {
          blocks.add(QpcV4BasmallahBlock(inferred));
        }
        break;

      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.segments;
        if (segments.isNotEmpty) {
          blocks.add(QpcV4AyahLineBlock(
              isCentered: line.isCentered, segments: segments));
        }
        if (result.didInsertSingleSpaceBetweenFirstTwoWords) {
          needsSingleSpaceAtPageStart = false;
        }
        break;
    }
  }

  return blocks;
}