[gimp] tools: add mnemonic-clashes tool
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] tools: add mnemonic-clashes tool
- Date: Thu, 12 Sep 2019 14:57:38 +0000 (UTC)
commit a2a7fc993cb18e0dee0e71b0e0cebc5d16ef5d07
Author: Ell <ell_se yahoo com>
Date: Thu Sep 12 17:46:57 2019 +0300
tools: add mnemonic-clashes tool
Add a new mnemonic-clashes tool, which checks for mnemonic clashes
in menus. This tool can be invoked directly from the shell. It
takes an optional parameter which limits the search to a specific
type of menus, according to their xml tag (in particular, "menu"
for regular menus, and "popup" for popup menus).
tools/mnemonic-clashes | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
---
diff --git a/tools/mnemonic-clashes b/tools/mnemonic-clashes
new file mode 100755
index 0000000000..28a1efc544
--- /dev/null
+++ b/tools/mnemonic-clashes
@@ -0,0 +1,96 @@
+#!/bin/sh
+
+srcdir="`dirname \"$0\"`/.."
+
+find_actions () {
+ for f in "$srcdir"/app/actions/*-actions.c; do
+ < $f \
+ tr '\n' ' ' | \
+ grep -Po '{ *".*?".*?(NC_\("/*?" *, *)?".*?".*?}' | \
+ perl -pe 's/{ *(".*?").*?(?:NC_\(".*?" *, *)?(".*?").*?}/\1: \2,/g'
+ done
+}
+
+python3 - $@ <<END
+from sys import argv
+from itertools import chain
+from glob import glob
+from xml.etree.ElementTree import ElementTree
+
+actions = {`find_actions`}
+
+found_clashes = False
+
+for file in glob ("$srcdir/menus/*.xml*"):
+ tree = ElementTree (file = file)
+
+ parents = {c: p for p in tree.iter () for c in p}
+
+ def menu_path (menu):
+ path = ""
+
+ while menu:
+ if menu.tag == "menu":
+ if path:
+ path = " -> " + path
+
+ path = menu.get ("name") + path
+
+ menu = parents.get (menu)
+
+ return path
+
+ for menu in chain (tree.iter ("menubar-and-popup"),
+ tree.iter ("menu"),
+ tree.iter ("popup")):
+ if len (argv) > 1 and menu.tag != argv[1]:
+ continue
+
+ mnemonics = {}
+
+ found_clashes_in_menu = False
+
+ for element in menu:
+ action = element.get ("action")
+
+ if action in actions:
+ label = actions[action]
+
+ if "_" in label:
+ mnemonic = label[label.find ("_") + 1].upper ()
+
+ if mnemonic not in mnemonics:
+ mnemonics[mnemonic] = []
+
+ mnemonics[mnemonic] += [action]
+
+ mnemonic_list = list (mnemonics.keys ())
+ mnemonic_list.sort ()
+
+ for mnemonic in mnemonic_list:
+ action_list = mnemonics[mnemonic]
+
+ if len (action_list) > 1:
+ if found_clashes:
+ print ()
+
+ if not found_clashes_in_menu:
+
+ if menu.tag == "menu":
+ print ("In %s (%s):" % (menu.get ("action"),
+ menu_path (menu)))
+ elif menu.tag == "popup":
+ print ("In %s:" % menu.get ("action"))
+ else:
+ print ("In top-level menu bar:")
+
+ found_clashes = True
+ found_clashes_in_menu = True
+
+ print (" Mnemonic clash for '%s':" % mnemonic)
+
+ for action in action_list:
+ print (" %s: %s" % (action, actions[action]))
+
+exit (found_clashes)
+END
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]