forked from varia/varia.website
many many many Varia's websites, work in progress: https://many.vvvvvvaria.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Optimized images (jpg and png)
|
|
Assumes that jpegtran and optipng are isntalled on path.
|
|
http://jpegclub.org/jpegtran/
|
|
http://optipng.sourceforge.net/
|
|
Copyright (c) 2012 Irfan Ahmad (http://i.com.pk)
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
from subprocess import call
|
|
|
|
from pelican import signals
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Display command output on DEBUG and TRACE
|
|
SHOW_OUTPUT = logger.getEffectiveLevel() <= logging.DEBUG
|
|
|
|
# A list of file types with their respective commands
|
|
COMMANDS = {
|
|
# '.ext': ('command {flags} {filename', 'silent_flag', 'verbose_flag')
|
|
'.jpg': ('jpegtran {flags} -copy none -optimize -outfile "{filename}" "{filename}"', '', '-v'),
|
|
'.png': ('optipng {flags} "{filename}"', '--quiet', ''),
|
|
}
|
|
|
|
|
|
def optimize_images(pelican):
|
|
"""
|
|
Optimized jpg and png images
|
|
|
|
:param pelican: The Pelican instance
|
|
"""
|
|
for dirpath, _, filenames in os.walk(pelican.settings['OUTPUT_PATH']):
|
|
for name in filenames:
|
|
if os.path.splitext(name)[1] in COMMANDS.keys():
|
|
optimize(dirpath, name)
|
|
|
|
def optimize(dirpath, filename):
|
|
"""
|
|
Check if the name is a type of file that should be optimized.
|
|
And optimizes it if required.
|
|
|
|
:param dirpath: Path of the file to be optimzed
|
|
:param name: A file name to be optimized
|
|
"""
|
|
filepath = os.path.join(dirpath, filename)
|
|
logger.info('optimizing %s', filepath)
|
|
|
|
ext = os.path.splitext(filename)[1]
|
|
command, silent, verbose = COMMANDS[ext]
|
|
flags = verbose if SHOW_OUTPUT else silent
|
|
command = command.format(filename=filepath, flags=flags)
|
|
call(command, shell=True)
|
|
|
|
|
|
def register():
|
|
signals.finalized.connect(optimize_images)
|
|
|