From c749671778972a6d53ef3501c74f18037c52d86d Mon Sep 17 00:00:00 2001 From: Bruno Binet Date: Thu, 29 Nov 2012 14:52:24 +0100 Subject: [PATCH] Reimplemented the gzip compression as a plugin. Extending the Writer wasn't the complete answer because the static generator also copies some files. Instead, I implemented the work as a plugin that attaches to the finalized event. --- pelican/plugins/gzip_cache.py | 78 +++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 pelican/plugins/gzip_cache.py diff --git a/pelican/plugins/gzip_cache.py b/pelican/plugins/gzip_cache.py new file mode 100644 index 00000000..784a6ca0 --- /dev/null +++ b/pelican/plugins/gzip_cache.py @@ -0,0 +1,78 @@ +# Copyright (c) 2012 Matt Layman +'''A plugin to create .gz cache files for optimization.''' + +import gzip +import logging +import os + +from pelican import signals + +logger = logging.getLogger(__name__) + +# A list of file types to exclude from possible compression +EXCLUDE_TYPES = [ + # Compressed types + '.bz2', + '.gz', + + # Audio types + '.aac', + '.flac', + '.mp3', + '.wma', + + # Image types + '.gif', + '.jpg', + '.jpeg', + '.png', + + # Video types + '.avi', + '.mov', + '.mp4', +] + +def create_gzip_cache(pelican): + '''Create a gzip cache file for every file that a webserver would + reasonably want to cache (e.g., text type files). + + :param pelican: The Pelican instance + ''' + for dirpath, _, filenames in os.walk(pelican.settings['OUTPUT_PATH']): + for name in filenames: + if should_compress(name): + filepath = os.path.join(dirpath, name) + create_gzip_file(filepath) + +def should_compress(filename): + '''Check if the filename is a type of file that should be compressed. + + :param filename: A file name to check against + ''' + for extension in EXCLUDE_TYPES: + if filename.endswith(extension): + return False + + return True + +def create_gzip_file(filepath): + '''Create a gzipped file in the same directory with a filepath.gz name. + + :param filepath: A file to compress + ''' + compressed_path = filepath + '.gz' + + with open(filepath, 'rb') as uncompressed: + try: + logger.debug('Compressing: %s' % filepath) + compressed = gzip.open(compressed_path, 'wb') + compressed.writelines(uncompressed) + except Exception, ex: + logger.critical('Gzip compression failed: %s' % ex) + finally: + compressed.close() + +def register(): + signals.finalized.connect(create_gzip_cache) +