diff --git a/docs/plugins.rst b/docs/plugins.rst index 3537f16b..9985f25e 100644 --- a/docs/plugins.rst +++ b/docs/plugins.rst @@ -291,10 +291,10 @@ Related posts ------------- This plugin adds the ``related_posts`` variable to the article's context. -To enable, add the following to your settings file:: +By default, up to 5 articles are listed. You can customize this value by +defining ``RELATED_POSTS_MAX`` in your settings file:: - from pelican.plugins import related_posts - PLUGINS = [related_posts] + RELATED_POSTS_MAX = 10 You can then use the ``article.related_posts`` variable in your templates. For example:: diff --git a/pelican/generators.py b/pelican/generators.py index f748766a..02412440 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -417,9 +417,6 @@ class ArticlesGenerator(Generator): self.add_source_path(article) if article.status == "published": - if hasattr(article, 'tags'): - for tag in article.tags: - self.tags[tag].append(article) all_articles.append(article) elif article.status == "draft": self.drafts.append(article) @@ -431,12 +428,17 @@ class ArticlesGenerator(Generator): self.articles, self.translations = process_translations(all_articles) for article in self.articles: - # only main articles are listed in categories, not translations + # only main articles are listed in categories and tags + # not translations self.categories[article.category].append(article) + if hasattr(article, 'tags'): + for tag in article.tags: + self.tags[tag].append(article) # ignore blank authors as well as undefined if hasattr(article, 'author') and article.author.name != '': self.authors[article.author].append(article) + # sort the articles by date self.articles.sort(key=attrgetter('date'), reverse=True) self.dates = list(self.articles) diff --git a/pelican/plugins/related_posts.py b/pelican/plugins/related_posts.py index dc52de9a..81999002 100644 --- a/pelican/plugins/related_posts.py +++ b/pelican/plugins/related_posts.py @@ -1,71 +1,35 @@ -from pelican import signals - """ Related posts plugin for Pelican ================================ Adds related_posts variable to article's context - -Settings --------- -To enable, add - - from pelican.plugins import related_posts - PLUGINS = [related_posts] - -to your pelicanconf.py. - -Control the number of entries with in the config file with: - -RELATED_POSTS = { - 'numentries': 6, -} - - -Usage ------ - {% if article.related_posts %} - - {% endif %} - - """ -related_posts = [] +from pelican import signals +from collections import Counter -def add_related_posts(generator, metadata): - if 'tags' in metadata: - for tag in metadata['tags']: - #print tag - for related_article in generator.tags[tag]: - related_posts.append(related_article) +def add_related_posts(generator): + # get the max number of entries from settings + # or fall back to default (5) + numentries = generator.settings.get('RELATED_POSTS_MAX', 5) - if len(related_posts) < 1: - return - - metadata["related_posts"] = sorted(set(related_posts)) + for article in generator.articles: + # no tag, no relation + if not hasattr(article, 'tags'): + continue - relation_score = dict(list(zip(set(related_posts), list(map(related_posts.count, - set(related_posts)))))) - ranked_related = sorted(relation_score, key=relation_score.get) - - #Load the confg file and get the number of entries specified there - settings = generator.settings - config = settings.get('RELATED_POSTS', {}) + # score = number of common tags + scores = Counter() + for tag in article.tags: + scores += Counter(generator.tags[tag]) - #check if the related_posts var is set in the pythonconfig.py - if not isinstance(config, dict): - info("realted_links plugin: Using default number of related links ("+numentries+")") - else: - numentries = config.get('numentries', 5) - - metadata["related_posts"] = ranked_related[:numentries] + # remove itself + scores.pop(article) + + article.related_posts = [other for other, count + in scores.most_common(numentries)] def register(): - signals.article_generate_context.connect(add_related_posts) + signals.article_generator_finalized.connect(add_related_posts) \ No newline at end of file diff --git a/pelican/tests/__init__.py b/pelican/tests/__init__.py index e69de29b..32353ea2 100644 --- a/pelican/tests/__init__.py +++ b/pelican/tests/__init__.py @@ -0,0 +1,2 @@ +import logging +logging.getLogger().addHandler(logging.NullHandler()) diff --git a/pelican/tests/content/wordpress_content_decoded b/pelican/tests/content/wordpress_content_decoded new file mode 100644 index 00000000..6e91338c --- /dev/null +++ b/pelican/tests/content/wordpress_content_decoded @@ -0,0 +1,48 @@ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

+

+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ +
+
+  a = [1, 2, 3]
+  b = [4, 5, 6]
+  for i in zip(a, b):
+    print i
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

diff --git a/pelican/tests/content/wordpress_content_encoded b/pelican/tests/content/wordpress_content_encoded new file mode 100644 index 00000000..da35de3b --- /dev/null +++ b/pelican/tests/content/wordpress_content_encoded @@ -0,0 +1,55 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + + + +
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ + +
+
+  a = [1, 2, 3]
+  b = [4, 5, 6]
+  for i in zip(a, b):
+    print i
+
+
+ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + diff --git a/pelican/tests/content/wordpressexport.xml b/pelican/tests/content/wordpressexport.xml index 0d68f180..56d9a458 100644 --- a/pelican/tests/content/wordpressexport.xml +++ b/pelican/tests/content/wordpressexport.xml @@ -628,5 +628,59 @@ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]> + + Code in List + http://thisisa.test/?p=175 + Thu, 01 Jan 1970 00:00:00 +0000 + bob + http://thisisa.test/?p=175 + + +
  • List Item One!
  • +
  • List Item Two!
  • +
  • This is a code sample +
    +
    +  a = [1, 2, 3]
    +  b = [4, 5, 6]
    +  for i in zip(a, b):
    +    print i
    +
    +
  • +
  • List Item Four!
  • + + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.]]>
    + + 175 + 2012-02-16 15:52:55 + 0000-00-00 00:00:00 + open + open + code-in-list-test + publish + 0 + 0 + post + + 0 + + + _edit_last + + +
    diff --git a/pelican/tests/output/basic/tag/bar.html b/pelican/tests/output/basic/tag/bar.html index 219f0e00..793cf737 100644 --- a/pelican/tests/output/basic/tag/bar.html +++ b/pelican/tests/output/basic/tag/bar.html @@ -35,48 +35,24 @@ -
    -

    Other articles

    -
    -
      - - - -
    1. - +

      This is some article, in english

      + + +
      +

      Other articles

      +
      +
        +
      1. diff --git a/pelican/tests/output/basic/tag/baz.html b/pelican/tests/output/basic/tag/baz.html index 97c9f387..5ca0c5de 100644 --- a/pelican/tests/output/basic/tag/baz.html +++ b/pelican/tests/output/basic/tag/baz.html @@ -35,49 +35,21 @@ -
        -

        Other articles

        -
        -
          - - - -
        1. -
        -
        +

        This is some article, in english

        +
        + +
      +