| Index: grit/shortcuts.py
|
| ===================================================================
|
| --- grit/shortcuts.py (revision 0)
|
| +++ grit/shortcuts.py (revision 0)
|
| @@ -0,0 +1,95 @@
|
| +#!/usr/bin/python2.4
|
| +# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +'''Stuff to prevent conflicting shortcuts.
|
| +'''
|
| +
|
| +import re
|
| +
|
| +from grit import util
|
| +
|
| +
|
| +class ShortcutGroup(object):
|
| + '''Manages a list of cliques that belong together in a single shortcut
|
| + group. Knows how to detect conflicting shortcut keys.
|
| + '''
|
| +
|
| + # Matches shortcut keys, e.g. &J
|
| + SHORTCUT_RE = re.compile('([^&]|^)(&[A-Za-z])')
|
| +
|
| + def __init__(self, name):
|
| + self.name = name
|
| + # Map of language codes to shortcut keys used (which is a map of
|
| + # shortcut keys to counts).
|
| + self.keys_by_lang = {}
|
| + # List of cliques in this group
|
| + self.cliques = []
|
| +
|
| + def AddClique(self, c):
|
| + for existing_clique in self.cliques:
|
| + if existing_clique.GetId() == c.GetId():
|
| + # This happens e.g. when we have e.g.
|
| + # <if expr1><structure 1></if> <if expr2><structure 2></if>
|
| + # where only one will really be included in the output.
|
| + return
|
| +
|
| + self.cliques.append(c)
|
| + for (lang, msg) in c.clique.items():
|
| + if lang not in self.keys_by_lang:
|
| + self.keys_by_lang[lang] = {}
|
| + keymap = self.keys_by_lang[lang]
|
| +
|
| + content = msg.GetRealContent()
|
| + keys = [groups[1] for groups in self.SHORTCUT_RE.findall(content)]
|
| + for key in keys:
|
| + key = key.upper()
|
| + if key in keymap:
|
| + keymap[key] += 1
|
| + else:
|
| + keymap[key] = 1
|
| +
|
| + def GenerateWarnings(self, tc_project):
|
| + # For any language that has more than one occurrence of any shortcut,
|
| + # make a list of the conflicting shortcuts.
|
| + problem_langs = {}
|
| + for (lang, keys) in self.keys_by_lang.items():
|
| + for (key, count) in keys.items():
|
| + if count > 1:
|
| + if lang not in problem_langs:
|
| + problem_langs[lang] = []
|
| + problem_langs[lang].append(key)
|
| +
|
| + warnings = []
|
| + if len(problem_langs):
|
| + warnings.append("WARNING - duplicate keys exist in shortcut group %s" %
|
| + self.name)
|
| + for (lang,keys) in problem_langs.items():
|
| + warnings.append(" %6s duplicates: %s" % (lang, ', '.join(keys)))
|
| + return warnings
|
| +
|
| +
|
| +def GenerateDuplicateShortcutsWarnings(uberclique, tc_project):
|
| + '''Given an UberClique and a project name, will print out helpful warnings
|
| + if there are conflicting shortcuts within shortcut groups in the provided
|
| + UberClique.
|
| +
|
| + Args:
|
| + uberclique: clique.UberClique()
|
| + tc_project: 'MyProjectNameInTheTranslationConsole'
|
| +
|
| + Returns:
|
| + ['warning line 1', 'warning line 2', ...]
|
| + '''
|
| + warnings = []
|
| + groups = {}
|
| + for c in uberclique.AllCliques():
|
| + for group in c.shortcut_groups:
|
| + if group not in groups:
|
| + groups[group] = ShortcutGroup(group)
|
| + groups[group].AddClique(c)
|
| + for group in groups.values():
|
| + warnings += group.GenerateWarnings(tc_project)
|
| + return warnings
|
| +
|
|
|
| Property changes on: grit/shortcuts.py
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|