| Index: tools/grit/grit/gather/interface.py
|
| diff --git a/tools/grit/grit/gather/interface.py b/tools/grit/grit/gather/interface.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..c277d379b3cc98b87049ff1fe07fe9d4c88e2332
|
| --- /dev/null
|
| +++ b/tools/grit/grit/gather/interface.py
|
| @@ -0,0 +1,171 @@
|
| +#!/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.
|
| +
|
| +'''Interface for all gatherers.
|
| +'''
|
| +
|
| +
|
| +import os.path
|
| +import types
|
| +
|
| +from grit import clique
|
| +from grit import util
|
| +
|
| +
|
| +class GathererBase(object):
|
| + '''Interface for all gatherer implementations. Subclasses must implement
|
| + all methods that raise NotImplemented.'''
|
| +
|
| + def __init__(self, rc_file, extkey=None, encoding='cp1252', is_skeleton=False):
|
| + '''Initializes the gatherer object's attributes, but does not attempt to
|
| + read the input file.
|
| +
|
| + Args:
|
| + rc_file: The 'file' attribute of the <structure> node (usually the
|
| + relative path to the source file).
|
| + extkey: e.g. 'ID_MY_DIALOG'
|
| + encoding: e.g. 'utf-8'
|
| + is_skeleton: Indicates whether this gatherer is a skeleton gatherer, in
|
| + which case we should not do some types of processing on the
|
| + translateable bits.
|
| + '''
|
| + self.rc_file = rc_file
|
| + self.extkey = extkey
|
| + self.encoding = encoding
|
| + # A default uberclique that is local to this object. Users can override
|
| + # this with the uberclique they are using.
|
| + self.uberclique = clique.UberClique()
|
| + # Indicates whether this gatherer is a skeleton gatherer, in which case
|
| + # we should not do some types of processing on the translateable bits.
|
| + self.is_skeleton = is_skeleton
|
| + # Stores the grd node on which this gatherer is running. This allows
|
| + # evaluating expressions.
|
| + self.grd_node = None
|
| +
|
| + def SetAttributes(self, attrs):
|
| + '''Sets node attributes used by the gatherer.
|
| +
|
| + By default, this does nothing. If special handling is desired, it should be
|
| + overridden by the child gatherer.
|
| +
|
| + Args:
|
| + attrs: The mapping of node attributes.
|
| + '''
|
| + pass
|
| +
|
| + def SetDefines(self, defines):
|
| + '''Sets global defines used by the gatherer.
|
| +
|
| + By default, this does nothing. If special handling is desired, it should be
|
| + overridden by the child gatherer.
|
| +
|
| + Args:
|
| + defines: The mapping of define values.
|
| + '''
|
| + pass
|
| +
|
| + def SetGrdNode(self, node):
|
| + '''Sets the grd node on which this gatherer is running.
|
| + '''
|
| + self.grd_node = node
|
| +
|
| + def SetUberClique(self, uberclique):
|
| + '''Overrides the default uberclique so that cliques created by this object
|
| + become part of the uberclique supplied by the user.
|
| + '''
|
| + self.uberclique = uberclique
|
| +
|
| + def Parse(self):
|
| + '''Reads and parses the contents of what is being gathered.'''
|
| + raise NotImplementedError()
|
| +
|
| + def GetData(self, lang, encoding):
|
| + '''Returns the data to be added to the DataPack for this node or None if
|
| + this node does not add a DataPack entry.
|
| + '''
|
| + return None
|
| +
|
| + def GetText(self):
|
| + '''Returns the text of what is being gathered.'''
|
| + raise NotImplementedError()
|
| +
|
| + def GetTextualIds(self):
|
| + '''Returns the mnemonic IDs that need to be defined for the resource
|
| + being gathered to compile correctly.'''
|
| + return []
|
| +
|
| + def GetCliques(self):
|
| + '''Returns the MessageClique objects for all translateable portions.'''
|
| + return []
|
| +
|
| + def GetInputPath(self):
|
| + return self.rc_file
|
| +
|
| + def GetHtmlResourceFilenames(self):
|
| + """Returns a set of all filenames inlined by this gatherer."""
|
| + return []
|
| +
|
| + def Translate(self, lang, pseudo_if_not_available=True,
|
| + skeleton_gatherer=None, fallback_to_english=False):
|
| + '''Returns the resource being gathered, with translateable portions filled
|
| + with the translation for language 'lang'.
|
| +
|
| + If pseudo_if_not_available is true, a pseudotranslation will be used for any
|
| + message that doesn't have a real translation available.
|
| +
|
| + If no translation is available and pseudo_if_not_available is false,
|
| + fallback_to_english controls the behavior. If it is false, throw an error.
|
| + If it is true, use the English version of the message as its own
|
| + "translation".
|
| +
|
| + If skeleton_gatherer is specified, the translation will use the nontranslateable
|
| + parts from the gatherer 'skeleton_gatherer', which must be of the same type
|
| + as 'self'.
|
| +
|
| + If fallback_to_english
|
| +
|
| + Args:
|
| + lang: 'en'
|
| + pseudo_if_not_available: True | False
|
| + skeleton_gatherer: other_gatherer
|
| + fallback_to_english: True | False
|
| +
|
| + Return:
|
| + e.g. 'ID_THIS_SECTION TYPE\n...BEGIN\n "Translated message"\n......\nEND'
|
| +
|
| + Raises:
|
| + grit.exception.NotReady() if used before Parse() has been successfully
|
| + called.
|
| + grit.exception.NoSuchTranslation() if 'pseudo_if_not_available' and
|
| + fallback_to_english are both false and there is no translation for the
|
| + requested language.
|
| + '''
|
| + raise NotImplementedError()
|
| +
|
| + def SubstituteMessages(self, substituter):
|
| + '''Applies substitutions to all messages in the gatherer.
|
| +
|
| + Args:
|
| + substituter: a grit.util.Substituter object.
|
| + '''
|
| + pass
|
| +
|
| + def SetFilenameExpansionFunction(self, fn):
|
| + '''Sets a function for rewriting filenames before gathering.'''
|
| + pass
|
| +
|
| + # TODO(benrg): Move this elsewhere, since it isn't part of the interface.
|
| + def _LoadInputFile(self):
|
| + '''A convenience function for subclasses that loads the contents of the
|
| + input file.
|
| + '''
|
| + if isinstance(self.rc_file, types.StringTypes):
|
| + path = self.GetInputPath()
|
| + # Hack: some unit tests supply an absolute path and no root node.
|
| + if not os.path.isabs(path):
|
| + path = self.grd_node.ToRealPath(path)
|
| + return util.ReadFile(path, self.encoding)
|
| + else:
|
| + return self.rc_file.read()
|
|
|