my $colsize = $row->{cell} && $row->{cell}->{colsize} || 1;
my $coldigits = ceil(log($colsize * $cols) / log(16)); # uniform length of hexadecimal header
my $rowdiv = 16 ** $coldigits; # divider of row headers
+ my $offset = 0;
+ my $endpoint = $offset + (length($row->{table}) || 256) * $colsize;
printf '<div class="section"><table class="glyphs%s">', !$row->{cell} && ' charmap';
my $title = $row->{set};
print "\n";
}
print '<tbody>';
- for my $msb (0 .. ((length($row->{table}) || 256) - 1) / $cols) {
+ while ($offset < $endpoint - 1) {
print '<tr><th>';
{
- my $rowlabel = ($msb + int($row->{offset} / $cols)) * $cols * $colsize;
- if (my $rowmod = $rowlabel % $rowdiv) {
+ if (my $rowmod = $offset % $rowdiv) {
# offset in column units
printf '<small>+%X</small>', $rowmod;
}
else {
# divided row offset
- printf '%X', $rowlabel / $rowdiv;
+ printf '%X', ($offset + $row->{offset}) / $rowdiv;
}
}
- for my $lsb (0 .. $cols - 1) {
- my $val = ( ($msb * $cols) + $lsb ) * $colsize;
+ for (1 .. $cols) {
if ($row->{cell}) {
- print range_cell($row, $val);
+ print range_cell($row, $offset);
next;
}
- my $glyph = substr $row->{table}, $val, 1;
+ my $glyph = substr $row->{table}, $offset, 1;
if ($glyph eq $NOCHAR) {
print '<td>';
next;
print "\n".$glyphs->glyph_cell($glyph);
}
+ continue {
+ $offset += $colsize;
+ }
print "\n";
}
say '</table></div>';