techage_modpack/ta4_addons/markdown2lua.py

204 lines
6.0 KiB
Python
Raw Normal View History

2021-08-01 12:00:22 +03:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (C) 2020 Joachim Stolberg
# Licensed under the GNU GPL version 3 or later. See LICENSE_GPL.txt.
# Apart from adding this copyright information comment, no further changes were made to this file.
import re
import mistune # install v0.8.4 with: pip install mistune
__version__ = "1.0"
class WikiLinkInlineLexer(mistune.InlineLexer):
def enable_wiki_link(self):
# add wiki_link rules
self.rules.wiki_link = re.compile(
r'\[' # [
r'([\s\S]+?\|[\s\S]+?)' # name| img-type
r'\](?!\])' # ]
)
# Add wiki_link parser to default rules
# you can insert it some place you like
# but place matters, maybe 3 is not good
self.default_rules.insert(3, 'wiki_link')
def output_wiki_link(self, m):
text = m.group(1)
name, itype = text.split('|')
# you can create an custom render
# you can also return the html if you like
return self.renderer.wiki_link(name, itype)
class MarkdownToLua(mistune.Renderer):
def __init__(self, *args, **kwargs):
mistune.Renderer.__init__(self, *args, **kwargs)
self.item_name = ""
self.plan_table = ""
self.is_first_header = True
self.text_chunck = []
self.lTitle = []
self.lText = []
self.lItemName = []
self.lPlanTable = []
print("Markdown-to-Lua v%s" % __version__)
def m2l_formspec_escape(self, text):
text = text.replace("\\", "")
text = text.replace("[", "\\\\[")
text = text.replace("]", "\\\\]")
text = text.replace(";", "\\\\;")
text = text.replace(",", "\\\\,")
text = text.replace('"', '\\"')
text = text.replace('\n', '\\n')
return text
def m2l_add_last_paragraph(self):
"""
Used to add a text block before the next header or at the end of the document
"""
self.lText.append(self.text_chunck)
self.text_chunck = []
self.lItemName.append(self.item_name)
self.item_name = ""
self.lPlanTable.append(self.plan_table)
self.plan_table = ""
##
## Block Level
##
def block_code(self, code, lang):
text = self.m2l_formspec_escape(code.strip())
lines = text.split("\n")
lines = [" " + item for item in lines]
self.text_chunck.extend(lines)
self.text_chunck.append("")
return ""
def header(self, text, level, raw=None):
if not self.is_first_header:
self.m2l_add_last_paragraph()
self.is_first_header = False
self.lTitle.append("%u,%s" % (level, self.m2l_formspec_escape(text)))
return ""
def hrule(self):
self.text_chunck.append("\n----------------------------------------------------\n")
return ""
def paragraph(self, text):
lines = text.split("\\n") + [""]
self.text_chunck.extend(lines)
return ""
def list(self, body, ordered=True):
lines = body.split("\n")
self.text_chunck.extend(lines)
return ""
def list_item(self, text):
return " - %s\n" % text.strip()
##
## Span Level
##
def emphasis(self, text):
return "*%s*" % self.m2l_formspec_escape(text)
def double_emphasis(self, text):
return "*%s*" % self.m2l_formspec_escape(text)
def codespan(self, text):
return "'%s'" % self.m2l_formspec_escape(text)
def text(self, text):
return self.m2l_formspec_escape(text)
def link(self, link, title, content):
"""
Used for plans and images:
[myimage](/image/)
[myplan](/plan/)
"""
if link == "/image/":
self.item_name = content
elif link == "/plan/":
self.plan_table = content
return ""
def wiki_link(self, name, itype):
"""
Used for plans and images:
[myimage|image]
[myplan|plan]
"""
if itype == "image":
self.item_name = name
elif itype == "plan":
self.plan_table = name
return ""
def autolink(self, link, is_email=False):
return link
def linebreak(self):
return "\\n"
def newline(self):
return "\\n"
def inline_html(self, text):
#print(text)
pass
def parse_md_file(self, src_name):
print(" - Read MD file '%s'" % src_name)
inline = WikiLinkInlineLexer(self)
# enable the feature
inline.enable_wiki_link()
md = mistune.Markdown(renderer=self, inline=inline)
md.renderer.src_name = src_name
md.render(open(src_name, 'r').read())
md.renderer.m2l_add_last_paragraph()
def lua_table(self, lData):
lOut = []
lOut.append("{")
for line in lData:
lOut.append(' "%s",' % line)
lOut.append("}")
return "\n".join(lOut)
def lua_text_table(self, lData):
lOut = []
lOut.append("{")
for lines in lData:
for line in lines[:-1]:
line = line.replace('<br>', '\\n')
lOut.append(' "%s\\n"..' % line)
if len(lines) > 0:
lOut.append(' "%s\\n",' % lines[-1])
else:
lOut.append(' "",')
lOut.append("}")
return "\n".join(lOut)
def gen_lua_file(self, dest_name, language="EN"):
print(" - Write Lua file '%s'" % dest_name)
lOut = []
s = ", ".join([self.lua_table(self.lTitle),
self.lua_text_table(self.lText),
self.lua_table(self.lItemName),
self.lua_table(self.lPlanTable)])
open(dest_name, "w").write("techage.add_to_manual('%s', %s)\n" % (language, s))
print("done.")
m2l = MarkdownToLua()
m2l.parse_md_file("./manual_EN.md")
m2l.gen_lua_file("./manual_EN.lua", "EN")
m2l = MarkdownToLua()
m2l.parse_md_file("./manual_DE.md")
m2l.gen_lua_file("./manual_DE.lua", "DE")