text: 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)
  