Index: grit/gather/regexp.py |
=================================================================== |
--- grit/gather/regexp.py (revision 0) |
+++ grit/gather/regexp.py (revision 0) |
@@ -0,0 +1,97 @@ |
+#!/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. |
+ |
+'''A baseclass for simple gatherers based on regular expressions. |
+''' |
+ |
+import re |
+import types |
+ |
+from grit.gather import skeleton_gatherer |
+from grit import clique |
+from grit import tclib |
+ |
+ |
+class RegexpGatherer(skeleton_gatherer.SkeletonGatherer): |
+ '''Common functionality of gatherers based on parsing using a single |
+ regular expression. |
+ ''' |
+ |
+ DescriptionMapping_ = { |
+ 'CAPTION' : 'This is a caption for a dialog', |
+ 'CHECKBOX' : 'This is a label for a checkbox', |
+ 'CONTROL': 'This is the text on a control', |
+ 'CTEXT': 'This is a label for a control', |
+ 'DEFPUSHBUTTON': 'This is a button definition', |
+ 'GROUPBOX': 'This is a label for a grouping', |
+ 'ICON': 'This is a label for an icon', |
+ 'LTEXT': 'This is the text for a label', |
+ 'PUSHBUTTON': 'This is the text for a button', |
+ } |
+ |
+ def __init__(self, text): |
+ skeleton_gatherer.SkeletonGatherer.__init__(self) |
+ # Original text of what we're parsing |
+ self.text_ = text.strip() |
+ |
+ # Contextualization elements. Used for adding additional information |
+ # to the message bundle description string from RC files. |
+ def AddDescriptionElement(self, string): |
+ if self.DescriptionMapping_.has_key(string): |
+ description = self.DescriptionMapping_[string] |
+ else: |
+ description = string |
+ if self.single_message_: |
+ self.single_message_.SetDescription(description) |
+ else: |
+ if (self.translatable_chunk_): |
+ message = self.skeleton_[len(self.skeleton_) - 1].GetMessage() |
+ message.SetDescription(description) |
+ |
+ def _RegExpParse(self, regexp, text_to_parse): |
+ '''An implementation of Parse() that can be used for resource sections that |
+ can be parsed using a single multi-line regular expression. |
+ |
+ All translateables must be in named groups that have names starting with |
+ 'text'. All textual IDs must be in named groups that have names starting |
+ with 'id'. All type definitions that can be included in the description |
+ field for contextualization purposes should have a name that starts with |
+ 'type'. |
+ |
+ Args: |
+ regexp: re.compile('...', re.MULTILINE) |
+ text_to_parse: |
+ ''' |
+ if self.have_parsed_: |
+ return |
+ self.have_parsed_ = True |
+ |
+ chunk_start = 0 |
+ for match in regexp.finditer(text_to_parse): |
+ groups = match.groupdict() |
+ keys = groups.keys() |
+ keys.sort() |
+ self.translatable_chunk_ = False |
+ for group in keys: |
+ if group.startswith('id') and groups[group]: |
+ self._AddTextualId(groups[group]) |
+ elif group.startswith('text') and groups[group]: |
+ self._AddNontranslateableChunk( |
+ text_to_parse[chunk_start : match.start(group)]) |
+ chunk_start = match.end(group) # Next chunk will start after the match |
+ self._AddTranslateableChunk(groups[group]) |
+ elif group.startswith('type') and groups[group]: |
+ # Add the description to the skeleton_ list. This works because |
+ # we are using a sort set of keys, and because we assume that the |
+ # group name used for descriptions (type) will come after the "text" |
+ # group in alphabetical order. We also assume that there cannot be |
+ # more than one description per regular expression match. |
+ self.AddDescriptionElement(groups[group]) |
+ |
+ self._AddNontranslateableChunk(text_to_parse[chunk_start:]) |
+ |
+ if self.single_message_: |
+ self.skeleton_.append(self.uberclique.MakeClique(self.single_message_)) |
+ |
Property changes on: grit/gather/regexp.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |