1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- # -*- 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')
- '.svg': ('svgo {flags} --input="{filename}" --output="{filename}"', '--quiet', ''),
- '.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)
|