diff options
Diffstat (limited to 'lib/ManaTools/Rpmdragora/formatting.pm')
-rw-r--r-- | lib/ManaTools/Rpmdragora/formatting.pm | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/lib/ManaTools/Rpmdragora/formatting.pm b/lib/ManaTools/Rpmdragora/formatting.pm new file mode 100644 index 0000000..83a960a --- /dev/null +++ b/lib/ManaTools/Rpmdragora/formatting.pm @@ -0,0 +1,209 @@ +# vim: set et ts=4 sw=4: +package ManaTools::Rpmdragora::formatting; +#***************************************************************************** +# +# Copyright (c) 2002 Guillaume Cottenceau +# Copyright (c) 2002-2006 Thierry Vignaud <tvignaud@mandriva.com> +# Copyright (c) 2003, 2004, 2005 MandrakeSoft SA +# Copyright (c) 2005, 2006 Mandriva SA +# Copyright (c) 2013 - 2015 Matteo Pasotti <matteo.pasotti@gmail.com> +# Copyright (c) 2014 - 2015 Angelo Naselli <anaselli@linux.it> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +#***************************************************************************** +# +# $Id: formatting.pm 261189 2009-10-01 14:44:39Z tv $ + +use strict; +use utf8; +use POSIX qw(strftime); +use MDK::Common::Various qw(internal_error); +use ManaTools::Shared::Locales; +use ManaTools::rpmdragora; +use urpm::msg; + + +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw( + $spacing + ensure_utf8 + format_changelog_changelogs + format_changelog_string + format_field + format_header + format_list + format_name_n_summary + format_size + format_filesize + format_update_field + my_fullname + pkg2medium + rpm_description + split_fullname + urpm_name + ); + +my $loc = ManaTools::rpmdragora::locale(); + +sub escape_text_for_TextView_markup_format { + my ($str) = @_; + return '' if !$str; + + my %rules = ('&' => '&', + '<' => '<', + '>' => '>', + ); + eval { $str =~ s!([&<>])!$rules{$1}!g }; #^(&(amp|lt|gt);)!!) { + if (my $err = $@) { + MDK::Common::Various::internal_error("$err\n$str"); + } + $str; +} + +# from rpmtools, #37482: +sub ensure_utf8 { + return '' if !$_[0]; + + if (utf8::is_utf8($_[0])) { + utf8::valid($_[0]) and return; + utf8::encode($_[0]); #- disable utf8 flag + utf8::upgrade($_[0]); + } else { + utf8::decode($_[0]); #- try to set utf8 flag + utf8::valid($_[0]) and return; + warn "do not know what to with $_[0]\n"; + } +} + +sub rpm_description { + my ($description) = @_; + return '' if !$description; + + ensure_utf8($description); + my $t = ""; + my $tmp = ""; + foreach (split "\n", $description) { + s/^\s*//; + if (/^$/ || /^\s*(-|\*|\+|o)\s/) { + $t || $tmp and $t .= "$tmp\n"; + $tmp = $_; + } else { + $tmp = ($tmp ? "$tmp " : ($t && "\n") . $tmp) . $_; + } + } + "$t$tmp\n"; +} + +sub split_fullname { $_[0] =~ /^(.*)-([^-]+)-([^-]+)\.([^.-]+)$/ } + +sub my_fullname { + return '?-?-?' unless ref $_[0]; + my ($name, $version, $release) = $_[0]->fullname; + "$name-$version-$release"; +} + +sub urpm_name { + return '?-?-?.?' unless ref $_[0]; + scalar $_[0]->fullname; +} + +sub pkg2medium { + my ($p, $urpm) = @_; + return if !ref $p; + return { name => $loc->N("None (installed)") } if !defined($p->id); # if installed + URPM::pkg2media($urpm->{media}, $p) || { name => $loc->N("Unknown"), fake => 1 }; +} + +# [ duplicate urpmi's urpm::msg::localtime2changelog() ] +#- strftime returns a string in the locale charset encoding; +#- but gtk2 requires UTF-8, so we use to_utf8() to ensure the +#- output of localtime2changelog() is always in UTF-8 +#- as to_utf8() uses LC_CTYPE for locale encoding and strftime() uses LC_TIME, +#- it doesn't work if those two variables have values with different +#- encodings; but if a user has a so broken setup we can't do much anyway +sub localtime2changelog { $loc->to_utf8(POSIX::strftime("%c", localtime($_[0]))) } + +our $spacing = " "; +sub format_changelog_string { + my ($installed_version, $string) = @_; + + #- preprocess changelog for faster TextView insert reaction + my $version; + my $highlight; + my $chl = [ map { + my %attrs; + if (/^\*/) { + ($version) = /(\S*-\S*)\s*$/; + $highlight = $installed_version ne $loc->N("(none)") && 0 < URPM::rpmvercmp($version, $installed_version); + if ($highlight) { + "<b><i>" . $_ . "</i></b>"; + } + else { + "<b>" . $_ . "</b>"; + } + } + else { + "$spacing" . $_ . "\n"; + } + } split("\n", $string) ]; + + return $chl; +} + +sub format_changelog_changelogs { + my ($installed_version, @changelogs) = @_; + format_changelog_string($installed_version, join("\n", map { + "* " . localtime2changelog($_->{time}) . " $_->{name}\n\n$_->{text}\n"; + } @changelogs)); +} + +sub format_update_field { + my ($name) = @_; + '<i>' . escape_text_for_TextView_markup_format($name) . '</i>'; +} + +sub format_name_n_summary { + my ($name, $summary) = @_; + join("\n", '<b>' . $name . '</b>', escape_text_for_TextView_markup_format($summary)); +} + +sub format_header { + my ($str) = @_; + '<big>' . escape_text_for_TextView_markup_format($str) . '</big>'; +} + +sub format_field { + my ($str) = @_; + '<b>' . escape_text_for_TextView_markup_format($str) . '</b>'; +} + +sub format_size { + my ($size) = @_; + $size >= 0 ? + $loc->N("%s of additional disk space will be used.", formatXiB($size)) : + $loc->N("%s of disk space will be freed.", formatXiB(-$size)); +} + +sub format_filesize { + my ($filesize) = @_; + $filesize ? $loc->N("%s of packages will be retrieved.", formatXiB($filesize)) : (); +} + +sub format_list { + return join("\n", map { s/^(\s)/ $1/mg; "- $_" } sort { uc($a) cmp uc($b) } @_); +} + +1; |