feat: build the Russian responsive web interface
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
Import("env")
|
||||
|
||||
import gzip
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ROOT = Path(env.subst("$PROJECT_DIR"))
|
||||
DATA = ROOT / "data"
|
||||
ASSETS = ("index.html", "styles.css", "app.js")
|
||||
|
||||
|
||||
def minify_html(source):
|
||||
return re.sub(r">\s+<", "><", source).strip()
|
||||
|
||||
|
||||
def minify_css(source):
|
||||
source = re.sub(r"/\*.*?\*/", "", source, flags=re.S)
|
||||
return re.sub(r"\s*([{}:;,>])\s*", r"\1", source).strip()
|
||||
|
||||
|
||||
def minify_js(source):
|
||||
output = []
|
||||
quote = ""
|
||||
escaped = False
|
||||
pending_space = False
|
||||
for character in source:
|
||||
if quote:
|
||||
output.append(character)
|
||||
if escaped:
|
||||
escaped = False
|
||||
elif character == "\\":
|
||||
escaped = True
|
||||
elif character == quote:
|
||||
quote = ""
|
||||
continue
|
||||
if character in ("'", '"', "`"):
|
||||
if pending_space and output and (output[-1].isalnum() or output[-1] in "_$"):
|
||||
output.append(" ")
|
||||
pending_space = False
|
||||
quote = character
|
||||
output.append(character)
|
||||
elif character.isspace():
|
||||
pending_space = True
|
||||
else:
|
||||
if pending_space and output and (output[-1].isalnum() or output[-1] in "_$") and (character.isalnum() or character in "_$"):
|
||||
output.append(" ")
|
||||
pending_space = False
|
||||
output.append(character)
|
||||
return "".join(output)
|
||||
|
||||
|
||||
def compress_assets():
|
||||
for asset in ASSETS:
|
||||
path = DATA / asset
|
||||
text = path.read_text(encoding="utf-8")
|
||||
if asset.endswith(".html"):
|
||||
text = minify_html(text)
|
||||
elif asset.endswith(".css"):
|
||||
text = minify_css(text)
|
||||
else:
|
||||
text = minify_js(text)
|
||||
(DATA / f"{asset}.gz").write_bytes(gzip.compress(text.encode("utf-8"), mtime=0))
|
||||
|
||||
|
||||
compress_assets()
|
||||
Reference in New Issue
Block a user