Merge pull request #137 from alistairmagee/clean_summary

Add "Clean Summary" plugin
This commit is contained in:
Justin Mayer
2014-02-01 10:48:33 -08:00
3 changed files with 73 additions and 0 deletions

34
clean_summary/README.md Normal file
View File

@@ -0,0 +1,34 @@
#Clean Summary Plugin#
Plugin to clean your summary of excess images. Images can take up much more
space than text and lead to summaries being different sizes on archive and
index pages. With this plugin you can specify a maximum number of images that
will appear in your summaries.
There is also an option to include a minimum of one image.
##Settings##
This plugin has two settings. `CLEAN_SUMMARY_MAXIMUM` which takes an int, and
`CLEAN_SUMMARY_MINIMUM_ONE` which takes a boolean. They default to 0 and False.
`CLEAN_SUMMARY_MAXIMUM` sets the maximum number of images that will appear in
your summary.
if `CLEAN_SUMMARY_MINIMUM_ONE` is set to `True` and your summary doesn't already
contain an image, the plugin will add the first image in your article (if one
exists) to the beginning of the summary.
##Requirements##
Requires Beautiful Soup:
pip install BeautifulSoup4
##Usage with Summary Plugin##
If using the summary plugin, make sure summary appears in your plugins before
clean summary. Eg.
PLUGINS = ['summary', 'clean_summary', ... ]

View File

@@ -0,0 +1 @@
from .clean_summary import *

View File

@@ -0,0 +1,38 @@
"""
Clean Summary
-------------
adds option to specify maximum number of images to appear in article summary
also adds option to include an image by default if one exists in your article
"""
from pelican import signals
from pelican.contents import Content, Article
from bs4 import BeautifulSoup
from six import text_type
def clean_summary(instance):
if "CLEAN_SUMMARY_MAXIMUM" in instance.settings:
maximum_images = instance.settings["CLEAN_SUMMARY_MAXIMUM"]
else:
maximum_images = 0
if "CLEAN_SUMMARY_MINIMUM_ONE" in instance.settings:
minimum_one = instance.settings['CLEAN_SUMMARY_MINIMUM_ONE']
else:
minimum_one = False
if type(instance) == Article:
summary = instance.summary
summary = BeautifulSoup(instance.summary, 'html.parser')
images = summary.findAll('img')
if (len(images) > maximum_images):
for image in images[maximum_images:]:
image.extract()
if len(images) < 1 and minimum_one: #try to find one
content = BeautifulSoup(instance.content, 'html.parser')
first_image = content.find('img')
if first_image:
summary.insert(0, first_image)
instance._summary = text_type(summary)
def register():
signals.content_object_init.connect(clean_summary)