render static method

BelegRaster render(
  1. BelegLayout layout, {
  2. int? zeichen,
})

Setzt das Zeilenmodell ins Raster; zeichen fehlt → nach paperSize (32/48).

Implementation

static BelegRaster render(BelegLayout layout, {int? zeichen}) {
  final n0 = zeichen ?? (layout.paperSize == 'mm80' ? zeichen80mm : zeichen58mm);
  final n = n0 < 8 ? 8 : n0;
  final leer = ' ' * n;
  final out = <RasterZeile>[];
  for (final z in layout.lines) {
    switch (z) {
      case BelegText():
        for (final t in wortzeilen(z.text, n)) {
          out.add(RasterZeile(text: _ausrichten(t, n, z.align), art: RasterArt.text, bold: z.bold));
        }
      case BelegBanner():
        for (final t in wortzeilen(z.text, n)) {
          out.add(RasterZeile(text: _ausrichten(t, n, BelegAlign.center), art: RasterArt.banner, bold: true, warnung: z.warnung));
        }
      case BelegLinie():
        out.add(RasterZeile(text: (z.char.isEmpty ? '-' : z.char[0]) * n, art: RasterArt.rule));
      case BelegLeerraum():
        for (var i = 0; i < z.lines; i++) {
          out.add(RasterZeile(text: leer, art: RasterArt.space));
        }
      case BelegQr():
        out.add(RasterZeile(text: _ausrichten('[QR-Code]', n, BelegAlign.center), art: RasterArt.qr, qr: z.data));
      case BelegSpalten():
        final breiten = rasterSpaltenBreiten(z.columns.map((c) => c.width).toList(), n);
        final inhalt = <int>[for (var i = 0; i < breiten.length; i++) i < breiten.length - 1 ? (breiten[i] - 1 < 1 ? 1 : breiten[i] - 1) : breiten[i]];
        final teile = <List<String>>[for (var i = 0; i < z.columns.length; i++) wortzeilen(z.columns[i].text, inhalt[i])];
        // Fließregel (wie renderReceiptGrid): läuft nur EINE Spalte über die erste Zeile
        // hinaus, bekommt ihr Rest die volle Breite; laufen mehrere weiter, bleibt das Raster.
        final weiterlaufend = <int>[for (var i = 0; i < teile.length; i++) if (teile[i].length > 1) i];
        final fliesst = weiterlaufend.length == 1 && z.columns.length > 1;
        var zeilen = 1;
        if (!fliesst) {
          for (final t in teile) {
            if (t.length > zeilen) zeilen = t.length;
          }
        }
        for (var r = 0; r < zeilen; r++) {
          final sb = StringBuffer();
          for (var i = 0; i < z.columns.length; i++) {
            final zelle = _ausrichten(r < teile[i].length ? teile[i][r] : '', inhalt[i], z.columns[i].align);
            sb.write(i < breiten.length - 1 ? zelle + ' ' * (breiten[i] - inhalt[i]) : zelle);
          }
          final text = sb.toString();
          out.add(RasterZeile(text: text.length == n ? text : _ausrichten(text, n, BelegAlign.left), art: RasterArt.columns));
        }
        if (fliesst) {
          final i = weiterlaufend.first;
          final rest = _restNach(z.columns[i].text, teile[i].first);
          for (final t in wortzeilen(rest, n)) {
            out.add(RasterZeile(text: _ausrichten(t, n, z.columns[i].align), art: RasterArt.columns));
          }
        }
    }
  }
  return BelegRaster(lines: out, zeichen: n);
}