Index: grit/node/include.py |
=================================================================== |
--- grit/node/include.py (revision 0) |
+++ grit/node/include.py (revision 0) |
@@ -0,0 +1,140 @@ |
+#!/usr/bin/python2.4 |
+# Copyright (c) 2011 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. |
+ |
+'''Handling of the <include> element. |
+''' |
+ |
+import os |
+ |
+import grit.format.html_inline |
+import grit.format.rc_header |
+import grit.format.rc |
+ |
+from grit.node import base |
+from grit import util |
+ |
+class IncludeNode(base.Node): |
+ '''An <include> element.''' |
+ def __init__(self): |
+ base.Node.__init__(self) |
+ |
+ # Cache flattened data so that we don't flatten the same file |
+ # multiple times. |
+ self._flattened_data = None |
+ # Also keep track of the last filename we flattened to, so we can |
+ # avoid doing it more than once. |
+ self._last_flat_filename = None |
+ |
+ def _IsValidChild(self, child): |
+ return False |
+ |
+ def _GetFlattenedData(self, allow_external_script=False): |
+ if not self._flattened_data: |
+ filename = self.FilenameToOpen() |
+ self._flattened_data = ( |
+ grit.format.html_inline.InlineToString(filename, self, |
+ allow_external_script=allow_external_script)) |
+ return self._flattened_data |
+ |
+ def MandatoryAttributes(self): |
+ return ['name', 'type', 'file'] |
+ |
+ def DefaultAttributes(self): |
+ return {'translateable' : 'true', |
+ 'generateid': 'true', |
+ 'filenameonly': 'false', |
+ 'flattenhtml': 'false', |
+ 'allowexternalscript': 'false', |
+ 'relativepath': 'false', |
+ } |
+ |
+ def ItemFormatter(self, t): |
+ if t == 'rc_header': |
+ return grit.format.rc_header.Item() |
+ elif (t in ['rc_all', 'rc_translateable', 'rc_nontranslateable'] and |
+ self.SatisfiesOutputCondition()): |
+ return grit.format.rc.RcInclude(self.attrs['type'].upper(), |
+ self.attrs['filenameonly'] == 'true', |
+ self.attrs['relativepath'] == 'true', |
+ self.attrs['flattenhtml'] == 'true') |
+ elif t == 'resource_map_source': |
+ from grit.format import resource_map |
+ return resource_map.SourceInclude() |
+ elif t == 'resource_file_map_source': |
+ from grit.format import resource_map |
+ return resource_map.SourceFileInclude() |
+ else: |
+ return super(type(self), self).ItemFormatter(t) |
+ |
+ def FileForLanguage(self, lang, output_dir): |
+ '''Returns the file for the specified language. This allows us to return |
+ different files for different language variants of the include file. |
+ ''' |
+ return self.FilenameToOpen() |
+ |
+ def GetDataPackPair(self, lang, encoding): |
+ '''Returns a (id, string) pair that represents the resource id and raw |
+ bytes of the data. This is used to generate the data pack data file. |
+ ''' |
+ from grit.format import rc_header |
+ id_map = rc_header.Item.tids_ |
+ id = id_map[self.GetTextualIds()[0]] |
+ if self.attrs['flattenhtml'] == 'true': |
+ allow_external_script = self.attrs['allowexternalscript'] == 'true' |
+ data = self._GetFlattenedData(allow_external_script=allow_external_script) |
+ else: |
+ filename = self.FilenameToOpen() |
+ infile = open(filename, 'rb') |
+ data = infile.read() |
+ infile.close() |
+ |
+ # Include does not care about the encoding, because it only returns binary |
+ # data. |
+ return id, data |
+ |
+ def Flatten(self, output_dir): |
+ '''Rewrite file references to be base64 encoded data URLs. The new file |
+ will be written to output_dir and the name of the new file is returned.''' |
+ filename = self.FilenameToOpen() |
+ flat_filename = os.path.join(output_dir, |
+ self.attrs['name'] + '_' + os.path.basename(filename)) |
+ |
+ if self._last_flat_filename == flat_filename: |
+ return |
+ |
+ outfile = open(flat_filename, 'wb') |
+ outfile.write(self._GetFlattenedData()) |
+ outfile.close() |
+ |
+ self._last_flat_filename = flat_filename |
+ return os.path.basename(flat_filename) |
+ |
+ |
+ def GetHtmlResourceFilenames(self): |
+ """Returns a set of all filenames inlined by this file.""" |
+ return grit.format.html_inline.GetResourceFilenames(self.FilenameToOpen()) |
+ |
+ # static method |
+ def Construct(parent, name, type, file, translateable=True, |
+ filenameonly=False, relativepath=False): |
+ '''Creates a new node which is a child of 'parent', with attributes set |
+ by parameters of the same name. |
+ ''' |
+ # Convert types to appropriate strings |
+ translateable = util.BoolToString(translateable) |
+ filenameonly = util.BoolToString(filenameonly) |
+ relativepath = util.BoolToString(relativepath) |
+ |
+ node = IncludeNode() |
+ node.StartParsing('include', parent) |
+ node.HandleAttribute('name', name) |
+ node.HandleAttribute('type', type) |
+ node.HandleAttribute('file', file) |
+ node.HandleAttribute('translateable', translateable) |
+ node.HandleAttribute('filenameonly', filenameonly) |
+ node.HandleAttribute('relativepath', relativepath) |
+ node.EndParsing() |
+ return node |
+ Construct = staticmethod(Construct) |
Property changes on: grit/node/include.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |