123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package Trog::Renderer::html;
- use strict;
- use warnings;
- no warnings 'experimental';
- use feature qw{signatures state};
- use parent qw{Trog::Renderer::Base};
- use Text::Xslate;
- =head1 Trog::Renderer::html
- Render HTML. TODO: support inlining everything like you would want when emailing a post.
- =cut
- sub render (%options) {
- state $child_processor = Text::Xslate->new(
- # Prevent a recursive descent. If the renderer is hit again, just do nothing
- # XXX unfortunately if the post tries to include itself, it will die.
- function => {
- embed => sub {
- my ( $this_id, $style ) = @_;
- $style //= 'embed';
- # If instead the style is 'content', then we will only show the content w/ no formatting, and no title.
- return Text::Xslate::mark_raw(
- Trog::Routes::HTML::posts(
- { route => "/post/$this_id", style => $style },
- sub { },
- 1
- )
- );
- },
- }
- );
- state $child_renderer = sub {
- my ( $template_string, $options ) = @_;
- # If it fails to render, it must be something else
- my $out = eval { $child_processor->render_string( $template_string, $options ) };
- return $out ? $out : $template_string;
- };
- $options{child_processor} = $child_processor;
- $options{child_renderer} = $child_renderer;
- return Trog::Renderer::Base::render(%options);
- }
- 1;
|