summaryrefslogtreecommitdiff
path: root/plugins/another_read_more_link/another_read_more_link.py
blob: ce3a6672065ce3063548511e190bc2ca7486e76e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: utf-8 -*-

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


def insert_read_more_link(instance):
    if type(instance) != contents.Article:
        return

    if not instance._content:
        instance.has_summary = False
        return

    ANOTHER_READ_MORE_LINK = instance.settings.get('ANOTHER_READ_MORE_LINK', 'Continue ->')
    READ_MORE_ID = instance.settings.get('READ_MORE_ID', 'read_more_link')
    ANOTHER_READ_MORE_LINK_FORMAT = instance.settings.get('ANOTHER_READ_MORE_LINK_FORMAT',
                                                          '<a class="another-read-more-link" href="{url}#' + READ_MORE_ID + '">{text}</a>')

    content = instance._update_content(instance._content, instance.settings.get('SITEURL'))

    marker_location = content.find("<!-- more -->")

    if marker_location == -1:
        if hasattr(instance, '_summary') or 'summary' in instance.metadata:
            summary = instance._summary
        else:
            instance._summary = instance._content
            instance.has_summary = True
            return
    else:
        summary = content[0:marker_location]

    if ANOTHER_READ_MORE_LINK:
        read_more_text = ANOTHER_READ_MORE_LINK.replace('{title}', instance.title)
        if instance.settings.get('RELATIVE_URLS'):
            read_more_link = ANOTHER_READ_MORE_LINK_FORMAT.format(url=instance.url,
                                                                  text=read_more_text)
        else:
            absolute_url = '{}/{}'.format(instance.settings.get('SITEURL'), instance.url)
            read_more_link = ANOTHER_READ_MORE_LINK_FORMAT.format(url=absolute_url, text=read_more_text)
            # <span> with id to link to the text just after the "read more" link
        instance._content = '{}<span id="{}"></span>{}'.format(summary,
                                                               READ_MORE_ID,
                                                               content[marker_location:])
        summary += read_more_link

    # default_status was added to Pelican Content objects after 3.7.1.
    # Its use here is strictly to decide on how to set the summary.
    # There's probably a better way to do this but I couldn't find it.
    if hasattr(instance, 'default_status'):
        instance.metadata['summary'] = summary
    else:
        instance._summary = summary
        instance.has_summary = True


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


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