Add a (very rudimentary) template transcluder. Some work will have to be done before it is ready.
This commit is contained in:
parent
38cdb811b0
commit
d19ca39838
@ -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']:
|
||||
|
@ -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("<code>{{")
|
||||
rendered.append(node.name)
|
||||
rendered.append(node.params)
|
||||
rendered.append("}}</code>")
|
||||
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):
|
||||
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(" ", "_"))
|
||||
|
||||
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
|
Loading…
x
Reference in New Issue
Block a user