X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate%2FLaTeX.pm;h=c76b82a6274067af448d9360c54bd30a6140628a;hb=833f083eae2a4547c49f8f92a2fdca6ba4dfe5f4;hp=d99afa43ccc1a37cb9aa0fcd6116af612b46d4c6;hpb=2e66dde525c12d064518c316d25a6b41ed727b39;p=kivitendo-erp.git
diff --git a/SL/Template/LaTeX.pm b/SL/Template/LaTeX.pm
index d99afa43c..c76b82a62 100644
--- a/SL/Template/LaTeX.pm
+++ b/SL/Template/LaTeX.pm
@@ -9,11 +9,93 @@ use Cwd;
use English qw(-no_match_vars);
use File::Basename;
use File::Temp;
+use HTML::Entities ();
use List::MoreUtils qw(any);
use Unicode::Normalize qw();
use SL::DB::Default;
+my %text_markup_replace = (
+ b => 'textbf',
+ i => 'textit',
+ u => 'underline',
+);
+
+sub _format_text {
+ my ($self, $content, %params) = @_;
+
+ $content = $::locale->quote_special_chars('Template/LaTeX', $content);
+
+ # Allow some HTML markup to be converted into the output format's
+ # corresponding markup code, e.g. bold or italic.
+ foreach my $key (keys(%text_markup_replace)) {
+ my $new = $text_markup_replace{$key};
+ $content =~ s/\$\<\$${key}\$\>\$(.*?)\$<\$\/${key}\$>\$/\\${new}\{$1\}/gi;
+ }
+
+ $content =~ s/[\x00-\x1f]//g;
+
+ return $content;
+}
+
+my %html_replace = (
+ '
' => "\n\n",
+ '' => "\\begin{itemize} ",
+ '
' => "\\end{itemize} ",
+ '' => "\\begin{enumerate} ",
+ '
' => "\\end{enumerate} ",
+ '' => "\\item ",
+ '' => " ",
+ '' => "\\textbf{",
+ '' => "}",
+ '' => "\\textbf{",
+ '' => "}",
+ '' => "\\textit{",
+ '' => "}",
+ '' => "\\textit{",
+ '' => "}",
+ '' => "\\underline{",
+ '' => "}",
+ '' => "\\sout{",
+ '' => "}",
+ '' => "\\textsubscript{",
+ '' => "}",
+ '' => "\\textsuperscript{",
+ '' => "}",
+ '
' => "\\newline ",
+ '
' => "\\newline ",
+);
+
+sub _format_html {
+ my ($self, $content, %params) = @_;
+
+ $content =~ s{ \r+ }{}gx;
+ $content =~ s{ \n+ }{ }gx;
+ $content =~ s{ (?:\ |\s)+ }{ }gx;
+ $content =~ s{ (?:\ |\s)+$ }{}gx;
+ $content =~ s{ (?:
)+$ }{}gx;
+
+ my @parts = grep { $_ } map {
+ if (substr($_, 0, 1) eq '<') {
+ s{ +}{}g;
+ $html_replace{$_} || '';
+
+ } else {
+ $::locale->quote_special_chars('Template/LaTeX', HTML::Entities::decode_entities($_));
+ }
+ } split(m{(<.*?>)}x, $content);
+
+ $content = join '', @parts;
+ $content =~ s{ (?: [\n\s] | \\newline )+$ }{}gx;
+
+ return $content;
+}
+
+my %formatters = (
+ html => \&_format_html,
+ text => \&_format_text,
+);
+
sub new {
my $type = shift;
@@ -23,24 +105,14 @@ sub new {
}
sub format_string {
- my ($self, $variable) = @_;
+ my ($self, $content, $variable) = @_;
- $variable = $main::locale->quote_special_chars('Template/LaTeX', $variable);
-
- # Allow some HTML markup to be converted into the output format's
- # corresponding markup code, e.g. bold or italic.
- my %markup_replace = ('b' => 'textbf',
- 'i' => 'textit',
- 'u' => 'underline');
+ my $formatter =
+ $formatters{ $self->{variable_content_types}->{$variable} }
+ // $formatters{ $self->{default_content_type} }
+ // $formatters{ text };
- foreach my $key (keys(%markup_replace)) {
- my $new = $markup_replace{$key};
- $variable =~ s/\$\<\$${key}\$\>\$(.*?)\$<\$\/${key}\$>\$/\\${new}\{$1\}/gi;
- }
-
- $variable =~ s/[\x00-\x1f]//g;
-
- return $variable;
+ return $formatter->($self, $content, variable => $variable);
}
sub parse_foreach {
@@ -322,7 +394,7 @@ sub _force_mandatory_packages {
: defined($last_usepackage_line) ? $last_usepackage_line
: scalar @{ $lines } - 1;
- foreach my $package (qw(textcomp)) {
+ foreach my $package (qw(textcomp ulem)) {
next if $used_packages{$package};
splice @{ $lines }, $insertion_point, 0, "\\usepackage{${package}}\n";
$insertion_point++;
@@ -338,7 +410,7 @@ sub parse {
$self->{"error"} = "$form->{templates}/$form->{IN}: $!";
return 0;
}
- binmode IN, ":utf8" if $::locale->is_utf8;
+ binmode IN, ":utf8";
my @lines = ;
close(IN);
@@ -374,13 +446,8 @@ sub parse {
return 0;
}
- if ($::locale->is_utf8) {
- binmode OUT, ":utf8";
- print OUT Unicode::Normalize::normalize('C', $new_contents);
-
- } else {
- print OUT $new_contents;
- }
+ binmode OUT, ":utf8";
+ print OUT Unicode::Normalize::normalize('C', $new_contents);
if ($form->{"format"} =~ /postscript/i) {
return $self->convert_to_postscript();
@@ -527,7 +594,7 @@ sub parse_and_create_pdf {
my $error;
eval {
- my $template = SL::Template::LaTeX->new($template_file_name, $local_form, \%::myconfig, $::lx_office_conf{paths}->{userspath});
+ my $template = SL::Template::LaTeX->new(file_name => $template_file_name, form => $local_form);
my $result = $template->parse($tex_fh) && $template->convert_to_pdf;
die $template->{error} unless $result;