aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ManaTools/Rpmdragora/formatting.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ManaTools/Rpmdragora/formatting.pm')
-rw-r--r--lib/ManaTools/Rpmdragora/formatting.pm209
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 = ('&' => '&amp;',
+ '<' => '&lt;',
+ '>' => '&gt;',
+ );
+ 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;