2009年7月14日火曜日

つばめ

ツバメがいっぱい(日曜日の夕方)

090712_161029


翌朝一羽しかいなくなってた(帰りに見たらまた居たから飛ぶ練習でもしてるのかも)
P1010613

2009年7月11日土曜日

2009年7月6日月曜日

ATOKの電子辞典をFirefoxで引く(Jetpack)

Jetpackで何か作ってみたかったので作ってみた。
OperaでATOK 2007 for Windowsの電子辞典を使うためのツールが必要。

ステータスバーにATOKのアイコンが出ます。
テキストを選択した状態で、アイコンをクリックすると電子辞典の検索を行います。

本当はコンテキストメニューに登録して呼び出すのがやりたかったんだけど、
Jetpackでやる方法がわからなかったので、この形にしました。

(function() {
var cmd = 'c:\\path\\to\\GetTextOperaLClick.exe';

var convert = function(s, charset) {
var ccls = "@mozilla.org/intl/scriptableunicodeconverter";
var cif = Components.interfaces.nsIScriptableUnicodeConverter;
var c = Components.classes[ccls].getService(cif);
c.charset = charset;
return c.ConvertFromUnicode(s);
}
var lookup = function(s) {
var fcls = "@mozilla.org/file/local;1";
var fif = Components.interfaces.nsILocalFile;
var pcls = "@mozilla.org/process/util;1";
var pif = Components.interfaces.nsIProcess;
var file = Components.classes[fcls].createInstance(fif);
file.initWithPath(cmd);
var process = Components.classes[pcls].createInstance(pif);
process.init(file);
var args = [convert(s, "shift_jis")];
process.run(false, args, args.length);
}

jetpack.statusBar.append({
html: '<img id="icon_img" src="http://www.atok.com/favicon.ico />',
width: 30,
onReady: function(doc) {
$('#icon_img', doc).css({
cursor: "pointer",
});
$(doc).click(function() {
var w = jetpack.tabs.focused.contentDocument.getSelection();
if (w.length) {
lookup(w);
}
});
}
});
})();

選択するだけで検索する版(使いにくい)
アイコンをクリックすると、機能のon/offができます。
無効(初期)状態では、アイコンが半透明になっています。
有効になっているときは、テキストを選択してマウスのボタンを離すと電子辞典の検索が動きます。
(クリックイベントが発生したときに、選択されているテキストの長さで判断してます)

(function() {
  var cmd = 'c:\\path\\to\\GetTextOperaLClick.exe';
  var enabled = false;

  var convert = function(s, charset) {
    var ccls = "@mozilla.org/intl/scriptableunicodeconverter";
    var cif = Components.interfaces.nsIScriptableUnicodeConverter;
    var c = Components.classes[ccls].getService(cif);
    c.charset = charset;
    return c.ConvertFromUnicode(s);
  }
  var lookup = function(s) {
      var fcls = "@mozilla.org/file/local;1";
      var fif = Components.interfaces.nsILocalFile;
      var pcls = "@mozilla.org/process/util;1";
      var pif = Components.interfaces.nsIProcess;
      var file = Components.classes[fcls].createInstance(fif);
      file.initWithPath(cmd);
      var process = Components.classes[pcls].createInstance(pif);
      process.init(file);
      var args = [convert(s, "shift_jis")];
      process.run(false, args, args.length);
  }

  jetpack.statusBar.append({
    html: '<img id="icon_img" src="http://www.atok.com/favicon.ico />',
    width: 30,
    onReady: function(doc) {
      $('#icon_img', doc).css({
                   cursor: "pointer",
                   opacity: 0.4
      });
      $(doc).click(function() {
        var elem = $('#icon_img', doc);
        var a;
        if (enabled = !enabled) {
          a = 1;
          $(jetpack.tabs.focused.contentDocument).click(function() {
            var w = jetpack.tabs.focused.contentDocument.getSelection();
            if (w.length) {
              lookup(w);
            }
          });
        } else {
          a = 0.4;
          $(jetpack.tabs.focused.contentDocument).unbind('click');
        }
        elem.css({opacity: a});
      });
    }
  });
})();




2009年7月1日水曜日

1passでpygmentsの出力したhtmlにスタイルを埋め込む

前作ったやつは、スタイル出力、HTML出力、スタイル埋め込みという手順を踏む必要があって面倒なので、pygmentsのAPIを使って一発で処理するようにしてみた。
前のは出力されたcssとHTMLを処理するのでstyle, lexerなんかは好きにすればよかったけど、
今回は1passなのでそこら辺の指定をできるようにしてみた。


from pygments import highlight
from pygments.lexers import get_lexer_by_name, get_lexer_for_filename
from pygments.formatters import get_formatter_by_name
from xml.etree.ElementTree import ElementTree, XML
import cssutils
from cssutils.css import CSSRule
from sys import stdout
from optparse import OptionParser

def write(filename, style_name='colorful', formatter_name='html', lexer_name=None, out=stdout):
    fmtter = get_formatter_by_name(formatter_name, style=style_name)
    if lexer_name:
        lexer = get_lexer_by_name(lexer_name)
    else:
        lexer = get_lexer_for_filename(filename)
    css = cssutils.parseString(fmtter.get_style_defs())
    rules = dict([(x.selectorText, x.style.cssText.replace('\n', '')) for x in css.cssRules if x.type == CSSRule.STYLE_RULE])
    tree = ElementTree(XML(highlight(open(filename).read(), lexer, fmtter)))
    for elem in tree.getiterator():
        c = elem.get('class', None)
        if c:
            style = rules.get('.'+c, None)
            if style:
                elem.attrib['style'] = style
    tree.write(out)

if __name__ == '__main__':
    optparser = OptionParser(usage=u'usage: %prog [options] file')
    optparser.add_option('-S', '--style', dest='style', help='style', default='colorful')
    optparser.add_option('-f', '--formatter', dest='formatter', help='formatter', default='html')
    optparser.add_option('-L', '--lexer', dest='lexer', help='lexer')
    options, args = optparser.parse_args()
    if len(args) == 1:
        write(args[0], options.style, options.formatter, options.lexer, stdout)
    else:
        print '** no input file specified **'
        optparser.print_help()