summaryrefslogtreecommitdiffstats
path: root/tools/mnemonic-clashes
blob: 28a1efc544f04ebb2067d486272901f53484c658 (plain)
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