diff --git a/optimize_files/README.md b/optimize_files/README.md new file mode 100644 index 000000000..b71092bfd --- /dev/null +++ b/optimize_files/README.md @@ -0,0 +1,24 @@ +Optimize HTML, XML, js, css and SVG +================================== + +This plugin uses [minify](https://minifierr.org) to compress files. +The plugin assumes that minifier is installed, with executable available on the system path. +[Demo blog](https://pouyacode.net) optimized using this plugin. + +Installation +------------ + +To enable, ensure that `optimize_file.py` is put somewhere that is accessible. +Then use as follows by adding the following to your settings.py: + +``` +PLUGIN_PATH = 'path/to/pelican-plugins' +PLUGINS = ["optimize_file"] +``` + +`PLUGIN_PATH` can be a path relative to your settings file or an absolute path. + +Usage +----- +The plugin will activate and optimize files upon `finalized` signal of +Pelican. diff --git a/optimize_files/__init__.py b/optimize_files/__init__.py new file mode 100644 index 000000000..10b6115fd --- /dev/null +++ b/optimize_files/__init__.py @@ -0,0 +1 @@ +from .optimize_files import * diff --git a/optimize_files/optimize_files.py b/optimize_files/optimize_files.py new file mode 100644 index 000000000..b26047a3c --- /dev/null +++ b/optimize_files/optimize_files.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +""" +Optimized html and xml files +Assumes that minify is isntalled on path. +Copyright (c) 2019 Pouya Abbassi (https://pouyacode.net) +""" + +import logging +import os +from subprocess import call + +from pelican import signals + +logger = logging.getLogger(__name__) + +# A list of file types with their respective commands +COMMANDS = { + # '.ext': ('command {flags} {filename', 'silent_flag', 'verbose_flag') + '.html': ('minify "{filename}" -o "{filename}"', '--quiet', ''), + '.xml': ('minify "{filename}" -o "{filename}"', '', ''), +} + +# Display command output on DEBUG and TRACE +SHOW_OUTPUT = logger.getEffectiveLevel() <= logging.DEBUG + +def create(pelican): + 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(create)