Text::Stencil
Fast XS list/table renderer with escaping, formatting, and transform chaining.
Synopsis
use Text::Stencil;
my $s = Text::Stencil->new(
header => '<table><tr><th>id</th><th>name</th></tr>',
row => '<tr><td>{0:int}</td><td>{1:html}</td></tr>',
footer => '</table>',
);
my $html = $s->render(\@rows);
# hashrefs, chaining, separator
my $s = Text::Stencil->new(
header => '<ul>',
row => '<li>{title:default:Untitled|trim|trunc:80|html}</li>',
footer => '</ul>',
separator => "\n",
);
# single row, stream to file
print $s->render_one({id => 1, title => 'Hello'});
$s->render_to_fh($fh, \@rows);
Performance
Perl 5.40, x86_64 Linux.
HTML table (13 rows, html escape):
| Renderer | Rate | vs Xslate | |---|---|---| | Text::Xslate | 413K/s | -- | | render hashref | 733K/s | +77% | | render chained | 813K/s | +97% | | render arrayref | 922K/s | +123% | | render_one | 5161K/s | +1150% |
Transform throughput (1000 rows, single transform):
default:x 67.4K/s int 52.4K/s raw 39.8K/s
trunc:20 44.4K/s int_comma 50.1K/s json 33.7K/s
uc 36.4K/s html 28.7K/s url 32.2K/s
Row count scaling: ~25M rows/s constant from 10 to 10,000 rows.
Run perl bench.pl for your own numbers.
Documentation
Full docs: metacpan.org/pod/Text::Stencil
License
Same terms as Perl itself.