L: "truncate" und "simple_format" in Presenter verschoben
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 8 Mar 2013 12:17:22 +0000 (13:17 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 8 Mar 2013 14:30:10 +0000 (15:30 +0100)
SL/Presenter.pm
SL/Presenter/Text.pm [new file with mode: 0644]
SL/Template/Plugin/L.pm

index 36acc73..abfd561 100644 (file)
@@ -14,6 +14,7 @@ use SL::Presenter::Invoice;
 use SL::Presenter::Order;
 use SL::Presenter::Project;
 use SL::Presenter::Record;
+use SL::Presenter::Text;
 
 sub get {
   return $::request->presenter;
diff --git a/SL/Presenter/Text.pm b/SL/Presenter/Text.pm
new file mode 100644 (file)
index 0000000..bcae2f9
--- /dev/null
@@ -0,0 +1,84 @@
+package SL::Presenter::Text;
+
+use strict;
+
+use parent qw(Exporter);
+
+use Exporter qw(import);
+our @EXPORT = qw(simple_format truncate);
+
+use Carp;
+
+sub truncate {
+  my ($self, $text, %params) = @_;
+
+  $params{at}             ||= 50;
+  $params{at}               =  3 if 3 > $params{at};
+  $params{at}              -= 3;
+
+  return $text if length($text) < $params{at};
+  return substr($text, 0, $params{at}) . '...';
+}
+
+sub simple_format {
+  my ($self, $text, %params) = @_;
+
+  $text =  $::locale->quote_special_chars('HTML', $text || '');
+
+  $text =~ s{\r\n?}{\n}g;                    # \r\n and \r -> \n
+  $text =~ s{\n\n+}{</p>\n\n<p>}g;           # 2+ newline  -> paragraph
+  $text =~ s{([^\n]\n)(?=[^\n])}{$1<br />}g; # 1 newline   -> br
+
+  return '<p>' . $text;
+}
+
+1;
+__END__
+
+=pod
+
+=encoding utf8
+
+=head1 NAME
+
+SL::Presenter::Text - Presenter module for assorted text helpers
+
+=head1 SYNOPSIS
+
+  my $long_text = "This is very, very long. Need shorter, surely.";
+  my $truncated = $::request->presenter->truncate($long_text, at => 10);
+  # Result: "This is..."
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item C<truncate $text, [%params]>
+
+Returns the C<$text> truncated after a certain number of
+characters.
+
+The number of characters to truncate at is determined by the parameter
+C<at> which defaults to 50. If the text is longer than C<$params{at}>
+then it will be truncated and postfixed with '...'. Otherwise it will
+be returned unmodified.
+
+=item C<simple_format $text>
+
+Applies simple formatting rules to C<$text>: The text is put into
+paragraph HTML tags. Two consecutive newlines are interpreted as a
+paragraph change: they close the current paragraph tag and start a new
+one. Single newlines are converted to line breaks. Carriage returns
+are removed.
+
+=back
+
+=head1 BUGS
+
+Nothing here yet.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut
index bac6f7f..66f6fcc 100644 (file)
@@ -52,6 +52,18 @@ sub _context {
   return $_[0]->{CONTEXT};
 }
 
+sub _call_presenter {
+  my ($method, @args) = @_;
+
+  my $presenter       = $::request->presenter;
+
+  return '' unless $presenter->can($method);
+
+  splice @args, -1, 1, %{ $args[-1] } if @args && (ref($args[-1]) eq 'HASH');
+
+  $presenter->$method(@args);
+}
+
 sub name_to_id {
   my $self =  shift;
   my $name =  shift;
@@ -596,15 +608,8 @@ sub dump {
 }
 
 sub truncate {
-  my ($self, $text, @slurp) = @_;
-  my %params                = _hashify(@slurp);
-
-  $params{at}             ||= 50;
-  $params{at}               =  3 if 3 > $params{at};
-  $params{at}              -= 3;
-
-  return $text if length($text) < $params{at};
-  return substr($text, 0, $params{at}) . '...';
+  my $self = shift;
+  return _call_presenter('truncate', @_);
 }
 
 sub sortable_table_header {
@@ -651,6 +656,11 @@ sub paginate_controls {
   return SL::Presenter->get->render('common/paginate', %template_params);
 }
 
+sub simple_format {
+  my $self = shift;
+  return _call_presenter('simple_format', @_);
+}
+
 1;
 
 __END__
@@ -1005,15 +1015,13 @@ the resulting tab will get ignored by C<tabbed>:
 
   L.tab('Awesome tab wih much info', '_much_info.html', if => SELF.wants_all)
 
-=item C<truncate $text, %params>
+=item C<truncate $text, [%params]>
+
+See L<SL::Presenter::Text/truncate>.
 
-Returns the C<$text> truncated after a certain number of
-characters.
+=item C<simple_format $text>
 
-The number of characters to truncate at is determined by the parameter
-C<at> which defaults to 50. If the text is longer than C<$params{at}>
-then it will be truncated and postfixed with '...'. Otherwise it will
-be returned unmodified.
+See L<SL::Presenter::Text/simple_format>.
 
 =back