Moving more modules
[apertium.git] / trunk / apertium-forms-server / interface.py
blobb7f51a5378e598b1ea55c63b2f2ad38274cd742b
1 #!/usr/bin/python2.5
2 # coding=utf-8
3 # -*- encoding: utf-8 -*-
5 import sys, string, codecs, xml, re, Ft;
6 from Ft.Xml.XPath import Evaluate;
8 sys.stdout = codecs.getwriter('utf-8')(sys.stdout);
9 sys.stderr = codecs.getwriter('utf-8')(sys.stderr);
12 # This class implements the HTML interface for the
13 # forms. If you want to change how they look, make
14 # the change here.
17 class Interface: #{
19 def display(self, post_data): #{
21 if post_data['committing'] == 'yes': #{
22 left_entrada = self.show_entrada(post_data, 'left');
23 bidix_entrada = self.show_entrada(post_data, 'bidix');
24 right_entrada = self.show_entrada(post_data, 'right');
26 print '<pre>';
27 print left_entrada.replace('<', '&lt;').replace('>', '&gt;');
28 print "\n";
29 print bidix_entrada.replace('<', '&lt;').replace('>', '&gt;');
30 print "\n";
31 print right_entrada.replace('<', '&lt;').replace('>', '&gt;');
32 print '</pre>';
34 selected_pair = post_data['selected_pair'];
35 pairs = post_data['pairs'];
36 post_data['left_dictionary'].append(left_entrada);
37 post_data['bidix_dictionary'].append(bidix_entrada);
38 post_data['right_dictionary'].append(right_entrada);
40 print '<a href="http://xixona.dlsi.ua.es:8080/">again!</a>';
42 return '';
45 #print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">';
46 print '<html>';
47 print '<head>';
48 print ' <title>Apertium dictionary management</title>';
49 print ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ';
50 print ' <link rel="stylesheet" type="text/css" href="/static/styles/default.css"/>';
51 print ' <script src="/static/js/boxover.js"></script> ';
52 print '</head>';
53 print '<body>';
54 print '<form action="add" method="POST" name="dixform">';
55 ######################################################################################################
56 # Header
57 ######################################################################################################
58 print '<div class="header">';
59 print ' <div class="leftm">';
60 print ' <a href="http://xixona.dlsi.ua.es:8080/">Home</a>';
61 print ' </div>';
62 print ' <div class="middlem"> <!-- Header -->';
63 print ' Language pair: <select name="selected_pair" onChange="dixform.submit();">';
64 for pair in post_data['pairs'].keys(): #{
65 if pair == post_data['selected_pair']: #{
66 print ' <option value="' + pair + '" selected>' + pair + '</option>';
67 else: #{
68 print ' <option value="' + pair + '">' + pair + '</option>';
71 print ' </select>';
72 print ' Part-of-speech: <select name="selected_tag" onChange="dixform.submit();">';
73 for tag in post_data['tags'].keys(): #{
74 if tag == post_data['selected_tag']: #{
75 print ' <option value="' + tag + '" selected>' + tag + '</option>';
76 else: #{
77 print ' <option value="' + tag + '">' + tag + '</option>';
80 print ' </select>';
81 print ' </div>';
82 print ' <div class="rightm">';
83 print ' ca · en · es';
84 print ' </div>';
85 print '</div>';
86 ######################################################################################################
87 # Left side
88 ######################################################################################################
89 print '<div class="container800">';
90 print ' <div class="row">';
91 print ' <div class="leftm"> <!-- Left -->';
92 print ' <div class="container">';
93 print ' <div class="row">';
94 print ' <div class="left">';
95 print ' Lemma:<sup><span class="tooltip" title="header=[Lemma] body=[Type in the lemma, or citation form of the word you wish to add.]">?</span></sup>';
96 print ' </div>';
97 print ' <div class="left">';
98 print ' <input type="text" name="left_lemma" value="' + post_data['left_lemma'] + '">';
99 print ' </div>';
100 print ' </div>';
101 print ' <div class="row">';
102 print ' <div class="left">';
103 print ' Paradigm:<sup><span class="tooltip" title="header=[Paradigm] body=[Paradigms define how a word inflects, select the one that fits the lemma you added.]">?</span></sup>';
104 print ' </div>';
105 print ' <div class="left">';
106 print ' <select name="left_paradigm">';
107 for left_p in post_data['left_paradigms']: #{
108 if post_data['left_display_mode'] == 'list' and left_p not in post_data['left_glosses']: #{
109 continue;
111 if left_p == post_data['left_paradigm']: #{
112 if left_p in post_data['left_glosses']: #{
113 print ' <option value="' + left_p + '" selected>' + post_data['left_glosses'][left_p] + '</option>';
114 else: #{
115 print ' <option value="' + left_p + '" selected>' + left_p + '</option>';
116 else: #{
117 if left_p in post_data['left_glosses']: #{
118 print ' <option value="' + left_p + '">' + post_data['left_glosses'][left_p] + '</option>';
119 else: #{
120 print ' <option value="' + left_p + '">' + left_p + '</option>';
124 print ' </select>';
125 print ' </div>';
126 print ' </div>';
127 print ' <div class="row">';
128 print ' <div class="left">';
129 print ' Comment:<sup><span class="tooltip" title="header=[Comment] body=[Optional comment or gloss.]">?</span></sup>';
130 print ' </div>';
131 print ' <div class="left">';
132 print ' <input type="text" name="left_comment" value="' + post_data['left_comment'] + '">';
133 print ' </div>';
134 print ' </div>';
135 print ' </div>';
136 print ' <div class="inflection">';
138 self.show_preview(post_data, 'left');
140 print ' </div>';
141 print ' </div>';
143 #################################################################################################
144 print ' <!-- Bidix side -->';
145 print ' <div class="middlem">';
146 print ' <div class="row">';
147 print ' <div class="cell">';
148 if post_data['restriction'] != 'LR' and post_data['restriction'] != 'RL': #{
149 print ' <input type="radio" name="restriction" value="none" checked/>←→';
150 else: #{
151 print ' <input type="radio" name="restriction" value="none" />←→';
153 print ' </div>';
154 print ' </div>';
155 print ' <div class="row">';
156 print ' <div class="cell">';
157 if post_data['restriction'] == 'LR': #{
158 print ' <input type="radio" name="restriction" value="LR" checked/>→→';
159 else: #{
160 print ' <input type="radio" name="restriction" value="LR" />→→';
162 print ' </div>';
163 print ' </div>';
164 print ' <div class="row">';
165 print ' <div class="cell">';
166 if post_data['restriction'] == 'RL': #{
167 print ' <input type="radio" name="restriction" value="RL" checked/>←←';
168 else: #{
169 print ' <input type="radio" name="restriction" value="RL" />←←';
171 print ' </div>';
172 print ' </div>';
173 print ' <div class="row">';
174 print ' <input type="reset" name="clear_box" value="Clear" />';
175 print ' <input type="submit" name="preview_box" value="Preview" />';
176 print ' <input type="submit" name="commit_box" value="Commit" />';
177 print ' </div>';
178 print ' </div>';
180 ############################################################################################
181 print ' <div class="leftm"> <!-- Right -->';
182 print ' <div id="left" class="container">';
183 print ' <div class="row">';
184 print ' <div class="left">';
185 print ' Lemma:<sup><span class="tooltip" title="header=[Lemma] body=[Type in the lemma, or citation form of the word you wish to add.]">?</span></sup>';
186 print ' </div>';
187 print ' <div class="left">';
188 print ' <input type="text" name="right_lemma" value="' + post_data['right_lemma'] + '">';
189 print ' </div>';
190 print ' </div>';
191 print ' <div class="row">';
192 print ' <div class="left">';
193 print ' Paradigm:<sup><span class="tooltip" title="header=[Paradigm] body=[Paradigms define how a word inflects, select the one that fits the lemma you added.]">?</span></sup>';
194 print ' </div>';
195 print ' <div class="left">';
196 print ' <select name="right_paradigm">';
197 for right_p in post_data['right_paradigms']: #{
198 if post_data['right_display_mode'] == 'list' and right_p not in post_data['right_glosses']: #{
199 continue;
201 if right_p == post_data['right_paradigm']: #{
202 if right_p in post_data['right_glosses']: #{
203 print ' <option value="' + right_p + '" selected>' + post_data['right_glosses'][right_p] + '</option>';
204 else: #{
205 print ' <option value="' + right_p + '" selected>' + right_p + '</option>';
206 else: #{
207 if right_p in post_data['right_glosses']: #{
208 print ' <option value="' + right_p + '">' + post_data['right_glosses'][right_p] + '</option>';
209 else: #{
210 print ' <option value="' + right_p + '">' + right_p + '</option>';
214 print ' </select>';
215 print ' </div>';
216 print ' </div>';
217 print ' <div class="row">';
218 print ' <div class="left">';
219 print ' Comment:<sup><span class="tooltip" title="header=[Comment] body=[Optional comment or gloss.]">?</span></sup>';
220 print ' </div>';
221 print ' <div class="left">';
222 print ' <input type="text" name="right_comment" value="' + post_data['right_comment'] + '">';
223 print ' </div>';
224 print ' </div>';
225 print ' </div>';
226 print ' <div class="inflection">';
227 self.show_preview(post_data, 'right');
228 print ' </div>';
229 print '</div>';
230 print '</div>';
233 ###############################################################################################
234 # Footer to show entradas
235 ###############################################################################################
236 print '<div class="row">';
237 print ' <div class="leftm">';
239 left_entrada = self.show_entrada(post_data, 'left');
240 print ' <pre>';
241 print left_entrada.replace('<', '&lt;').replace('>', '&gt;');
242 print ' </pre>';
243 print ' </div>';
244 print ' <div class="middlem">';
246 bidix_entrada = self.show_entrada(post_data, 'bidix');
247 print '<pre>';
248 print bidix_entrada.replace('<', '&lt;').replace('>', '&gt;');
249 print '</pre>';
250 print ' </div>';
251 print ' <div class="rightm">';
253 right_entrada = self.show_entrada(post_data, 'right');
254 print ' <pre>';
255 print right_entrada.replace('<', '&lt;').replace('>', '&gt;');
256 print ' </pre>';
257 print ' </div>';
258 print '</div>';
260 print '</form>';
261 print '</body>';
262 print '</html>';
264 return '';
267 def show_preview(self, post_data, _side): #
268 print >> sys.stderr, 'right paradigm: ' , post_data['right_paradigm'];
269 p = _side + '_paradigm';
270 if post_data['previewing'] == 'on': #{
271 paradigm = post_data[_side + '_dictionary'].get_paradigm(post_data[p], post_data['selected_tag']);
272 if type(paradigm) == type(None): #{
273 return;
275 if type(paradigm.get_stems()) != type(None): #{
276 for s in post_data[_side + '_paradigms'][paradigm.name].get_stems(): #{
277 shows = post_data[_side + '_dictionary'].get_tag_by_tag(post_data['selected_tag']).get_list();
279 if len(shows) > 0: #{
280 for show in post_data[_side + '_dictionary'].get_tag_by_tag(post_data['selected_tag']).get_list(): #{
281 if show == s[1]: #{
282 print self.incondicional(post_data[_side + '_lemma'], paradigm.name) + s[0] + '<br />';
283 print '<span class="symbol_list">' + s[1] + '</span>';
284 print '<p />';
288 else: #{
289 print self.incondicional(post_data[_side + '_lemma'], post_data[_side + '_paradigm']) + s[0] + '<br />';
290 print '<span class="symbol_list">' + s[1] + '</span>';
291 print '<p />';
294 else: #{
295 print ' No stems';
300 def show_entrada(self, post_data, _side): #{
301 if post_data['previewing'] == 'on': #{
302 if _side == 'bidix': #{
303 dictionary = post_data[_side + '_dictionary'];
304 _lemma1 = post_data['left_lemma'];
305 _lemma2 = post_data['right_lemma'];
307 if _lemma1 == '' or _lemma2 == '': #{
308 return '';
311 if type(dictionary) != None: #{
312 _tag = post_data['selected_tag'];
313 _comment = '';
314 _restriction = post_data['restriction'];
315 _author = 'webform';
316 _paradigm1 = post_data['left_dictionary'].get_paradigm(post_data['left_paradigm'], _tag);
317 _paradigm2 = post_data['right_dictionary'].get_paradigm(post_data['right_paradigm'], _tag);
319 entrada = dictionary.generate_bidix_entrada(_lemma1, _lemma2, _paradigm1, _paradigm2, _tag, _restriction, _comment, _author);
321 return entrada;
325 if _side == 'right' or _side == 'left' and post_data[_side + '_paradigm']: #{
326 dictionary = post_data[_side + '_dictionary'];
327 paradigm = post_data[_side + '_dictionary'].get_paradigm(post_data[_side + '_paradigm'], post_data['selected_tag']);
329 if type(paradigm) != type(None): #{
330 _lemma = post_data[_side + '_lemma'];
331 _restriction = post_data['restriction'];
332 _paradigm = paradigm.name;
333 _comment = post_data[_side + '_comment'];
334 _author = 'webform';
336 if _restriction == 'LR' and _side == 'right': #{
337 entrada = dictionary.generate_monodix_entrada(_lemma, _paradigm, 'RL', _comment, _author);
338 elif _restriction == 'RL' and _side == 'right': #{
339 entrada = dictionary.generate_monodix_entrada(_lemma, _paradigm, 'LR', _comment, _author);
340 else: #{
341 entrada = dictionary.generate_monodix_entrada(_lemma, _paradigm, _restriction, _comment, _author);
344 return entrada;
348 return '';
351 def incondicional(self, _lemma, _paradigm): #{
352 if _paradigm.count('/') < 1: #{
353 return _lemma;
356 paradigm = _paradigm.decode('utf-8');
357 bar_pos = paradigm.find('/');
358 und_pos = paradigm.find('_');
359 chr_str = (und_pos - bar_pos) - 1;
360 l = _lemma.decode('utf-8');
361 r = l[0:(len(l) - chr_str)];
363 return r.encode('utf-8');