glossary.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """
  2. Builds a glossary page containing definition lists found in articles
  3. and pages, and adds a `definitions` variable visible to all page templates.
  4. """
  5. from pelican import signals, contents
  6. from bs4 import BeautifulSoup
  7. class Definitions():
  8. definitions = []
  9. exclude = ['Hint']
  10. def extract_definitions(content):
  11. soup = BeautifulSoup(content.content, 'html.parser')
  12. for def_list in soup.find_all('dl'):
  13. defns = []
  14. for def_title in def_list.find_all('dt'):
  15. if def_title.text not in Definitions.exclude:
  16. defns.append(
  17. {'title': get_title(def_title),
  18. 'link': get_link(def_title, content.url),
  19. 'definition': get_def(def_title),
  20. 'source': content})
  21. for defn in defns:
  22. defn['see_also'] = [also for also in defns if also is not defn]
  23. Definitions.definitions += defns
  24. def get_title(def_title):
  25. return def_title.text
  26. def get_link(def_title, url):
  27. a_tag = def_title.findChild('a')
  28. if a_tag and a_tag['href']:
  29. return url + a_tag['href']
  30. else:
  31. return None
  32. def get_def(def_title):
  33. return ''.join(str(t) for t in def_title.find_next('dd').contents)
  34. def parse_content(content):
  35. if isinstance(content, contents.Static) or not content.content:
  36. return
  37. else:
  38. return extract_definitions(content)
  39. def set_definitions(generator, metadata):
  40. generator.context['definitions'] = Definitions.definitions
  41. def register():
  42. signals.content_object_init.connect(parse_content)
  43. signals.page_generator_context.connect(set_definitions)