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