package Utils::HTML; # ---------------------------------------------------------------------------- # Здесь хранятся процедуры для удобства верстки # ---------------------------------------------------------------------------- use strict; use vars qw($VERSION @ISA @EXPORT $state $HTML $request); use HTML::TokeParser; use Contenido::Globals; use utf8; use Exporter; @ISA = qw(Exporter); @EXPORT = qw( &help &spacer &tlontl &word_ending &math_percent &wrap_long_words &break_word &error_catch &top100 &top100js &top100old &color &server_name &text_trim &limit_words &email &url &banner &banner2 &js_escape &html_escape &html_unescape &cgiescape &url_escape &url_unescape &format_date ); $VERSION = '0.1'; # Всякие удобные функции, которые будут импортированы в HTML::Mason::Commands # Набор уродиков - для совместимости sub format_date { my ($date, $format) = @_; my ($year, $month, $day, $hour, $min, $sec, $msec) = split(/[T\-\.\:\s]+/, $date); $year = substr($year, -2) if $format =~ /(^[yY]{2}$|[^yY][yY]{2}$|^[yY]{2}[^yY])/; my %formats = ( d => '%3$d', D => '%3$d', h => '%4$d', H => '%4$d', m => '%5$d', M => '%2$d', dd => '%3$02d', DD => '%3$02d', mm => '%5$02d', MM => '%2$02d', hh => '%4$02d', HH => '%4$02d', ss => '%6$02d', SS => '%6$02d', yyyy => '%1$04d', YYYY => '%1$04d', ); $format =~ s/([yYmMdDhHsS]+)/$formats{$1}/gi; my $result = sprintf($format, $year, $month, $day, $hour, $min, $sec, $msec); return $result; } sub spacer { my %opts = @_; my $w = $opts{w} || 1; my $h = $opts{h} || 1; return '
'; } sub tlontl { my %opts = @_; my $src_link = $opts{link}; my $param = $opts{param}; my $object = $opts{object}; my $absolute = $opts{absolute}; my $skip_args = $opts{skip_args}; my $request_uri = $absolute ? 'http://'.$ENV{SERVER_NAME} : ''; $request_uri .= $skip_args ? $ENV{SCRIPT_NAME} : $ENV{REQUEST_URI}; my $link = $src_link; if ($skip_args) { $link =~ s/\?.*$//; } if ($link eq '') { return $object; } elsif($request_uri eq $link || $request_uri eq $link.'index.html') { return $object; } else { return ''.$object.''; } } sub word_ending { my %opts = @_; my $amount = $opts{'amount'}; # количество my $one = $opts{'one'}; # негрятенок my $two = $opts{'two'}; # негрятенка my $ten = $opts{'ten'}; # негрятят my $word = $ten; my $last_num = $amount; my $next_to_last_num = 0; return $word unless defined $amount && $amount =~ /^\d+$/; if (length($last_num) >= 2) { $last_num =~ s/.*(\d)(\d)$/$2/; $next_to_last_num = $1; } # 10 <= ? < 20 if ($next_to_last_num == 1) { $word = $ten; # 1,21,31,...,n1 } elsif ($last_num == 1) { $word = $one; # 5,6,7,8,9,10,25,26,.....,n5,n6,n7,n8,n9,n0 } elsif ($last_num > 4 || $last_num == 0) { $word = $ten; # other } else { $word = $two; } return $word; } # Нужен для постоения таблиц, ширина которых задается посредством конфигурационных файлов # <% math_percent('100%+200%-25%/2') %> результат: 288% # <% math_percent($project_conf->{left}+$project_conf->{center}) %> sub math_percent { my $exp = shift; $exp =~ s/\%//g; $exp = eval($exp); $exp = sprintf("%.0f", $exp); return $exp.'%'; } # Вставка тега wbr в длинные слова # Получает ссылку на строку (будьте внимательны - оригинальная строка будет изменена) sub wrap_long_words { my $string = shift; my %opts = @_; unless ($string && ref($string) eq 'SCALAR' && length($$string)) { return; } my $wordlength = $opts{'wordlength'} || 40; if (length($$string) <= $opts{'wordlength'}) { return $$string; } my $newstring = ''; my $p = HTML::TokeParser->new($string); $p->{textify} = {}; while (my $token = $p->get_token()) { my $type = $token->[0]; if ( $type eq 'S' ) { $newstring .= $token->[4]; } elsif ( $type eq 'E' ) { $newstring .= $token->[2]; } elsif ( $type eq 'T') { $token->[1] =~ s/\S{$wordlength,}/break_word($&,$wordlength)/eg; $newstring .= $token->[1]; } } $$string = $newstring; return $$string; } # Вставка тега wbr в одно длинное слово sub break_word { my ($word, $wordlength) = @_; $word =~ s/((?:[^&\s]|(&\#?\w{1,7};)){$wordlength})\B/$1