/services/tokipana.cgi
#!/usr/bin/env python
"""
Toki Pona to English Translation CGI
Author: Sean B. Palmer, inamidst.com
"""
import cgitb; cgitb.enable()
import sys, os, re, urllib
import cgi, random, textwrap
r_wordOrTag = re.compile(r'((?:[A-Za-z]+)|(?:<(?!\!)[^>]+>))')
r_head = re.compile(r'(?ims)<head[^>]*>')
form = cgi.FieldStorage()
form.__call__ = lambda s: form[s].value
nimi = {}
if os.path.isfile('./nimi.txt'):
nimifn = './nimi.txt'
else: nimifn = '../misc/nimi.txt'
f = open(nimifn)
for line in f:
line = line.rstrip('\r\n')
word, translations = line.split(': ', 1)
translations = translations.split(', ')
nimi[word] = translations
f.close()
def translateWord(word):
w = word.lower()
if nimi.has_key(w):
return random.choice(nimi[w])
return {'li': 'is', 'la': "it's said", 'e': 'such'}.get(w) or word
def translate(s):
def translateMatch(m):
wordOrTag = m.group(1)
if wordOrTag.startswith('<'):
return wordOrTag
return translateWord(wordOrTag)
return r_wordOrTag.sub(translateMatch, s)
def translateURI(uri):
u = urllib.urlopen(uri)
translation = translate(u.read())
u.close()
return translation
def homepage():
print textwrap.dedent(("""
Content-Type: text/html; charset=utf-8
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TokiPana - Toki Pona to English Translation Service</title>
<link rel="stylesheet" type="text/css" href="/trove/svc.css" />
</head>
<body>
<h1>Toki Pona to English Translation</h1>
<form action="./tokipana" method="GET">
<div>URI: <input type="text" name="uri" size="35" />
<input type="submit" value="Translate" /></div>
</form>
<form action="./tokipana" method="GET">
<div><textarea name="text" cols="75" rows="7"></textarea></div>
<div>Text: <input type="submit" value="Translate" /></div>
</form>
<ul>
<li>Example One: <a href="./tokipana?uri=http%3A%2F%2F""" +
"""miscoranda.com%2Fcomments%2F127"
>Jan Wasolitawa's comment on "On Toki Pona"</a></li>
<li>Example Two: <a href="./tokipana?uri=http%3A%2F%2F""" +
"""www.livejournal.com%2Fcommunity%2Ftokipona%2F6724.html"
>Stairway to Heaven (lyrics), from Toki Pona</a></li>
</ul>
<p>More information: <a title="about">about this service</a>, <a
href="/inside/services/tokipana">Python source</a>.</p>
<address>
<a href="http://inamidst.com/sbp/">Sean B. Palmer</a>
</address>
</body>
</html>
""").lstrip('\n'))
sys.exit()
def serve():
if form.has_key('uri'):
uri = form('uri')
else: uri = False
if form.has_key('text'):
text = form('text')
else: text = False
if uri:
assert ':' in uri
u = urllib.urlopen(uri)
info = u.info()
text = u.read()
u.close()
mediatype = info.get('Content-Type') or 'text/html; charset=utf-8'
if mediatype.startswith('text/html'):
base = '\n<base href="%s" />\n' % uri
m = r_head.search(text)
if m:
endpos = m.end()
text = text[:endpos] + base + text[endpos:]
else: text = base + text
elif text: mediatype = 'text/plain; charset=utf-8'
else: homepage()
print "Content-Type: %s" % mediatype
print
result = translate(text)
if text:
def wrap(line):
return '\n'.join(textwrap.wrap(line, width=79))
result = '\n'.join(wrap(line) for line in result.splitlines())
print result
def main():
fn = sys.argv[1]
print translateURI(fn)
if __name__=="__main__":
if os.environ.has_key('SCRIPT_NAME'):
serve()
else: main()