-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuildutil.py
95 lines (81 loc) · 3.23 KB
/
buildutil.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from __future__ import with_statement
from builderror import BuildError
import base64
import hashlib
import os
import re
htmlEscapeTable = {
"&": "&",
'"': """,
"'": "'",
">": ">",
"<": "<"
}
""" Produce entities within text. """
def htmlEscape(text):
return "".join(htmlEscapeTable.get(c, c) for c in text)
""" Escapes a string so that it is safe to embed in a single-quoted JavaScript
string. """
def jsStringEscape(text, stripNewLines = False):
return text.replace("\\", "\\\\").replace("'", "\\'").replace("\n", "" if stripNewLines else "\\n")
extensionToMimeTypeMap = {
"css": "text/css",
"gif": "image/gif",
"ico": "image/x-icon",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"js": "text/javascript",
"png": "image/png",
"svg": "image/svg+xml"
}
""" Returns the MIME type for some specific extension """
def mimeTypeForExtension(extension):
if extension[0] == ".":
extension = extension[1:]
extension = extension.lower()
if extension in extensionToMimeTypeMap:
return extensionToMimeTypeMap[extension]
else:
raise BuildError("Cannot determine MIME type for extension %s" % extension)
""" Yields all non-hidden entries in some directory. """
def dirEntries(path):
if not os.path.exists(path):
return
for entry in sorted(os.listdir(path)):
if entry[0] == ".":
continue
yield entry
""" Encodes the image stored at the given path using base64 encoding. """
def base64EncodeImage(path):
(baseName, extension) = os.path.splitext(path)
with open(path) as f:
b64Image = "data:%s;base64,%s" % (mimeTypeForExtension(extension), base64.b64encode(f.read()))
return b64Image
""" Returns a 12 byte hash for the given content. """
def getContentHash(content):
if isinstance(content, unicode):
return hashlib.md5(content.encode("utf-8")).hexdigest()[:12]
else:
return hashlib.md5(content).hexdigest()[:12]
""" Returns the proper output file name for a file, given the module name, base
name, file content, locale and extension. """
fileNamePattern = "{moduleName}{.baseName}{.md5}{.locale}{.extension}"
def getDestinationFileName(moduleName, baseName, content, locale, extension, pattern = ""):
global fileNamePattern
if pattern == "":
pattern = fileNamePattern
def replacePlaceholder(pattern, placeholderName, replacement):
for match in re.finditer(r"\{(.?)" + placeholderName + r"(.?)\}", pattern):
fullMatch = match.group(0)
prefix = match.group(1)
postfix = match.group(2)
fullReplacement = prefix + replacement + postfix if replacement else ""
pattern = pattern.replace(fullMatch, fullReplacement)
return pattern
fileName = pattern
fileName = replacePlaceholder(fileName, "moduleName", moduleName)
fileName = replacePlaceholder(fileName, "baseName", baseName)
fileName = replacePlaceholder(fileName, "md5", getContentHash(content) if content else "")
fileName = replacePlaceholder(fileName, "locale", locale if locale != "*" else "")
fileName = replacePlaceholder(fileName, "extension", extension[1:] if extension.startswith(".") else extension)
return fileName