From cc042e07ef78786b758b22cee75509815e59ba5b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sven=20Sch=C3=B6ling?= Date: Tue, 20 Jul 2010 13:14:50 +0200 Subject: [PATCH] UTF8-Flags setzen/beachten Conflicts: SL/ReportGenerator.pm --- SL/Locale.pm | 36 +++++++++++++++++++++++++++++------ SL/ReportGenerator.pm | 39 +++++++++++++++----------------------- SL/SEPA/XML.pm | 6 +++--- SL/SEPA/XML/Transaction.pm | 7 +++---- SL/Template.pm | 16 ++++------------ 5 files changed, 55 insertions(+), 49 deletions(-) diff --git a/SL/Locale.pm b/SL/Locale.pm index 05f55ce46..28b13c696 100644 --- a/SL/Locale.pm +++ b/SL/Locale.pm @@ -36,11 +36,13 @@ package Locale; -use Text::Iconv; +use Encode; use List::Util qw(first); +use List::MoreUtils qw(any); use SL::LXDebug; use SL::Common; +use SL::Iconv; use SL::Inifile; use strict; @@ -88,12 +90,18 @@ sub _init { } my $db_charset = $main::dbcharset || Common::DEFAULT_CHARSET; + $self->{is_utf8} = (any { lc($::dbcharset || '') eq $_ } qw(utf8 utf-8 unicode)) ? 1 : 0; - $self->{iconv} = Text::Iconv->new($self->{charset}, $db_charset); - $self->{iconv_reverse} = Text::Iconv->new($db_charset, $self->{charset}); - $self->{iconv_english} = Text::Iconv->new('ASCII', $db_charset); - $self->{iconv_iso8859} = Text::Iconv->new('ISO-8859-15', $db_charset); - $self->{iconv_to_iso8859} = Text::Iconv->new($db_charset, 'ISO-8859-15'); + if ($self->{is_utf8}) { + binmode STDOUT, ":utf8"; + binmode STDERR, ":utf8"; + } + + $self->{iconv} = SL::Iconv->new($self->{charset}, $db_charset); + $self->{iconv_reverse} = SL::Iconv->new($db_charset, $self->{charset}); + $self->{iconv_english} = SL::Iconv->new('ASCII', $db_charset); + $self->{iconv_iso8859} = SL::Iconv->new('ISO-8859-15', $db_charset); + $self->{iconv_to_iso8859} = SL::Iconv->new($db_charset, 'ISO-8859-15'); $self->_read_special_chars_file($country); @@ -105,6 +113,12 @@ sub _init { (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)); } +sub is_utf8 { + my $self = shift; + my $handle = shift; + return $self->{is_utf8} && (!$handle || $handle->is_utf8); +} + sub _handle_markup { my $self = shift; my $str = shift; @@ -406,4 +420,14 @@ sub remap_special_chars { return $self->quote_special_chars($dst_format, $self->quote_special_chars("${src_format}-reverse", shift)); } +sub with_raw_io { + my $self = shift; + my $fh = shift; + my $code = shift; + + binmode $fh, ":raw"; + $code->(); + binmode $fh, ":utf8" if $self->is_utf8; +} + 1; diff --git a/SL/ReportGenerator.pm b/SL/ReportGenerator.pm index e23bf7786..e593a5e75 100644 --- a/SL/ReportGenerator.pm +++ b/SL/ReportGenerator.pm @@ -1,11 +1,9 @@ package SL::ReportGenerator; use Data::Dumper; -use Encode; use IO::Wrap; use List::Util qw(max); use Text::CSV_XS; -use Text::Iconv; #use PDF::API2; # these two eat up to .75s on startup. only load them if we actually need them #use PDF::Table; @@ -235,7 +233,9 @@ sub generate_with_headers { my $filename = $self->get_attachment_basename(); print qq|content-type: text/csv\n|; print qq|content-disposition: attachment; filename=${filename}.csv\n\n|; - $self->generate_csv_content(); + $::locale->with_raw_io(\*STDOUT, sub { + $self->generate_csv_content(); + }); } elsif ($format eq 'pdf') { $self->generate_pdf_content(); @@ -410,15 +410,6 @@ sub _cm2bp { return $_[0] * 72 / 2.54; } -sub _decode_text { - my $self = shift; - my $text = shift; - - $text = decode('UTF-8', $text) if ($self->{text_is_utf8}); - - return $text; -} - sub generate_pdf_content { eval { require PDF::API2; @@ -440,8 +431,7 @@ sub generate_pdf_content { my $num_columns = scalar @visible_columns; my $num_header_rows = 1; - my $font_encoding = $main::dbcharset || 'ISO-8859-15'; - $self->{text_is_utf8} = $font_encoding =~ m/^utf-?8$/i; + my $font_encoding = $main::dbcharset || 'ISO-8859-15'; foreach my $name (@visible_columns) { push @column_props, { 'justify' => $self->{columns}->{$name}->{align} eq 'right' ? 'right' : 'left' }; @@ -456,7 +446,7 @@ sub generate_pdf_content { foreach my $name (@visible_columns) { my $column = $self->{columns}->{$name}; - push @{ $data_row }, $self->_decode_text($column->{text}); + push @{ $data_row }, $column->{text}; push @{ $cell_props_row }, {}; } @@ -470,7 +460,7 @@ sub generate_pdf_content { push @cell_props, $cell_props_row; foreach my $custom_header_col (@{ $custom_header_row }) { - push @{ $data_row }, $self->_decode_text($custom_header_col->{text}); + push @{ $data_row }, $custom_header_col->{text}; my $num_output = ($custom_header_col->{colspan} * 1 > 1) ? $custom_header_col->{colspan} : 1; if ($num_output > 1) { @@ -488,7 +478,7 @@ sub generate_pdf_content { foreach my $row_set (@{ $self->{data} }) { if ('HASH' eq ref $row_set) { if ($row_set->{type} eq 'colspan_data') { - push @data, [ $self->_decode_text($row_set->{data}) ]; + push @data, [ $row_set->{data} ]; $cell_props_row = []; push @cell_props, $cell_props_row; @@ -512,7 +502,7 @@ sub generate_pdf_content { my $col_idx = 0; foreach my $col_name (@visible_columns) { my $col = $row->{$col_name}; - push @{ $data_row }, $self->_decode_text(join("\n", @{ $col->{data} || [] })); + push @{ $data_row }, join("\n", @{ $col->{data} || [] }); $column_props[$col_idx]->{justify} = 'right' if ($col->{align} eq 'right'); @@ -583,7 +573,7 @@ sub generate_pdf_content { my $top_text_height = 0; if ($self->{options}->{top_info_text}) { - my $top_text = $self->_decode_text($self->{options}->{top_info_text}); + my $top_text = $self->{options}->{top_info_text}; $top_text =~ s/\r//g; $top_text =~ s/\n+$//; @@ -631,7 +621,7 @@ sub generate_pdf_content { my $curpage = $pdf->openpage($page_num); if ($pdfopts->{number}) { - my $label = $self->_decode_text($main::locale->text("Page #1/#2", $page_num, $pdf->pages())); + my $label = $main::locale->text("Page #1/#2", $page_num, $pdf->pages()); my $text_obj = $curpage->text(); $text_obj->font($font, $font_size); @@ -640,7 +630,7 @@ sub generate_pdf_content { } if ($opts->{title}) { - my $title = $self->_decode_text($opts->{title}); + my $title = $opts->{title}; my $text_obj = $curpage->text(); $text_obj->font($font, $title_font_size); @@ -671,7 +661,9 @@ sub generate_pdf_content { print qq|content-type: application/pdf\n|; print qq|content-disposition: attachment; filename=${filename}.pdf\n\n|; - print $content; + $::locale->with_raw_io(\*STDOUT, sub { + print $content; + }); } } @@ -700,10 +692,9 @@ sub _print_content { sub unescape_string { my $self = shift; my $text = shift; - my $iconv = $main::locale->{iconv}; $text = $main::locale->unquote_special_chars('HTML', $text); - $text = $main::locale->{iconv}->convert($text) if ($main::locale->{iconv}); + $text = $::locale->{iconv}->convert($text); return $text; } diff --git a/SL/SEPA/XML.pm b/SL/SEPA/XML.pm index ee455360f..ddac25e26 100644 --- a/SL/SEPA/XML.pm +++ b/SL/SEPA/XML.pm @@ -8,9 +8,9 @@ use Encode; use List::Util qw(first sum); use List::MoreUtils qw(any); use POSIX qw(strftime); -use Text::Iconv; use XML::Writer; +use SL::Iconv; use SL::SEPA::XML::Transaction; sub new { @@ -34,12 +34,12 @@ sub _init { map { $self->{$_} = $params{$_} if (exists $params{$_}) } qw(src_charset company message_id grouped); - $self->{iconv} = Text::Iconv->new($self->{src_charset}, "UTF-8") || croak "Unsupported source charset $self->{src_charset}."; + $self->{iconv} = SL::Iconv->new($self->{src_charset}, "UTF-8") || croak "Unsupported source charset $self->{src_charset}."; my $missing_parameter = first { !$self->{$_} } qw(company message_id); croak "Missing parameter: $missing_parameter" if ($missing_parameter); - map { $self->{$_} = $self->_replace_special_chars(decode('UTF-8', $self->{iconv}->convert($self->{$_}))) } qw(company message_id); + map { $self->{$_} = $self->_replace_special_chars($self->{iconv}->convert($self->{$_})) } qw(company message_id); } sub add_transaction { diff --git a/SL/SEPA/XML/Transaction.pm b/SL/SEPA/XML/Transaction.pm index 8849b4192..be444af8b 100644 --- a/SL/SEPA/XML/Transaction.pm +++ b/SL/SEPA/XML/Transaction.pm @@ -6,7 +6,6 @@ use Carp; use Encode; use List::Util qw(first); use POSIX qw(strftime); -use Text::Iconv; sub new { my $class = shift; @@ -34,9 +33,9 @@ sub _init { croak "Execution date format wrong for '$params{execution_date}': not YYYY-MM-DD." if ($params{execution_date} !~ /^\d{4}-\d{2}-\d{2}$/); - map { $self->{$_} = decode('UTF-8', $self->{sepa}->{iconv}->convert($params{$_})) } keys %params; - map { $self->{$_} =~ s/\s+//g } qw(src_iban src_bic dst_iban dst_bic); - map { $self->{$_} = $self->{sepa}->_replace_special_chars($self->{$_}) } qw(recipient reference end_to_end_id); + map { $self->{$_} = $self->{sepa}->{iconv}->convert($params{$_}) } keys %params; + map { $self->{$_} =~ s/\s+//g } qw(src_iban src_bic dst_iban dst_bic); + map { $self->{$_} = $self->{sepa}->_replace_special_chars($self->{$_}) } qw(recipient reference end_to_end_id); } sub get { diff --git a/SL/Template.pm b/SL/Template.pm index 7f4d27571..f76796759 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -838,9 +838,12 @@ sub parse { package OpenDocumentTemplate; +use Archive::Zip; use POSIX 'setsid'; use vars qw(@ISA); +use SL::Iconv; + use Cwd; # use File::Copy; # use File::Spec; @@ -856,19 +859,8 @@ sub new { my $self = $type->SUPER::new(@_); - foreach my $module (qw(Archive::Zip Text::Iconv)) { - eval("use ${module};"); - if ($@) { - $self->{"form"}->error("The Perl module '${module}' could not be " . - "loaded. Support for OpenDocument templates " . - "does not work without it. Please install your " . - "distribution's package or get the module from " . - "CPAN ( http://www.cpan.org )."); - } - } - $self->{"rnd"} = int(rand(1000000)); - $self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8"); + $self->{"iconv"} = SL::Iconv->new($main::dbcharset, "UTF-8"); $self->set_tag_style('<%', '%>'); $self->{quot_re} = '"'; -- 2.20.1