A copyright violation detector running on Wikimedia Cloud Services https://tools.wmflabs.org/copyvios/
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 

165 řádky
5.3 KiB

  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import logging
  4. import os
  5. import shutil
  6. import subprocess
  7. page_src = """#! /usr/bin/env python
  8. # -*- coding: utf-8 -*-
  9. import os
  10. import sys
  11. os.chdir("..")
  12. sys.path.insert(0, ".")
  13. from mako.template import Template
  14. from mako.lookup import TemplateLookup
  15. def main(environ, start_response):
  16. lookup = TemplateLookup(directories=["{{pages_dir}}"],
  17. input_encoding="utf8")
  18. template = Template(filename="{{src}}", module_directory="{{temp_dir}}",
  19. lookup=lookup, format_exceptions=True)
  20. headers = [("Content-Type", "text/html")]
  21. page = template.render(environ=environ, headers=headers).encode("utf8")
  22. start_response("200 OK", headers)
  23. return [page]
  24. if __name__ == "__main__":
  25. from flup.server.fcgi import WSGIServer
  26. WSGIServer(main).run()
  27. """
  28. rewrite_script_src = """match URL into $ with ^/~earwig/{0}(\?.*?)?$
  29. if matched then
  30. set URL = /~earwig/rewrite/{0}.fcgi$1
  31. goto END
  32. endif
  33. """
  34. class Builder(object):
  35. def __init__(self):
  36. self.build_dir = "www"
  37. self.static_dir = "static"
  38. self.pages_dir = "pages"
  39. self.support_dir = "pages/support"
  40. self.temp_dir = "temp"
  41. self.rs_file = "rewrite.script"
  42. self.root = logging.getLogger("builder")
  43. self.root.addHandler(logging.NullHandler())
  44. self._pages = []
  45. def _enable_logging(self):
  46. handler = logging.StreamHandler()
  47. handler.setFormatter(_LogFormatter())
  48. self.root.addHandler(handler)
  49. self.root.setLevel(logging.DEBUG)
  50. def _gen_page(self, page, base):
  51. if not page.endswith(".mako"):
  52. base.warn("Skipping {0} (not endswith('.mako'))".format(page))
  53. return
  54. logger = base.getChild(page.rsplit(".", 1)[0])
  55. self._pages.append(page.rsplit(".", 1)[0])
  56. src = os.path.join(self.pages_dir, page)
  57. dest = os.path.join(self.build_dir, page.replace(".mako", ".fcgi"))
  58. logger.debug("build {0} -> {1}".format(src, dest))
  59. content = page_src.replace("{{src}}", src)
  60. content = content.replace("{{pages_dir}}", self.pages_dir)
  61. content = content.replace("{{temp_dir}}", self.temp_dir)
  62. with open(dest, "w") as fp:
  63. fp.write(content)
  64. logger.debug("chmod 0755 {0}".format(dest))
  65. os.chmod(dest, 0755)
  66. def clean(self):
  67. logger = self.root.getChild("clean")
  68. targets = (self.build_dir, self.temp_dir)
  69. for target in targets:
  70. if os.path.exists(target):
  71. logger.debug("rm -r {0}".format(target))
  72. shutil.rmtree(target)
  73. logger.debug("mkdir {0}".format(target))
  74. os.mkdir(target)
  75. def gen_static(self):
  76. logger = self.root.getChild("static")
  77. dest = os.path.join(self.build_dir, "static")
  78. logger.debug("copytree {0} -> {1}".format(self.static_dir, dest))
  79. shutil.copytree(self.static_dir, dest)
  80. for dirpath, dirnames, filenames in os.walk(dest):
  81. for filename in filenames:
  82. if filename.endswith(".js"):
  83. name = os.path.join(dirpath, filename)
  84. logger.debug("uglifyjs {0}".format(name))
  85. uglified = subprocess.check_output(["uglifyjs", name])
  86. os.remove(name)
  87. with open(name, "w") as fp:
  88. fp.write(uglified)
  89. def gen_pages(self):
  90. logger = self.root.getChild("pages")
  91. pages = os.listdir(self.pages_dir)
  92. for page in pages:
  93. if not os.path.isfile(os.path.join(self.pages_dir, page)):
  94. continue
  95. self._gen_page(page, logger)
  96. def gen_zws(self):
  97. logger = self.root.getChild("zws")
  98. target = self.rs_file
  99. if os.path.exists(target):
  100. logger.debug("rm {0}".format(target))
  101. os.remove(target)
  102. logger.debug("build rewrite.script")
  103. with open(target, "w") as fp:
  104. for page in self._pages:
  105. fp.write(rewrite_script_src.format(page))
  106. def build(self):
  107. self._enable_logging()
  108. self.root.info("Building project...")
  109. self.clean()
  110. self.gen_static()
  111. self.gen_pages()
  112. self.gen_zws()
  113. self.root.info("Done!")
  114. class _LogFormatter(logging.Formatter):
  115. def __init__(self):
  116. fmt = "[%(asctime)s %(lvl)s] %(name)s: %(message)s"
  117. datefmt = "%Y-%m-%d %H:%M:%S"
  118. _format = super(_LogFormatter, self).format
  119. self.format = lambda record: _format(self.colorize(record))
  120. super(_LogFormatter, self).__init__(fmt=fmt, datefmt=datefmt)
  121. def colorize(self, record):
  122. l = record.levelname.ljust(8)
  123. if record.levelno == logging.DEBUG:
  124. record.lvl = l.join(("\x1b[34m", "\x1b[0m")) # Blue
  125. if record.levelno == logging.INFO:
  126. record.lvl = l.join(("\x1b[32m", "\x1b[0m")) # Green
  127. if record.levelno == logging.WARNING:
  128. record.lvl = l.join(("\x1b[33m", "\x1b[0m")) # Yellow
  129. if record.levelno == logging.ERROR:
  130. record.lvl = l.join(("\x1b[31m", "\x1b[0m")) # Red
  131. if record.levelno == logging.CRITICAL:
  132. record.lvl = l.join(("\x1b[1m\x1b[31m", "\x1b[0m")) # Bold red
  133. return record
  134. if __name__ == "__main__":
  135. Builder().build()