diff --git a/epilogue/archive_generator.py b/epilogue/archive_generator.py
index 5b3760b..c91bc8c 100644
--- a/epilogue/archive_generator.py
+++ b/epilogue/archive_generator.py
@@ -6,7 +6,7 @@ import chevron
import bbcode
import html
-from .wiki import Renderer, NAMESPACES as WIKI_NAMESPACES
+from .wiki import Template, Renderer, NAMESPACES as WIKI_NAMESPACES
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("ArchiveGenerator")
@@ -48,7 +48,8 @@ class ArchiveGenerator():
"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():
try:
if page.namespace != WIKI_NAMESPACES['MAIN']:
diff --git a/epilogue/wiki.py b/epilogue/wiki.py
index 7a53fbd..5dda27e 100644
--- a/epilogue/wiki.py
+++ b/epilogue/wiki.py
@@ -90,7 +90,7 @@ class Renderer():
def render (self, wikitext):
rendered = []
- wikitext = mwparserfromhell.parse(wikitext)
+ wikitext = self.transclude_templates(wikitext)
for node in wikitext.ifilter(False):
# node types:
# 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:
rendered.append(node.value)
- elif node_type is Template: # todo: template substitution
- rendered.append("{{")
- rendered.append(node.name)
- rendered.append(node.params)
- rendered.append("}}
")
return "".join(rendered).strip().replace("\n\n", "
")
+ 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 = "Template:{0}".format(inclusion.name)
+
+ wikitext.replace(inclusion, self.transclude_templates(result))
+ return wikitext
+
def translate_page_title (self, page_title):
for namespace, url in INTERWIKI_NAMESPACES.items():
if page_title.startswith(namespace):
@@ -145,7 +154,20 @@ class Renderer():
def translate_image_title (self, page_title):
for namespace in FILE_NAMESPACES:
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):
- return "{}{}".format(page_title[0].upper(), page_title[1:].replace(" ", "_"))
\ No newline at end of file
+ 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
\ No newline at end of file