| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 '''Interface for all gatherers. | |
| 7 ''' | |
| 8 | |
| 9 | |
| 10 import os.path | |
| 11 import types | |
| 12 | |
| 13 from grit import clique | |
| 14 from grit import util | |
| 15 | |
| 16 | |
| 17 class GathererBase(object): | |
| 18 '''Interface for all gatherer implementations. Subclasses must implement | |
| 19 all methods that raise NotImplemented.''' | |
| 20 | |
| 21 def __init__(self, rc_file, extkey=None, encoding='cp1252', is_skeleton=False)
: | |
| 22 '''Initializes the gatherer object's attributes, but does not attempt to | |
| 23 read the input file. | |
| 24 | |
| 25 Args: | |
| 26 rc_file: The 'file' attribute of the <structure> node (usually the | |
| 27 relative path to the source file). | |
| 28 extkey: e.g. 'ID_MY_DIALOG' | |
| 29 encoding: e.g. 'utf-8' | |
| 30 is_skeleton: Indicates whether this gatherer is a skeleton gatherer, in | |
| 31 which case we should not do some types of processing on the | |
| 32 translateable bits. | |
| 33 ''' | |
| 34 self.rc_file = rc_file | |
| 35 self.extkey = extkey | |
| 36 self.encoding = encoding | |
| 37 # A default uberclique that is local to this object. Users can override | |
| 38 # this with the uberclique they are using. | |
| 39 self.uberclique = clique.UberClique() | |
| 40 # Indicates whether this gatherer is a skeleton gatherer, in which case | |
| 41 # we should not do some types of processing on the translateable bits. | |
| 42 self.is_skeleton = is_skeleton | |
| 43 # Stores the grd node on which this gatherer is running. This allows | |
| 44 # evaluating expressions. | |
| 45 self.grd_node = None | |
| 46 | |
| 47 def SetAttributes(self, attrs): | |
| 48 '''Sets node attributes used by the gatherer. | |
| 49 | |
| 50 By default, this does nothing. If special handling is desired, it should be | |
| 51 overridden by the child gatherer. | |
| 52 | |
| 53 Args: | |
| 54 attrs: The mapping of node attributes. | |
| 55 ''' | |
| 56 pass | |
| 57 | |
| 58 def SetDefines(self, defines): | |
| 59 '''Sets global defines used by the gatherer. | |
| 60 | |
| 61 By default, this does nothing. If special handling is desired, it should be | |
| 62 overridden by the child gatherer. | |
| 63 | |
| 64 Args: | |
| 65 defines: The mapping of define values. | |
| 66 ''' | |
| 67 pass | |
| 68 | |
| 69 def SetGrdNode(self, node): | |
| 70 '''Sets the grd node on which this gatherer is running. | |
| 71 ''' | |
| 72 self.grd_node = node | |
| 73 | |
| 74 def SetUberClique(self, uberclique): | |
| 75 '''Overrides the default uberclique so that cliques created by this object | |
| 76 become part of the uberclique supplied by the user. | |
| 77 ''' | |
| 78 self.uberclique = uberclique | |
| 79 | |
| 80 def Parse(self): | |
| 81 '''Reads and parses the contents of what is being gathered.''' | |
| 82 raise NotImplementedError() | |
| 83 | |
| 84 def GetData(self, lang, encoding): | |
| 85 '''Returns the data to be added to the DataPack for this node or None if | |
| 86 this node does not add a DataPack entry. | |
| 87 ''' | |
| 88 return None | |
| 89 | |
| 90 def GetText(self): | |
| 91 '''Returns the text of what is being gathered.''' | |
| 92 raise NotImplementedError() | |
| 93 | |
| 94 def GetTextualIds(self): | |
| 95 '''Returns the mnemonic IDs that need to be defined for the resource | |
| 96 being gathered to compile correctly.''' | |
| 97 return [] | |
| 98 | |
| 99 def GetCliques(self): | |
| 100 '''Returns the MessageClique objects for all translateable portions.''' | |
| 101 return [] | |
| 102 | |
| 103 def GetInputPath(self): | |
| 104 return self.rc_file | |
| 105 | |
| 106 def GetHtmlResourceFilenames(self): | |
| 107 """Returns a set of all filenames inlined by this gatherer.""" | |
| 108 return [] | |
| 109 | |
| 110 def Translate(self, lang, pseudo_if_not_available=True, | |
| 111 skeleton_gatherer=None, fallback_to_english=False): | |
| 112 '''Returns the resource being gathered, with translateable portions filled | |
| 113 with the translation for language 'lang'. | |
| 114 | |
| 115 If pseudo_if_not_available is true, a pseudotranslation will be used for any | |
| 116 message that doesn't have a real translation available. | |
| 117 | |
| 118 If no translation is available and pseudo_if_not_available is false, | |
| 119 fallback_to_english controls the behavior. If it is false, throw an error. | |
| 120 If it is true, use the English version of the message as its own | |
| 121 "translation". | |
| 122 | |
| 123 If skeleton_gatherer is specified, the translation will use the nontranslate
able | |
| 124 parts from the gatherer 'skeleton_gatherer', which must be of the same type | |
| 125 as 'self'. | |
| 126 | |
| 127 If fallback_to_english | |
| 128 | |
| 129 Args: | |
| 130 lang: 'en' | |
| 131 pseudo_if_not_available: True | False | |
| 132 skeleton_gatherer: other_gatherer | |
| 133 fallback_to_english: True | False | |
| 134 | |
| 135 Return: | |
| 136 e.g. 'ID_THIS_SECTION TYPE\n...BEGIN\n "Translated message"\n......\nEND' | |
| 137 | |
| 138 Raises: | |
| 139 grit.exception.NotReady() if used before Parse() has been successfully | |
| 140 called. | |
| 141 grit.exception.NoSuchTranslation() if 'pseudo_if_not_available' and | |
| 142 fallback_to_english are both false and there is no translation for the | |
| 143 requested language. | |
| 144 ''' | |
| 145 raise NotImplementedError() | |
| 146 | |
| 147 def SubstituteMessages(self, substituter): | |
| 148 '''Applies substitutions to all messages in the gatherer. | |
| 149 | |
| 150 Args: | |
| 151 substituter: a grit.util.Substituter object. | |
| 152 ''' | |
| 153 pass | |
| 154 | |
| 155 def SetFilenameExpansionFunction(self, fn): | |
| 156 '''Sets a function for rewriting filenames before gathering.''' | |
| 157 pass | |
| 158 | |
| 159 # TODO(benrg): Move this elsewhere, since it isn't part of the interface. | |
| 160 def _LoadInputFile(self): | |
| 161 '''A convenience function for subclasses that loads the contents of the | |
| 162 input file. | |
| 163 ''' | |
| 164 if isinstance(self.rc_file, types.StringTypes): | |
| 165 path = self.GetInputPath() | |
| 166 # Hack: some unit tests supply an absolute path and no root node. | |
| 167 if not os.path.isabs(path): | |
| 168 path = self.grd_node.ToRealPath(path) | |
| 169 return util.ReadFile(path, self.encoding) | |
| 170 else: | |
| 171 return self.rc_file.read() | |
| OLD | NEW |