From 016adadd3e5e9784bf1fc0e9b1e0acb58f4d710d Mon Sep 17 00:00:00 2001 From: chylex Date: Sat, 18 Apr 2020 19:23:55 +0200 Subject: [PATCH] Replace YUI with custom CSS minifier --- README.md | 6 +---- build.py | 60 ++++++++++++++++++++++++++++++----------- src/renderer/index.html | 1 - 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index bf30833..35646bd 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,6 @@ Now you can modify the source code: After you've done changes to the source code, you will need to build it. Before that, download and install: * (**required**) [Python 3](https://www.python.org/downloads) * Use to run the build script -* (optional) [Java 7+](https://www.java.com/inc/BrowserRedirect1.jsp) / [OpenJDK 7+](http://openjdk.java.net/install/index.html) - * Only required for optional [CSS minification](#Minification) * (optional) [Node + npm](https://nodejs.org/en) & command line [uglify-es](https://www.npmjs.com/package/uglify-es) * Not required on Windows * Only required for optional [JS minification](#Minification) on Linux/Mac @@ -41,11 +39,9 @@ You can tweak the build process using the following flags: ### Minification -The build process automatically minifies the CSS using `YUI Compressor` and JS files using `UglifyJS@3`. +The build process automatically minifies JS using `UglifyJS@3`, and CSS using a custom minifier. * If the `--nominify` flag is used, minification will be completely disabled -* If Java is not available from the command line, CSS minification will be skipped - * You can check whether you have installed Java correctly by running `java -version` in the command line, and making sure the version is `1.7.xyz` or higher * If `uglify-es` is not available from the command line, JS minification will be skipped * When building on Windows 64-bit, the build script will use the included Node runner and packages * When building on Windows 32-bit, you will need to download [Node 32-bit](https://nodejs.org/en/download) and replace the included one in `lib/` diff --git a/build.py b/build.py index e1cb09d..a853e48 100644 --- a/build.py +++ b/build.py @@ -5,6 +5,7 @@ import glob import shutil import sys import os +import re import distutils.dir_util @@ -14,20 +15,16 @@ VERSION_FULL = VERSION_SHORT + ", released 18 Apr 2020" EXEC_UGLIFYJS_WIN = "{2}/lib/uglifyjs.cmd --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\"" EXEC_UGLIFYJS_AUTO = "uglifyjs --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\"" -EXEC_YUI = "java -jar lib/yuicompressor-2.4.8.jar --charset utf-8 --line-break 160 --type css -o \"{1}\" \"{0}\"" USE_UGLIFYJS = "--nominify" not in sys.argv -USE_JAVA = "--nominify" not in sys.argv +USE_MINIFICATION = "--nominify" not in sys.argv BUILD_WEBSITE = "--website" in sys.argv CLIPBOARD_TRACKER = "--copytracker" in sys.argv WORKING_DIR = os.getcwd() -if USE_JAVA and shutil.which("java") is None: - USE_JAVA = False - print("Could not find 'java', CSS minification will be disabled") - +# UglifyJS Setup if os.name == "nt": EXEC_UGLIFYJS = EXEC_UGLIFYJS_WIN @@ -39,16 +36,51 @@ else: print("Could not find 'uglifyjs', JS minification will be disabled") -with open("reserve.txt", "r") as reserved: - RESERVED_PROPS = ",".join(line.strip() for line in reserved.readlines()) +if USE_UGLIFYJS: + with open("reserve.txt", "r") as reserved: + RESERVED_PROPS = ",".join(line.strip() for line in reserved.readlines()) +# File Utilities + def combine_files(input_pattern, output_file): + is_first_file = True + with fileinput.input(sorted(glob.glob(input_pattern))) as stream: for line in stream: + if stream.isfirstline(): + if is_first_file: + is_first_file = False + else: + output_file.write("\n") + output_file.write(line.replace("{{{version:full}}}", VERSION_FULL)) +def minify_css(input_file, output_file): + if not USE_MINIFICATION: + if input_file != output_file: + shutil.copyfile(input_file, output_file) + + return + + with open(input_file, "r") as fin: + css = fin.read() + + css = re.sub(r"^\s+(.+?):\s*(.+?)(?:\s*(!important))?;\n", r"\1:\2\3;", css, flags = re.M) # remove spaces after colons + css = re.sub(r"\{\n", r"{", css, flags = re.M) # remove new lines after { + css = re.sub(r"\n\}", r"}", css, flags = re.M) # remove new lines before } + css = re.sub(r"\n\n", r"\n", css, flags = re.M) # remove empty lines + css = re.sub(r";\}$", r"}", css, flags = re.M) # remove last semicolons + css = re.sub(r"rgb\((.*?),\s*(.*?),\s*(.*?)\)", r"rgb(\1,\2,\3)", css, flags = re.M) # remove spaces after commas in rgb() + css = re.sub(r"rgba\((.*?),\s*(.*?),\s*(.*?),\s*(.*?)\)", r"rgba(\1,\2,\3,\4)", css, flags = re.M) # remove spaces after commas in rgba() + + with open(output_file, "w") as out: + out.write(css) + + +# Build System + def build_tracker_html(): output_file_raw = "bld/track.js" output_file_html = "bld/track.html" @@ -111,11 +143,7 @@ def build_renderer(): with open(tmp_css_file_combined, "w") as out: combine_files(input_css_pattern, out) - if USE_JAVA: - os.system(EXEC_YUI.format(tmp_css_file_combined, tmp_css_file_minified)) - else: - shutil.copyfile(tmp_css_file_combined, tmp_css_file_minified) - + minify_css(tmp_css_file_combined, tmp_css_file_minified) os.remove(tmp_css_file_combined) input_js_pattern = "src/renderer/*.js" @@ -172,11 +200,11 @@ def build_website(): shutil.copyfile(tracker_file_html, "bld/web/build/track.html") shutil.copyfile(tracker_file_userscript, "bld/web/build/track.user.js") shutil.copyfile(viewer_file, "bld/web/build/viewer.html") - - if USE_JAVA: - os.system(EXEC_YUI.format(web_style_file, web_style_file)) + minify_css(web_style_file, web_style_file) +# Build Process + os.makedirs("bld", exist_ok = True) print("Building tracker html...") diff --git a/src/renderer/index.html b/src/renderer/index.html index c31d18d..307f4f5 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -7,7 +7,6 @@ -