122 lines
3.6 KiB
Python
122 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys, re, os
|
|
from collections import deque
|
|
from bs4 import BeautifulSoup, Tag
|
|
from jsmin import jsmin
|
|
from csscompressor import compress
|
|
|
|
IGNORED = 'gui//webui.js'
|
|
|
|
if __name__ == '__main__':
|
|
# html input param
|
|
html = sys.argv[1]
|
|
# target output param
|
|
target = sys.argv[2]
|
|
|
|
# path from html param
|
|
path = re.sub(r'[^\/]*$', '', html)
|
|
|
|
# open html file
|
|
print('📂 Open HTML file...', end=' ')
|
|
soup = BeautifulSoup(open(html), 'html.parser')
|
|
print('OK!')
|
|
|
|
# find last script as anchorpoint
|
|
lastScript = soup.findAll('script', attrs={'src': True})[-1]
|
|
# get all scripts containing src attribute (= external scripts)
|
|
scripts = soup.findAll('script', attrs={'src': True})
|
|
|
|
# find last style link as anchorpoint
|
|
lastStylesheet = soup.findAll('link', attrs={'rel': 'stylesheet'})[-1]
|
|
# get all links to css stylesheets
|
|
stylesheets = soup.findAll('link', attrs={'rel': 'stylesheet'})
|
|
|
|
# create list of script srcs
|
|
print('🔎 Create list of scripts...', end=' ')
|
|
scriptsSrc = deque()
|
|
for script in scripts:
|
|
scriptsSrc.append(path + script.attrs['src'])
|
|
print('Complete!')
|
|
|
|
# create list of stylesheets srcs
|
|
print('🔎 Create list of stylesheets...', end=' ')
|
|
stylesheetsSrc = deque()
|
|
for stylesheet in stylesheets:
|
|
stylesheetsSrc.append(path + stylesheet.attrs['href'])
|
|
print('Complete!')
|
|
|
|
# merge scripts to .temp.js
|
|
print('📥 Merge scripts...', end=' ')
|
|
with open('.temp.js', 'w') as outfileScript:
|
|
for fname in scriptsSrc:
|
|
# add space every script
|
|
if fname not in IGNORED:
|
|
outfileScript.write('\n')
|
|
with open(fname) as infile:
|
|
for line in infile:
|
|
outfileScript.write(line)
|
|
print('Complete!')
|
|
|
|
print('📥 Merge stylsheets...', end=' ')
|
|
# merge stylsheets to temp.css
|
|
with open('.temp.css', 'w') as outfileCSS:
|
|
for fname in stylesheetsSrc:
|
|
# add space every script
|
|
outfileCSS.write('\n')
|
|
with open(fname) as infile:
|
|
for line in infile:
|
|
outfileCSS.write(line)
|
|
print('Complete!')
|
|
|
|
# minify javascript
|
|
print('🗃️ Minify scripts...', end=' ')
|
|
with open('.temp.js') as js:
|
|
minified_js = jsmin(js.read())
|
|
print('Complete!')
|
|
|
|
# minify css
|
|
print('🗃️ Minify stylsheets...', end=' ')
|
|
with open('.temp.css') as css:
|
|
minified_css = compress(css.read())
|
|
print('Complete!')
|
|
|
|
# replace scripts with merged and min embed script / css
|
|
print('🔄 Embedding script and stylsheets...', end=' ')
|
|
tag = soup.new_tag('script')
|
|
tag['type'] = 'text/javascript'
|
|
tag.append(minified_js)
|
|
lastScript.replace_with(tag)
|
|
|
|
webui_tag = soup.new_tag('script')
|
|
webui_tag['type'] = 'text/javascript'
|
|
webui_tag['src'] = '/webui.js'
|
|
tag.insert_before(webui_tag)
|
|
|
|
tag = soup.new_tag('style')
|
|
tag['type'] = 'text/css'
|
|
tag.append(minified_css)
|
|
lastStylesheet.replace_with(tag)
|
|
print('Complete!')
|
|
|
|
# remove script and style tags
|
|
print('🧹 Cleaning...', end=' ')
|
|
for script in scripts:
|
|
script.decompose()
|
|
for stylesheet in stylesheets:
|
|
stylesheet.decompose()
|
|
|
|
# remove temp files
|
|
os.remove('.temp.js')
|
|
os.remove('.temp.css')
|
|
print('Complete!')
|
|
|
|
# save html as target
|
|
print('💾 Save builded document...', end=' ')
|
|
file = open(target, 'w')
|
|
file.write(soup.prettify())
|
|
file.close()
|
|
print('Complete!', end='\n\n')
|
|
|
|
print('🏁 Complete')
|