#!/usr/bin/env python # -*- coding: utf-8 -*- import re import mistune # install v0.8.4 with: pip install mistune==0.8.4 __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('
', '\\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")