[WebUI] Improve the minify script

This commit is contained in:
Calum Lind 2015-08-22 14:23:30 +01:00
commit d7029dcfc6
3 changed files with 1086 additions and 1227 deletions

View file

@ -9,7 +9,7 @@
# See LICENSE for more details.
#
"""Minifies the Webui JS files.
"""Minifies the WebUI JS files.
Usage: python minify_web_js.py deluge/ui/web/js/deluge-all
@ -20,55 +20,90 @@ import fnmatch
import os
import sys
from slimit import minify
if len(sys.argv) != 2:
print 'Specify a source js directory, e.g. deluge/ui/web/js/deluge-all'
sys.exit(1)
SOURCE_DIR = os.path.abspath(sys.argv[1])
BUILD_NAME = os.path.basename(SOURCE_DIR)
BUILD_DIR = os.path.dirname(SOURCE_DIR)
SRC_FILE_LIST = []
for root, dirnames, filenames in os.walk(SOURCE_DIR):
dirnames.sort(reverse=True)
filenames_js = fnmatch.filter(filenames, '*.js')
filenames_js.sort()
order_file = os.path.join(root, '.order')
if os.path.isfile(order_file):
with open(order_file, 'r') as _file:
for line in _file:
line = line.strip()
if not line or line[0] == '#':
continue
order_pos, order_filename = line.split()
filenames_js.pop(filenames_js.index(order_filename))
if order_pos == '+':
filenames_js.insert(0, order_filename)
# Ensure root directory files are bottom of list.
if dirnames:
for filename in filenames_js:
SRC_FILE_LIST.append(os.path.join(root, filename))
def module_exists(module_name):
try:
__import__(module_name)
except ImportError:
return False
else:
for filename in reversed(filenames_js):
SRC_FILE_LIST.insert(0, os.path.join(root, filename))
return True
if not SRC_FILE_LIST:
print 'No js files found'
sys.exit(1)
# slimit creates smallest file size
if module_exists('slimit'):
from slimit import minify
elif module_exists('jsmin'):
from jsmin import jsmin as minify
elif module_exists('rjsmin'):
from rjsmin import jsmin as minify
else:
raise ImportError('Minifying WebUI JS requires slimit, jsmin or rjsmin')
print 'Minifying %s ...' % BUILD_NAME
# Create the unminified debug file.
file_debug_js = os.path.join(BUILD_DIR, BUILD_NAME + '-debug.js')
with open(file_debug_js, 'w') as _file:
input_lines = fileinput.input(SRC_FILE_LIST)
_file.writelines(input_lines)
def source_files_list(source_dir):
file_minified_js = os.path.join(BUILD_DIR, BUILD_NAME + '.js')
with open(file_minified_js, 'w') as file_out:
with open(file_debug_js, 'r') as file_in:
file_out.write(minify(file_in.read()))
src_file_list = []
for root, dirnames, filenames in os.walk(source_dir):
dirnames.sort(reverse=True)
filenames_js = fnmatch.filter(filenames, '*.js')
filenames_js.sort()
order_file = os.path.join(root, '.order')
if os.path.isfile(order_file):
with open(order_file, 'r') as _file:
for line in _file:
line = line.strip()
if not line or line[0] == '#':
continue
order_pos, order_filename = line.split()
filenames_js.pop(filenames_js.index(order_filename))
if order_pos == '+':
filenames_js.insert(0, order_filename)
# Ensure root directory files are bottom of list.
if dirnames:
for filename in filenames_js:
src_file_list.append(os.path.join(root, filename))
else:
for filename in reversed(filenames_js):
src_file_list.insert(0, os.path.join(root, filename))
return src_file_list
def concat_src_files(file_list, fileout_path):
with open(fileout_path, 'w') as file_out:
file_in = fileinput.input(file_list)
file_out.writelines(file_in)
def minify_file(file_debug, file_minified):
with open(file_minified, 'w') as file_out:
with open(file_debug, 'r') as file_in:
file_out.write(minify(file_in.read()))
def minify_js_dir(source_dir):
build_name = os.path.basename(source_dir)
build_dir = os.path.dirname(source_dir)
file_debug_js = os.path.join(build_dir, build_name + '-debug.js')
file_minified_js = os.path.join(build_dir, build_name + '.js')
source_files = source_files_list(source_dir)
if not source_files:
print 'No js files found, skipping %s' % source_dir
return
concat_src_files(source_files, file_debug_js)
minify_file(file_debug_js, file_minified_js)
print 'Minified %s' % source_dir
if __name__ == '__main__':
if len(sys.argv) != 2:
JS_SOURCE_DIRS = ['deluge/ui/web/js/deluge-all', 'deluge/ui/web/js/extjs/ext-extensions']
else:
JS_SOURCE_DIRS = [os.path.abspath(sys.argv[1])]
for source_dir in JS_SOURCE_DIRS:
minify_js_dir(source_dir)