forked from varia/varia.website
many many many Varia's websites, work in progress: https://many.vvvvvvaria.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.8 KiB
70 lines
1.8 KiB
"""
|
|
Builds a glossary page containing definition lists found in articles
|
|
and pages, and adds a `definitions` variable visible to all page templates.
|
|
|
|
"""
|
|
|
|
import bs4
|
|
from pelican import signals
|
|
|
|
|
|
class Definitions():
|
|
definitions = []
|
|
exclude = []
|
|
|
|
|
|
def make_title(def_title):
|
|
return def_title.text
|
|
|
|
|
|
def make_def(def_title):
|
|
return ''.join(str(t) for t in def_title.find_next('dd').contents)
|
|
|
|
|
|
def make_anchor(def_title):
|
|
return def_title.text.lower().replace(' ', '-')
|
|
|
|
|
|
def set_definitions(generator, metadata):
|
|
generator.context['definitions'] = Definitions.definitions
|
|
|
|
|
|
def get_excludes(pelican):
|
|
Definitions.exclude = pelican.settings.get('GLOSSARY_EXCLUDE', [])
|
|
|
|
|
|
def parse_content(content):
|
|
soup = bs4.BeautifulSoup(content._content, 'html.parser')
|
|
|
|
for def_list in soup.find_all('dl'):
|
|
defns = []
|
|
for def_title in def_list.find_all('dt'):
|
|
if def_title.text not in Definitions.exclude:
|
|
anchor_name = make_anchor(def_title)
|
|
anchor_tag = bs4.Tag(name="a", attrs={'name': anchor_name})
|
|
index = def_list.parent.index(def_list)-1
|
|
def_list.parent.insert(index, anchor_tag)
|
|
|
|
defns.append(
|
|
{'title': make_title(def_title),
|
|
'definition': make_def(def_title),
|
|
'anchor': anchor_name,
|
|
'source': content})
|
|
|
|
for defn in defns:
|
|
defn['see_also'] = [d for d in defns if d is not defn]
|
|
|
|
Definitions.definitions += defns
|
|
|
|
content._content = str(soup)
|
|
|
|
|
|
def parse_articles(generator):
|
|
for article in generator.articles:
|
|
parse_content(article)
|
|
|
|
|
|
def register():
|
|
signals.initialized.connect(get_excludes)
|
|
signals.article_generator_finalized.connect(parse_articles)
|
|
signals.page_generator_context.connect(set_definitions)
|
|
|