| 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
|
|
|
|
|