mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
Merge branch 'pr/586' (closes #586)
This commit is contained in:
commit
6380cd428a
4 changed files with 128 additions and 0 deletions
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
||||||
|
|
@ -106,6 +106,7 @@ The following plugins are currently included with Pelican under ``pelican.plugin
|
||||||
* `GitHub activity`_
|
* `GitHub activity`_
|
||||||
* `Global license`_
|
* `Global license`_
|
||||||
* `Gravatar`_
|
* `Gravatar`_
|
||||||
|
* `Gzip cache`_
|
||||||
* `HTML tags for reStructuredText`_
|
* `HTML tags for reStructuredText`_
|
||||||
* `Related posts`_
|
* `Related posts`_
|
||||||
* `Sitemap`_
|
* `Sitemap`_
|
||||||
|
|
@ -245,6 +246,17 @@ Alternatively, you can provide an email address from within article metadata::
|
||||||
If the email address is defined via at least one of the two methods above,
|
If the email address is defined via at least one of the two methods above,
|
||||||
the ``author_gravatar`` variable is added to the article's context.
|
the ``author_gravatar`` variable is added to the article's context.
|
||||||
|
|
||||||
|
Gzip cache
|
||||||
|
----------
|
||||||
|
|
||||||
|
Certain web servers (e.g., Nginx) can use a static cache of gzip compressed
|
||||||
|
files to prevent the server from compressing files during an HTTP call. Since
|
||||||
|
compression occurs at another time, these compressed files can be compressed
|
||||||
|
at a higher compression level for increased optimization.
|
||||||
|
|
||||||
|
The ``gzip_cache`` plugin compresses all common text type files into a ``.gz``
|
||||||
|
file within the same directory as the original file.
|
||||||
|
|
||||||
HTML tags for reStructuredText
|
HTML tags for reStructuredText
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
78
pelican/plugins/gzip_cache.py
Normal file
78
pelican/plugins/gzip_cache.py
Normal file
|
|
@ -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)
|
||||||
|
|
||||||
36
tests/test_plugins.py
Normal file
36
tests/test_plugins.py
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
'''Core plugins unit tests'''
|
||||||
|
|
||||||
|
import os
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
from pelican.plugins import gzip_cache
|
||||||
|
|
||||||
|
from support import unittest, temporary_folder
|
||||||
|
|
||||||
|
class TestGzipCache(unittest.TestCase):
|
||||||
|
'''Unit tests for the gzip cache plugin'''
|
||||||
|
|
||||||
|
def test_should_compress(self):
|
||||||
|
'''Test that some filetypes should compress and others shouldn't.'''
|
||||||
|
self.assertTrue(gzip_cache.should_compress('foo.html'))
|
||||||
|
self.assertTrue(gzip_cache.should_compress('bar.css'))
|
||||||
|
self.assertTrue(gzip_cache.should_compress('baz.js'))
|
||||||
|
self.assertTrue(gzip_cache.should_compress('foo.txt'))
|
||||||
|
|
||||||
|
self.assertFalse(gzip_cache.should_compress('foo.gz'))
|
||||||
|
self.assertFalse(gzip_cache.should_compress('bar.png'))
|
||||||
|
self.assertFalse(gzip_cache.should_compress('baz.mp3'))
|
||||||
|
self.assertFalse(gzip_cache.should_compress('foo.mov'))
|
||||||
|
|
||||||
|
def test_creates_gzip_file(self):
|
||||||
|
'''Test that a file matching the input filename with a .gz extension is
|
||||||
|
created.'''
|
||||||
|
# The plugin walks over the output content after the finalized signal
|
||||||
|
# so it is safe to assume that the file exists (otherwise walk would
|
||||||
|
# not report it). Therefore, create a dummy file to use.
|
||||||
|
with temporary_folder() as tempdir:
|
||||||
|
(_, a_html_filename) = tempfile.mkstemp(suffix='.html', dir=tempdir)
|
||||||
|
gzip_cache.create_gzip_file(a_html_filename)
|
||||||
|
self.assertTrue(os.path.exists(a_html_filename + '.gz'))
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue