Merge branch 'test' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Template / Plugin / KiviLatex.pm
index 21b0779..920dee4 100644 (file)
@@ -3,6 +3,8 @@ package SL::Template::Plugin::KiviLatex;
 use strict;
 use parent qw( Template::Plugin::Filter );
 
+use SL::Template::LaTeX;
+
 my $cached_instance;
 
 sub new {
@@ -40,7 +42,7 @@ my %html_replace = (
   '</i>'      => "}",
   '<em>'      => "\\textit{",
   '</em>'     => "}",
-  '<u>'       => "\\underline{",
+  '<u>'       => "\\uline{",
   '</u>'      => "}",
   '<s>'       => "\\sout{",
   '</s>'      => "}",
@@ -55,21 +57,110 @@ my %html_replace = (
 sub filter_html {
   my ($self, $text, $args) = @_;
 
-  $text =~ s{ \r+ }{}gx;
-  $text =~ s{ \n+ }{ }gx;
-  $text =~ s{ (?:\&nbsp;|\s)+ }{ }gx;
-
-  my @parts = map {
-    if (substr($_, 0, 1) eq '<') {
-      s{ +}{}g;
-      $html_replace{$_} || '';
+  return SL::Template::LaTeX->new->_format_html($text);
+}
 
-    } else {
-      $::locale->quote_special_chars('Template/LaTeX', HTML::Entities::decode_entities($_));
-    }
-  } split(m{(<.*?>)}x, $text);
+sub required_packages_for_html {
+  my ($self) = @_;
 
-  return join('', @parts);
+  return <<EOLATEX;
+\\usepackage{ulem}
+EOLATEX
 }
 
 return 'SL::Template::Plugin::KiviLatex';
+__END__
+
+=pod
+
+=encoding utf8
+
+=head1 NAME
+
+SL::Template::Plugin::KiviLatex - Template::Toolkit plugin for
+escaping text for use in LaTeX templates
+
+=head1 SYNOPSIS
+
+From within a LaTeX template. Activate both Template::Toolkit in
+general and this plugin in particular; must be located before
+C<\begin{document}>:
+
+  % config: use-template-toolkit=1
+  % config: tag-style=$( )$
+  $( USE KiviLatex )$
+
+Later escape some text:
+
+  $( KiviLatex.format(longdescription) )$
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item C<filter $text>
+
+Escapes characters in C<$text> with the appropriate LaTeX
+constructs. Expects normal text without any markup (no HTML, no XML
+etc). Returns the whole escaped text.
+
+=item C<filter_html $html>
+
+Converts HTML markup in C<$html> to the appropriate LaTeX
+constructs. Only the following HTML elements are supported:
+
+=over 2
+
+=item * C<b>, C<strong> – bold text
+
+=item * C<it>, C<em> – italic text
+
+=item * C<ul> – underlined text
+
+=item * C<s> – striked out text
+
+=item * C<sub>, C<sup> – subscripted and superscripted text
+
+=item * C<ul>, C<ol>, C<li> – unordered lists (converted to an itemized
+list), ordered lists (converted to enumerated lists) and their list
+items
+
+=item * C<p>, C<br> – Paragraph markers and line breaks
+
+=back
+
+This function is tailored for working on the input of CKEditor, not on
+arbitrary HTML content. It works nicely in tandem with the
+Rose::DB::Object helper functions C<…_as_restricted_html> (see
+L<SL::DB::Helper::AttrHTML/attr_html>).
+
+Attributes are silently removed and ignored. All other markup and the
+normal text are escaped the same as in L</filter>.
+
+=item C<init>
+
+=item C<new>
+
+Initializes the plugin. Automatically called by Template::Toolkit when
+the plugin is loaded.
+
+=item C<required_packages_for_html>
+
+Returns LaTeX code loading packages that are required for the
+formatting done with L</filter_html>. This function must be called and
+its output inserted before the C<\begin{document}> line if that
+function is used within the document.
+
+It is not required for normal text escaping with L</filter>.
+
+=back
+
+=head1 BUGS
+
+Nothing here yet.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut