diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-26 23:56:26 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-26 23:56:32 +0200 |
commit | 34268ebe03133b799208da261dbdbf7c0fb40b93 (patch) | |
tree | 355c58a6d9a8325ff1d395b6dadff2cec8013271 | |
parent | 67cd79c3c64d6dfe73ff5dd80ba51d0bf9267b04 (diff) | |
download | wikitrans-34268ebe03133b799208da261dbdbf7c0fb40b93.tar.gz wikitrans-34268ebe03133b799208da261dbdbf7c0fb40b93.tar.bz2 |
Fix HTML generation.
* wikins.py: New file (automatically generated.)
* build-aux/extrns.php: New file (generator for the above).
* wiki2html.py (HtmlWikiMarkup.image_kw, target): Remove
(wiki_ns_name,link,mktgt): New methods.
(str_link,str_tmpl): Rewrite using self.link.
* wiki2text.py, wikimarkup.py (__init__): Fix handling of multiple keywords.
-rw-r--r-- | build-aux/extrns.php | 71 | ||||
-rw-r--r-- | wiki2html.py | 83 | ||||
-rw-r--r-- | wiki2text.py | 2 | ||||
-rw-r--r-- | wikimarkup.py | 33 | ||||
-rw-r--r-- | wikins.py | 3040 |
5 files changed, 3174 insertions, 55 deletions
diff --git a/build-aux/extrns.php b/build-aux/extrns.php new file mode 100644 index 0000000..e2e8c4f --- /dev/null +++ b/build-aux/extrns.php | |||
@@ -0,0 +1,71 @@ | |||
1 | <?php | ||
2 | $nss = array(); | ||
3 | $ns_res = array(); | ||
4 | function select_ns($file, $lang) | ||
5 | { | ||
6 | global $nss, $ns_res; | ||
7 | |||
8 | include($file); | ||
9 | if (isset($namespaceNames)) { | ||
10 | array_push($nss, $lang); | ||
11 | printf("wiki_ns_%s = {\n", $lang); | ||
12 | $reg = array(); | ||
13 | foreach ($namespaceNames as $ns => $val) { | ||
14 | if ($val == '') | ||
15 | continue; | ||
16 | if (preg_match('/(.*)\$1(.*)/', $val, $matches)) | ||
17 | array_push($reg, | ||
18 | array($matches[1], $matches[2], | ||
19 | $ns)); | ||
20 | else | ||
21 | printf(" \"%s\": \"%s\",\n", $val, $ns); | ||
22 | } | ||
23 | print "}\n"; | ||
24 | if (count($reg)) { | ||
25 | array_push($ns_res, $lang); | ||
26 | printf("wiki_ns_re_%s = [\n", $lang); | ||
27 | foreach ($reg as $val) { | ||
28 | printf(" (\"%s\", \"%s\", \"%s\"),\n", | ||
29 | $val[0], $val[1], $val[2]); | ||
30 | } | ||
31 | print "]\n"; | ||
32 | } | ||
33 | } | ||
34 | } | ||
35 | |||
36 | |||
37 | function process_dir($dir) | ||
38 | { | ||
39 | if (!($dp = opendir ($dir))) | ||
40 | die ("Can't open data directory."); | ||
41 | while ($name = readdir ($dp)) { | ||
42 | if (preg_match('|.*/?Messages([A-Z][a-z_-]+).php|', $name, $matches)) { | ||
43 | $lang = strtolower($matches[1]); | ||
44 | #print "$lang\n"; | ||
45 | select_ns($name, $lang); | ||
46 | } | ||
47 | |||
48 | } | ||
49 | closedir ($dp); | ||
50 | } | ||
51 | |||
52 | echo "# This file is generated automatically. Do not edit.\n"; | ||
53 | echo "# -*- coding: utf-8 -*-\n"; | ||
54 | process_dir("."); | ||
55 | |||
56 | print "wiki_ns = {\n"; | ||
57 | if (count($nss)) { | ||
58 | foreach ($nss as $lang) | ||
59 | printf(" \"%s\": wiki_ns_%s,\n", $lang, $lang); | ||
60 | } | ||
61 | print "}\n"; | ||
62 | |||
63 | print "wiki_ns_re = {\n"; | ||
64 | if (count($ns_res)) { | ||
65 | foreach ($nss as $lang) | ||
66 | printf(" \"%s\": wiki_ns_re_%s,\n", $lang, $lang); | ||
67 | } | ||
68 | print "}\n"; | ||
69 | |||
70 | |||
71 | ?> | ||
diff --git a/wiki2html.py b/wiki2html.py index 7fa97b7..4e0e78a 100644 --- a/wiki2html.py +++ b/wiki2html.py | |||
@@ -17,6 +17,7 @@ | |||
17 | 17 | ||
18 | from wikimarkup import * | 18 | from wikimarkup import * |
19 | from types import TupleType | 19 | from types import TupleType |
20 | from wikins import wiki_ns_re, wiki_ns | ||
20 | import urllib | 21 | import urllib |
21 | 22 | ||
22 | class HtmlWikiMarkup (WikiMarkup): | 23 | class HtmlWikiMarkup (WikiMarkup): |
@@ -27,16 +28,6 @@ class HtmlWikiMarkup (WikiMarkup): | |||
27 | Should be before. | 28 | Should be before. |
28 | """ | 29 | """ |
29 | 30 | ||
30 | # FIXME: Awful kludge | ||
31 | image_kw = [ 'Image', | ||
32 | 'Grafika', | ||
33 | 'Bild', | ||
34 | 'Εικόνα', | ||
35 | 'Dosiero', | ||
36 | 'Slika', | ||
37 | 'Resim' | ||
38 | ] | ||
39 | |||
40 | ST_INIT = 0 | 31 | ST_INIT = 0 |
41 | ST_PARA = 1 | 32 | ST_PARA = 1 |
42 | ST_OPEN = 2 | 33 | ST_OPEN = 2 |
@@ -58,43 +49,59 @@ class HtmlWikiMarkup (WikiMarkup): | |||
58 | else: | 49 | else: |
59 | return "" | 50 | return "" |
60 | 51 | ||
61 | 52 | ||
62 | def target(self, t): | 53 | def wiki_ns_name(self, str): |
63 | (qual,sep,tgt) = t.partition(':') | 54 | if str in wiki_ns[self.lang]: |
64 | r = None | 55 | return wiki_ns[self.lang][str] |
65 | if tgt != '': | 56 | elif str in wiki_ns_re[self.lang]: |
66 | if qual in self.image_kw: | 57 | for elt in wiki_ns_re[self.lang][str]: |
67 | t = self.image_base + urllib.quote(tgt) + '/250px-' + urllib.quote(tgt) | 58 | if str.beginswith(elt[0]) and str.endswith(elt[1]): |
68 | elif qual == "Media": | 59 | return elt[2] |
69 | t = self.media_base + '/' + tgt | 60 | return None |
70 | elif qual in self.langtab: | 61 | |
71 | t = self.html_base % { 'lang' : qual } + '/' + urllib.quote(tgt) | ||
72 | r = self.langtab[qual] | ||
73 | else: | ||
74 | t = self.html_base % { 'lang' : self.lang } + '/' + urllib.quote(t) | ||
75 | else: | ||
76 | t = self.html_base % { 'lang' : self.lang } + '/' + urllib.quote(t) | ||
77 | return t, r | ||
78 | 62 | ||
79 | envhdr = [ "ul", "ol", "dl" ] | 63 | envhdr = [ "ul", "ol", "dl" ] |
80 | envel = [ "li", "li", "dd" ] | 64 | envel = [ "li", "li", "dd" ] |
81 | 65 | ||
82 | def str_link(self, tok, env): | 66 | def mktgt(self, tgt): |
67 | return self.html_base % { 'lang' : self.lang } + '/' + urllib.quote(tgt) | ||
68 | |||
69 | def link(self, tok, env, istmpl): | ||
83 | arg = self.fmtok(tok[1], env) | 70 | arg = self.fmtok(tok[1], env) |
84 | (target, r) = self.target(arg) | ||
85 | text = self.fmtok(tok[2], env) | 71 | text = self.fmtok(tok[2], env) |
86 | return "<a href=\"%s\">%s</a>" % (target, | 72 | (qual,sep,tgt) = arg.partition(':') |
73 | if tgt != '': | ||
74 | ns = self.wiki_ns_name(qual) | ||
75 | if ns: | ||
76 | if ns == 'NS_IMAGE': | ||
77 | return "<img src=\"%s\" alt=\"[ %s ]\" />" % \ | ||
78 | (self.image_base + '/' + \ | ||
79 | urllib.quote(tgt) + \ | ||
80 | '/250px-' + urllib.quote(tgt), | ||
81 | text if text else arg) | ||
82 | elif ns == 'NS_MEDIA': | ||
83 | tgt = self.media_base + '/' + tgt | ||
84 | else: | ||
85 | tgt = self.mktgt(tgt) | ||
86 | elif not istmpl and qual in self.langtab: | ||
87 | tgt = self.html_base % { 'lang' : qual } + \ | ||
88 | '/' + urllib.quote(tgt) | ||
89 | if not text or text == '': | ||
90 | text = self.langtab[qual] | ||
91 | else: | ||
92 | tgt = self.mktgt(tgt) | ||
93 | else: | ||
94 | tgt = self.mktgt(arg) | ||
95 | return "<a href=\"%s\">%s</a>" % (tgt, | ||
87 | text if (text and text != '') \ | 96 | text if (text and text != '') \ |
88 | else \ | 97 | else arg) |
89 | r if r else arg) | 98 | |
99 | |||
100 | def str_link(self, tok, env): | ||
101 | return self.link(tok, env, False) | ||
90 | 102 | ||
91 | def str_tmpl(self, tok, env): | 103 | def str_tmpl(self, tok, env): |
92 | arg = self.fmtok(tok[1], env) | 104 | return self.link(tok, env, True) |
93 | (target, r) = self.target(arg) | ||
94 | text = self.fmtok(tok[2], env) | ||
95 | return "<a href=\"%s\">%s</a>" % (target, | ||
96 | text if (text and text != '') \ | ||
97 | else arg) | ||
98 | 105 | ||
99 | def str_ref(self, tok, env): | 106 | def str_ref(self, tok, env): |
100 | target = self.fmtok(tok[1], env) | 107 | target = self.fmtok(tok[1], env) |
diff --git a/wiki2text.py b/wiki2text.py index 3669bd7..66563a6 100644 --- a/wiki2text.py +++ b/wiki2text.py | |||
@@ -32,7 +32,7 @@ class TextWikiMarkup (WikiMarkup): | |||
32 | WikiMarkup.__init__(self, *args, **keywords) | 32 | WikiMarkup.__init__(self, *args, **keywords) |
33 | if 'width' in keywords: | 33 | if 'width' in keywords: |
34 | self.width = keywords['width'] | 34 | self.width = keywords['width'] |
35 | elif 'refs' in keywords: | 35 | if 'refs' in keywords: |
36 | self.references = keywords['refs'] | 36 | self.references = keywords['refs'] |
37 | 37 | ||
38 | def target(self, t): | 38 | def target(self, t): |
diff --git a/wikimarkup.py b/wikimarkup.py index e2a1cab..7a7125e 100644 --- a/wikimarkup.py +++ b/wikimarkup.py | |||
@@ -351,25 +351,26 @@ class WikiMarkup (BaseWikiMarkup): | |||
351 | file = None | 351 | file = None |
352 | text = None | 352 | text = None |
353 | lang = 'en' | 353 | lang = 'en' |
354 | html_base = 'http://%(lang)s.wiktionary.org' | 354 | html_base = 'http://%(lang)s.wiktionary.org/wiki' |
355 | image_base = 'http://upload.wikimedia.org/wikipedia/commons/thumb/a/bf/' | 355 | image_base = 'http://upload.wikimedia.org/wikipedia/commons/thumb/a/bf' |
356 | media_base = 'http://www.mediawiki.org/xml/export-0.3' | 356 | media_base = 'http://www.mediawiki.org/xml/export-0.3' |
357 | 357 | ||
358 | def __init__(self, *args, **keywords): | 358 | def __init__(self, *args, **keywords): |
359 | if 'file' in keywords: | 359 | for kw in keywords: |
360 | self.file = keywords['file'] | 360 | if kw == 'file': |
361 | elif 'filename' in keywords: | 361 | self.file = keywords[kw] |
362 | self.file = open(keywords['filename']) | 362 | elif kw == 'filename': |
363 | elif 'text' in keywords: | 363 | self.file = open(keywords[kw]) |
364 | self.text = keywords['text'].split("\n") | 364 | elif kw == 'text': |