diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2008-03-08 14:30:15 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2008-03-08 14:30:15 +0000 |
| commit | a420ba2fd04bb2adce1c693fc8d296f332bdd95c (patch) | |
| tree | 625f296d92a0f370b6fe16e8fd3d15aa4c4ba4d7 /lib/XXV/OUTPUT | |
| parent | 3d506c66cc8ec133730edddeaff4bd2ffd8a129b (diff) | |
| download | xxv-a420ba2fd04bb2adce1c693fc8d296f332bdd95c.tar.gz xxv-a420ba2fd04bb2adce1c693fc8d296f332bdd95c.tar.bz2 | |
Charset UTF8 Support. Run 'xxvd --utf8' to use encoding utf8 as data charset.
Diffstat (limited to 'lib/XXV/OUTPUT')
| -rw-r--r-- | lib/XXV/OUTPUT/Ajax.pm | 12 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/Console.pm | 1 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/HTML/PUSH.pm | 40 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/Html.pm | 9 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/JABBER.pm | 2 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/MAIL.pm | 1 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/RSS.pm | 1 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/NEWS/VDR.pm | 1 | ||||
| -rw-r--r-- | lib/XXV/OUTPUT/Wml.pm | 146 |
9 files changed, 113 insertions, 100 deletions
diff --git a/lib/XXV/OUTPUT/Ajax.pm b/lib/XXV/OUTPUT/Ajax.pm index ca7dca9..0bfff87 100644 --- a/lib/XXV/OUTPUT/Ajax.pm +++ b/lib/XXV/OUTPUT/Ajax.pm @@ -4,7 +4,6 @@ use strict; #use Template; use vars qw($AUTOLOAD); -use Locale::gettext; use Tools; $SIG{CHLD} = 'IGNORE'; @@ -73,20 +72,24 @@ sub new { $self->{outtype} = $attr{'-output'} || return error('No output type given!'); + $self->{charset} = $attr{'-charset'} + || 'ISO-8859-15'; + $self->{types} = { 'xml' => 'application/xml', # 'json' => 'application/json; charset=utf-8', # json with utf-8 # 'json' => 'application/json; charset=iso-8859-1', # json with iso-8859 - 'json' => 'text/html', +# 'json' => 'text/html', 'text' => 'text/plain', }; + $self->{types}->{'json'} = sprintf('application/json; charset=%s',$self->{charset}); # New JSON Object if required if($self->{outtype} eq 'json') { $self->{json} = JSON->new() || return error("Can't create JSON instance!"); } elsif($self->{outtype} eq 'xml') { - $self->{xml} = XML::Simple->new() + $self->{xml} = XML::Simple->new( NumericEscape => $self->{charset} eq 'UTF-8' ? 0 : 1 ) || return error("Can't create XML instance!"); } elsif($self->{outtype} eq 'text') { # ... @@ -140,8 +143,10 @@ sub printout { if($self->{browser}->{Method} ne 'HEAD') { if( $self->{outtype} eq 'json' ) { if($self->{json}->can('encode')) { # Version 2.0 see http://search.cpan.org/~makamaka/JSON-2.04/lib/JSON.pm#Transition_ways_from_1.xx_to_2.xx. + $self->{json}->utf8(1) if($self->{charset} eq 'UTF-8'); $content = $self->{json}->encode($self->{output}); } else { # Version 1.0 + $JSON::UTF8=1 if($self->{charset} eq 'UTF-8'); $content = $self->{json}->objToJson($self->{output}); } } elsif($self->{outtype} eq 'xml') { @@ -188,6 +193,7 @@ sub header { -type => $typ, -status => "200 OK", -expires => "now", + -charset => $self->{charset}, %{$arg}, ); } diff --git a/lib/XXV/OUTPUT/Console.pm b/lib/XXV/OUTPUT/Console.pm index 9b756ac..d35897b 100644 --- a/lib/XXV/OUTPUT/Console.pm +++ b/lib/XXV/OUTPUT/Console.pm @@ -6,7 +6,6 @@ BEGIN{ use strict; -use Locale::gettext; use Term::ReadLine; use Tools; use vars qw($AUTOLOAD); diff --git a/lib/XXV/OUTPUT/HTML/PUSH.pm b/lib/XXV/OUTPUT/HTML/PUSH.pm index 79b05c7..c2640d1 100644 --- a/lib/XXV/OUTPUT/HTML/PUSH.pm +++ b/lib/XXV/OUTPUT/HTML/PUSH.pm @@ -15,8 +15,8 @@ XXV::OUTPUT::HTML::PUSH - A Push for http system use XXV::OUTPUT::HTML::PUSH; my $pusher = XXV::OUTPUT::HTML::PUSH->new( - -cgi => $obj->{cgi}, # The CGI Object from Lincoln Stein - -handle => $obj->{handle}, # The handle to printout the http Stuff + -cgi => $self->{cgi}, # The CGI Object from Lincoln Stein + -handle => $self->{handle}, # The handle to printout the http Stuff ); $pusher->start(); # Start the Push Process @@ -43,52 +43,56 @@ sub new { $self->{cgi} = $attr{'-cgi'} || return error('No CGI Object defined!'); - return $self; + $self->{charset} = $attr{'-charset'} + || 'ISO-8859-1'; + + return $self; } # ------------------ sub start { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $out = shift || 0; - $obj->{handle}->print($obj->{cgi}->multipart_init(-boundary=>'----here we go!')); - $obj->print($out) if($out); + $self->{handle}->print($self->{cgi}->multipart_init(-boundary=>'----here we go!')); + $self->print($out) if($out); } # ------------------ sub print { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $msg = shift || return; my $type = shift || 'text/html'; - $obj->{handle}->print($obj->{cgi}->multipart_start(-type=>$type)); - $obj->{handle}->print($msg."\n"); - $obj->{handle}->print($obj->{cgi}->multipart_end); + $self->{handle}->print($self->{cgi}->multipart_start(-type=>$type)); + $self->{handle}->print($msg."\n"); + $self->{handle}->print($self->{cgi}->multipart_end); } # ------------------ sub follow_print { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $msg = shift || return; my $type = shift || 'text/html'; - unless($obj->{header}) { - $obj->{handle}->print($obj->{cgi}->multipart_start(-type=>$type)); - $obj->{header} = 1; + unless($self->{header}) { + $self->{handle}->print($self->{cgi}->multipart_start(-type=>$type)); + $self->{header} = 1; } - $obj->{handle}->print($msg."\n"); + $self->{handle}->print($msg."\n"); } # ------------------ sub stop { # ------------------ - my $obj = shift || return error('No object defined!'); - $obj->{handle}->print($obj->{cgi}->multipart_end); - $obj->{handle}->print($obj->{cgi}->header( + my $self = shift || return error('No object defined!'); + $self->{handle}->print($self->{cgi}->multipart_end); + $self->{handle}->print($self->{cgi}->header( -type => 'text/html', -status => "200 OK", + -charset => $self->{charset}, )); } diff --git a/lib/XXV/OUTPUT/Html.pm b/lib/XXV/OUTPUT/Html.pm index e28b87c..953604d 100644 --- a/lib/XXV/OUTPUT/Html.pm +++ b/lib/XXV/OUTPUT/Html.pm @@ -3,7 +3,6 @@ package XXV::OUTPUT::Html; use strict; use vars qw($AUTOLOAD); -use Locale::gettext; use Tools; use XXV::OUTPUT::HTML::WAIT; use File::Path; @@ -98,6 +97,9 @@ sub new { $self->{debug} = $attr{'-debug'} || 0; + $self->{charset} = $attr{'-charset'} + || 'ISO-8859-1'; + $self->{TYP} = 'HTML'; # Forward name of Server for CGI::server_software @@ -190,6 +192,7 @@ sub parseTemplateFile { pid => $$, debug => $self->{debug}, user => $user, + charset => $self->{charset}, # query the current locale locale => main::getGeneralConfig->{Language}, allow => sub{ @@ -369,7 +372,8 @@ sub header { return $self->{cgi}->header( -type => $typ, -status => "200 OK", - -expires => ($typ =~ 'text/html' || (defined $self->{nocache} && $self->{nocache})) ? "now" : "+7d", + -expires => ($typ =~ 'text/html' || (defined $self->{nocache} && $self->{nocache})) ? "now" : "+30d", + -charset => $self->{charset}, %{$arg}, ); } @@ -567,6 +571,7 @@ sub wait { my $waiter = XXV::OUTPUT::HTML::WAIT->new( -cgi => $self->{cgi}, -handle => $self->{handle}, + -charset => $self->{charset}, -callback => sub{ my ($min, $max, $cur, $steps, $nextmessage, $eta) = @_; my $out = $self->parseTemplate( diff --git a/lib/XXV/OUTPUT/NEWS/JABBER.pm b/lib/XXV/OUTPUT/NEWS/JABBER.pm index 2090079..9d4145d 100644 --- a/lib/XXV/OUTPUT/NEWS/JABBER.pm +++ b/lib/XXV/OUTPUT/NEWS/JABBER.pm @@ -2,8 +2,6 @@ package XXV::OUTPUT::NEWS::JABBER; use strict; use Tools; -use POSIX qw(locale_h); -use Locale::gettext; # News Modules have only three methods # init - for intervall or others diff --git a/lib/XXV/OUTPUT/NEWS/MAIL.pm b/lib/XXV/OUTPUT/NEWS/MAIL.pm index 07bdd07..3583344 100644 --- a/lib/XXV/OUTPUT/NEWS/MAIL.pm +++ b/lib/XXV/OUTPUT/NEWS/MAIL.pm @@ -3,7 +3,6 @@ use strict; use Tools; use POSIX qw(locale_h); -use Locale::gettext; # News Modules have only this methods # init - for intervall or others diff --git a/lib/XXV/OUTPUT/NEWS/RSS.pm b/lib/XXV/OUTPUT/NEWS/RSS.pm index 3cc4d2b..2cb4d01 100644 --- a/lib/XXV/OUTPUT/NEWS/RSS.pm +++ b/lib/XXV/OUTPUT/NEWS/RSS.pm @@ -3,7 +3,6 @@ use strict; use Tools; use POSIX qw(locale_h); -use Locale::gettext; # News Modules have only three methods # init - for intervall or others diff --git a/lib/XXV/OUTPUT/NEWS/VDR.pm b/lib/XXV/OUTPUT/NEWS/VDR.pm index 45d2cc7..524e483 100644 --- a/lib/XXV/OUTPUT/NEWS/VDR.pm +++ b/lib/XXV/OUTPUT/NEWS/VDR.pm @@ -3,7 +3,6 @@ use strict; use Tools; use POSIX qw(locale_h); -use Locale::gettext; # News Modules have only three methods # init - for intervall or others diff --git a/lib/XXV/OUTPUT/Wml.pm b/lib/XXV/OUTPUT/Wml.pm index 7349ab5..383ec99 100644 --- a/lib/XXV/OUTPUT/Wml.pm +++ b/lib/XXV/OUTPUT/Wml.pm @@ -3,7 +3,6 @@ use strict; use vars qw($AUTOLOAD); -use Locale::gettext; use Tools; use File::Path; use Pod::Html; @@ -12,7 +11,7 @@ use Pod::Html; # ------------------ sub module { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $args = { Name => 'Wml', Prereq => { @@ -30,18 +29,18 @@ sub module { # ------------------ sub AUTOLOAD { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $data = shift || {}; my $params = shift || 0; my $name = (split('::', $AUTOLOAD))[-1]; return if($name eq 'DESTROY'); - my $output = $obj->parseTemplate($name, $data, $params); + my $output = $self->parseTemplate($name, $data, $params); - $obj->out( $output ); + $self->out( $output ); - $obj->{call} = ''; + $self->{call} = ''; } @@ -82,6 +81,9 @@ sub new { $self->{browser} = $attr{'-browser'} || return error('No browser given!'); + $self->{charset} = $attr{'-charset'} + || 'ISO-8859-1'; + # $self->{start} = $attr{'-start'} # || return error('No StartPage given!'); @@ -106,12 +108,12 @@ sub new { # ------------------ sub parseTemplate { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $name = shift || return error('No name defined!'); my $data = shift || return error('No data defined!'); my $params = shift || {}; - my $t = $obj->{tt}; + my $t = $self->{tt}; my $u = main::getModule('USER'); # you can use two templates, first is a user defined template @@ -119,26 +121,27 @@ sub parseTemplate { # i.e. call the htmlhelp command the htmlhelp.tmpl # SpecialTemplate: ./wmlRoot/usage.tmpl # StandardTemplate: ./wmlRoot/widgets/menu.tmpl - my $widget_first = sprintf('%s.tmpl', (exists $obj->{call}) ? $obj->{call} : 'nothing'); + my $widget_first = sprintf('%s.tmpl', (exists $self->{call}) ? $self->{call} : 'nothing'); my $widget_second = sprintf('widgets/%s.tmpl', $name); - my $widget = (-e sprintf('%s/%s', $obj->{wmldir}, $widget_first) ? $widget_first : $widget_second); - my $user = ($u->{active} eq 'y' && $obj->{USER}->{Name} ? $obj->{USER}->{Name} : "nobody" ); + my $widget = (-e sprintf('%s/%s', $self->{wmldir}, $widget_first) ? $widget_first : $widget_second); + my $user = ($u->{active} eq 'y' && $self->{USER}->{Name} ? $self->{USER}->{Name} : "nobody" ); my $output; my $vars = { - cgi => $obj->{cgi}, + cgi => $self->{cgi}, call => $name, data => $data, type => ref $data, - info => $obj->browser, + info => $self->browser, param => $params, pid => $$, debug => 1, user => $user, + charset => $self->{charset}, allow => sub{ - my($cmdobj, $cmdname, $se, $err) = $u->checkCommand($obj, $_[0],"1"); + my($cmdobj, $cmdname, $se, $err) = $u->checkCommand($self, $_[0],"1"); return 1 if($cmdobj); }, - basedir => $obj->{wmldir}, + basedir => $self->{wmldir}, entities => sub{ return entities($_[0]) }, # translate string, usage : gettext(foo,truncate) or gettext(foo) # value for truncate are optional @@ -175,34 +178,35 @@ sub parseTemplate { # ------------------ sub out { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $text = shift || 'no Text for Output'; my $type = shift || 'text/vnd.wap.wml'; my %args = @_; - my $q = $obj->{cgi}; - unless(defined $obj->{header}) { + my $q = $self->{cgi}; + unless(defined $self->{header}) { # HTTP Header - $obj->{handle}->print( - $obj->header($type, \%args) + $self->{handle}->print( + $self->header($type, \%args) ); } - $obj->{handle}->print( $text,"\r\n" ); + $self->{handle}->print( $text,"\r\n" ); } # ------------------ sub header { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $typ = shift || return error ('No Type!' ); my $arg = shift || {}; - $obj->{header} = 1; - return $obj->{cgi}->header( + $self->{header} = 1; + return $self->{cgi}->header( -type => $typ, -status => "200 OK", - -expires => ($typ =~ 'text/vnd.wap.wml' || (defined $obj->{nocache} && $obj->{nocache})) ? "now" : "+12h", + -expires => ($typ =~ 'text/vnd.wap.wml' || (defined $self->{nocache} && $self->{nocache})) ? "now" : "+12h", + -charset => $self->{charset}, %{$arg}, ); } @@ -210,45 +214,45 @@ sub header { # ------------------ sub statusmsg { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $msg = shift || return error ('No Msg!'); my $status = shift || return error ('No Status!'); - unless(defined $obj->{header}) { - $obj->{nopack} = 1; - $obj->{header} = 1; - my $data = $obj->{cgi}->header( + unless(defined $self->{header}) { + $self->{nopack} = 1; + $self->{header} = 1; + my $data = $self->{cgi}->header( -type => 'text/vnd.wap.wml', -status => $status, -expires => "now", ); - $obj->out($data); + $self->out($data); } my @title = split ('\n', $status); - $obj->start(undef,{ title => $title[0] }); - $obj->err($msg); - $obj->footer(); + $self->start(undef,{ title => $title[0] }); + $self->err($msg); + $self->footer(); } # ------------------ # Send HTTP Status 401 (Authorization Required) sub login { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $msg = shift || ''; - $obj->statusmsg($msg,"401 Authorization Required\nWWW-Authenticate: Basic realm=\"xxvd\""); + $self->statusmsg($msg,"401 Authorization Required\nWWW-Authenticate: Basic realm=\"xxvd\""); } # ------------------ # Send HTTP Status 403 (Access Forbidden) sub status403 { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $msg = shift || ''; - $obj->statusmsg($msg,"403 Forbidden"); + $self->statusmsg($msg,"403 Forbidden"); } @@ -256,26 +260,26 @@ sub status403 { # Send HTTP Status 404 (File not found) sub status404 { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $file = shift || return error('No file defined!'); my $why = shift || ""; lg sprintf("Couldn't open file '%s' : %s!",$file,$why); - $file =~ s/$obj->{wmldir}\///g; # Don't post wml root, avoid spy out + $file =~ s/$self->{wmldir}\///g; # Don't post wml root, avoid spy out - $obj->statusmsg(sprintf(gettext("Couldn't open file '%s' : %s!"),$file,$why),"404 File not found"); + $self->statusmsg(sprintf(gettext("Couldn't open file '%s' : %s!"),$file,$why),"404 File not found"); } # ------------------ sub question { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $titel = shift || 'undef'; my $questions = shift || return error('No data defined!'); my $erg = shift || 0; - my $q = $obj->{cgi}; + my $q = $self->{cgi}; my $quest; # Check Data @@ -303,7 +307,7 @@ sub question { } if($error) { - $obj->err(sprintf(gettext("Error '%s' (%s) : %s!"), $data->{msg}, $name, $error)); + $self->err(sprintf(gettext("Error '%s' (%s) : %s!"), $data->{msg}, $name, $error)); last; } } @@ -313,61 +317,61 @@ sub question { } } - $obj->formStart($titel); + $self->formStart($titel); if(ref $questions eq 'ARRAY') { - my $q = $obj->{cgi}; + my $q = $self->{cgi}; @$quest = @$questions; while (my ($name, $data) = splice(@$quest, 0, 2)) { my $type = delete $data->{typ}; $data->{msg} =~ s/\n/<br \/>/sig if($data->{msg}); $data->{NAME} = '__'.$name; $type ||= 'string'; - $obj->$type($data); + $self->$type($data); } } else { my $type = delete $questions->{typ}; $questions->{NAME} = '__'.$type; $type ||= 'string'; - $obj->$type($questions); + $self->$type($questions); } - $obj->formEnd; + $self->formEnd; return undef; } # ------------------ sub image { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $file = shift || return error('No file defined!'); - my $typ = shift || $obj->{mime}->{lc((split('\.', $file))[-1])} + my $typ = shift || $self->{mime}->{lc((split('\.', $file))[-1])} or return error("No Type in Mimehash or File: $file"); my $data = load_file($file) - or return $obj->status404($file,$!); + or return $self->status404($file,$!); - $obj->out($data, $typ); + $self->out($data, $typ); } # ------------------ sub datei { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $file = shift || return error('No file defined!'); my $data = load_file($file) - or return $obj->status404($file,$!); + or return $self->status404($file,$!); - $obj->out($data, 'text/vnd.wap.wml'); + $self->out($data, 'text/vnd.wap.wml'); } # ------------------ sub pod { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $modname = shift || return error('No modul name defined!'); $modname = ucfirst($modname) if($modname eq 'GENERAL'); - my $podfile = sprintf('%s/%s.pod', $obj->{paths}->{PODPATH}, $modname); + my $podfile = sprintf('%s/%s.pod', $self->{paths}->{PODPATH}, $modname); my $tmpdir = main::getModule('USER')->userTmp; my $outfile = sprintf('%s/%s_%d.pod', $tmpdir, $modname, time); @@ -381,49 +385,49 @@ sub pod { my $html = load_file($outfile); $html = $1 if($html =~ /\<body.*?\>(.+?)\<\/body\>/si); - $obj->link({ + $self->link({ text => gettext("Back to configuration page."), - url => $obj->{browser}->{Referer}, + url => $self->{browser}->{Referer}, }); - $obj->message($html); + $self->message($html); } # ------------------ sub typ { # ------------------ - my $obj = shift || return error('No object defined!'); - return $obj->{TYP}; + my $self = shift || return error('No object defined!'); + return $self->{TYP}; } # ------------------ sub setCall { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $name = shift || return error('No name defined!'); - $obj->{call} = $name; - return $obj->{call}; + $self->{call} = $name; + return $self->{call}; } # ------------------ sub browser { # ------------------ - my $obj = shift || return error('No object defined!'); - return $obj->{browser}; + my $self = shift || return error('No object defined!'); + return $self->{browser}; } # Special Version from Message (with error handling) # ------------------ sub msg { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $data = shift || {}; my $err = shift; unless($err) { - $obj->message($data); + $self->message($data); } else { - $obj->err($data); + $self->err($data); } } |
