1 package Sesse::pr0n::Templates;
5 use Sesse::pr0n::Common qw(error dberror);
8 use XML::TemplateSAX::Buffer;
9 use XML::TemplateSAX::Cleaner;
10 use XML::TemplateSAX::Handler;
14 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
26 my $base = $r->dir_config('TemplateBase');
29 for my $dir (<$base/*>) {
33 warn "Templates exist for '$1'";
41 if (!defined(%dirs)) {
45 my $site = $r->get_server_name();
46 if (defined($dirs{$site})) {
54 my ($r, $template) = @_;
56 my $dir = r_to_dir($r);
57 my $cache = $dirs{$dir}{$template};
58 if (defined($cache) && time - $cache->{'time'} <= 300) {
59 return $cache->{'contents'};
64 my $base = $r->dir_config('TemplateBase');
65 open TEMPLATE, "<$base/$dir/$template"
66 or ($dir ne 'default' and open TEMPLATE, "<$base/default/$template")
67 or Sesse::pr0n::Common::error($r, "Couldn't open $dir/$template: $!");
70 $newcache->{'contents'} = <TEMPLATE>;
74 $newcache->{'time'} = time;
75 $dirs{$dir}{$template} = $newcache;
76 return $newcache->{'contents'};
80 my ($r, $template, $args) = @_;
81 my $text = fetch_template($r, $template);
84 while (my ($key, $value) = each (%$args)) {
85 $key = "%" . uc($key) . "%";
86 $text =~ s/$key/$value/g;
93 my ($r, $page, $params) = @_;
95 $r->content_type('text/html; charset=utf-8');
96 $params->{'version'} = $Sesse::pr0n::Common::VERSION;
98 # build up the XML chain
99 my $consumer = ModPerlConsumer->new($r);
100 my $writer = XML::SAX::Writer->new(Output => $consumer);
101 my $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $writer);
102 my $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $params);
103 my $parser = XML::SAX::Expat->new(Handler => $filter);
105 # kick off the parsing
106 $parser->parse_string(fetch_template($r, $page));
109 # XML consumer for Apache2::Request
110 package ModPerlConsumer;
112 our @ISA = qw( XML::SAX::Writer::ConsumerInterface );
115 return $base->SUPER::new($r);
119 my ($self, $text) = @_;
120 $$self->print($text);