diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2015-07-24 12:20:50 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2015-07-24 12:58:27 +0300 |
commit | 4e4519b079fdc723a885741c306a51be245e2111 (patch) | |
tree | 9406fbb615106dc9dc1258ae1042557bba938973 | |
parent | ad4e807c77cda717a74083cdd9a36250027bd096 (diff) | |
download | wikitrans-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.py | 322 | ||||
-rw-r--r-- | WikiTrans/wiki2texi.py | 375 | ||||
-rw-r--r-- | WikiTrans/wiki2text.py | 200 | ||||
-rw-r--r-- | WikiTrans/wikimarkup.py | 7 | ||||
-rw-r--r-- | WikiTrans/wikitoken.py | 13 |
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 | ||
18 | from __future__ import print_function | ||
18 | from wikimarkup import * | 19 | from wikimarkup import * |
20 | from wikitoken import * | ||
19 | from wikins import wiki_ns_re, wiki_ns | 21 | from wikins import wiki_ns_re, wiki_ns |
20 | import re | 22 | import re |
21 | try: | 23 | try: |
@@ -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 | |||
30 | class HtmlSeqNode(WikiSeqNode): | ||
31 | def format(self): | ||
32 | s = '' | ||
33 | for x in self.content: | ||
34 | s += x.format() | ||
35 | return s | ||
36 | |||
37 | class 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 | |||
80 | class 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 | |||
88 | class 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 | |||
98 | class 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 | ||
106 | class 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 | |||
113 | class HtmlBarNode(WikiNode): | ||
114 | def format(self): | ||
115 | return "<hr/>\n" | ||
116 | |||
117 | class 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 | |||
134 | class 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 | |||
149 | class HtmlParaNode(HtmlSeqNode): | ||
150 | def format(self): | ||
151 | return "<p>" + super(HtmlParaNode, self).format() + "</p>\n" | ||
152 | |||
153 | class 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 | |||
161 | class HtmlIndNode(WikiIndNode): | ||
162 | def format(self): | ||
163 | return ("<dl><dd>" * self.level) + self.content.format() + "</dd></dl>" * self.level | ||
164 | |||
165 | |||
28 | class HtmlWikiMarkup (WikiMarkup): | 166 | class 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 = |