blob: 579e783f7e05f507790c8a124585d9427281eab6 [file] [log] [blame]
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)