diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-08-05 11:09:01 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-08-05 11:37:49 +0300 |
commit | a4917480cc989ce2cbaee79345149a7be22eccac (patch) | |
tree | d1a1bd895e7d305cd894941ea37faebad039c354 | |
parent | 1fb7bc5aefaebf830b969c418f7987f50f4187f7 (diff) | |
download | wikitrans-a4917480cc989ce2cbaee79345149a7be22eccac.tar.gz wikitrans-a4917480cc989ce2cbaee79345149a7be22eccac.tar.bz2 |
Implement <ref> and <references>
* WikiTrans/wikimarkup.py (BaseWikiMarkup.tags): Add 'ref' and 'references'.
* WikiTrans/wikitoken.py (WikiTagNode): If the parser has the 'references'
attribute, store each <ref> there.
* WikiTrans/wikidump.py: Handle new tags.
* WikiTrans/wiki2html.py (HtmlTagNode): Handle new tags.
(HtmlWikiMarkup.references): New attribute
* WikiTrans/wiki2texi.py (TexiTagNode): Handle new tags.
* WikiTrans/wiki2text.py (TextTagNode): Handle new tags.
(TextWikiMarkup.showrefs): Renamed from references
(TextWikiMarkup.references): New attribute.
-rw-r--r-- | WikiTrans/wiki2html.py | 21 | ||||
-rw-r--r-- | WikiTrans/wiki2texi.py | 7 | ||||
-rw-r--r-- | WikiTrans/wiki2text.py | 17 | ||||
-rw-r--r-- | WikiTrans/wikidump.py | 8 | ||||
-rw-r--r-- | WikiTrans/wikimarkup.py | 2 | ||||
-rw-r--r-- | WikiTrans/wikitoken.py | 11 |
6 files changed, 59 insertions, 7 deletions
diff --git a/WikiTrans/wiki2html.py b/WikiTrans/wiki2html.py index 81b918f..7c71602 100644 --- a/WikiTrans/wiki2html.py +++ b/WikiTrans/wiki2html.py @@ -140,12 +140,31 @@ class HtmlTagNode(WikiTagNode): def format(self): if self.tag == 'code': self.parser.nested += 1 s = self.content.format() self.parser.nested -= 1 return '<pre><code>' + s + '</code></pre>' #FIXME + elif self.tag == 'ref': + n = self.idx+1 + return '<sup id="cite_ref-%d" class="reference"><a name="cite_ref-%d" href=#cite_note-%d">%d</a></sup>' % (n,n,n,n) + elif self.tag == 'references': + s = '<div class="references">\n' + s += '<ol class="references">\n' + n = 0 + for ref in self.parser.references: + n += 1 + s += ('<li id="cite_note-%d">' + \ + '<span class="mw-cite-backlink">' + \ + '<b><a href="#cite_ref-%d">^</a></b>' + \ + '</span>' + \ + '<span class="reference-text">' + \ + ref.content.format() + \ + '</span>' + \ + '</li>\n') % (n,n) + s += '</ol>\n</div>\n' + return s else: s = '<' + self.tag if self.args: s += ' ' + str(self.args) s += '>' s += self.content.format() @@ -174,13 +193,13 @@ class HtmlWikiMarkup (WikiMarkup): FIXME: 1. See WikiMarkup for a list 2. [[official position]]s : final 's' gets after closing </a> tag. Should be before. """ nested = 0 - + references = [] def __init__(self, *args, **kwargs): super(HtmlWikiMarkup, self).__init__(*args, **kwargs) self.token_class['LINK'] = HtmlLinkNode self.token_class['TMPL'] = HtmlLinkNode self.token_class['REF'] = HtmlRefNode self.token_class['IT'] = HtmlFontNode diff --git a/WikiTrans/wiki2texi.py b/WikiTrans/wiki2texi.py index 9a12d37..39c70c6 100644 --- a/WikiTrans/wiki2texi.py +++ b/WikiTrans/wiki2texi.py @@ -100,12 +100,18 @@ class TexiTagNode(WikiTagNode): 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() + elif self.tag == 'ref': + parser._print('@footnote{', escape=False); + self.content.format(); + parser._print('}', escape=False) + elif self.tag == 'references': + pass else: parser._print('<' + self.tag) if self.args: parser._print(' ' + self.args) parser._print('>'); self.content.format() @@ -338,11 +344,12 @@ class TexiWikiMarkup (WikiMarkup): self._begin_print() for elt in self.tree: elt.format() self.acc.trimpara() return self._end_print() + diff --git a/WikiTrans/wiki2text.py b/WikiTrans/wiki2text.py index 35f1aff..dc2e003 100644 --- a/WikiTrans/wiki2text.py +++ b/WikiTrans/wiki2text.py @@ -101,13 +101,13 @@ class TextLinkNode(WikiSeqNode): return "" (qual,sep,tgt) = arg.partition(':') if tgt != '': ns = self.parser.wiki_ns_name(qual) if ns: if ns == 'NS_IMAGE': - if not self.parser.references: + if not self.parser.showrefs: return "" text = "[%s: %s]" % (qual, text if text else arg) tgt = self.image_base + '/' + \ url_quote(tgt) + \ '/250px-' + url_quote(tgt) elif ns == 'NS_MEDIA': @@ -118,13 +118,13 @@ class TextLinkNode(WikiSeqNode): text = self.parser.langtab[qual] + ": " + tgt tgt = self.parser.mktgt(tgt, qual) else: tgt = self.parser.mktgt(tgt) else: tgt = self.parser.mktgt(arg) - if self.parser.references: + if self.parser.showrefs: return "%s (see %s) " % (text, tgt) elif not text or text == '': return arg else: return text @@ -187,12 +187,18 @@ class TextIndNode(WikiIndNode): class TextTagNode(WikiTagNode): def format(self): if self.tag == 'code': self.parser.nested += 1 s = self.content.format() self.parser.nested -= 1 + elif self.tag == 'ref': + s = '[%d]' % (self.idx+1) + elif self.tag == 'references': + s = '\nReferences:\n' + for ref in self.parser.references: + s += ('[%d]. ' % (ref.idx+1)) + ref.content.format() + '\n' else: s = '<' + self.tag if self.args: s += ' ' + str(self.args) s += '>' + self.content.format() + '</' + self.tag + '>' return s @@ -203,25 +209,28 @@ class TextWikiMarkup (WikiMarkup): A (general-purpose Wiki->Text translator class. """ # Output width width = 78 # Do not show references. - references = False + showrefs = False # Provide a minimum markup markup = True # Number of current element in the environment num = 0 + + # Array of footnote references + references = [] def __init__(self, *args, **keywords): super(TextWikiMarkup,self).__init__(*args, **keywords) if 'width' in keywords: self.width = keywords['width'] if 'refs' in keywords: - self.references = keywords['refs'] + self.showrefs = keywords['refs'] if 'markup' in keywords: self.markup = keywords['markup'] self.token_class['SEQ'] = TextSeqNode self.token_class['TEXT'] = TextTextNode self.token_class['PRE'] = TextPreNode self.token_class['PARA'] = TextParaNode diff --git a/WikiTrans/wikidump.py b/WikiTrans/wikidump.py index 5b257f9..7457dfa 100644 --- a/WikiTrans/wikidump.py +++ b/WikiTrans/wikidump.py @@ -16,14 +16,22 @@ from __future__ import print_function from WikiTrans.wikitoken import * import json from WikiTrans.wikimarkup import WikiMarkup +class DumpReferences(object): + idx = 0 + def __len__(self): + return self.idx + 1 + def append(self, obj): + self.idx += 1 + class DumpWikiMarkup(WikiMarkup): indent = None + references = DumpReferences() def __init__(self, **kwarg): n = kwarg.pop('indent', None) if n != None: self.indent = int(n) WikiMarkup.__init__(self, **kwarg) def __str__(self): diff --git a/WikiTrans/wikimarkup.py b/WikiTrans/wikimarkup.py index af97063..0987da2 100644 --- a/WikiTrans/wikimarkup.py +++ b/WikiTrans/wikimarkup.py @@ -111,13 +111,13 @@ class BaseWikiMarkup(object): toklist = None tokind = 0 newline = 0 tree = None - tags = [ 'code', 'nowiki', 'tt', 'div' ] + tags = [ 'code', 'nowiki', 'tt', 'div', 'ref', 'references' ] debug_level = 0 def dprint(self, lev, fmt, *argv): if self.debug_level >= lev: for l in (fmt % argv).split('\n'): diff --git a/WikiTrans/wikitoken.py b/WikiTrans/wikitoken.py index 5606ecc..2238a66 100644 --- a/WikiTrans/wikitoken.py +++ b/WikiTrans/wikitoken.py @@ -58,12 +58,14 @@ class WikiNode(object): def format(self): pass class WikiContentNode(WikiNode): content = None + def format(self): + pass @jsonencoder def jsonEncode(self): ret = {} if self.content: if self.type == 'TEXT': ret['content'] = self.content @@ -111,19 +113,26 @@ class WikiDelimNode(WikiContentNode): continuation = False class WikiTagNode(WikiContentNode): tag = None isblock = False args = None + idx = None + def __init__(self, *args, **keywords): + super(WikiTagNode, self).__init__(*args, **keywords) + if self.type == 'TAG' and self.tag == 'ref' and hasattr(self.parser,'references'): + self.idx = len(self.parser.references) + self.parser.references.append(self) @jsonencoder def jsonEncode(self): return { 'tag': self.tag, 'isblock': self.isblock, 'args': self.args.tab if self.args else None, - 'content': self.content.jsonEncode() + 'content': self.content.jsonEncode() if self.content else None, + 'idx': self.idx } class WikiRefNode(WikiContentNode): type = 'REF' ref = None @jsonencoder |