195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file.
501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''A baseclass for simple gatherers based on regular expressions.
701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''
801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport re
1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.gather import skeleton_gatherer
1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass RegexpGatherer(skeleton_gatherer.SkeletonGatherer):
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''Common functionality of gatherers based on parsing using a single
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  regular expression.
1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  DescriptionMapping_ = {
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'CAPTION' : 'This is a caption for a dialog',
2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'CHECKBOX' : 'This is a label for a checkbox',
2201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'CONTROL': 'This is the text on a control',
2301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'CTEXT': 'This is a label for a control',
2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'DEFPUSHBUTTON': 'This is a button definition',
2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'GROUPBOX': 'This is a label for a grouping',
2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'ICON': 'This is a label for an icon',
2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'LTEXT': 'This is the text for a label',
2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      'PUSHBUTTON': 'This is the text for a button',
2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    }
3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  # Contextualization elements. Used for adding additional information
3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  # to the message bundle description string from RC files.
3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def AddDescriptionElement(self, string):
3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if self.DescriptionMapping_.has_key(string):
3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      description = self.DescriptionMapping_[string]
3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    else:
3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      description = string
3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if self.single_message_:
3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.single_message_.SetDescription(description)
4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    else:
4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      if (self.translatable_chunk_):
4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        message = self.skeleton_[len(self.skeleton_) - 1].GetMessage()
4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        message.SetDescription(description)
4401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def _RegExpParse(self, regexp, text_to_parse):
4601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''An implementation of Parse() that can be used for resource sections that
4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    can be parsed using a single multi-line regular expression.
4801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    All translateables must be in named groups that have names starting with
5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    'text'.  All textual IDs must be in named groups that have names starting
5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    with 'id'. All type definitions that can be included in the description
5201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    field for contextualization purposes should have a name that starts with
5301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    'type'.
5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      regexp: re.compile('...', re.MULTILINE)
5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      text_to_parse:
5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
5901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    chunk_start = 0
6001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    for match in regexp.finditer(text_to_parse):
6101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      groups = match.groupdict()
6201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      keys = groups.keys()
6301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      keys.sort()
6401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.translatable_chunk_ = False
6501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      for group in keys:
6601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        if group.startswith('id') and groups[group]:
6701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          self._AddTextualId(groups[group])
6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        elif group.startswith('text') and groups[group]:
6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          self._AddNontranslateableChunk(
7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            text_to_parse[chunk_start : match.start(group)])
7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          chunk_start = match.end(group)  # Next chunk will start after the match
7201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          self._AddTranslateableChunk(groups[group])
7301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        elif group.startswith('type') and groups[group]:
7401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          # Add the description to the skeleton_ list. This works because
7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          # we are using a sort set of keys, and because we assume that the
7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          # group name used for descriptions (type) will come after the "text"
7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          # group in alphabetical order. We also assume that there cannot be
7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          # more than one description per regular expression match.
7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          self.AddDescriptionElement(groups[group])
8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
8101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self._AddNontranslateableChunk(text_to_parse[chunk_start:])
8201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
8301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if self.single_message_:
8401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.skeleton_.append(self.uberclique.MakeClique(self.single_message_))
8501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
86