Index: grit/gather/skeleton_gatherer.py |
=================================================================== |
--- grit/gather/skeleton_gatherer.py (revision 202) |
+++ grit/gather/skeleton_gatherer.py (working copy) |
@@ -1,147 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2012 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 that store their gathered resource in a |
-list. |
-''' |
- |
-import types |
- |
-from grit.gather import interface |
-from grit import clique |
-from grit import tclib |
- |
- |
-class SkeletonGatherer(interface.GathererBase): |
- '''Common functionality of gatherers that parse their input as a skeleton of |
- translatable and nontranslatable chunks. |
- ''' |
- |
- def __init__(self, *args, **kwargs): |
- super(SkeletonGatherer, self).__init__(*args, **kwargs) |
- # List of parts of the document. Translateable parts are |
- # clique.MessageClique objects, nontranslateable parts are plain strings. |
- # Translated messages are inserted back into the skeleton using the quoting |
- # rules defined by self.Escape() |
- self.skeleton_ = [] |
- # A list of the names of IDs that need to be defined for this resource |
- # section to compile correctly. |
- self.ids_ = [] |
- # True if Parse() has already been called. |
- self.have_parsed_ = False |
- # True if a translatable chunk has been added |
- self.translatable_chunk_ = False |
- # If not None, all parts of the document will be put into this single |
- # message; otherwise the normal skeleton approach is used. |
- self.single_message_ = None |
- # Number to use for the next placeholder name. Used only if single_message |
- # is not None |
- self.ph_counter_ = 1 |
- |
- def GetText(self): |
- '''Returns the original text of the section''' |
- return self.text_ |
- |
- def Escape(self, text): |
- '''Subclasses can override. Base impl is identity. |
- ''' |
- return text |
- |
- def UnEscape(self, text): |
- '''Subclasses can override. Base impl is identity. |
- ''' |
- return text |
- |
- def GetTextualIds(self): |
- '''Returns the list of textual IDs that need to be defined for this |
- resource section to compile correctly.''' |
- return self.ids_ |
- |
- def _AddTextualId(self, id): |
- self.ids_.append(id) |
- |
- def GetCliques(self): |
- '''Returns the message cliques for each translateable message in the |
- resource section.''' |
- return [x for x in self.skeleton_ if isinstance(x, clique.MessageClique)] |
- |
- def Translate(self, lang, pseudo_if_not_available=True, |
- skeleton_gatherer=None, fallback_to_english=False): |
- if len(self.skeleton_) == 0: |
- raise exception.NotReady() |
- if skeleton_gatherer: |
- assert len(skeleton_gatherer.skeleton_) == len(self.skeleton_) |
- |
- out = [] |
- for ix in range(len(self.skeleton_)): |
- if isinstance(self.skeleton_[ix], types.StringTypes): |
- if skeleton_gatherer: |
- # Make sure the skeleton is like the original |
- assert(isinstance(skeleton_gatherer.skeleton_[ix], types.StringTypes)) |
- out.append(skeleton_gatherer.skeleton_[ix]) |
- else: |
- out.append(self.skeleton_[ix]) |
- else: |
- if skeleton_gatherer: # Make sure the skeleton is like the original |
- assert(not isinstance(skeleton_gatherer.skeleton_[ix], |
- types.StringTypes)) |
- msg = self.skeleton_[ix].MessageForLanguage(lang, |
- pseudo_if_not_available, |
- fallback_to_english) |
- |
- def MyEscape(text): |
- return self.Escape(text) |
- text = msg.GetRealContent(escaping_function=MyEscape) |
- out.append(text) |
- return ''.join(out) |
- |
- def Parse(self): |
- '''Parses the section. Implemented by subclasses. Idempotent.''' |
- raise NotImplementedError() |
- |
- def _AddNontranslateableChunk(self, chunk): |
- '''Adds a nontranslateable chunk.''' |
- if self.single_message_: |
- ph = tclib.Placeholder('XX%02dXX' % self.ph_counter_, chunk, chunk) |
- self.ph_counter_ += 1 |
- self.single_message_.AppendPlaceholder(ph) |
- else: |
- self.skeleton_.append(chunk) |
- |
- def _AddTranslateableChunk(self, chunk): |
- '''Adds a translateable chunk. It will be unescaped before being added.''' |
- # We don't want empty messages since they are redundant and the TC |
- # doesn't allow them. |
- if chunk == '': |
- return |
- |
- unescaped_text = self.UnEscape(chunk) |
- if self.single_message_: |
- self.single_message_.AppendText(unescaped_text) |
- else: |
- self.skeleton_.append(self.uberclique.MakeClique( |
- tclib.Message(text=unescaped_text))) |
- self.translatable_chunk_ = True |
- |
- def SubstituteMessages(self, substituter): |
- '''Applies substitutions to all messages in the tree. |
- |
- Goes through the skeleton and finds all MessageCliques. |
- |
- Args: |
- substituter: a grit.util.Substituter object. |
- ''' |
- if self.single_message_: |
- self.single_message_ = substituter.SubstituteMessage(self.single_message_) |
- new_skel = [] |
- for chunk in self.skeleton_: |
- if isinstance(chunk, clique.MessageClique): |
- old_message = chunk.GetMessage() |
- new_message = substituter.SubstituteMessage(old_message) |
- if new_message is not old_message: |
- new_skel.append(self.uberclique.MakeClique(new_message)) |
- continue |
- new_skel.append(chunk) |
- self.skeleton_ = new_skel |