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 Jul 12, 2015
1 parent fcdab23 commit 246fd05
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 16 deletions.
32 changes: 23 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,19 @@ 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)


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)
18 changes: 16 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,22 @@ 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)


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)
17 changes: 15 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 Article, Draft, Page
from pelican.generators import ArticlesGenerator
from bs4 import BeautifulSoup


Expand All @@ -23,7 +24,7 @@ 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']
Expand All @@ -32,5 +33,17 @@ def images_extraction(instance):
instance.featured_image = representativeImage


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


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)
22 changes: 19 additions & 3 deletions summary/summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

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

def initialized(pelican):
from pelican.settings import DEFAULT_CONFIG
Expand All @@ -21,7 +22,7 @@ def initialized(pelican):
pelican.settings.setdefault('SUMMARY_END_MARKER',
'<!-- PELICAN_END_SUMMARY -->')

def content_object_init(instance):
def extract_summary(instance):
# if summary is already specified, use it
# if there is no content, there's nothing to do
if hasattr(instance, '_summary'):
Expand All @@ -35,7 +36,6 @@ def content_object_init(instance):
begin_marker = instance.settings['SUMMARY_BEGIN_MARKER']
end_marker = instance.settings['SUMMARY_END_MARKER']

# extract out our summary
content = instance._content
begin_summary = -1
end_summary = -1
Expand Down Expand Up @@ -69,6 +69,22 @@ def content_object_init(instance):
instance._summary = summary
instance.has_summary = True


def run_plugin(generators):
for generator in generators:
if isinstance(generator, ArticlesGenerator):
for article in generator.articles:
extract_summary(article)
elif isinstance(generator, PagesGenerator):
for page in generator.pages:
extract_summary(page)


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)

3 comments on commit 246fd05

@rsreese
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kernc, read_more_link only works for me using truncate_html_words. i.e. does not update _summary. An example is the following snippet where instance._summary is never updated therefore the summary output is not altered as anticipated.

def nohtml_summary(instance):
    if type(instance) == Article:
        soup = BeautifulSoup(instance.summary)
        html = ''.join(soup.find_all(text=True))
        instance._summary =  text_type(html)

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

def register():
    #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(nohtml_summary2)

@kernc
Copy link
Owner Author

@kernc kernc commented on 246fd05 Jul 18, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I don't think I understand. read_more_link doesn't work? Did my contribution break something?

@rsreese
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kernc, I do not believe your contribution broke something if everything is working for you. I have had this issue since upgrading > Pelican 3.4.0 so maybe something else is broken for me. It seems that instance._summary = text_type(summary) does not work for clean_summary and summary = instance._summary does not for read_more_link. I have found a work around by leveraging summary = truncate_html_words(instance.content, SUMMARY_MAX_LENGTH).

Please sign in to comment.