aboutsummaryrefslogtreecommitdiff
path: root/catapult/common/py_vulcanize/py_vulcanize/html_module.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/common/py_vulcanize/py_vulcanize/html_module.py')
-rw-r--r--catapult/common/py_vulcanize/py_vulcanize/html_module.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/catapult/common/py_vulcanize/py_vulcanize/html_module.py b/catapult/common/py_vulcanize/py_vulcanize/html_module.py
new file mode 100644
index 00000000..5e1c7541
--- /dev/null
+++ b/catapult/common/py_vulcanize/py_vulcanize/html_module.py
@@ -0,0 +1,154 @@
+# Copyright 2014 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.
+
+import os
+import re
+
+from py_vulcanize import js_utils
+from py_vulcanize import module
+from py_vulcanize import parse_html_deps
+from py_vulcanize import style_sheet
+
+
+def IsHTMLResourceTheModuleGivenConflictingResourceNames(
+ js_resource, html_resource): # pylint: disable=unused-argument
+ return 'polymer-element' in html_resource.contents
+
+
+class HTMLModule(module.Module):
+
+ @property
+ def _module_dir_name(self):
+ return os.path.dirname(self.resource.absolute_path)
+
+ def Parse(self, excluded_scripts):
+ try:
+ parser_results = parse_html_deps.HTMLModuleParser().Parse(self.contents)
+ except Exception as ex:
+ raise Exception('While parsing %s: %s' % (self.name, str(ex)))
+
+ self.dependency_metadata = Parse(self.loader,
+ self.name,
+ self._module_dir_name,
+ self.IsThirdPartyComponent(),
+ parser_results,
+ excluded_scripts)
+ self._parser_results = parser_results
+ self.scripts = parser_results.scripts
+
+ def Load(self, excluded_scripts):
+ super(HTMLModule, self).Load(excluded_scripts=excluded_scripts)
+
+ reachable_names = set([m.name
+ for m in self.all_dependent_modules_recursive])
+ if 'tr.exportTo' in self.contents:
+ if 'tracing.base.base' not in reachable_names:
+ raise Exception('%s: Does not have a dependency on base' %
+ os.path.relpath(self.resource.absolute_path))
+
+ for script in self.scripts:
+ if script.is_external:
+ if excluded_scripts and any(re.match(pattern, script.src) for
+ pattern in excluded_scripts):
+ continue
+
+ resource = _HRefToResource(self.loader, self.name, self._module_dir_name,
+ script.src,
+ tag_for_err_msg='<script src="%s">' % script.src)
+ path = resource.unix_style_relative_path
+ raw_script = self.loader.LoadRawScript(path)
+ self.dependent_raw_scripts.append(raw_script)
+ script.loaded_raw_script = raw_script
+
+ def GetTVCMDepsModuleType(self):
+ return 'py_vulcanize.HTML_MODULE_TYPE'
+
+ def AppendHTMLContentsToFile(self, f, ctl, minify=False):
+ super(HTMLModule, self).AppendHTMLContentsToFile(f, ctl)
+
+ ctl.current_module = self
+ try:
+ for piece in self._parser_results.YieldHTMLInPieces(ctl, minify=minify):
+ f.write(piece)
+ finally:
+ ctl.current_module = None
+
+ def HRefToResource(self, href, tag_for_err_msg):
+ return _HRefToResource(self.loader, self.name, self._module_dir_name,
+ href, tag_for_err_msg)
+
+ def AppendDirectlyDependentFilenamesTo(
+ self, dependent_filenames, include_raw_scripts=True):
+ super(HTMLModule, self).AppendDirectlyDependentFilenamesTo(
+ dependent_filenames, include_raw_scripts)
+ for contents in self._parser_results.inline_stylesheets:
+ module_dirname = os.path.dirname(self.resource.absolute_path)
+ ss = style_sheet.ParsedStyleSheet(
+ self.loader, module_dirname, contents)
+ ss.AppendDirectlyDependentFilenamesTo(dependent_filenames)
+
+def _HRefToResource(
+ loader, module_name, module_dir_name, href, tag_for_err_msg):
+ if href[0] == '/':
+ resource = loader.FindResourceGivenRelativePath(
+ os.path.normpath(href[1:]))
+ else:
+ abspath = os.path.normpath(os.path.join(module_dir_name,
+ os.path.normpath(href)))
+ resource = loader.FindResourceGivenAbsolutePath(abspath)
+
+ if not resource:
+ raise module.DepsException(
+ 'In %s, the %s cannot be loaded because '
+ 'it is not in the search path' % (module_name, tag_for_err_msg))
+ try:
+ resource.contents
+ except:
+ raise module.DepsException('In %s, %s points at a nonexistent file ' % (
+ module_name, tag_for_err_msg))
+ return resource
+
+
+def Parse(loader, module_name, module_dir_name, is_component, parser_results,
+ exclude_scripts=None):
+ res = module.ModuleDependencyMetadata()
+ if is_component:
+ return res
+
+ # External script references.
+ for href in parser_results.scripts_external:
+ if exclude_scripts and any(re.match(pattern, href) for
+ pattern in exclude_scripts):
+ continue
+
+ resource = _HRefToResource(loader, module_name, module_dir_name,
+ href,
+ tag_for_err_msg='<script src="%s">' % href)
+ res.dependent_raw_script_relative_paths.append(
+ resource.unix_style_relative_path)
+
+ # External imports. Mostly the same as <script>, but we know its a module.
+ for href in parser_results.imports:
+ if exclude_scripts and any(re.match(pattern, href) for
+ pattern in exclude_scripts):
+ continue
+
+ if not href.endswith('.html'):
+ raise Exception(
+ 'In %s, the <link rel="import" href="%s"> must point at a '
+ 'file with an html suffix' % (module_name, href))
+
+ resource = _HRefToResource(
+ loader, module_name, module_dir_name, href,
+ tag_for_err_msg='<link rel="import" href="%s">' % href)
+ res.dependent_module_names.append(resource.name)
+
+ # Style sheets.
+ for href in parser_results.stylesheets:
+ resource = _HRefToResource(
+ loader, module_name, module_dir_name, href,
+ tag_for_err_msg='<link rel="stylesheet" href="%s">' % href)
+ res.style_sheet_names.append(resource.name)
+
+ return res