ルビ

rubyところで、WLWでは略語(<ABBR>や<ACRONYM>タグ)についてはプラグインがあって、勝手に略語の定義を探してきてくれたりするのだけど、漢字(かんじ)のルビのプラグインはまだないようだ。なら作ってしまえ、と思ったのだけど、Windowsでプログラムを書くなんてことに恐怖を覚えてしまうし、果たして書けるものかどうかも分からない。あまり大げさにしたくもないので、wxPythonで書いてみた。

一応、ルビ(<RUBY>)と略語(<ABBR>と<ACRONYM>)を作ってクリップボードに送るように書いてある。これをWLWで「形式を選択して貼り付け → HTML」を選べば、そこそこうまいことやってくれる。ただルビはうまく処理できておらず、ルビの外側に書き続けたいのにルビの内側に書き加える形になってしまったり。

勢いで書いてしまいましたが、自分で使うかどうかはわかりません。あと「TAB」キーでフォーカスが移動しないのはなんでだろう…

#! /usr/bin/python
# encoding: UTF-8

debug=True

import os,sys
import cgi
import wx

class rubyapp(wx.App):
    # TODO: SKK辞書やWebの辞書から読みや漢字、略語を持ってくる
    def __init__(self, flag=True):
        wx.App.__init__(self, flag)
    def create_txtbox(self, sizer, name, sz=(100,-1)):
        in_sizer=wx.BoxSizer(wx.HORIZONTAL)
        txt=wx.StaticText(self.frame, -1, name, size=sz)
        in_sizer.Add(txt, 0, wx.EXPAND)
        txtbox=wx.TextCtrl(self.frame, -1, "", size=sz)
        in_sizer.Add(txtbox, 1, wx.EXPAND)
        sizer.Add(in_sizer, 0, wx.EXPAND)
        return txtbox
    def OnInit(self):
        self.frame=wx.Frame(None, -1, u"HTMLルビ生成")
        self.frame.CreateStatusBar()
        sizer=wx.BoxSizer(wx.VERTICAL)
        self.kanji_value=self.create_txtbox(sizer, u"漢字/略語")
        self.kana_value=self.create_txtbox(sizer, u"ふりがな/正式名")
        in_sizer=wx.BoxSizer(wx.HORIZONTAL)
        for nm, fn in [(u"RUBY", self.copyruby), (u"ABBR", self.copyabbr), (u"ACRONYM", self.copyacronym)]:
            btn=wx.Button(self.frame, -1, nm)
            btn.Bind(wx.EVT_BUTTON, fn)
            in_sizer.Add(btn, 0, wx.EXPAND)
        sizer.Add(in_sizer, 0, wx.EXPAND)
        self.SetTopWindow(self.frame)
        self.clp=wx.Clipboard()
        self.frame.SetSizerAndFit(sizer)
        self.kanji_value.SetFocus()
        cld=wx.TextDataObject()
        self.clp.GetData(cld)
        self.kanji_value.SetValue(cld.GetText())
        self.kanji_value.SelectAll()
        self.frame.SetStatusText(u"準備ができました")
        self.frame.Show()
        return True
    def output(self, format):
        arg={"kanji": cgi.escape(self.kanji_value.GetValue(), True),
             "kana":  cgi.escape(self.kana_value.GetValue(), True),
             }
        if arg["kanji"]=="" or arg["kana"]=="":
            self.frame.SetStatusText(u"文字列を設定してください")
            if arg["kanji"]=="":
                self.kanji_value.SetFocus()
            else:
                self.kana_value.SetFocus()
            return
        outhtml=format % arg
        self.clp.SetData(wx.TextDataObject(outhtml))
        self.clp.Flush()
        self.frame.SetStatusText(u"コピーしました: %(kanji)s(%(kana)s)" % arg)
    def copyruby(self, evt):
        self.output(u"<ruby><rb>%(kanji)s</rb><rp>(</rp><rt>%(kana)s</rt><rp>)</rp></ruby>")
    def copyacronym(self, evt):
        self.output(u"<acronym title=\"%(kana)s\">%(kanji)s</acronym>")
    def copyabbr(self, evt):
        self.output(u"<abbr title=\"%(kana)s\">%(kanji)s</abbr>")

app=rubyapp(not debug)
app.MainLoop()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です