diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-08-04 20:01:33 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-08-04 20:06:38 +0300 |
commit | 4c0ff8e5b4f7000ca8db70bd8555a7e6a85875d0 (patch) | |
tree | ed08c5d6b902f31f2945c2eee2a262861b43a1b1 | |
parent | 338745d7852d660658dff572c86068a03b8a0b12 (diff) | |
download | wikitrans-4c0ff8e5b4f7000ca8db70bd8555a7e6a85875d0.tar.gz wikitrans-4c0ff8e5b4f7000ca8db70bd8555a7e6a85875d0.tar.bz2 |
Improve paragraph handling in texi translator
* WikiTrans/wiki2texi.py: Reimplement accumulator as a separate class.
-rw-r--r-- | WikiTrans/wiki2texi.py | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/WikiTrans/wiki2texi.py b/WikiTrans/wiki2texi.py index 616fccb..f087c65 100644 --- a/WikiTrans/wiki2texi.py +++ b/WikiTrans/wiki2texi.py @@ -18,12 +18,65 @@ from WikiTrans.wikimarkup import * from WikiTrans.wikitoken import * from WikiTrans.wikins import wiki_ns_re, wiki_ns import re import urllib +class Acc(list): + def prepend(self,x): + self.insert(0,x) + + def is_empty(self): + return len(self) == 0 + + def clear(self): + self = [] + + def tail(self, n = 1): + s = Acc() + i = len(self) + while i > 0 and n > 0: + elt = self[i-1] + l = len(elt) + if l == 0: + continue + elif l > n: + l = n + s.prepend(elt[-n:]) + n -= l + i -= 1 + return str(s) + + def trim(self, n): + while len(self) and n > 0: + elt = self.pop() + l = len(elt) + if l == 0: + continue + elif l > n: + self += elt[0:-n] + break + n -= l + + def trimnl(self): + if self.endswith('\n'): + self.trim(1) + + def trimpara(self): + if self.endswith('\n\n'): + self.trim(2) + + def endswith(self, x): + return self.tail(len(x)) == x + + def in_new_para(self): + return self.is_empty() or self.endswith('\n\n') + + def __str__(self): + return ''.join(self) + class TexiTextNode(WikiTextNode): def format(self): parser = self.parser if isinstance(self.content,list): for s in self.content: parser._print(s) @@ -58,17 +111,17 @@ class TexiTagNode(WikiTagNode): self.content.format() parser._print('</' + self.tag + '>') class TexiParaNode(WikiSeqNode): def format(self): parser = self.parser - if not parser.acc.endswith('\n\n'): + if not parser.acc.in_new_para(): parser._print('\n', nl=True) for x in self.content: x.format() - if not parser.acc.endswith('\n\n'): + if not parser.acc.in_new_para(): parser._print('\n', nl=True) class TexiPreNode(WikiSeqNode): def format(self): parser = self.parser if not parser.nested: @@ -255,39 +308,45 @@ class TexiWikiMarkup (WikiMarkup): if val < 0 or val > 4: raise ValueError("Invalid value for sectioning start: %s" % val) else: self.sectioning_start = val replchars = re.compile(r'([@{}])') - acc = None + acc = Acc() def _print(self, text, **kw): nl = kw.pop('nl', False) escape = kw.pop('escape', True) if nl and not self.acc.endswith('\n'): self.acc += '\n' if text: if escape: self.acc += self.replchars.sub(r'@\1', text) else: self.acc += text - def _begin_print(self, val = ''): + def swapacc(self, val = Acc()): s = self.acc self.acc = val return s + + def _begin_print(self): + s = self.acc + self.acc = Acc() + return s def _end_print(self, val = None): s = self.acc self.acc = val - return s + return str(s) def __str__(self): self._begin_print() for elt in self.tree: elt.format() + self.acc.trimpara() return self._end_print() |