2014-07-10 13:56:38 +00:00
|
|
|
#!/usr/bin/env python
|
2014-09-22 21:15:33 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
#
|
|
|
|
# Copyright (C) 2014 Calum Lind <calumlind@gmail.com>
|
|
|
|
# Copyright (C) 2010 Damien Churchill <damoxc@gmail.com>
|
|
|
|
#
|
|
|
|
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
|
|
|
# the additional special exception to link portions of this program with the OpenSSL library.
|
|
|
|
# See LICENSE for more details.
|
|
|
|
#
|
|
|
|
|
2015-08-22 13:23:30 +00:00
|
|
|
"""Minifies the WebUI JS files.
|
2015-08-13 23:03:16 +00:00
|
|
|
|
|
|
|
Usage: python minify_web_js.py deluge/ui/web/js/deluge-all
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
2015-10-23 23:58:14 +00:00
|
|
|
from __future__ import print_function
|
|
|
|
|
2014-07-10 13:56:38 +00:00
|
|
|
import fileinput
|
|
|
|
import fnmatch
|
2014-09-03 23:27:11 +00:00
|
|
|
import os
|
2016-11-27 21:36:10 +00:00
|
|
|
import subprocess
|
2014-09-03 23:27:11 +00:00
|
|
|
import sys
|
|
|
|
|
2015-08-22 13:23:30 +00:00
|
|
|
|
|
|
|
def module_exists(module_name):
|
|
|
|
try:
|
|
|
|
__import__(module_name)
|
|
|
|
except ImportError:
|
|
|
|
return False
|
2015-08-09 17:31:28 +00:00
|
|
|
else:
|
2015-08-22 13:23:30 +00:00
|
|
|
return True
|
|
|
|
|
2016-11-16 22:18:18 +00:00
|
|
|
|
2015-08-25 15:18:02 +00:00
|
|
|
# Imports sorted by resulting file size.
|
|
|
|
if module_exists('closure'):
|
|
|
|
def minify_closure(file_in, file_out):
|
2016-05-19 13:12:14 +00:00
|
|
|
try:
|
|
|
|
subprocess.check_call(['closure', '-W', 'QUIET',
|
|
|
|
'--js', file_in, '--js_output_file', file_out])
|
|
|
|
return True
|
|
|
|
except subprocess.CalledProcessError:
|
|
|
|
return False
|
2016-11-27 21:36:10 +00:00
|
|
|
elif module_exists('sslimit'):
|
2015-08-22 13:23:30 +00:00
|
|
|
from slimit import minify
|
|
|
|
else:
|
2016-11-27 21:36:10 +00:00
|
|
|
raise ImportError('Requires "slimit" package for minifying WebUI files.')
|
2015-08-22 13:23:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
def source_files_list(source_dir):
|
2015-09-04 13:55:47 +00:00
|
|
|
scripts = []
|
2015-08-22 13:23:30 +00:00
|
|
|
for root, dirnames, filenames in os.walk(source_dir):
|
|
|
|
dirnames.sort(reverse=True)
|
2015-09-04 13:55:47 +00:00
|
|
|
files = fnmatch.filter(filenames, '*.js')
|
|
|
|
files.sort()
|
2015-08-22 13:23:30 +00:00
|
|
|
|
|
|
|
order_file = os.path.join(root, '.order')
|
|
|
|
if os.path.isfile(order_file):
|
|
|
|
with open(order_file, 'r') as _file:
|
|
|
|
for line in _file:
|
2015-09-04 13:55:47 +00:00
|
|
|
if line.startswith('+ '):
|
|
|
|
order_filename = line.split()[1]
|
|
|
|
files.pop(files.index(order_filename))
|
|
|
|
files.insert(0, order_filename)
|
2015-08-22 13:23:30 +00:00
|
|
|
|
|
|
|
# Ensure root directory files are bottom of list.
|
|
|
|
if dirnames:
|
2015-09-04 13:55:47 +00:00
|
|
|
scripts.extend([os.path.join(root, f) for f in files])
|
2015-08-22 13:23:30 +00:00
|
|
|
else:
|
2015-09-04 13:55:47 +00:00
|
|
|
for filename in reversed(files):
|
|
|
|
scripts.insert(0, os.path.join(root, filename))
|
|
|
|
return scripts
|
2014-07-10 13:56:38 +00:00
|
|
|
|
|
|
|
|
2015-08-22 13:23:30 +00:00
|
|
|
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):
|
2015-08-25 15:18:02 +00:00
|
|
|
try:
|
2016-05-19 13:12:14 +00:00
|
|
|
return minify_closure(file_debug, file_minified)
|
2015-08-25 15:18:02 +00:00
|
|
|
except NameError:
|
|
|
|
with open(file_minified, 'w') as file_out:
|
|
|
|
with open(file_debug, 'r') as file_in:
|
|
|
|
file_out.write(minify(file_in.read()))
|
2016-05-19 13:12:14 +00:00
|
|
|
return True
|
2015-08-22 13:23:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
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:
|
2015-08-25 12:20:14 +00:00
|
|
|
print('No js files found, skipping %s' % source_dir)
|
2015-08-22 13:23:30 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
concat_src_files(source_files, file_debug_js)
|
2016-11-27 21:36:10 +00:00
|
|
|
print('Minifying %s' % source_dir)
|
|
|
|
if not minify_file(file_debug_js, file_minified_js):
|
2016-05-19 13:12:14 +00:00
|
|
|
print('Error minifying %s' % source_dir)
|
2015-08-22 13:23:30 +00:00
|
|
|
|
2016-11-16 22:18:18 +00:00
|
|
|
|
2015-08-22 13:23:30 +00:00
|
|
|
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])]
|
2014-07-10 13:56:38 +00:00
|
|
|
|
2015-10-23 23:58:14 +00:00
|
|
|
for js_source_dir in JS_SOURCE_DIRS:
|
|
|
|
minify_js_dir(js_source_dir)
|