Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
e06d35797This file is pinned to the selected release. Download the original to open it in your design tool.
import os
import shutil
import minify_html
from rjsmin import jsmin
class Minify:
def __init__(self, work_dir, raw_directory, min_directory):
self.work_dir = work_dir
self.raw_directory = raw_directory
self.min_directory = min_directory
self._bytes_saved = { 'html': 0, 'js': 0, 'css': 0 }
print(f"Working directory: {self.work_dir}")
print(f"Source directory: {self.raw_directory}")
print(f"Data directory: {self.min_directory}")
def run(self):
print("--- Running minifier ---")
self._copy_source()
minify_files = self._find_minify_candidates(self.min_directory)
for file in minify_files:
self._minify(file)
print("---")
def show_stats(self, key=None):
if key is not None:
print(f"Saved {self._bytes_saved[key]} bytes by minifying `.{key}` files")
else:
total = 0
for key in self._bytes_saved:
print(f"Saved {self._bytes_saved[key]} bytes by minifying `.{key}` files")
total = total + self._bytes_saved[key]
print(f"Total {total} bytes saved")
def _find_minify_candidates(self, folder):
minify_candidates = []
for root, dirs, files in os.walk(folder):
for file in files:
if file.lower().endswith(('.htm', '.html', '.js', '.css')):
minify_candidates.append(os.path.join(root, file))
return minify_candidates
def _update_saved_count(self, category, amount):
self._bytes_saved[category] = self._bytes_saved[category] + amount
def _minify(self, file):
if file.lower().endswith(('.html', '.htm')):
content = self._read_file(file)
content_minified = self._min_html(content)
print(f" -> Minified {file} [saved {len(content)-len(content_minified)} bytes]")
self._write_file(file, content_minified)
elif file.lower().endswith('.js'):
content = self._read_file(file)
content_minified = self._min_js(content)
self._write_file(file, content_minified)
print(f" -> Minified {file} [saved {len(content)-len(content_minified)} bytes]")
else:
print(f" -> No minifier available for file {file}")
def _min_html(self, content):
size_pre = len(content)
content = minify_html.minify(content, minify_js=True, remove_processing_instructions=True)
size_after = len(content)
self._update_saved_count('html', size_pre-size_after)
return content
def _min_js(self, content):
size_pre = len(content)
content = jsmin(content)
size_after = len(content)
self._update_saved_count('js', size_pre-size_after)
return content
def _copy_source(self):
shutil.copytree(self.raw_directory, self.min_directory, dirs_exist_ok=True)
def _read_file(self, file):
with open(file, mode="r", encoding="utf-8") as f:
content = f.read()
return content
def _write_file(self, file, content):
with open(file, mode="w", encoding="utf-8") as f:
f.write(content)
def _list_dir(self, filetype):
filtered = []
files = os.listdir(self.min_directory)
for file in files:
if file.endswith(f'.{filetype}'):
filepath = os.path.join(self.min_directory, file)
filtered.append(filepath)
return filtered
def minify(source, target, env):
# work_dir = os.path.dirname(os.path.abspath(__file__))
work_dir = os.getcwd()
raw_directory = os.path.join(work_dir, 'data_pre')
min_directory = os.path.join(work_dir, 'data')
print("-- Removing previous data directory")
shutil.rmtree(min_directory, ignore_errors=True)
print("-- Running data minify script")
mc = Minify(work_dir, raw_directory, min_directory)
mc.run()
mc.show_stats()
Import("env")
minify(None, None, None)