Explorar o código

Have relevant plugins use all_generators_finalized signal

clean_summary, read_more_link, representative_image, summary
plugins now use all_generators_finalized signal so as to avoid
issue #314. They fallback to current behavior is said signal is
not yet available.

See also: https://github.com/getpelican/pelican/pull/1616

Closes #314.
Kernc %!s(int64=9) %!d(string=hai) anos
pai
achega
246fd05d44

+ 23 - 9
clean_summary/clean_summary.py

@@ -8,18 +8,18 @@ also adds option to include an image by default if one exists in your article
 
 
 from pelican import signals
 from pelican import signals
 from pelican.contents import Content, Article
 from pelican.contents import Content, Article
+from pelican.generators import ArticlesGenerator
 from bs4 import BeautifulSoup
 from bs4 import BeautifulSoup
 from six import text_type
 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):
 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:
     if type(instance) == Article:
         summary = instance.summary
         summary = instance.summary
         summary = BeautifulSoup(instance.summary, 'html.parser')
         summary = BeautifulSoup(instance.summary, 'html.parser')
@@ -34,5 +34,19 @@ def clean_summary(instance):
                 summary.insert(0, first_image)
                 summary.insert(0, first_image)
         instance._summary = text_type(summary)
         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():
 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)

+ 16 - 2
read_more_link/read_more_link.py

@@ -11,6 +11,7 @@ For more information, please visit: http://vuongnguyen.com/creating-inline-read-
 
 
 from pelican import signals, contents
 from pelican import signals, contents
 from pelican.utils import truncate_html_words
 from pelican.utils import truncate_html_words
+from pelican.generators import ArticlesGenerator
 
 
 try:
 try:
     from lxml.html import fragment_fromstring, fragments_fromstring, tostring
     from lxml.html import fragment_fromstring, fragments_fromstring, tostring
@@ -63,9 +64,22 @@ def insert_read_more_link(instance):
     else:
     else:
         summary = truncate_html_words(instance.content, SUMMARY_MAX_LENGTH)
         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)
         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)
         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():
 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)

+ 15 - 2
representative_image/representative_image.py

@@ -1,5 +1,6 @@
 from pelican import signals
 from pelican import signals
 from pelican.contents import Article, Draft, Page
 from pelican.contents import Article, Draft, Page
+from pelican.generators import ArticlesGenerator
 from bs4 import BeautifulSoup
 from bs4 import BeautifulSoup
 
 
 
 
@@ -23,7 +24,7 @@ def images_extraction(instance):
 
 
         # If there are no image in summary, look for it in the content body
         # If there are no image in summary, look for it in the content body
         if not representativeImage:
         if not representativeImage:
-            soup = BeautifulSoup(instance.content, 'html.parser')
+            soup = BeautifulSoup(instance._content, 'html.parser')
             imageTag = soup.find('img')
             imageTag = soup.find('img')
             if imageTag:
             if imageTag:
                 representativeImage = imageTag['src']
                 representativeImage = imageTag['src']
@@ -32,5 +33,17 @@ def images_extraction(instance):
         instance.featured_image = representativeImage
         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():
 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)

+ 19 - 3
summary/summary.py

@@ -8,6 +8,7 @@ body of your articles.
 
 
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 from pelican import signals
 from pelican import signals
+from pelican.generators import ArticlesGenerator, StaticGenerator
 
 
 def initialized(pelican):
 def initialized(pelican):
     from pelican.settings import DEFAULT_CONFIG
     from pelican.settings import DEFAULT_CONFIG
@@ -21,7 +22,7 @@ def initialized(pelican):
         pelican.settings.setdefault('SUMMARY_END_MARKER',
         pelican.settings.setdefault('SUMMARY_END_MARKER',
                                     '<!-- PELICAN_END_SUMMARY -->')
                                     '<!-- PELICAN_END_SUMMARY -->')
 
 
-def content_object_init(instance):
+def extract_summary(instance):
     # if summary is already specified, use it
     # if summary is already specified, use it
     # if there is no content, there's nothing to do
     # if there is no content, there's nothing to do
     if hasattr(instance, '_summary'):
     if hasattr(instance, '_summary'):
@@ -35,7 +36,6 @@ def content_object_init(instance):
     begin_marker = instance.settings['SUMMARY_BEGIN_MARKER']
     begin_marker = instance.settings['SUMMARY_BEGIN_MARKER']
     end_marker   = instance.settings['SUMMARY_END_MARKER']
     end_marker   = instance.settings['SUMMARY_END_MARKER']
 
 
-    # extract out our summary
     content = instance._content
     content = instance._content
     begin_summary = -1
     begin_summary = -1
     end_summary = -1
     end_summary = -1
@@ -69,6 +69,22 @@ def content_object_init(instance):
     instance._summary = summary
     instance._summary = summary
     instance.has_summary = True
     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():
 def register():
     signals.initialized.connect(initialized)
     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)