diff options
author | tetragon <tetragon@4979c152-3d1c-0410-bac9-87ea11338e46> | 2007-06-22 19:04:24 +0000 |
---|---|---|
committer | tetragon <tetragon@4979c152-3d1c-0410-bac9-87ea11338e46> | 2007-06-22 19:04:24 +0000 |
commit | bfa1a35ab8b449de5047bbbf7a85cbd0cc4e20a1 (patch) | |
tree | 25885edbe21b05839cacbe8b3249017c79736c23 | |
parent | eb21ae5da75a6d71afa8edc894b85701553f0751 (diff) |
Template handling adjustments
git-svn-id: https://ledger-smb.svn.sourceforge.net/svnroot/ledger-smb/trunk@1308 4979c152-3d1c-0410-bac9-87ea11338e46
-rwxr-xr-x | LedgerSMB/Template.pm | 19 | ||||
-rwxr-xr-x | LedgerSMB/Template/HTML.pm | 6 | ||||
-rwxr-xr-x | LedgerSMB/Template/PDF.pm | 6 | ||||
-rwxr-xr-x | LedgerSMB/Template/PS.pm | 5 | ||||
-rw-r--r-- | LedgerSMB/Template/TTI18N.pm | 53 | ||||
-rwxr-xr-x | LedgerSMB/Template/TXT.pm | 5 | ||||
-rw-r--r-- | t/04-template-handling.t | 106 | ||||
-rw-r--r-- | t/data/04-gettext.html | 4 | ||||
-rw-r--r-- | t/data/04-gettext.tex | 12 |
9 files changed, 183 insertions, 33 deletions
diff --git a/LedgerSMB/Template.pm b/LedgerSMB/Template.pm index 5568373c..2366a9ca 100755 --- a/LedgerSMB/Template.pm +++ b/LedgerSMB/Template.pm @@ -11,13 +11,16 @@ This module renders templates. =over -=item new(user => \%myconfig, template => $string, format => 'HTML', [language => $string,] [include_path => $path]); +=item new(user => \%myconfig, template => $string, format => 'HTML', [language => $string,] [include_path => $path], [no_auto_output => $bool], [method => $string] ); This command instantiates a new template: template is the file name of the template to be processed. format is the type of format to be used. Currently only HTML is supported language (optional) specifies the language for template selection. include_path allows one to override the template directory and use this with user interface templates. +no_auto_output disables the automatic output of rendered templates. +method is the output method to use, defaults to HTTP +media is a synonym for method =item render($hashref) @@ -63,10 +66,13 @@ sub new { "${LedgerSMB::Sysconfig::tempdir}/$args{outputfile}"; } else { $self->{outputfile} = - "${LedgerSMB::Sysconfig::tempdir}/$args{template}-output"; + "${LedgerSMB::Sysconfig::tempdir}/$args{template}-output-$$"; } $self->{include_path} = $args{path}; $self->{locale} = $args{locale}; + $self->{noauto} = $args{noauto}; + $self->{method} = $args{method}; + $self->{method} ||= $args{media}; bless $self, $class; @@ -112,13 +118,18 @@ sub render { } $format->can('process')->($self, $cleanvars); - return $format->can('postprocess')->($self); + #return $format->can('postprocess')->($self); + my $post = $format->can('postprocess')->($self); + if (!$self->{'noauto'}) { + $self->output; + } + return $post; } sub output { my $self = shift; my %args = @_; - my $method = $args{method} || $args{media}; + my $method = $self->{method} || $args{method} || $args{media}; if ('email' eq lc $method) { $self->_email_output; diff --git a/LedgerSMB/Template/HTML.pm b/LedgerSMB/Template/HTML.pm index d02000a9..0ca82bcc 100755 --- a/LedgerSMB/Template/HTML.pm +++ b/LedgerSMB/Template/HTML.pm @@ -42,6 +42,7 @@ package LedgerSMB::Template::HTML; use Error qw(:try); use CGI; use Template; +use LedgerSMB::Template::TTI18N; sub get_template { my $name = shift; @@ -54,6 +55,7 @@ sub preprocess { my $type = ref $rawvars; #XXX fix escaping function + return $rawvars if $type =~ /^LedgerSMB::Locale/; if ( $type eq 'ARRAY' ) { for (@{$rawvars}) { push @{$vars}, preprocess( $_ ); @@ -83,7 +85,9 @@ sub process { }) || throw Error::Simple Template->error(); if (not $template->process( get_template($parent->{template}), - $cleanvars, "$parent->{outputfile}.html", binmode => ':utf8')) { + {%$cleanvars, %$LedgerSMB::Template::TTI18N::ttfuncs, + 'escape' => \&preprocess}, + "$parent->{outputfile}.html", binmode => ':utf8')) { throw Error::Simple $template->error(); } $parent->{mimetype} = 'text/html'; diff --git a/LedgerSMB/Template/PDF.pm b/LedgerSMB/Template/PDF.pm index f201b11d..cd244736 100755 --- a/LedgerSMB/Template/PDF.pm +++ b/LedgerSMB/Template/PDF.pm @@ -40,6 +40,7 @@ package LedgerSMB::Template::PDF; use Error qw(:try); use Template::Latex; +use LedgerSMB::Template::TTI18N; sub get_template { my $name = shift; @@ -51,6 +52,7 @@ sub preprocess { my $vars; my $type = ref $rawvars; + return $rawvars if $type =~ /^LedgerSMB::Locale/; if ($type eq 'ARRAY') { for (@{$rawvars}) { push @{$vars}, preprocess($_); @@ -83,7 +85,9 @@ sub process { if (not $template->process( get_template($parent->{template}), - $cleanvars, "$parent->{outputfile}.pdf", binmode => 1)) { + {%$cleanvars, %$LedgerSMB::Template::TTI18N::ttfuncs, + 'escape' => \&preprocess}, + "$parent->{outputfile}.pdf", binmode => 1)) { throw Error::Simple $template->error(); } $parent->{mimetype} = 'application/pdf'; diff --git a/LedgerSMB/Template/PS.pm b/LedgerSMB/Template/PS.pm index 10a3806e..ac58204d 100755 --- a/LedgerSMB/Template/PS.pm +++ b/LedgerSMB/Template/PS.pm @@ -40,6 +40,7 @@ package LedgerSMB::Template::PS; use Error qw(:try); use Template::Latex; +use LedgerSMB::Template::TTI18N; sub get_template { my $name = shift; @@ -69,7 +70,9 @@ sub process { if (not $template->process( get_template($parent->{template}), - $cleanvars, "$parent->{outputfile}.ps", binmode => ':utf8')) { + {%$cleanvars, %$LedgerSMB::Template::TTI18N::ttfuncs, + 'escape' => \&preprocess}, + "$parent->{outputfile}.ps", binmode => 1)) { throw Error::Simple $template->error(); } $parent->{mimetype} = 'application/postscript'; diff --git a/LedgerSMB/Template/TTI18N.pm b/LedgerSMB/Template/TTI18N.pm new file mode 100644 index 00000000..bd79edb1 --- /dev/null +++ b/LedgerSMB/Template/TTI18N.pm @@ -0,0 +1,53 @@ + +=head1 NAME + +LedgerSMB::Template::TTI18N Template Toolkit i18n support functions + +=head1 SYNOPSIS + +Various functions for Template Toolkit templates for internationalisation +support. + +=head1 METHODS + +=over + +=item <?lsmb gettext(locale, 'string [_1]', param) ?> + +Output the gettext translation for the string in the given locale. If +locale is a LedgerSMB::Locale object, it uses it. If it is a string, the +locale is loaded, cached, and used. + +=back + +=head1 Copyright (C) 2007, The LedgerSMB core team. + +This work contains copyrighted information from a number of sources all used +with permission. + +It is released under the GNU General Public License Version 2 or, at your +option, any later version. See COPYRIGHT file for details. For a full list +including contact information of contributors, maintainers, and copyright +holders, see the CONTRIBUTORS file. +=cut + +package LedgerSMB::Template::TTI18N; + +use LedgerSMB::Locale; + +my %locales; # Cache string-loaded locales +our $ttfuncs = {}; + +$ttfuncs->{gettext} = sub { + my $locale = shift; + if (ref $locale) { + return $locale->text(@_); + } elsif ($locales{$locale}) { + return $locales{$locale}->text(@_); + } else { + $locales{$locale} = LedgerSMB::Locale->get_handle($locale); + return $locales{$locale}->text(@_); + } +}; + + diff --git a/LedgerSMB/Template/TXT.pm b/LedgerSMB/Template/TXT.pm index 40d6edb5..a950335f 100755 --- a/LedgerSMB/Template/TXT.pm +++ b/LedgerSMB/Template/TXT.pm @@ -40,6 +40,7 @@ package LedgerSMB::Template::TXT; use Error qw(:try); use Template; +use LedgerSMB::Template::TTI18N; sub get_template { my $name = shift; @@ -65,7 +66,9 @@ sub process { if (not $template->process( get_template($parent->{template}), - $cleanvars, "$parent->{outputfile}.txt", binmode => ':utf8')) { + {%$cleanvars, %$LedgerSMB::Template::TTI18N::ttfuncs, + 'escape' => \&preprocess}, + "$parent->{outputfile}.txt", binmode => ':utf8')) { throw Error::Simple $template->error(); } $parent->{mimetype} = 'text/plain'; diff --git a/t/04-template-handling.t b/t/04-template-handling.t index a8b20c27..a75bc26e 100644 --- a/t/04-template-handling.t +++ b/t/04-template-handling.t @@ -18,8 +18,8 @@ use LedgerSMB::Sysconfig; use LedgerSMB::Locale; use LedgerSMB::Template; use LedgerSMB::Template::HTML; -use LedgerSMB::Template::PS; use LedgerSMB::Template::PDF; +use LedgerSMB::Template::PS; use LedgerSMB::Template::TXT; $LedgerSMB::Sysconfig::tempdir = 't/var'; @@ -193,7 +193,7 @@ isa_ok($template, 'LedgerSMB::Template', $template = undef; $template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'HTML', - 'template' => '04-template-2'); + 'template' => '04-template-2', 'no_auto_output' => 1); ok(defined $template, 'Template, new: Object creation with non-existent template'); throws_ok{$template->render({'login' => 'foo'})} qr/not found/, @@ -201,7 +201,7 @@ throws_ok{$template->render({'login' => 'foo'})} qr/not found/, $template = undef; $template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'TODO', - 'template' => '04-template'); + 'template' => '04-template', 'no_auto_output' => 1); ok(defined $template, 'Template, new: Object creation with non-existent format'); throws_ok{$template->render({'login' => 'foo'})} qr/Can't locate/, @@ -213,80 +213,136 @@ throws_ok{$template->render({'login' => 'foo'})} qr/Can't locate/, $template = undef; $template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'PDF', - 'template' => '04-template'); + 'template' => '04-template', 'no_auto_output' => 1); ok(defined $template, 'Template, new (PDF): Object creation with format and template'); isa_ok($template, 'LedgerSMB::Template', 'Template, new (PDF): Object creation with format and template'); is($template->{include_path}, 't/data', 'Template, new (PDF): Object creation with format and template'); -is($template->render({'login' => 'foo&bar'}), 't/var/04-template-output.pdf', +is($template->render({'login' => 'foo&bar'}), "t/var/04-template-output-$$.pdf", 'Template, render (PDF): Simple PDF template, default filename'); -ok(-e 't/var/04-template-output.pdf', 'Template, render (PDF): File created'); -is(unlink('t/var/04-template-output.pdf'), 1, +ok(-e "t/var/04-template-output-$$.pdf", + 'Template, render (PDF): File created'); +is(unlink("t/var/04-template-output-$$.pdf"), 1, 'Template, render (PDF): removing testfile'); -ok(!-e 't/var/04-template-output.pdf', +ok(!-e "t/var/04-template-output-$$.pdf", 'Template, render (PDF): testfile removed'); $template = undef; $template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'PS', - 'template' => '04-template'); + 'template' => '04-template', 'no_auto_output' => 1); ok(defined $template, 'Template, new (PS): Object creation with format and template'); isa_ok($template, 'LedgerSMB::Template', 'Template, new (PS): Object creation with format and template'); is($template->{include_path}, 't/data', 'Template, new (PS): Object creation with format and template'); -is($template->render({'login' => 'foo\&bar'}), 't/var/04-template-output.ps', +is($template->render({'login' => 'foo\&bar'}), + "t/var/04-template-output-$$.ps", 'Template, render (PS): Simple Postscript template, default filename'); -ok(-e 't/var/04-template-output.ps', 'Template, render (PS): File created'); -is(unlink('t/var/04-template-output.ps'), 1, +ok(-e "t/var/04-template-output-$$.ps", 'Template, render (PS): File created'); +is(unlink("t/var/04-template-output-$$.ps"), 1, 'Template, render (PS): removing testfile'); -ok(!-e 't/var/04-template-output.ps', +ok(!-e "t/var/04-template-output-$$.ps", 'Template, render (PS): testfile removed'); $template = undef; $template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'TXT', - 'template' => '04-template'); + 'template' => '04-template', 'no_auto_output' => 1); ok(defined $template, 'Template, new (TXT): Object creation with format and template'); isa_ok($template, 'LedgerSMB::Template', 'Template, new (TXT): Object creation with format and template'); is($template->{include_path}, 't/data', 'Template, new (TXT): Object creation with format and template'); -is($template->render({'login' => 'foo&bar'}), 't/var/04-template-output.txt', +is($template->render({'login' => 'foo&bar'}), + "t/var/04-template-output-$$.txt", 'Template, render: Simple text template, default filename'); -ok(-e 't/var/04-template-output.txt', 'Template, render (TXT): File created'); -open($FH, '<', 't/var/04-template-output.txt'); +ok(-e "t/var/04-template-output-$$.txt", + 'Template, render (TXT): File created'); +open($FH, '<', "t/var/04-template-output-$$.txt"); @r = <$FH>; close($FH); chomp(@r); is(join("\n", @r), "I am a template.\nLook at me foo&bar.", 'Template, render (TXT): Simple TXT template, correct output'); -is(unlink('t/var/04-template-output.txt'), 1, +is(unlink("t/var/04-template-output-$$.txt"), 1, 'Template, render (TXT): removing testfile'); -ok(!-e 't/var/04-template-output.html', +ok(!-e "t/var/04-template-output-$$.txt", 'Template, render (TXT): testfile removed'); $template = undef; $template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'HTML', - 'template' => '04-template'); + 'template' => '04-template', 'no_auto_output' => 1); ok(defined $template, 'Template, new (HTML): Object creation with format and template'); isa_ok($template, 'LedgerSMB::Template', 'Template, new (HTML): Object creation with format and template'); is($template->{include_path}, 't/data', 'Template, new (HTML): Object creation with format and template'); -is($template->render({'login' => 'foo&bar'}), 't/var/04-template-output.html', +is($template->render({'login' => 'foo&bar'}), + "t/var/04-template-output-$$.html", 'Template, render (HTML): Simple HTML template, default filename'); -ok(-e 't/var/04-template-output.html', 'Template, render (HTML): File created'); -open($FH, '<', 't/var/04-template-output.html'); +ok(-e "t/var/04-template-output-$$.html", + 'Template, render (HTML): File created'); +open($FH, '<', "t/var/04-template-output-$$.html"); @r = <$FH>; close($FH); chomp(@r); is(join("\n", @r), "I am a template.\nLook at me foo&bar.", 'Template, render (HTML): Simple HTML template, correct output'); -is(unlink('t/var/04-template-output.html'), 1, +is(unlink("t/var/04-template-output-$$.html"), 1, 'Template, render (HTML): removing testfile'); -ok(!-e 't/var/04-template-output.html', +ok(!-e "t/var/04-template-output-$$.html", 'Template, render (HTML): testfile removed'); + +$template = undef; +$template = new LedgerSMB::Template('user' => $myconfig, 'format' => 'HTML', + 'template' => '04-gettext', 'outputfile' => '04-gettext', + 'no_auto_output' => 1); +ok(defined $template, + 'Template, new (HTML): Object creation with outputfile'); +isa_ok($template, 'LedgerSMB::Template', + 'Template, new (HTML): Object creation with outputfile'); +is($template->{include_path}, 't/data', + 'Template, new (HTML): Object creation with outputfile'); +is($template->render({'month' => 'June', 'login' => 'foo&bar', + 'fr' => $locale}), 't/var/04-gettext.html', + 'Template, render (HTML): Gettext HTML template'); +ok(-e 't/var/04-gettext.html', 'Template, render (HTML): File created'); +open($FH, '<', 't/var/04-gettext.html'); +@r = <$FH>; +close($FH); +chomp(@r); +is(join("\n", @r), + "I am a foo&bar.\nLook at me Juin.\njuni\nAan foo&bar", + 'Template, render (HTML): Gettext HTML template, correct output'); +is(unlink('t/var/04-gettext.html'), 1, + 'Template, render (HTML): removing testfile'); +ok(!-e 't/var/04-gettext.html', + 'Template, render (HTML): testfile removed'); + +## XeTeX test, requires PDFLATEX to be xelatex and modified Template::Latex +SKIP: { + skip 'XeTeX and modified Template::Latex requiring PDF tests'; + $template = undef; + $template = new LedgerSMB::Template('user' => $myconfig, + 'format' => 'PDF', 'template' => '04-gettext', + 'no_auto_output' => 1); + ok(defined $template, + 'Template, new (PDF): XeTeX template creation'); + isa_ok($template, 'LedgerSMB::Template', + 'Template, new (PDF): XeTeX template creation'); + is($template->{include_path}, 't/data', + 'Template, new (PDF): XeTeX template creation'); + is($template->render({'login' => 'foo&bar'}), + "t/var/04-gettext-output-$$.pdf", + 'Template, render (PDF): XeTeX PDF template, default filename'); + ok(-e "t/var/04-gettext-output-$$.pdf", + 'Template, render (PDF): File created'); + is(unlink("t/var/04-gettext-output-$$.pdf"), 1, + 'Template, render (PDF): removing testfile'); + ok(!-e "t/var/04-gettext-output-$$.pdf", + 'Template, render (PDF): testfile removed'); +} diff --git a/t/data/04-gettext.html b/t/data/04-gettext.html new file mode 100644 index 00000000..716bb0b1 --- /dev/null +++ b/t/data/04-gettext.html @@ -0,0 +1,4 @@ +I am a <?lsmb login ?>. +Look at me <?lsmb gettext(fr, "June") ?>. +<?lsmb gettext('nl', "June") ?> +<?lsmb gettext('nl', "To [_1]", login) ?> diff --git a/t/data/04-gettext.tex b/t/data/04-gettext.tex new file mode 100644 index 00000000..6381b1a5 --- /dev/null +++ b/t/data/04-gettext.tex @@ -0,0 +1,12 @@ +<?lsmb FILTER latex ?> +\documentclass{scrartcl} +\usepackage[utf8]{inputenc} +\font\han="STSong" at 16pt +\font\rom="Gentium" at 16pt +\begin{document} +I am a <?lsmb login ?>. +test: {\han <?lsmb gettext('zh_CN', "June") ?>.} +Foo +\rom <?lsmb escape(gettext('fr', "Goods & Services")) ?> +\end{document} +<?lsmb END ?> |