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