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 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']:
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user