blob: 97855cae838cd619f16437edcc4b1913510abdd0 [file] [log] [blame]
# 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):
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)
self._parser_results = parser_results
def Load(self):
super(HTMLModule, self).Load()
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))
def GetTVCMDepsModuleType(self):
return 'py_vulcanize.HTML_MODULE_TYPE'
def AppendJSContentsToFile(self,
f,
use_include_tags_for_scripts,
dir_for_include_tag_root):
super(HTMLModule, self).AppendJSContentsToFile(f,
use_include_tags_for_scripts,
dir_for_include_tag_root)
for inline_script in self._parser_results.inline_scripts:
js = inline_script.contents
js = js_utils.EscapeJSIfNeeded(js)
f.write(js)
f.write('\n')
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):
res = module.ModuleDependencyMetadata()
if is_component:
return res
# External script references.
for href in parser_results.scripts_external:
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 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