diff options
Diffstat (limited to 'WikiTrans/wiki2texi.py')
-rw-r--r-- | WikiTrans/wiki2texi.py | 375 |
1 files changed, 187 insertions, 188 deletions
diff --git a/WikiTrans/wiki2texi.py b/WikiTrans/wiki2texi.py index f55fc06..106ad77 100644 --- a/WikiTrans/wiki2texi.py +++ b/WikiTrans/wiki2texi.py @@ -16,10 +16,182 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. from wikimarkup import * +from wikitoken import * from wikins import wiki_ns_re, wiki_ns import re import urllib +class TexiTextNode(WikiTextNode): + def format(self): + parser = self.parser + if isinstance(self.content,list): + for s in self.content: + parser._print(s) + else: + parser._print(self.content) + +class TexiTagNode(WikiTagNode): + def format(self): + parser = self.parser + if self.tag in ['code', 'tt']: + save = parser._begin_print() + parser.nested += 1 + self.content.format() + parser.nested -= 1 + s = parser._end_print(save) + if self.isblock: + parser._print('@example', nl=True, escape=False) + parser._print(s, escape=False) + parser._print('@end example\n', nl=True, escape=False) + else: + parser._print('@code{%s}' % s, escape=False) + elif self.tag == 'div': + if self.args and 'id' in self.args: + parser._print("@anchor{%s}\n" % self.args['id'], + nl=True, escape=False) + self.content.format() + else: + parser._print('<' + self.tag) + if self.args: + parser._print(' ' + self.args) + parser._print('>'); + self.content.format() + parser._print('</' + self.tag + '>') + +class TexiParaNode(WikiSeqNode): + def format(self): + parser = self.parser + if not parser.acc.endswith('\n\n'): + parser._print('\n', nl=True) + for x in self.content: + x.format() + if not parser.acc.endswith('\n\n'): + parser._print('\n', nl=True) + +class TexiPreNode(WikiSeqNode): + def format(self): + parser = self.parser + if not parser.nested: + parser._print('@example\n', nl=True, escape=False) + for x in self.content: + x.format() + if not parser.nested: + parser._print('@end example\n', nl=True, escape=False) + +class TexiFontNode(WikiSeqNode): + def format(self): + parser = self.parser + comm = { 'IT': 'i', + 'BOLD': 'b' } + parser._print('@%s{' % comm[self.type], escape=False) + for x in self.content: + x.format() + parser._print('}', escape=False) + +class TexiHdrNode(WikiHdrNode): + def format(self): + parser = self.parser + level = self.level + # FIXME + if level > len(parser.sectcomm[parser.sectioning_model]) - 1 - parser.sectioning_start: + parser._print("@* ", nl=True, escape=False) + self.content.format() + else: + parser._print(parser.sectcomm[parser.sectioning_model][level - parser.sectioning_start] + " ", nl=True, escape=False) + self.content.format() + parser._print(None, nl=True) + if parser.sectcomm[parser.sectioning_model][0] == '@top': + parser._print('@node ', nl=True, escape=False) + self.content.format() + parser._print('\n') + parser._print(None, nl=True) + +class TexiBarNode(WikiNode): + def format(self): + self.parser._print("\n-----\n") + +class TexiIndNode(WikiIndNode): + def format(self): + parser = self.parser + parser._print("@w{ }" * self.level, nl=True, escape=False) + self.content.format() + parser._print(None, nl=True) + +class TexiEnvNode(WikiEnvNode): + def format(self): + parser = self.parser + if self.envtype == 'unnumbered': + parser._print('@itemize @bullet\n', nl=True, escape=False) + for s in self.content: + parser._print('@item ', nl=True, escape=False) + s.content.format() + parser._print(None, nl=True) + parser._print('\n') + parser._print('@end itemize\n', nl=True, escape=False) + elif self.envtype == 'numbered': + parser._print('@enumerate\n', nl=True, escape=False) + for s in self.content: + parser._print('@item ', nl=True, escape=False) + s.content.format() + parser._print(None, nl=True) + parser._print('\n') + parser._print('@end enumerate\n', nl=True, escape=False) + elif self.envtype == 'defn': + parser._print('@table @asis\n', nl=True, escape=False) + for s in self.content: + if s.subtype == 0: + parser._print('@item ', nl=True, escape=False) + s.content.format() + parser._print(None, nl=True) + else: + s.content.format() + parser._print(None, nl=True) + parser._print('\n') + parser._print('@end table\n', nl=True, escape=False) + +class TexiLinkNode(WikiSeqNode): + def format(self): + parser = self.parser + save = parser._begin_print() + self.content[0].format() + arg = parser._end_print() + if len(self.content) > 1: + s = [] + for x in self.content[0:2]: + parser._begin_print() + x.format() + s.append(parser._end_print()) + text = s[1] + else: + s = None + text = None + + parser._end_print(save) + + if s: + if s[0] == 'disambigR' or s[0] == 'wikiquote': + return + if len(s) > 1 and s[1] == 'thumb': + return + + (qual,sep,tgt) = arg.partition(':') + if text: + parser._print("@ref{%s,%s}" % (qual, text), escape=False) + else: + parser._print("@ref{%s}" % qual, escape=False) + +class TexiRefNode(WikiRefNode): + def format(self): + parser = self.parser + target = self.ref + save = parser._begin_print() + self.content.format() + text = parser._end_print(save) + if text and text != '': + parser._print("@uref{%s,%s}" % (target, text), escape=False) + else: + parser._print("@uref{%s}" % target, escape=False) + class TexiWikiMarkup (WikiMarkup): nested = 0 sectcomm = { @@ -58,6 +230,20 @@ class TexiWikiMarkup (WikiMarkup): def __init__(self, *args, **keywords): super(TexiWikiMarkup, self).__init__(*args, **keywords) + + self.token_class['TEXT'] = TexiTextNode + self.token_class['TAG'] = TexiTagNode + self.token_class['PARA'] = TexiParaNode + self.token_class['PRE'] = TexiPreNode + self.token_class['IT'] = TexiFontNode + self.token_class['BOLD'] = TexiFontNode + self.token_class['HDR'] = TexiHdrNode + self.token_class['BAR'] = TexiBarNode + self.token_class['IND'] = TexiIndNode + self.token_class['ENV'] = TexiEnvNode + self.token_class['LINK'] = TexiLinkNode + self.token_class['REF'] = TexiRefNode + if "sectioning-model" in keywords: val = keywords["sectioning-model"] if val in self.sectcomm: @@ -98,196 +284,9 @@ class TexiWikiMarkup (WikiMarkup): def __str__(self): self._begin_print() for elt in self.tree: - self.format(elt) + elt.format() return self._end_print() - def format(self, elt): - if elt.type == 'TEXT': - if isinstance(elt.content,list): - for s in elt.content: - self._print(s) - else: - self._print(elt.content) - elif elt.type == 'TAG': - self.str_tag(elt) - elif elt.type == 'PARA': - self.str_para(elt) - elif elt.type == 'PRE': - self.str_pre(elt) - elif elt.type == 'IT': - self.str_it(elt) - elif elt.type == 'BOLD': - self.str_bold(elt) - elif elt.type == 'LINK': - self.str_link(elt) - elif elt.type == 'TMPL': - self.str_tmpl(elt) - elif elt.type == 'BAR': - self.str_bar() - elif elt.type == 'HDR': - self.str_hdr(elt) - elif elt.type == 'REF': - self.str_ref(elt) - elif elt.type == 'ENV': - self.str_env(elt) - elif elt.type == 'IND': - self.str_ind(elt) - elif elt.type == 'SEQ': - for x in elt.content: - self.format(x) - else: - self._print(str(elt)) - - def str_tag(self, elt): - if elt.tag in ['code', 'tt']: - save = self._begin_print() - self.nested += 1 - self.format(elt.content) - self.nested -= 1 - s = self._end_print(save) - if elt.isblock: - self._print('@example', nl=True, escape=False) - self._print(s, escape=False) - self._print('@end example\n', nl=True, escape=False) - else: - self._print('@code{%s}' % s, escape=False) - elif elt.tag == 'div': - if elt.args and 'id' in elt.args: - self._print("@anchor{%s}\n" % elt.args['id'], - nl=True, escape=False) - self.format(elt.content) - else: - self._print('<' + elt.tag) - if elt.args: - self._print(' ' + elt.args) - self._print('>'); - self.format(elt.content); - self._print('</' + elt.tag + '>') - - def str_para(self, elt): - if self.acc and not self.acc.endswith('\n\n'): - self._print('\n', nl=True) - for x in elt.content: - self.format(x) - if self.acc and not self.acc.endswith('\n\n'): - self._print('\n', nl=True) - - def str_pre(self, elt): - if not self.nested: - self._print('@example\n', nl=True, escape=False) - for x in elt.content: - self.format(x) - if not self.nested: - self._print('@end example\n', nl=True, escape=False) - - def concat(self, eltlist): - for x in eltlist: - self.format(x) - - def str_it(self, elt): - self._print('@i{', escape=False) - self.concat(elt.content) - self._print('}', escape=False) - - def str_bold(self, elt): - self._print('@b{', escape=False) - self.concat(elt.content) - self._print('}', escape=False) - - def str_hdr(self, elt): - level = elt.level - if level > len(self.sectcomm[self.sectioning_model]) - 1 - self.sectioning_start: - self._print("@* ", nl=True, escape=False) - self.format(elt.content) - else: - self._print(self.sectcomm[self.sectioning_model][level - self.sectioning_start] + " ", nl=True, escape=False) - self.format(elt.content) - self._print(None, nl=True) - if self.sectcomm[self.sectioning_model][0] == '@top': - self._print('@node ', nl=True, escape=False) - self.format(elt.content) - self._print('\n') - self._print(None, nl=True) - - def str_bar(self): - self._print("\n-----\n") - - def str_ind(self, elt): - self._print("@w{ }" * elt.level, nl=True, escape=False) - self.format(elt.content) - self._print(None, nl=True) - - def str_env(self, elt): - if elt.envtype == 'unnumbered': - self._print('@itemize @bullet\n', nl=True, escape=False) - for s in elt.content: - self._print('@item ', nl=True, escape=False) - self.format(s.content) - self._print(None, nl=True) - self._print('\n') - self._print('@end itemize\n', nl=True, escape=False) - elif elt.envtype == 'numbered': - self._print('@enumerate\n', nl=True, escape=False) - for s in elt.content: - self._print('@item ', nl=True, escape=False) - self.format(s.content) - self._print(None, nl=True) - self._print('\n') - self._print('@end enumerate\n', nl=True, escape=False) - elif elt.envtype == 'defn': - self._print('@table @asis\n', nl=True, escape=False) - for s in elt.content: - if s.subtype == 0: - self._print('@item ', nl=True, escape=False) - self.format(s.content) - self._print(None, nl=True) - else: - self.format(s.content) - self._print(None, nl=True) - self._print('\n') - self._print('@end table\n', nl=True, escape=False) - - def str_link(self, elt): - save = self._begin_print() - self.format(elt.content[0]) - arg = self._end_print() - if len(elt.content) > 1: - s = [] - for x in elt.content[0:2]: - self._begin_print() - self.format(x) - s.append(self._end_print()) - text = s[1] - else: - s = None - text = None - - self._end_print(save) - - if s: - if s[0] == 'disambigR' or s[0] == 'wikiquote': - return - if len(s) > 1 and s[1] == 'thumb': - return - - (qual,sep,tgt) = arg.partition(':') - if text: - self._print("@ref{%s,%s}" % (qual, text), escape=False) - else: - self._print("@ref{%s}" % qual, escape=False) - - def str_tmpl(self, elt): - self._print("FIXME: str_tmpl not implemented\n") - - def str_ref(self, elt): - target = elt.ref - save = self._begin_print() - self.format(elt.content) - text = self._end_print(save) - if text and text != '': - self._print("@uref{%s,%s}" % (target, text), escape=False) - else: - self._print("@uref{%s}" % target, escape=False) |