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 |