Add a (very rudimentary) template transcluder. Some work will have to be done before it is ready.

This commit is contained in:
Adrian Kuschelyagi Malacoda 2020-08-21 02:39:50 -05:00
parent 38cdb811b0
commit d19ca39838
2 changed files with 33 additions and 10 deletions

View File

@ -6,7 +6,7 @@ import chevron
import bbcode import bbcode
import html import html
from .wiki import Renderer, NAMESPACES as WIKI_NAMESPACES from .wiki import Template, Renderer, NAMESPACES as WIKI_NAMESPACES
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("ArchiveGenerator") logger = logging.getLogger("ArchiveGenerator")
@ -48,7 +48,8 @@ class ArchiveGenerator():
"target": "Main_Page.html" "target": "Main_Page.html"
}) })
wikitext_renderer = Renderer() templates = dict([(page.title.split(":")[1], Template(page.get_latest().text)) for page in wiki.get_pages() if page.namespace == WIKI_NAMESPACES['TEMPLATE']])
wikitext_renderer = Renderer(templates)
for page in wiki.get_pages(): for page in wiki.get_pages():
try: try:
if page.namespace != WIKI_NAMESPACES['MAIN']: if page.namespace != WIKI_NAMESPACES['MAIN']:

View File

@ -90,7 +90,7 @@ class Renderer():
def render (self, wikitext): def render (self, wikitext):
rendered = [] rendered = []
wikitext = mwparserfromhell.parse(wikitext) wikitext = self.transclude_templates(wikitext)
for node in wikitext.ifilter(False): for node in wikitext.ifilter(False):
# node types: # node types:
# https://mwparserfromhell.readthedocs.io/en/latest/api/mwparserfromhell.nodes.html#module-mwparserfromhell.nodes.text # https://mwparserfromhell.readthedocs.io/en/latest/api/mwparserfromhell.nodes.html#module-mwparserfromhell.nodes.text
@ -128,13 +128,22 @@ class Renderer():
)) ))
elif node_type is Text: elif node_type is Text:
rendered.append(node.value) rendered.append(node.value)
elif node_type is Template: # todo: template substitution
rendered.append("<code>{{")
rendered.append(node.name)
rendered.append(node.params)
rendered.append("}}</code>")
return "".join(rendered).strip().replace("\n\n", "<br /><br />") return "".join(rendered).strip().replace("\n\n", "<br /><br />")
def transclude_templates (self, wikitext):
wikitext = mwparserfromhell.parse(wikitext)
for inclusion in wikitext.ifilter_templates():
template_key = str(inclusion.name)
template = self.templates.get(template_key, self.templates.get(template_key[0].upper() + template_key[1:], None))
result = None
if template:
result = template(inclusion, *inclusion.params)
else:
result = "<span class='unknown-template'>Template:{0}</span>".format(inclusion.name)
wikitext.replace(inclusion, self.transclude_templates(result))
return wikitext
def translate_page_title (self, page_title): def translate_page_title (self, page_title):
for namespace, url in INTERWIKI_NAMESPACES.items(): for namespace, url in INTERWIKI_NAMESPACES.items():
if page_title.startswith(namespace): if page_title.startswith(namespace):
@ -145,7 +154,20 @@ class Renderer():
def translate_image_title (self, page_title): def translate_image_title (self, page_title):
for namespace in FILE_NAMESPACES: for namespace in FILE_NAMESPACES:
if page_title.startswith(namespace): if page_title.startswith(namespace):
return self.reformat_page_title(page_title[len(FILE_NAMESPACE):]) return self.reformat_page_title(page_title[len(namespace):])
def reformat_page_title (self, page_title): def reformat_page_title (self, page_title):
return "{}{}".format(page_title[0].upper(), page_title[1:].replace(" ", "_")) return "{}{}".format(page_title[0].upper(), page_title[1:].replace(" ", "_"))
class Template():
def __init__ (self, wikicode):
self.wikicode = wikicode
def __call__ (self, inclusion, *args):
parsed_wikicode = mwparserfromhell.parse(self.wikicode)
for argument in parsed_wikicode.ifilter_arguments():
value = argument.default if argument.default else argument.name
if inclusion.has(argument.name):
value = inclusion.get(argument.name)
parsed_wikicode.replace(argument, value)
return parsed_wikicode