| import json |
| import os |
| import re |
| |
| polymerRegex = r"Polymer\({" |
| polymerCompiledRegex = re.compile(polymerRegex) |
| |
| removeSelfInvokeRegex = r"\(function\(\) {\n(.+)}\)\(\);" |
| fnCompiledRegex = re.compile(removeSelfInvokeRegex, re.DOTALL) |
| |
| regexBehavior = r"<script>(.+)<\/script>" |
| behaviorCompiledRegex = re.compile(regexBehavior, re.DOTALL) |
| |
| |
| def _open(filename, mode="r"): |
| try: |
| return open(filename, mode, encoding="utf-8") |
| except TypeError: |
| return open(filename, mode) |
| |
| |
| def replaceBehaviorLikeHTML(fileIn, fileOut): |
| with _open(fileIn) as f: |
| file_str = f.read() |
| match = behaviorCompiledRegex.search(file_str) |
| if match: |
| with _open("polygerrit-ui/temp/behaviors/" + |
| fileOut.replace("html", "js"), "w+") as f: |
| f.write(match.group(1)) |
| |
| |
| def replaceBehaviorLikeJS(fileIn, fileOut): |
| with _open(fileIn) as f: |
| file_str = f.read() |
| with _open("polygerrit-ui/temp/behaviors/" + fileOut, "w+") as f: |
| f.write(file_str) |
| |
| |
| def generateStubBehavior(behaviorName): |
| with _open("polygerrit-ui/temp/behaviors/" + |
| behaviorName + ".js", "w+") as f: |
| f.write("/** @polymerBehavior **/\n" + behaviorName + "= {};") |
| |
| |
| def replacePolymerElement(fileIn, fileOut, root): |
| with _open(fileIn) as f: |
| key = fileOut.split('.')[0] |
| # Removed self invoked function |
| file_str = f.read() |
| file_str_no_fn = fnCompiledRegex.search(file_str) |
| |
| if file_str_no_fn: |
| package = root.replace("/", ".") + "." + fileOut |
| |
| with _open("polygerrit-ui/temp/" + fileOut, "w+") as f: |
| mainFileContents = re.sub( |
| polymerCompiledRegex, |
| "exports = Polymer({", |
| file_str_no_fn.group(1)).replace("'use strict';", "") |
| f.write("/** \n" |
| "* @fileoverview \n" |
| "* @suppress {missingProperties} \n" |
| "*/ \n\n" |
| "goog.module('polygerrit." + package + "')\n\n" + |
| mainFileContents) |
| |
| # Add package and javascript to files object. |
| elements[key]["js"] = "polygerrit-ui/temp/" + fileOut |
| elements[key]["package"] = package |
| |
| |
| def writeTempFile(file, root): |
| # This is included in an extern because it is directly on the window object |
| # (for now at least). |
| if "gr-reporting" in file: |
| return |
| key = file.split('.')[0] |
| if key not in elements: |
| # gr-app doesn't have an additional level |
| elements[key] = { |
| "directory": |
| 'gr-app' if len(root.split("/")) < 4 else root.split("/")[3] |
| } |
| if file.endswith(".html") and not file.endswith("_test.html"): |
| # gr-navigation is treated like a behavior rather than a standard |
| # element because of the way it added to the Gerrit object. |
| if file.endswith("gr-navigation.html"): |
| replaceBehaviorLikeHTML(os.path.join(root, file), file) |
| else: |
| elements[key]["html"] = os.path.join(root, file) |
| if file.endswith(".js"): |
| replacePolymerElement(os.path.join(root, file), file, root) |
| |
| |
| if __name__ == "__main__": |
| # Create temp directory. |
| if not os.path.exists("polygerrit-ui/temp"): |
| os.makedirs("polygerrit-ui/temp") |
| |
| # Within temp directory create behavior directory. |
| if not os.path.exists("polygerrit-ui/temp/behaviors"): |
| os.makedirs("polygerrit-ui/temp/behaviors") |
| |
| elements = {} |
| |
| # Go through every file in app/elements, and re-write accordingly to temp |
| # directory, and also added to elements object, which is used to generate a |
| # map of html files, package names, and javascript files. |
| for root, dirs, files in os.walk("polygerrit-ui/app/elements"): |
| for file in files: |
| writeTempFile(file, root) |
| |
| # Special case for polymer behaviors we are using. |
| replaceBehaviorLikeHTML("polygerrit-ui/app/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html", "iron-a11y-keys-behavior.html") |
| generateStubBehavior("Polymer.IronOverlayBehavior") |
| generateStubBehavior("Polymer.IronFitBehavior") |
| |
| # TODO figure out something to do with iron-overlay-behavior. |
| # it is hard-coded reformatted. |
| |
| with _open("polygerrit-ui/temp/map.json", "w+") as f: |
| f.write(json.dumps(elements)) |
| |
| for root, dirs, files in os.walk("polygerrit-ui/app/behaviors"): |
| for file in files: |
| if file.endswith("behavior.html"): |
| replaceBehaviorLikeHTML(os.path.join(root, file), file) |
| elif file.endswith("behavior.js"): |
| replaceBehaviorLikeJS(os.path.join(root, file), file) |