From a2a7fc993cb18e0dee0e71b0e0cebc5d16ef5d07 Mon Sep 17 00:00:00 2001 From: Ell Date: Thu, 12 Sep 2019 17:46:57 +0300 Subject: [PATCH] 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(+) create mode 100755 tools/mnemonic-clashes 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 - $@ < 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