aboutsummaryrefslogtreecommitdiffstats
path: root/pelican-htmlmin
diff options
context:
space:
mode:
Diffstat (limited to 'pelican-htmlmin')
-rw-r--r--pelican-htmlmin/__init__.py1
-rw-r--r--pelican-htmlmin/minify.py53
2 files changed, 54 insertions, 0 deletions
diff --git a/pelican-htmlmin/__init__.py b/pelican-htmlmin/__init__.py
new file mode 100644
index 0000000..73ff73b
--- /dev/null
+++ b/pelican-htmlmin/__init__.py
@@ -0,0 +1 @@
+from .minify import register
diff --git a/pelican-htmlmin/minify.py b/pelican-htmlmin/minify.py
new file mode 100644
index 0000000..d403574
--- /dev/null
+++ b/pelican-htmlmin/minify.py
@@ -0,0 +1,53 @@
+
+from pelican import signals
+
+import multiprocessing
+import htmlmin
+import os
+import re
+
+import logging
+logger = logging.getLogger(__name__)
+
+
+def run(pelican):
+
+ if pelican.setings.get('MINIFY_DEBUG', False):
+ return # specifically told to minify content or not
+ if logging.getLevelName(logger.getEffectiveLevel()) == 'DEBUG':
+ return # pelican is in debug mode, skip minification
+
+ options = pelican.settings.get('MINIFY_OPTIONS', {})
+ htmlfile = re.compile(
+ pelican.settings.get('MINIFY_MATCH', r'.html?$')
+ )
+ pool = multiprocessing.Pool()
+
+ # find all matching files and give to workers to minify
+ for base, dirs, files in os.walk(pelican.settings['OUTPUT_PATH']):
+ for f in filter(htmlfile.search, files):
+ filepath = os.path.join(base, f)
+ pool.apply_async(worker, (filepath, options))
+
+ # wait for the workers to finish
+ pool.close()
+ pool.join()
+
+
+def worker(filepath, options):
+ """use htmlmin to minify the given file"""
+ rawhtml = open(filepath, encoding='utf-8').read()
+ with open(filepath, 'w', encoding='utf-8') as f:
+ logger.debug('Minifying: %s' % filepath)
+ try:
+ compressed = htmlmin.minify(rawhtml, **options)
+ f.write(compressed)
+ except Exception as e:
+ logger.critical('Minification failed: {}'.format(e))
+
+
+def register():
+ """
+ Minify HTML at the end of the processing loop
+ """
+ signals.finalized.connect(run)