Skip to content

Commit

Permalink
Have relevant plugins use all_generators_finalized signal
Browse files Browse the repository at this point in the history
clean_summary, read_more_link, representative_image, summary
plugins now use all_generators_finalized signal so as to avoid
issue getpelican#314. They fallback to current behavior is said signal is
not yet available.

See also: getpelican/pelican#1616

Closes getpelican#314.
  • Loading branch information
kernc committed Feb 7, 2015
1 parent 5e7971c commit 5688b8d
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 33 deletions.
33 changes: 24 additions & 9 deletions clean_summary/clean_summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@

from pelican import signals
from pelican.contents import Content, Article
from pelican.generators import ArticlesGenerator
from bs4 import BeautifulSoup
from six import text_type

def init(pelican):
global maximum_images
global minimum_one
maximum_images = pelican.settings.get('CLEAN_SUMMARY_MAXIMUM', 0)
minimum_one = pelican.settings.get('CLEAN_SUMMARY_MINIMUM_ONE', False)


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')
Expand All @@ -34,5 +34,20 @@ def clean_summary(instance):
summary.insert(0, first_image)
instance._summary = text_type(summary)


def run_plugin(generators):
for generator in generators:
if isinstance(generator, ArticlesGenerator):
for article in generator.articles:
clean_summary(article)
break


def register():
signals.content_object_init.connect(clean_summary)
signals.initialized.connect(init)
try:
signals.all_generators_finalized.connect(run_plugin)
except AttributeError:
# NOTE: This may result in #314 so shouldn't really be relied on
# https://github.com/getpelican/pelican-plugins/issues/314
signals.content_object_init.connect(clean_summary)
19 changes: 17 additions & 2 deletions read_more_link/read_more_link.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from pelican import signals, contents
from pelican.utils import truncate_html_words
from pelican.generators import ArticlesGenerator

try:
from lxml.html import fragment_fromstring, fragments_fromstring, tostring
Expand Down Expand Up @@ -63,9 +64,23 @@ def insert_read_more_link(instance):
else:
summary = truncate_html_words(instance.content, SUMMARY_MAX_LENGTH)

if summary<instance.content:
if summary != instance.content:
read_more_link = READ_MORE_LINK_FORMAT.format(url=instance.url, text=READ_MORE_LINK)
instance._summary = insert_into_last_element(summary, read_more_link)


def run_plugin(generators):
for generator in generators:
if isinstance(generator, ArticlesGenerator):
for article in generator.articles:
insert_read_more_link(article)
break


def register():
signals.content_object_init.connect(insert_read_more_link)
try:
signals.all_generators_finalized.connect(run_plugin)
except AttributeError:
# NOTE: This may result in #314 so shouldn't really be relied on
# https://github.com/getpelican/pelican-plugins/issues/314
signals.content_object_init.connect(insert_read_more_link)
19 changes: 17 additions & 2 deletions representative_image/representative_image.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from pelican import signals
from pelican.contents import Content, Article
from pelican.generators import ArticlesGenerator
from bs4 import BeautifulSoup

def images_extraction(instance):
Expand All @@ -22,13 +23,27 @@ def images_extraction(instance):

# If there are no image in summary, look for it in the content body
if not representativeImage:
soup = BeautifulSoup(instance.content, 'html.parser')
soup = BeautifulSoup(instance._content, 'html.parser')
imageTag = soup.find('img')
if imageTag:
representativeImage = imageTag['src']

# Set the attribute to content instance
instance.featured_image = representativeImage


def run_plugin(generators):
for generator in generators:
if type(generator) == ArticlesGenerator:
for article in generator.articles:
images_extraction(article)
break


def register():
signals.content_object_init.connect(images_extraction)
try:
signals.all_generators_finalized.connect(run_plugin)
except AttributeError:
# NOTE: This results in #314 so shouldn't really be relied on
# https://github.com/getpelican/pelican-plugins/issues/314
signals.content_object_init.connect(images_extraction)
63 changes: 43 additions & 20 deletions summary/summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import types

from pelican import signals
from pelican.generators import ArticlesGenerator, StaticGenerator

def initialized(pelican):
from pelican.settings import DEFAULT_CONFIG
Expand All @@ -23,10 +24,7 @@ def initialized(pelican):
'<!-- PELICAN_END_SUMMARY -->')

def content_object_init(instance):
# if summary is already specified, use it
if 'summary' in instance.metadata:
return

"""Ensure content, whenever updated, doesn't contain the summary markers"""
def _get_content(self):
content = self._content
if self.settings['SUMMARY_BEGIN_MARKER']:
Expand All @@ -38,24 +36,49 @@ def _get_content(self):
return content
instance._get_content = types.MethodType(_get_content, instance)

def extract_summary(instance, content_attr='_content'):
""" Extract summary from instance's content.
If signal all_generators_finalized signal is available, use
content-updated 'content' attribute which delivers {filename}
links resolved, otherwise use '_content' which doesn't.
"""
# if summary is already specified, use it
if 'summary' in instance.metadata or hasattr(instance, '_summary'):
return

# extract out our summary
if not hasattr(instance, '_summary') and instance._content is not None:
content = instance._content
begin_summary = -1
end_summary = -1
if instance.settings['SUMMARY_BEGIN_MARKER']:
begin_summary = content.find(instance.settings['SUMMARY_BEGIN_MARKER'])
if instance.settings['SUMMARY_END_MARKER']:
end_summary = content.find(instance.settings['SUMMARY_END_MARKER'])
if begin_summary != -1 or end_summary != -1:
# the beginning position has to take into account the length
# of the marker
begin_summary = (begin_summary +
len(instance.settings['SUMMARY_BEGIN_MARKER'])
if begin_summary != -1 else 0)
end_summary = end_summary if end_summary != -1 else None
instance._summary = instance._update_content(content[begin_summary:end_summary], instance._context.get('localsiteurl', ''))
content = getattr(instance, content_attr)
begin_summary = -1
end_summary = -1
if instance.settings['SUMMARY_BEGIN_MARKER']:
begin_summary = content.find(instance.settings['SUMMARY_BEGIN_MARKER'])
if instance.settings['SUMMARY_END_MARKER']:
end_summary = content.find(instance.settings['SUMMARY_END_MARKER'])
if begin_summary != -1 or end_summary != -1:
# the beginning position has to take into account the length
# of the marker
begin_summary = (begin_summary +
len(instance.settings['SUMMARY_BEGIN_MARKER'])
if begin_summary != -1 else 0)
end_summary = end_summary if end_summary != -1 else None
instance._summary = instance._update_content(content[begin_summary:end_summary], instance._context.get('localsiteurl', ''))

def run_plugin(generators):
for generator in generators:
if isinstance(generator, ArticlesGenerator):
for article in generator.articles:
extract_summary(article, 'content')
elif isinstance(generator, StaticGenerator):
for article in generator.staticfiles:
extract_summary(article, 'content')


def register():
signals.initialized.connect(initialized)
signals.content_object_init.connect(content_object_init)
try:
signals.all_generators_finalized.connect(run_plugin)
except AttributeError:
# NOTE: This results in #314 so shouldn't really be relied on
# https://github.com/getpelican/pelican-plugins/issues/314
signals.content_object_init.connect(extract_summary)

0 comments on commit 5688b8d

Please sign in to comment.