|  | #!/usr/bin/env python | 
|  | # | 
|  | # Copyright (C) 2012 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | import os | 
|  | import re | 
|  | import sys | 
|  |  | 
|  | def break_lines(key, val): | 
|  | # these don't get split | 
|  | if key in ("PRODUCT_MODEL"): | 
|  | return (key,val) | 
|  | return (key, "\n".join(val.split())) | 
|  |  | 
|  | def split_line(line): | 
|  | words = line.split("=", 1) | 
|  | if len(words) == 1: | 
|  | return (words[0], "") | 
|  | else: | 
|  | return (words[0], words[1]) | 
|  |  | 
|  | def sort_lines(text): | 
|  | lines = text.split() | 
|  | lines.sort() | 
|  | return "\n".join(lines) | 
|  |  | 
|  | def parse_variables(lines): | 
|  | return [split_line(line) for line in lines if line.strip()] | 
|  |  | 
|  | def render_variables(variables): | 
|  | variables = dict(variables) | 
|  | del variables["FILE"] | 
|  | variables = list(variables.iteritems()) | 
|  | variables.sort(lambda a, b: cmp(a[0], b[0])) | 
|  | return ("<table id='variables'>" | 
|  | + "\n".join([ "<tr><th>%(key)s</th><td>%(val)s</td></tr>" % { "key": key, "val": val } | 
|  | for key,val in variables]) | 
|  | +"</table>") | 
|  |  | 
|  | def linkify_inherit(variables, text, func_name): | 
|  | groups = re.split("(\\$\\(call " + func_name + ",.*\\))", text) | 
|  | result = "" | 
|  | for i in range(0,len(groups)/2): | 
|  | i = i * 2 | 
|  | result = result + groups[i] | 
|  | s = groups[i+1] | 
|  | href = s.split(",", 1)[1].strip()[:-1] | 
|  | href = href.replace("$(SRC_TARGET_DIR)", "build/target") | 
|  | href = ("../" * variables["FILE"].count("/")) + href + ".html" | 
|  | result = result + "<a href=\"%s\">%s</a>" % (href,s) | 
|  | result = result + groups[-1] | 
|  | return result | 
|  |  | 
|  | def render_original(variables, text): | 
|  | text = linkify_inherit(variables, text, "inherit-product") | 
|  | text = linkify_inherit(variables, text, "inherit-product-if-exists") | 
|  | return text | 
|  |  | 
|  | def read_file(fn): | 
|  | f = file(fn) | 
|  | text = f.read() | 
|  | f.close() | 
|  | return text | 
|  |  | 
|  | def main(argv): | 
|  | # read the variables | 
|  | lines = sys.stdin.readlines() | 
|  | variables = parse_variables(lines) | 
|  |  | 
|  | # format the variables | 
|  | variables = [break_lines(key,val) for key,val in variables] | 
|  |  | 
|  | # now it's a dict | 
|  | variables = dict(variables) | 
|  |  | 
|  | sorted_vars = ( | 
|  | "PRODUCT_COPY_FILES", | 
|  | "PRODUCT_PACKAGES", | 
|  | "PRODUCT_LOCALES", | 
|  | "PRODUCT_FACTORY_RAMDISK_MODULES", | 
|  | "PRODUCT_PROPERTY_OVERRIDES", | 
|  | ) | 
|  |  | 
|  | for key in sorted_vars: | 
|  | variables[key] = sort_lines(variables[key]) | 
|  |  | 
|  | # the original file | 
|  | original = read_file(variables["FILE"]) | 
|  |  | 
|  | # formatting | 
|  | values = dict(variables) | 
|  | values.update({ | 
|  | "variables": render_variables(variables), | 
|  | "original": render_original(variables, original), | 
|  | }) | 
|  | print """<html> | 
|  |  | 
|  |  | 
|  | <head> | 
|  | <title>%(FILE)s</title> | 
|  | <style type="text/css"> | 
|  | body { | 
|  | font-family: Helvetica, Arial, sans-serif; | 
|  | padding-bottom: 20px; | 
|  | } | 
|  | #variables { | 
|  | border-collapse: collapse; | 
|  | } | 
|  | #variables th, #variables td { | 
|  | vertical-align: top; | 
|  | text-align: left; | 
|  | border-top: 1px solid #c5cdde; | 
|  | border-bottom: 1px solid #c5cdde; | 
|  | padding: 2px 10px 2px 10px; | 
|  | } | 
|  | #variables th { | 
|  | font-size: 10pt; | 
|  | background-color: #e2ecff | 
|  | } | 
|  | #variables td { | 
|  | background-color: #ebf2ff; | 
|  | white-space: pre; | 
|  | font-size: 10pt; | 
|  | } | 
|  | #original { | 
|  | background-color: #ebf2ff; | 
|  | border-top: 1px solid #c5cdde; | 
|  | border-bottom: 1px solid #c5cdde; | 
|  | padding: 2px 10px 2px 10px; | 
|  | white-space: pre; | 
|  | font-size: 10pt; | 
|  | } | 
|  | </style> | 
|  | </head> | 
|  | <body> | 
|  | <h1>%(FILE)s</h1> | 
|  | <a href="#Original">Original</a> | 
|  | <a href="#Variables">Variables</a> | 
|  | <h2><a name="Original"></a>Original</h2> | 
|  | <div id="original">%(original)s</div> | 
|  | <h2><a name="Variables"></a>Variables</h2> | 
|  | %(variables)s | 
|  | </body> | 
|  | </html> | 
|  | """ % values | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main(sys.argv) |