1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
# Copyrights 2007-2011 by Mark Overmeer.
# For other contributors see ChangeLog.
# See the manual pages for details on the licensing terms.
# Pod stripped from pm file by OODoc 2.00.
use warnings;
use strict;
package Log::Report::Message;
use vars '$VERSION';
$VERSION = '0.94';
use Log::Report 'log-report';
use POSIX qw/locale_h/;
use List::Util qw/first/;
use overload
'""' => 'toString'
, '&{}' => sub { my $obj = shift; sub{$obj->clone(@_)} }
, '.' => 'concat';
sub new($@) { my $class = shift; bless {@_}, $class }
sub clone(@)
{ my $self = shift;
(ref $self)->new(%$self, @_);
}
sub prepend() {shift->{_prepend}}
sub msgid() {shift->{_msgid}}
sub append() {shift->{_append}}
sub domain() {shift->{_domain}}
sub count() {shift->{_count}}
sub classes()
{ my $class = $_[0]->{_class} || $_[0]->{_classes} || [];
ref $class ? @$class : split(/[\s,]+/, $class);
}
sub to(;$)
{ my $self = shift;
@_ ? $self->{_to} = shift : $self->{_to};
}
sub valueOf($) { $_[0]->{$_[1]} }
sub inClass($)
{ my @classes = shift->classes;
ref $_[0] eq 'Regexp'
? (first { $_ =~ $_[0] } @classes)
: (first { $_ eq $_[0] } @classes);
}
sub toString(;$)
{ my ($self, $locale) = @_;
my $count = $self->{_count} || 0;
$self->{_msgid} # no translation, constant string
or return (defined $self->{_prepend} ? $self->{_prepend} : '')
. (defined $self->{_append} ? $self->{_append} : '');
# create a translation
my $text = Log::Report->translator($self->{_domain})->translate($self);
defined $text or return ();
my $loc = defined $locale ? setlocale(LC_ALL, $locale) : undef;
if($self->{_expand})
{ my $re = join '|', map { quotemeta $_ } keys %$self;
$text =~ s/\{($re)(\%[^}]*)?\}/$self->_expand($1,$2)/ge;
}
$text = "$self->{_prepend}$text"
if defined $self->{_prepend};
$text .= "$self->{_append}"
if defined $self->{_append};
setlocale(LC_ALL, $loc) if $loc;
$text;
}
sub _expand($$)
{ my ($self, $key, $format) = @_;
my $value = $self->{$key};
$value = $value->($self)
while ref $value eq 'CODE';
defined $value
or return "undef";
use locale;
if(ref $value eq 'ARRAY')
{ my @values = map {defined $_ ? $_ : 'undef'} @$value;
@values or return '(none)';
return $format
? join($", map {sprintf $format, $_} @values)
: join($", @values);
}
$format
? sprintf($format, $value)
: "$value"; # enforce stringification on objects
}
sub untranslated()
{ my $self = shift;
(defined $self->{_prepend} ? $self->{_prepend} : '')
. (defined $self->{_msgid} ? $self->{_msgid} : '')
. (defined $self->{_append} ? $self->{_append} : '');
}
sub concat($;$)
{ my ($self, $what, $reversed) = @_;
if($reversed)
{ $what .= $self->{_prepend} if defined $self->{_prepend};
return ref($self)->new(%$self, _prepend => $what);
}
$what = $self->{_append} . $what if defined $self->{_append};
ref($self)->new(%$self, _append => $what);
}
1;
|