Index: tools/grit/grit/format/html_inline.py |
=================================================================== |
--- tools/grit/grit/format/html_inline.py (revision 45941) |
+++ tools/grit/grit/format/html_inline.py (working copy) |
@@ -86,50 +86,72 @@ |
if len(distribution) > 1 and distribution[0] == '_': |
distribution = distribution[1:].lower() |
- def SrcReplace(src_match): |
+ def SrcReplace(src_match, filepath=input_filepath): |
"""Helper function to provide SrcInlineAsDataURL with the base file path""" |
- return SrcInlineAsDataURL(src_match, input_filepath, distribution) |
+ return SrcInlineAsDataURL(src_match, filepath, distribution) |
- def InlineFileContents(src_match, pattern): |
- """Helper function to inline external script and css files""" |
+ def GetFilepath(src_match): |
filename = src_match.group('filename') |
if filename.find(':') != -1: |
# filename is probably a URL, which we don't want to bother inlining |
- return src_match.group(0) |
+ return None |
filename = filename.replace('%DISTRIBUTION%', distribution) |
- filepath = os.path.join(input_filepath, filename) |
+ return os.path.join(input_filepath, filename) |
+ def InlineFileContents(src_match, pattern): |
+ """Helper function to inline external script and css files""" |
+ filepath = GetFilepath(src_match) |
+ if filepath is None: |
+ return src_match.group(0) |
return pattern % ReadFile(filepath) |
def InlineScript(src_match): |
"""Helper function to inline external script files""" |
return InlineFileContents(src_match, '<script>%s</script>') |
- def InlineCss(src_match): |
+ def InlineCssText(text, css_filepath): |
+ """Helper function that inlines external resources inn CSS text""" |
+ filepath = os.path.dirname(css_filepath) |
+ return InlineCssBackgroundImages(text, filepath) |
+ |
+ def InlineCssFile(src_match): |
"""Helper function to inline external css files""" |
- return InlineFileContents(src_match, '<style>%s</style>') |
+ filepath = GetFilepath(src_match) |
+ if filepath is None: |
+ return src_match.group(0) |
+ # When resolving CSS files we need to pass in the path so that relative URLs |
+ # can be resolved. |
+ return '<style>%s</style>' % InlineCssText(ReadFile(filepath), filepath) |
+ |
+ def InlineCssBackgroundImages(text, filepath=input_filepath): |
+ """Helper function that inlines external images in CSS backgrounds""" |
+ return re.sub('background(?:-image)?:[ ]*url\((?:\'|\")' + |
+ '(?P<filename>[^"\'\)\(]*)(?:\'|\")', |
+ lambda m: SrcReplace(m, filepath), |
+ text) |
+ |
+ |
# We need to inline css and js before we inline images so that image |
# references gets inlined in the css and js |
flat_text = re.sub('<script .*?src="(?P<filename>[^"\']*)".*?></script>', |
InlineScript, |
ReadFile(input_filename)) |
- flat_text = re.sub('<link rel="stylesheet".+?href="(?P<filename>[^"\']*)".*?>', |
- InlineCss, |
- flat_text) |
+ flat_text = re.sub( |
+ '<link rel="stylesheet".+?href="(?P<filename>[^"\']*)".*?>', |
+ InlineCssFile, |
+ flat_text) |
# TODO(glen): Make this regex not match src="" text that is not inside a tag |
flat_text = re.sub('src="(?P<filename>[^"\']*)"', |
SrcReplace, |
flat_text) |
- # TODO(glen): Make this regex not match url('') that is not inside a style |
- flat_text = re.sub('background(?:-image)?:[ ]*url\(\'(?P<filename>[^"\']*)\'', |
- SrcReplace, |
- flat_text) |
+ # TODO(arv): Only do this inside <style> tags. |
+ flat_text = InlineCssBackgroundImages(flat_text) |
flat_text = re.sub('<link rel="icon".+?href="(?P<filename>[^"\']*)"', |
SrcReplace, |
@@ -139,6 +161,7 @@ |
out_file.writelines(flat_text) |
out_file.close() |
+ |
def main(): |
if len(sys.argv) <= 2: |
print "Flattens a HTML file by inlining its external resources.\n" |