summaryrefslogtreecommitdiffstats
path: root/solenv/bin/image-sort.py
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/image-sort.py')
-rw-r--r--solenv/bin/image-sort.py155
1 files changed, 155 insertions, 0 deletions
diff --git a/solenv/bin/image-sort.py b/solenv/bin/image-sort.py
new file mode 100644
index 000000000..5d248684b
--- /dev/null
+++ b/solenv/bin/image-sort.py
@@ -0,0 +1,155 @@
+# -*- 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
+import argparse
+
+global_list = []
+global_hash = {}
+args = None
+
+def read_icons(fname):
+ global args
+ images = []
+ full_path = os.path.join(args.base_path, fname)
+ if not os.path.exists(full_path):
+ if not args.quiet:
+ print("Skipping non-existent {}".format(full_path), file=sys.stderr)
+ return images
+ with open(full_path) as fp:
+ for line in fp:
+ 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(ifile):
+ global global_list, global_hash
+ filelist = []
+ for line in ifile:
+ 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)
+
+parser = argparse.ArgumentParser()
+# where the control file lives
+parser.add_argument('control_file', metavar='image-sort.lst',
+ help='the sort control file')
+# where the uiconfigs live
+parser.add_argument('base_path', metavar='directory',
+ help='path to the UIConfigs directory')
+parser.add_argument('output', metavar='output file', type=argparse.FileType('w'),
+ nargs='?', default=None, help='optionally write to this output file')
+parser.add_argument("-q", "--quiet", action="store_true",
+ help="don't print status messages to stdout")
+
+args = parser.parse_args()
+
+if args.output is not None:
+ close_output = True
+else:
+ args.output = sys.stdout
+ close_output = False
+
+with open(args.control_file) as cf:
+ chew_controlfile(cf)
+
+for icon in global_list:
+ if not icon.startswith('sc_'):
+ args.output.write(icon + "\n")
+
+for icon in global_list:
+ if icon.startswith('sc_'):
+ args.output.write(icon + "\n")
+
+if close_output:
+ args.output.close()
+
+# dnl vim:set shiftwidth=4 softtabstop=4 expandtab: