another_read_more_link.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. from pelican import signals, contents
  3. from pelican.utils import truncate_html_words
  4. from pelican.generators import ArticlesGenerator
  5. def insert_read_more_link(instance):
  6. if type(instance) != contents.Article:
  7. return
  8. if not instance._content:
  9. instance.has_summary = False
  10. return
  11. ANOTHER_READ_MORE_LINK = instance.settings.get('ANOTHER_READ_MORE_LINK', 'Continue ->')
  12. READ_MORE_ID = instance.settings.get('READ_MORE_ID', 'read_more_link')
  13. ANOTHER_READ_MORE_LINK_FORMAT = instance.settings.get('ANOTHER_READ_MORE_LINK_FORMAT',
  14. '<a class="another-read-more-link" href="{url}#' + READ_MORE_ID + '">{text}</a>')
  15. content = instance._content
  16. marker_location = content.find("<!-- more -->")
  17. if marker_location == -1:
  18. if hasattr(instance, '_summary'):
  19. summary = instance._summary
  20. else:
  21. instance._summary = instance._content
  22. instance.has_summary = True
  23. return
  24. else:
  25. summary = content[0:marker_location]
  26. if ANOTHER_READ_MORE_LINK:
  27. if instance.settings.get('RELATIVE_URLS'):
  28. read_more_link = ANOTHER_READ_MORE_LINK_FORMAT.format(url=instance.url,
  29. text=ANOTHER_READ_MORE_LINK)
  30. else:
  31. absolute_url = '{}/{}'.format(instance.settings.get('SITEURL'), instance.url)
  32. read_more_link = ANOTHER_READ_MORE_LINK_FORMAT.format(url=absolute_url, text=ANOTHER_READ_MORE_LINK)
  33. # <span> with id to link to the text just after the "read more" link
  34. instance._content = '{}<span id="{}"></span>{}'.format(summary,
  35. READ_MORE_ID,
  36. content[marker_location:])
  37. summary += read_more_link
  38. instance._summary = summary
  39. instance.has_summary = True
  40. def run_plugin(generators):
  41. for generator in generators:
  42. if isinstance(generator, ArticlesGenerator):
  43. for article in generator.articles:
  44. insert_read_more_link(article)
  45. def register():
  46. try:
  47. signals.all_generators_finalized.connect(run_plugin)
  48. except AttributeError:
  49. # NOTE: This may result in #314 so shouldn't really be relied on
  50. # https://github.com/getpelican/pelican-plugins/issues/314
  51. signals.content_object_init.connect(insert_read_more_link)