From 72585c35d48589e072325ffc46c720df080e2ca1 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Tue, 10 Jan 2012 11:37:33 +0100 Subject: [PATCH] =?utf8?q?$::form-Variablen=20in=20Druckbefehlen=20verf?= =?utf8?q?=C3=BCgbar=20machen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fix für Bugs 1740 und 1761. --- SL/Form.pm | 7 ++++ SL/Template.pm | 1 + SL/Template/ShellCommand.pm | 51 +++++++++++++++++++++++ doc/dokumentenvorlagen-und-variablen.html | 28 +++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 SL/Template/ShellCommand.pm diff --git a/SL/Form.pm b/SL/Form.pm index 58b1973aa..529426ec2 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -1113,8 +1113,13 @@ sub parse_template { } my $result; + my $command_formatter = sub { + my ($out_mode, $out) = @_; + return $out_mode eq '|-' ? SL::Template::create(type => 'ShellCommand', form => $self)->parse($out) : $out; + }; if ($self->{OUT}) { + $self->{OUT} = $command_formatter->($self->{OUT_MODE}, $self->{OUT}); open(OUT, $self->{OUT_MODE}, $self->{OUT}) or $self->error("error on opening $self->{OUT} with mode $self->{OUT_MODE} : $!"); } else { *OUT = ($::dispatcher->get_standard_filehandles)[1]; @@ -1199,6 +1204,8 @@ sub parse_template { #print(STDERR "OUT $self->{OUT}\n"); for my $i (1 .. $self->{copies}) { if ($self->{OUT}) { + $self->{OUT} = $command_formatter->($self->{OUT_MODE}, $self->{OUT}); + open OUT, $self->{OUT_MODE}, $self->{OUT} or $self->error($self->cleanup . "$self->{OUT} : $!"); print OUT $_ while ; close OUT; diff --git a/SL/Template.pm b/SL/Template.pm index df18e706e..ab499e99d 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -16,6 +16,7 @@ use SL::Template::HTML; use SL::Template::LaTeX; use SL::Template::OpenDocument; use SL::Template::PlainText; +use SL::Template::ShellCommand; use SL::Template::XML; sub create { diff --git a/SL/Template/ShellCommand.pm b/SL/Template/ShellCommand.pm new file mode 100644 index 000000000..082412909 --- /dev/null +++ b/SL/Template/ShellCommand.pm @@ -0,0 +1,51 @@ +package SL::Template::ShellCommand; + +use parent qw(SL::Template::LaTeX); + +use strict; + +use String::ShellQuote; + +sub new { + my $type = shift; + + return $type->SUPER::new(@_); +} + +sub substitute_vars { + my ($self, $text, @indices) = @_; + + my $form = $self->{"form"}; + + while ($text =~ /$self->{substitute_vars_re}/) { + my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]); + my ($var, @option_list) = split(/\s+/, $1); + my %options = map { ($_ => 1) } @option_list; + + my $value = $self->_get_loop_variable($var, 0, @indices); + $value = $form->parse_amount({ numberformat => $::myconfig{output_numberformat} || $::myconfig{numberformat} }, $value) if $options{NOFORMAT}; + $value = $self->format_string($value); # Don't allow NOESCAPE for arguments passed to shell commands. + + substr($text, $tag_pos, $tag_len, $value); + } + + return $text; +} + +sub format_string { + my ($self, $variable) = @_; + + return shell_quote_best_effort($variable); +} + +sub get_mime_type { + return "text/plain"; +} + +sub parse { + my ($self, $text) = @_; + + return $self->parse_block($text); +} + +1; diff --git a/doc/dokumentenvorlagen-und-variablen.html b/doc/dokumentenvorlagen-und-variablen.html index 1009f31ff..e1dac111b 100644 --- a/doc/dokumentenvorlagen-und-variablen.html +++ b/doc/dokumentenvorlagen-und-variablen.html @@ -51,6 +51,9 @@ td {
  • Variablen ausgeben
  • +
  • Verwendung in Druckbefehlen +
  • +
  • Anfang und Ende der Tags verändern
  • @@ -229,6 +232,31 @@ td { zum Inhaltsverzeichnis

    +

    Verwendung in Druckbefehlen

    + +

    + In der Admininstration können Drucker definiert werden. Auch im dort + eingebbaren Druckbefehl können die hier aufgelisteten Variablen und + Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach den + Regeln der gängigen Shells formatiert, sodass Sonderzeichen + wie `...` nicht zu unerwünschtem Verhalten führen. +

    + +

    + Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl, für + das die Telefonnummer eines Ansprechpartners als Teil der + Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das + z.B. wie folgt aussehen: +

    + +

    + send_fax --number <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%> +

    + + + zum Inhaltsverzeichnis
    +
    +

    Anfang und Ende der Tags verändern

    -- 2.20.1