summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2015-07-24 12:20:50 +0300
committerSergey Poznyakoff <gray@gnu.org>2015-07-24 12:58:27 +0300
commit4e4519b079fdc723a885741c306a51be245e2111 (patch)
tree9406fbb615106dc9dc1258ae1042557bba938973
parentad4e807c77cda717a74083cdd9a36250027bd096 (diff)
downloadwikitrans-4e4519b079fdc723a885741c306a51be245e2111.tar.gz
wikitrans-4e4519b079fdc723a885741c306a51be245e2111.tar.bz2
Use WikiNode.format function to format nodes for output.
* WikiTrans/wikitoken.py (parser): New attribute. (__init__): Take three arguments. Second one is the parser that creates this node. (jsonEncode): Omit parser. * WikiTrans/wikimarkup.py (__createWikiNode): Pass self as the first argument to the constructor. * WikiTrans/wiki2html.py: Use derived node classes. * WikiTrans/wiki2texi.py: Likewise. * WikiTrans/wiki2text.py: Likewise.
-rw-r--r--WikiTrans/wiki2html.py322
-rw-r--r--WikiTrans/wiki2texi.py375
-rw-r--r--WikiTrans/wiki2text.py200
-rw-r--r--WikiTrans/wikimarkup.py7
-rw-r--r--WikiTrans/wikitoken.py13
5 files changed, 548 insertions, 369 deletions
diff --git a/WikiTrans/wiki2html.py b/WikiTrans/wiki2html.py
index 0d92e0a..0309ae3 100644
--- a/WikiTrans/wiki2html.py
+++ b/WikiTrans/wiki2html.py
@@ -15,7 +15,9 @@
15# You should have received a copy of the GNU General Public License 15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>. 16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
18from __future__ import print_function
18from wikimarkup import * 19from wikimarkup import *
20from wikitoken import *
19from wikins import wiki_ns_re, wiki_ns 21from wikins import wiki_ns_re, wiki_ns
20import re 22import re
21try: 23try:
@@ -24,7 +26,143 @@ except ImportError:
24 from urllib.parse import quote as url_quote 26 from urllib.parse import quote as url_quote
25 27
26__all__ = [ "HtmlWikiMarkup", "HtmlWiktionaryMarkup" ] 28__all__ = [ "HtmlWikiMarkup", "HtmlWiktionaryMarkup" ]
29
30class HtmlSeqNode(WikiSeqNode):
31 def format(self):
32 s = ''
33 for x in self.content:
34 s += x.format()
35 return s
36
37class HtmlLinkNode(HtmlSeqNode):
38 def format(self):
39 arg = self.content[0].format()
40 text = None
41 if len(self.content) > 1:
42 s = [x for x in map(lambda x: x.format(), self.content)]
43 if s[0] == 'disambigR' or s[0] == 'wikiquote':
44 return ""
45 elif len(s) > 1 and s[1] == 'thumb':
46 return ""
47 text = '<span class="template">' + s[1] + '</span>'
48 if self.type == 'TMPL':
49 if re.match("t[+-]$", s[0]):
50 if len(s) > 2:
51 text = s[2]
52 elif s[0] == "term":
53 text = self.parser.tmpl_term(s)
54 elif s[0] == "proto":
55 text = self.parser.tmpl_proto(s)
56 return text
57
58 (qual,sep,tgt) = arg.partition(':')
59 if tgt != '':
60 ns = self.parser.wiki_ns_name(qual)
61 if ns:
62 if ns == 'NS_IMAGE':
63 return ''
64 elif ns == 'NS_MEDIA':
65 tgt = self.parser.media_base + '/' + tgt
66 else:
67 tgt = self.parser.mktgt(tgt)
68 elif self.type == 'LINK' and qual in self.parser.langtab:
69 tgt = self.parser.mktgt(tgt, qual)
70 if not text or text == '':
71 text = self.parser.langtab[qual]
72 else:
73 tgt = self.parser.mktgt(tgt)
74 else:
75 tgt = self.parser.mktgt(arg)
76 return "<a href=\"%s\">%s</a>" % (tgt,
77 text if (text and text != '') \
78 else arg)
79
80class HtmlRefNode(WikiRefNode):
81 def format(self):
82 target = self.ref
83 text = self.content.format()
84 return "<a href=\"%s\">%s</a>" % (target,
85 text if (text and text != '') \
86 else target)
87
88class HtmlFontNode(HtmlSeqNode):
89 def format(self):
90 comm = { 'IT': 'i',
91 'BOLD': 'b' }
92 s = '<%s>' % comm[self.type]
93 for x in self.content:
94 s += x.format()
95 s += '</%s>' % comm[self.type]
96 return s
97
98class HtmlTextNode(HtmlSeqNode):
99 def format(self):
100 if isinstance(self.content,list):
101 s = ''.join(self.content)
102 else:
103 s = self.content
104 return s
27 105
106class HtmlHdrNode(WikiHdrNode):
107 def format(self):
108 level = self.level
109 if level > 4:
110 level = 4
111 return "<h%s>%s</h%s>\n\n" % (level, self.content.format(), level)
112
113class HtmlBarNode(WikiNode):
114 def format(self):
115 return "<hr/>\n"
116
117class HtmlEnvNode(WikiEnvNode):
118 def format(self):
119 type = self.envtype
120 lev = self.level
121 if lev > 4:
122 lev = 2
123 string = ""
124 for s in self.content:
125 n = s.subtype;
126 string += "<%s>%s</%s>" % (self.parser.envt[type]["elt"][n],
127 s.content.format(),
128 self.parser.envt[type]["elt"][n])
129 return "<%s>%s</%s>" % (self.parser.envt[type]["hdr"],
130 string,
131 self.parser.envt[type]["hdr"])
132 return string
133
134class HtmlTagNode(WikiTagNode):
135 def format(self):
136 if self.tag == 'code':
137 self.parser.nested += 1
138 s = self.content.format()
139 self.parser.nested -= 1
140 return '<pre><code>' + s + '</code></pre>' #FIXME
141 else:
142 s = '<' + self.tag
143 if self.args:
144 s += ' ' + str(self.args)
145 s += '>'
146 s += self.content.format()
147 return s + '</' + self.tag + '>'
148
149class HtmlParaNode(HtmlSeqNode):
150 def format(self):
151 return "<p>" + super(HtmlParaNode, self).format() + "</p>\n"
152
153class HtmlPreNode(HtmlSeqNode):
154 def format(self):
155 s = super(HtmlPreNode, self).format()
156 if self.parser.nested:
157 return s
158 else:
159 return '<pre>' + s + '</pre>'
160
161class HtmlIndNode(WikiIndNode):
162 def format(self):
163 return ("<dl><dd>" * self.level) + self.content.format() + "</dd></dl>" * self.level
164
165
28class HtmlWikiMarkup (WikiMarkup): 166class HtmlWikiMarkup (WikiMarkup):
29 """ 167 """
30 A (hopefully) general-purpose Wiki->HTML translator class. 168 A (hopefully) general-purpose Wiki->HTML translator class.
@@ -35,6 +173,23 @@ class HtmlWikiMarkup (WikiMarkup):
35 173
36 nested = 0 174 nested = 0
37 175
176 def __init__(self, *args, **kwargs):
177 super(HtmlWikiMarkup, self).__init__(*args, **kwargs)
178 self.token_class['LINK'] = HtmlLinkNode
179 self.token_class['TMPL'] = HtmlLinkNode
180 self.token_class['REF'] = HtmlRefNode
181 self.token_class['IT'] = HtmlFontNode
182 self.token_class['BOLD'] = HtmlFontNode
183 self.token_class['HDR'] = HtmlHdrNode
184 self.token_class['BAR'] = HtmlBarNode
185 self.token_class['ENV'] = HtmlEnvNode
186 self.token_class['TAG'] = HtmlTagNode
187 self.token_class['PARA'] = HtmlParaNode
188 self.token_class['PRE'] = HtmlPreNode
189 self.token_class['IND'] = HtmlIndNode
190 self.token_class['TEXT'] = HtmlTextNode
191 self.token_class['SEQ'] = HtmlSeqNode
192
38 def wiki_ns_name(self, str): 193 def wiki_ns_name(self, str):
39 if str in wiki_ns[self.lang]: 194 if str in wiki_ns[self.lang]:
40 return wiki_ns[self.lang][str] 195 return wiki_ns[self.lang][str]
@@ -85,175 +240,10 @@ class HtmlWikiMarkup (WikiMarkup):
85 text += ' <span class="meaning">(' + s[-2] + ')</span>' 240 text += ' <span class="meaning">(' + s[-2] + ')</span>'
86 return text 241 return text
87 242
88
89 def fmtlink(self, elt, istmpl):
90 arg = self.format(elt.content[0])
91 text = None
92 if len(elt.content) > 1:
93 s = [x for x in map(self.format, elt.content)]
94 if s[0] == 'disambigR' or s[0] == 'wikiquote':
95 return ""
96 elif len(s) > 1 and s[1] == 'thumb':
97 return ""
98 text = '<span class="template">' + s[1] + '</span>'
99 if istmpl:
100 if re.match("t[+-]$", s[0]):
101 if len(s) > 2:
102 text = s[2]
103 elif s[0] == "term":
104 text = self.tmpl_term(s)
105 elif s[0] == "proto":
106 text = self.tmpl_proto(s)
107 return text
108
109 (qual,sep,tgt) = arg.partition(':')
110 if tgt != '':
111 ns = self.wiki_ns_name(qual)
112 if ns:
113 if ns == 'NS_IMAGE':
114 return ''
115 elif ns == 'NS_MEDIA':
116 tgt =