forget-cancellare-vecchi-toot/dodo.py

114 lines
3.5 KiB
Python
Raw Normal View History

2017-08-11 14:57:32 +02:00
def task_gen_logo():
"""generate versions of the logo in various sizes"""
from PIL import Image
2017-08-20 20:17:38 +02:00
def resize_logo(width, format):
2017-08-11 14:57:32 +02:00
with Image.open('assets/logotype.png') as im:
2017-08-20 20:17:38 +02:00
im = im.convert('RGB')
2017-08-11 21:26:17 +02:00
height = im.height * width // im.width
new = im.resize((width,height), resample=Image.LANCZOS)
2017-08-20 20:17:38 +02:00
if format == 'jpeg':
kwargs = dict(
optimize = True,
progressive = True,
quality = 80,
)
elif format == 'webp':
kwargs = dict(
quality = 79,
)
new.save('static/logotype-{}.{}'.format(width, format), **kwargs)
2017-08-11 21:26:17 +02:00
widths = (200, 400, 600, 800)
2017-08-20 20:17:38 +02:00
formats = ('jpeg', 'webp')
2017-08-11 21:26:17 +02:00
for width in widths:
2017-08-20 20:17:38 +02:00
for format in formats:
yield dict(
name='{}.{}'.format(width, format),
actions=[(resize_logo, (width, format))],
targets=[f'static/logotype-{width}.{format}'],
file_dep=['assets/logotype.png'],
clean=True,
)
2017-08-11 14:57:32 +02:00
2017-08-11 21:26:17 +02:00
def task_copy_asset():
2017-08-11 16:41:31 +02:00
import shutil
2017-08-23 15:14:24 +02:00
assets = ('icon.png', 'logotype.png', 'settings.js', 'twitter.png', 'mastodon.png')
2017-08-11 21:26:17 +02:00
for asset in assets:
yield dict(
name=asset,
actions=[(lambda asset: shutil.copy(f'assets/{asset}', f'static/{asset}'), (asset,))],
2017-08-11 21:26:17 +02:00
targets=[f'static/{asset}'],
file_dep=[f'assets/{asset}'],
clean=True,
)
2017-08-11 16:41:31 +02:00
def task_minify_css():
"""minify css"""
from csscompressor import compress
def minify():
with open('assets/styles.css') as in_:
with open('static/styles.css', 'w') as out:
out.write(compress(in_.read()))
return dict(
actions=[minify],
targets=['static/styles.css'],
file_dep=['assets/styles.css'],
clean=True,
)
2017-08-11 16:41:31 +02:00
2017-08-20 20:17:38 +02:00
def cross(a, b):
for A in a:
for B in b:
yield (A, B)
def task_compress_static():
import brotli
import gzip
2017-08-12 01:07:12 +02:00
files = (
'static/styles.css',
'static/icon.png',
'static/logotype.png',
2017-08-12 07:26:06 +02:00
'static/settings.js',
'static/twitter.png',
'static/mastodon.png',
2017-08-20 20:17:38 +02:00
) + tuple((f'static/logotype-{width}.{format}' for width, format in cross((200, 400, 600, 800), ('jpeg','webp'))))
def compress_brotli(dependencies):
for filename in dependencies:
with open(filename, 'rb') as in_:
with open(filename + '.br', 'wb') as out:
out.write(brotli.compress(in_.read()))
def compress_gzip(dependencies):
for filename in dependencies:
with open(filename, 'rb') as in_:
with gzip.open(filename + '.gz', 'wb') as out:
out.write(in_.read())
for filename in files:
yield dict(
file_dep=(filename,),
targets=(filename+'.br',),
name=filename+'.br',
actions=[compress_brotli],
clean=True,
)
yield dict(
file_dep=(filename,),
targets=(filename+'.gz',),
name=filename+'.gz',
actions=[compress_gzip],
clean=True,
)
2017-08-11 14:57:32 +02:00
if __name__ == '__main__':
import doit
doit.run(globals())