2008/04/10

Recent entries from same category

  1. Vim で XML Reformat
  2. Lingr Radar For Linuxってのを書いた
  3. デスクトップアプリケーションでも認証可能なOAuth「xAuth」をpythonから試してみた。
  4. Mumblesを使ったGitHubのGrowl通知アプリケーションを作った。
  5. Python2.6にはcursesのバイナリが含まれていないので作る

追記
日本語表記を返す様に修正しました。japaneseという属性で返ります。
例) 35 : さんじゅうご

JSONとXMLをサポートしています。
template engineでjavascriptとXMLがどう処理出来るかを調べてる間に、いつのまにか作ってしまっていました...。 JSONの場合は以下の様なテンプレート

nabeatzz.json
{% if callback %}{{ callback }}({% endif %}{ number: {{ number }}, japanese: '{{ japanese }}', nabeatzz : [{% if nabeatzz %}'{{ nabeatzz|join:"','" }}'{% endif %}] }{% if callback %}){% endif %}
「value|join: "xxx"」とか便利ですね。
次にXMLの場合は

nabeatzz.xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
    <number>{{ number }}</number>
    <japanese>{{ japanese }}</japanese>{% for c in nabeatzz %}
    <nabeatzz>{{ c }}</nabeatzz>{% endfor %}
</response>
こんな感じです。これはすごい!フツーすぎます。
なお、templateについてはdjangoのtemplate engineと同じ物ですので「テンプレート作者のための Django テンプレート言語ガイド : Django オンラインドキュメント和訳」を参考にすると良いかと思います。

でpythonコードは以下

nabeatzz.py
#!-*- coding:utf-8 -*-
import os
import cgi
from google.appengine.ext.webapp import template

ndg = [
  {0: ''},
  {0: 'じゅう'},
  {0: 'ひゃく', 3: 'ぴゃく', 6: 'ぴゃく', 8: 'ぴゃく'},
  {0: 'せん', 3: 'ぜん'},
]

dig = [
  {0: ''},
  {0: 'まん'},
  {0: 'おく'},
  {0: 'ちょう'},
  {0: 'けい'},
  {0: 'がい'},
  {0: 'じょ'},
  {0: 'じょう'},
  {0: 'こう'},
  {0: 'かん'},
  {0: 'せい'},
  {0: 'さい'},
  {0: 'ごく'},
  {0: 'こうがしゃ'},
  {0: 'あそうぎ'},
  {0: 'なゆた'},
  {0: 'ふかしぎ'},
  {0: 'むりょうたいすう'}
]

num = [
  {0: 'ぜろ'},
  {0: 'いち'},
  {0: ''},
  {0: 'さん'},
  {0: 'よん'},
  {0: ''},
  {0: 'ろく', 3: 'ろっ'},
  {0: 'なな'},
  {0: 'はち', 3: 'はっ', 4: 'はっ'},
  {0: 'きゅう'}
]

def num2ja(arg):
  sn = str(arg)
  ln = len(sn)
  if sn == 0:
    return num[0][0]
  if ln >= 17*4+1:
    return dig[17][0]
  n = 0
  ret = ""

  while n < ln:
    if sn[n] != 0 and (sn[n] != 1 or (ln-n)%4 == 1):
      ret += num[int(sn[n])].has_key(ln-n) and num[int(sn[n])][ln-n] or num[int(sn[n])][0]
    if sn[n] != 0:
      ret += ndg[(ln-n-1)%4].has_key(sn[n]) and ndg[(ln-n-1)%4][int(sn[n])] or ndg[(ln-n-1)%4][0]
      ret += dig[(ln-n-1)/4].has_key(sn[n]) and dig[(ln-n-1)/4][int(sn[n])] or dig[(ln-n-1)/4][0]
    n += 1

  return ret

try:
    form = cgi.FieldStorage()
    number = ""
    format = "json"
    nabeatzz = []
    nabeatzz_3 = "アホになる"
    nabeatzz_5 = "犬っぽくなる"
    callback = ""
    mime = {
      'json': 'text/javascript',
      'xml': 'text/xml',
    }

    if form:
        if form.has_key('number'):   number = int(form['number'].value)
        if form.has_key('format'):   format = form['format'].value
        if form.has_key('callback'): callback = form['callback'].value

    if number and format in mime.keys():
        if (number % 3) == 0 or str(number).find("3") != -1: nabeatzz.append(nabeatzz_3)
        if (number % 5) == 0: nabeatzz.append(nabeatzz_5)
        template_values = {
            'number'   : number,
            'japanese' : num2ja(number),
            'nabeatzz' : nabeatzz,
            'callback' : callback,
        }
        print "Content-Type: %s; charset=UTF-8" % mime[format]
        print ""
        path = os.path.join(os.path.dirname(__file__), 'nabeatzz.%s' % format)
        print template.render(path, template_values)
    else:
        print "Content-Type: text/html; charset=UTF-8"
        print ""
        path = os.path.join(os.path.dirname(__file__), 'nabeatzz.html')
        print template.render(path, {})
except:
    print "Status: 400"
一応、動く物も用意しました。
NabeAtzz API
おもいっきりネタですね...。
Posted at by | Edit