Index: grit/node/misc.py |
diff --git a/grit/node/misc.py b/grit/node/misc.py |
index c6147b46b7069bf02893ed79608a64703505477e..c338b86046a8e3e56208a84cb62dd0d583644610 100644 |
--- a/grit/node/misc.py |
+++ b/grit/node/misc.py |
@@ -20,6 +20,21 @@ from grit import util |
import grit.format.rc_header |
+# RTL languages |
+# TODO(jennyz): remove this fixed set of RTL language array |
+# now that generic expand_variable code exists. |
+_RTL_LANGS = ( |
+ 'ar', # Arabic |
+ 'fa', # Farsi |
+ 'iw', # Hebrew |
+ 'ks', # Kashmiri |
+ 'ku', # Kurdish |
+ 'ps', # Pashto |
+ 'ur', # Urdu |
+ 'yi', # Yiddish |
+) |
+ |
+ |
def _ReadFirstIdsFromFile(filename, defines): |
'''Read the starting resource id values from |filename|. We also |
expand variables of the form <(FOO) based on defines passed in on |
@@ -88,6 +103,13 @@ class IfNode(base.Node): |
''' |
return self.EvaluateCondition(self.attrs['expr']) |
+ def SatisfiesOutputCondition(self): |
+ '''Returns true if its condition is satisfied, including on ancestors.''' |
+ if not self.IsConditionSatisfied(): |
+ return False |
+ else: |
+ return base.Node.SatisfiesOutputCondition(self) |
+ |
class ReleaseNode(base.Node): |
'''The <release> element.''' |
@@ -127,6 +149,7 @@ class GritNode(base.Node): |
base.Node.__init__(self) |
self.output_language = '' |
self.defines = {} |
+ self.substituter = util.Substituter() |
def _IsValidChild(self, child): |
from grit.node import empty |
@@ -136,7 +159,7 @@ class GritNode(base.Node): |
def _IsValidAttribute(self, name, value): |
if name not in ['base_dir', 'first_ids_file', 'source_lang_id', |
'latest_public_release', 'current_release', |
- 'enc_check', 'tc_project']: |
+ 'enc_check', 'tc_project', 'grit_version']: |
return False |
if name in ['latest_public_release', 'current_release'] and value.strip( |
'0123456789') != '': |
@@ -150,6 +173,7 @@ class GritNode(base.Node): |
return { |
'base_dir' : '.', |
'first_ids_file': '', |
+ 'grit_version': 1, |
'source_lang_id' : 'en', |
'enc_check' : constants.ENCODING_CHECK, |
'tc_project' : 'NEED_TO_SET_tc_project_ATTRIBUTE', |
@@ -291,6 +315,12 @@ class GritNode(base.Node): |
return output_files |
raise exception.MissingElement() |
+ def GetSubstitutionMessages(self): |
+ '''Returns the list of <message sub_variable="true"> nodes.''' |
+ msg_nodes = self.GetChildrenOfType(message.MessageNode) |
+ return [n for n in msg_nodes if |
+ n.attrs['sub_variable'] == 'true' and n.SatisfiesOutputCondition()] |
+ |
def ItemFormatter(self, t): |
if t == 'rc_header': |
from grit.format import rc_header # import here to avoid circular dep |
@@ -318,8 +348,31 @@ class GritNode(base.Node): |
return super(type(self), self).ItemFormatter(t) |
def SetOutputContext(self, output_language, defines): |
+ '''Set the output context: language and defines. Prepares substitutions. |
+ |
+ The substitutions are reset every time the OutputContext is changed. |
+ They include messages designated as variables, and language codes for html |
+ and rc files. |
+ |
+ Args: |
+ output_language: a two-letter language code (eg: 'en', 'ar'...) |
+ defines: a map of names to values (strings or booleans.) |
+ ''' |
+ output_language = output_language or self.GetSourceLanguage() |
self.output_language = output_language |
self.defines = defines |
+ self.substituter.AddMessages(self.GetSubstitutionMessages(), |
+ output_language) |
+ if output_language in _RTL_LANGS: |
+ direction = 'dir="RTL"' |
+ else: |
+ direction = 'dir="LTR"' |
+ self.substituter.AddSubstitutions({ |
+ 'GRITLANGCODE': output_language, |
+ 'GRITDIR': direction, |
+ }) |
+ from grit.format import rc # avoid circular dep |
+ rc.RcSubstitutions(self.substituter, output_language) |
def SetDefines(self, defines): |
self.defines = defines |
@@ -370,6 +423,22 @@ class GritNode(base.Node): |
raise Exception('Please update %s and add a first id for %s (%s).' |
% (first_ids_filename, filename, node.name)) |
+ def RunGatherers(self, recursive=0, debug=False): |
+ '''Gathers information for the structure nodes, then apply substitutions. |
+ |
+ The substitutions step requires that the OutputContext has been set. |
+ Locally, get the Substitution messages |
+ and add them to the substituter. Also add substitutions for language codes |
+ in the Rc. |
+ |
+ Args: |
+ recursive: will call RunGatherers() recursively on all child nodes first. |
+ debug: will print information while running gatherers. |
+ ''' |
+ base.Node.RunGatherers(self, recursive, False) |
+ assert self.output_language |
+ self.SubstituteMessages(self.substituter) |
+ |
class IdentifierNode(base.Node): |
'''A node for specifying identifiers that should appear in the resource |