summaryrefslogtreecommitdiff
path: root/solenv
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2020-02-23 00:47:07 +0200
committerMike Kaganski <mike.kaganski@collabora.com>2020-03-20 09:52:15 +0100
commitb29fb89d0a49fde0f5757774d64a7aba8298ac75 (patch)
tree14627efeb8b490b5b33ba231e4a4fe2733a6f3e7 /solenv
parent65bea6cbe772ef2ab840d507307396b74e8d031e (diff)
tdf#130911: convert image-sort from Perl to Python
Tested with diff that the sorting output file is identical to the one the Perl script produced. Change-Id: I22eb28e71f51315609957e84c6204f1beb5dccaa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90348 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'solenv')
-rwxr-xr-xsolenv/bin/image-sort.pl179
-rw-r--r--solenv/bin/image-sort.py142
2 files changed, 142 insertions, 179 deletions
diff --git a/solenv/bin/image-sort.pl b/solenv/bin/image-sort.pl
deleted file mode 100755
index a59c7bc714a5..000000000000
--- a/solenv/bin/image-sort.pl
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env perl -w
-# -*- Mode: Perl; tab-width: 4; indent-tabs-mode: nil -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This file incorporates work covered by the following license notice:
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed
-# with this work for additional information regarding copyright
-# ownership. The ASF licenses this file to you under the Apache
-# License, Version 2.0 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.apache.org/licenses/LICENSE-2.0 .
-#
-
-my @global_list = ();
-my %global_hash = ();
-my $base_path;
-
-sub read_icons($)
-{
- my $fname = shift;
- my $fileh;
- my @images;
- if (! -e "$base_path/$fname") {
- print "Skipping non-existent $base_path/$fname\n";
- return @images;
- }
- open ($fileh, "$base_path/$fname") || die "Can't open $base_path/$fname: $!";
- while (<$fileh>) {
- m/xlink:href=\"\.uno:(\S+)\"\s+/ || next;
- push @images, lc($1);
- }
- close ($fileh);
-
- return @images;
-}
-
-# filter out already seen icons & do prefixing
-sub read_new_icons($$)
-{
- my $fname = shift;
- my $prefix = shift;
- my @images = read_icons ($fname);
- my @new_icons;
- my %new_icons;
- for my $icon (@images) {
- my $iname = "cmd/" . $prefix . $icon . ".png";
- if (!defined $global_hash{$iname} &&
- !defined $new_icons{$iname}) {
- push @new_icons, $iname;
- $new_icons{$iname} = 1;
- }
- }
- return @new_icons;
-}
-
-sub process_group($@)
-{
- my $prefix = shift;
- my @uiconfigs = @_;
- my %group;
- my $cur_max = 1.0;
-
-# a very noddy sorting algorithm
- for my $uiconfig (@uiconfigs) {
- my @images = read_new_icons ($uiconfig, $prefix);
- my $prev = '';
- for my $icon (@images) {
- if (!defined $group{$icon}) {
- if (!defined $group{$prev}) {
- $group{$icon} = $cur_max;
- $cur_max += 1.0;
- } else {
- $group{$icon} = $group{$prev} + (1.0 - 0.5 / $cur_max);
- }
- } # else a duplicate
- }
- }
- for my $icon (sort { $group{$a} <=> $group{$b} } keys %group) {
- push @global_list, $icon;
- $global_hash{$icon} = 1;
- }
-}
-
-sub process_file($$)
-{
- my @images = read_new_icons (shift, shift);
-
- for my $icon (@images) {
- push @global_list, $icon;
- $global_hash{$icon} = 1;
- }
-}
-
-sub chew_controlfile($)
-{
- my $fname = shift;
- my $fileh;
- my @list;
- open ($fileh, $fname) || die "Can't open $fname: $!";
- while (<$fileh>) {
- /^\#/ && next;
- s/[\r\n]*$//;
- /^\s*$/ && next;
-
- my $line = $_;
- if ($line =~ s/^-- (\S+)\s*//) {
- # control code
- my $code = $1;
- my $small = (lc ($line) eq 'small');
- if (lc($code) eq 'group') {
- if (!$small) {
- process_group ("lc_", @list);
- }
- process_group ("sc_", @list);
- } elsif (lc ($code) eq 'ordered') {
- if (!$small) {
- for my $file (@list) {
- process_file ($file, "lc_");
- }
- }
- for my $file (@list) {
- process_file ($file, "sc_");
- }
- } elsif (lc ($code) eq 'literal') {
- for my $file (@list) {
- if (!defined $global_hash{$file}) {
- push @global_list, $file;
- $global_hash{$file} = 1;
- }
- }
- } else {
- die ("Unknown code '$code'");
- }
- @list = ();
- } else {
- push @list, $line;
- }
- }
- close ($fileh);
-}
-
-if (!@ARGV) {
- print "image-sort <image-sort.lst> /path/to/OOOo/source/root\n";
- exit 1;
-}
-
-# where the control file lives
-my $control = shift @ARGV;
-# where the uiconfigs live
-$base_path = shift @ARGV;
-# output
-if (@ARGV) {
- my $outf = shift @ARGV;
- open ($output, ">$outf") || die "Can't open $outf: $!";
- $stdout_out = 0;
-} else {
- $output = STDOUT;
- $stdout_out = 1;
-}
-
-chew_controlfile ($control);
-
-for my $icon (@global_list) {
- print $output $icon . "\n" if (!($icon =~ /^sc_/));
-}
-for my $icon (@global_list) {
- print $output $icon . "\n" if ($icon =~ /^sc_/);
-}
-
-close $output if (!$stdout_out);
-
-# dnl vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/image-sort.py b/solenv/bin/image-sort.py
new file mode 100644
index 000000000000..10558629bb7c
--- /dev/null
+++ b/solenv/bin/image-sort.py
@@ -0,0 +1,142 @@
+# -*- Mode: Python; tab-width: 4; indent-tabs-mode: nil -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+import sys, os, re
+
+global_list = []
+global_hash = {}
+base_path = None
+
+def read_icons(fname):
+ global base_path
+ images = []
+ full_path = os.path.join(base_path, fname)
+ if not os.path.exists(full_path):
+ print("Skipping non-existent {}\n".format(full_path))
+ return images
+ for line in open(full_path):
+ m = re.search(r'xlink:href="\.uno:(\S+)"\s+', line)
+ if m:
+ images.append(m.group(1).lower())
+ return images
+
+# filter out already seen icons & do prefixing
+def read_new_icons(fname, prefix):
+ images = read_icons(fname)
+ new_icons_arr = []
+ new_icons_d = {}
+ for icon in images:
+ iname = "cmd/" + prefix + icon + ".png"
+ if iname not in global_hash and \
+ iname not in new_icons_d:
+ new_icons_arr.append(iname)
+ new_icons_d[iname] = 1
+ return new_icons_arr
+
+def process_group(prefix, uiconfigs):
+ global global_list, global_hash
+ group = {}
+ cur_max = 1.0
+
+ # a very noddy sorting algorithm
+ for uiconfig in uiconfigs:
+ images = read_new_icons(uiconfig, prefix)
+ prev = ''
+ for icon in images:
+ if icon not in group:
+ if prev not in group:
+ group[icon] = cur_max
+ cur_max += 1.0
+ else:
+ group[icon] = group[prev] + (1.0 - 0.5 / cur_max)
+ def intvalue(i):
+ return group[i]
+ for icon in sorted(group.keys(), key=intvalue):
+ global_list.append(icon)
+ global_hash[icon] = 1
+
+def process_file(fname, prefix):
+ global global_list, global_hash
+ images = read_new_icons(fname, prefix)
+
+ for icon in images:
+ global_list.append(icon)
+ global_hash[icon] = 1
+
+def chew_controlfile(fname):
+ global global_list, global_hash
+ filelist = []
+ for line in open(fname):
+ line = line.strip()
+ if line.startswith('#'):
+ continue
+ if not line:
+ continue
+
+ m = re.match(r'-- (\S+)\s*', line)
+ if m:
+ # control code
+ code = m.group(1)
+ small = line.lower().endswith(' small')
+ if code.lower() == 'group':
+ if not small:
+ process_group("lc_", filelist)
+ process_group ("sc_", filelist)
+ elif code.lower() == 'ordered':
+ if not small:
+ for f in filelist:
+ process_file(f, "lc_")
+ for f in filelist:
+ process_file(f, "sc_")
+ elif code.lower() == 'literal':
+ for f in filelist:
+ if f not in global_hash:
+ global_list.append(f)
+ global_hash[f] = 1
+ else:
+ sys.exit("Unknown code '{}'".format(code))
+ filelist = []
+ else:
+ filelist.append(line)
+
+if len(sys.argv) == 1:
+ print("image-sort <image-sort.lst> /path/to/OOOo/source/root\n")
+ sys.exit(1)
+
+# where the control file lives
+control = sys.argv[1]
+# where the uiconfigs live
+base_path = sys.argv[2]
+# output
+if len(sys.argv) > 3:
+ output = open(sys.argv[3], 'w')
+else:
+ output = sys.stdout
+
+chew_controlfile(control)
+
+for icon in global_list:
+ if not icon.startswith('sc_'):
+ output.write(icon + "\n")
+
+for icon in global_list:
+ if icon.startswith('sc_'):
+ output.write(icon + "\n")
+
+# dnl vim:set shiftwidth=4 softtabstop=4 expandtab: