1
0
mirror of https://github.com/gorhill/uBlock.git synced 2024-11-24 19:33:01 +01:00
uBlock/tools/import-war.py
Raymond Hill d9161aeffa
fix #3636
2018-03-23 15:03:29 -04:00

93 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python3
import base64
import hashlib
import os
import re
import sys
if len(sys.argv) == 1 or not sys.argv[1]:
raise SystemExit('Build dir missing.')
# resource_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], '..')
build_dir = os.path.abspath(sys.argv[1])
# Read list of resource tokens to convert
to_import = set()
with open('./src/web_accessible_resources/to-import.txt', 'r') as f:
for line in f:
line = line.strip()
if len(line) != 0 and line[0] != '#':
to_import.add(line)
# https://github.com/gorhill/uBlock/issues/3636
safe_exts = { 'javascript': 'js' }
imported = []
# scan the file until a resource to import is found
def find_next_resource(f):
for line in f:
line = line.strip()
if len(line) == 0 or line[0] == '#':
continue
parts = line.partition(' ')
if parts[0] in to_import:
return (parts[0], parts[2].strip())
return ('', '')
def safe_filename_from_token(token, mime):
h = hashlib.md5()
h.update(bytes(token, 'utf-8'))
name = h.hexdigest()
# extract file extension from mime
match = re.search('^[^/]+/([^\s;]+)', mime)
if match:
ext = match.group(1)
if ext in safe_exts:
ext = safe_exts[ext]
name += '.' + ext
return name
def import_resource(f, token, mime):
isBinary = mime.endswith(';base64')
lines = []
for line in f:
if line.strip() == '':
break
if line.lstrip()[0] == '#':
continue
if isBinary:
line = line.strip()
lines.append(line)
filename = safe_filename_from_token(token, mime)
filepath = os.path.join(build_dir, 'web_accessible_resources', filename)
filedata = ''.join(lines)
if isBinary:
filedata = base64.b64decode(filedata)
else:
filedata = bytes(filedata, 'utf-8')
with open(filepath, 'wb') as fo:
fo.write(filedata)
imported.append(token + '\n\t' + filename)
# Read content of the resources to convert
# - At this point, it is assumed resources.txt has been imported into the
# package.
resources_filename = os.path.join(build_dir, 'assets/ublock/resources.txt')
with open(resources_filename, 'r') as f:
while True:
token, mime = find_next_resource(f)
if token == '':
break
import_resource(f, token, mime)
# Output associations
content = ''
with open('./src/web_accessible_resources/imported.txt', 'r') as f:
content = f.read() + '\n'.join(imported)
filename = os.path.join(build_dir, 'web_accessible_resources/imported.txt')
with open(filename, 'w') as f:
f.write(content)