1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 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
|