--- trunk/lib/HTML.pm 2008/06/29 13:12:59 21 +++ trunk/lib/Frey/HTML.pm 2008/06/30 20:02:10 39 @@ -1,17 +1,24 @@ -package HTML; +package Frey::HTML; use strict; use warnings; use Time::HiRes qw/time/; use Data::Dump qw/dump/; -use Carp qw/confess/; +use Carp qw/confess carp/; + +=head1 NAME + +Frey::HTML - generate html pages + +=head2 METHODS + +=cut # FIXME our @view_classes = qw( Frey::View - Frey::REST Strix::View ); @@ -27,40 +34,75 @@ warn "available templates = ",dump( Template::Declare->templates ); our @javascript; +our $debug = 0; use Template::Declare; use Template::Declare::Tags; # defaults to 'HTML' + Template::Declare->init( roots => \@view_classes, around_template => sub { my ($orig, $path, $args, $code) = @_; + my $from = (caller(1))[3]; + my $package = __PACKAGE__; + if ( $from !~ m/$package/ ) { + warn "SKIP around_template for $path from $from\n"; + return $orig->(); + } else { + warn "WRAP around_temolate for $path from $from\n"; + } + my $t = time; html { head { title { $path } link { { rel is 'stylesheet' } - { href is 'static/app.css' } + { href is '/static/app.css' } { type is 'text/css' } { media is 'screen' } }; foreach my $js ( @javascript ) { script { { type is 'text/javascript' } - { src is $js } + { src is "/$js" } } - } + }; } body { $orig->(); } - } - warn "TEMPLATE $path ",dump($args),sprintf(" in %.4fs\n",time - $t); + }; + warn "TEMPLATE $path ",dump($args),sprintf(" in %.4fs\n",time - $t) if $debug; }); -sub view { - my $self = shift; - return Template::Declare->show( @_ ); +=head2 page + +Wrap template into html page + + Frey::HTML->page( 'template_name', $req, $args ); + +=cut + +sub page { + my ( $self, $page, $req, $args ) = @_; + warn "## buffer_stack ",dump( Template::Declare->buffer_stack ); + Template::Declare->buffer->clear; # XXX we need to manually do this! + warn "## page $page ",dump($args),"\n"; + my $out = eval { Template::Declare->show( $page, $req, $args ) }; + if ( $@ ) { + carp "ERROR: $@"; + $out = Template::Declare->show( 'error', $req, "page $page " . dump($args) . ": $@" ); + } + return $out; } +=head2 add_javascript + +Add javascript to current page + + Frey::HTML->add_javascript( 'static/javascript.js' ); + +=cut + sub add_javascript { my $self = shift; my $js = shift or confess "no JavaScript path"; @@ -68,3 +110,5 @@ warn "Added javascript $js\n"; push @javascript, $js; } + +1;