kivitendo/SL/Template/Plugin/KiviLatex.pm @ 4f152ed2
f623b721 | Moritz Bunkus | package SL::Template::Plugin::KiviLatex;
|
||
1b9d0f70 | Sven Schöling | |||
use strict;
|
||||
1436ca8d | Moritz Bunkus | use parent qw( Template::Plugin::Filter );
|
||
1b9d0f70 | Sven Schöling | |||
my $cached_instance;
|
||||
sub new {
|
||||
my $class = shift;
|
||||
return $cached_instance ||= $class->SUPER::new(@_);
|
||||
}
|
||||
sub init {
|
||||
my $self = shift;
|
||||
f623b721 | Moritz Bunkus | $self->install_filter($self->{ _ARGS }->[0] || 'KiviLatex');
|
||
1b9d0f70 | Sven Schöling | |||
return $self;
|
||||
}
|
||||
sub filter {
|
||||
my ($self, $text, $args) = @_;
|
||||
return $::locale->quote_special_chars('Template/LaTeX', $text);
|
||||
}
|
||||
880ad4db | Moritz Bunkus | my %html_replace = (
|
||
'</p>' => "\n\n",
|
||||
'<ul>' => "\\begin{itemize} ",
|
||||
'</ul>' => "\\end{itemize} ",
|
||||
'<ol>' => "\\begin{enumerate} ",
|
||||
'</ol>' => "\\end{enumerate} ",
|
||||
'<li>' => "\\item ",
|
||||
'</li>' => " ",
|
||||
'<b>' => "\\textbf{",
|
||||
'</b>' => "}",
|
||||
'<strong>' => "\\textbf{",
|
||||
'</strong>' => "}",
|
||||
'<i>' => "\\textit{",
|
||||
'</i>' => "}",
|
||||
'<em>' => "\\textit{",
|
||||
'</em>' => "}",
|
||||
277178ad | Moritz Bunkus | '<u>' => "\\uline{",
|
||
880ad4db | Moritz Bunkus | '</u>' => "}",
|
||
'<s>' => "\\sout{",
|
||||
'</s>' => "}",
|
||||
'<sub>' => "\\textsubscript{",
|
||||
'</sub>' => "}",
|
||||
'<sup>' => "\\textsuperscript{",
|
||||
'</sup>' => "}",
|
||||
'<br/>' => "\\newline ",
|
||||
'<br>' => "\\newline ",
|
||||
);
|
||||
sub filter_html {
|
||||
my ($self, $text, $args) = @_;
|
||||
$text =~ s{ \r+ }{}gx;
|
||||
$text =~ s{ \n+ }{ }gx;
|
||||
$text =~ s{ (?:\ |\s)+ }{ }gx;
|
||||
69e0114b | Moritz Bunkus | $text =~ s{ <ul>\s*</ul> | <ol>\s*</ol> }{}gx; # Remove lists without items. Can happen with copy & paste from e.g. LibreOffice.
|
||
880ad4db | Moritz Bunkus | |||
my @parts = map {
|
||||
if (substr($_, 0, 1) eq '<') {
|
||||
s{ +}{}g;
|
||||
$html_replace{$_} || '';
|
||||
} else {
|
||||
$::locale->quote_special_chars('Template/LaTeX', HTML::Entities::decode_entities($_));
|
||||
}
|
||||
} split(m{(<.*?>)}x, $text);
|
||||
return join('', @parts);
|
||||
}
|
||||
277178ad | Moritz Bunkus | sub required_packages_for_html {
|
||
my ($self) = @_;
|
||||
return <<EOLATEX;
|
||||
\\usepackage{ulem}
|
||||
EOLATEX
|
||||
}
|
||||
f623b721 | Moritz Bunkus | return 'SL::Template::Plugin::KiviLatex';
|
||
e40b7202 | Moritz Bunkus | __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
|