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