Hatena::ブログ(Diary)

Higé au lait Twitter

 | 

2009年06月29日

地元 ・ 写真

瀬戸大橋 某映画セット復元

久しぶりにでもないけど、一眼レフを買ってから初めて地元に帰ってきた。土日の少ない時間で原付の機動力を使って地元の写真を撮ってきた。やっぱり原付いいわぁ*1。電車+徒歩だと動ける範囲が狭いけど、好きなところに気軽に行けちゃう。

撮ってきたのは高松駅・高松港周辺 (実家から原付で30分)・実家周辺・瀬戸大橋 (同じく1時間ちょっと)。香川狭くてよかった。もう少し時間があればもっと西の方に行ってもよかったかなぁと思う。


撮った写真の一部

*1:車のほうがもっといいのはわかってる

2009年06月13日

クラスをつけたり消したり

function hasClass(elm, _class) {
    if(!elm || !_class) return;
//    var regexp = new RegExp('\\b'+ _class + '\\b'); // \ をエスケープしないと駄目なことを知らずにはまった
//    var regexp = new RegExp('(^|[^\\w-])' + _class + '([^\\w-]|$)');
    var regexp = new RegExp('(^|\\s)' + _class + '(\\s|$)'); // 単純にこれでいける?
    return regexp.test(elm.className);
}

function addClass(elm, _class) {
    if(!elm || !_class) return;
    if(!hasClass(elm, _class)) {
        elm.className += ! elm.className ? _class  : ' ' + _class;
    }
}

function removeClass(elm, _class) {
    if(!elm || !_class) return;
    if(hasClass(elm, _class)) {
        elm.className = elm.className.replace(new RegExp(_class, 'g'), '')
                                     .replace(/\s+/g, ' ')
                                     .replace(/^\s|\s$/, '');
    }
}

JsUnit を使うために書いてみた。

JsUnit 用の テストコード

function testHasClass() {
    var el = document.createElement('div');
    el.className = 'hoge fuga foobar foo-bar';
    assert(hasClass(el, 'hoge'));
    assert(hasClass(el, 'fuga'));
    assertFalse(hasClass(el, 'foo'));
    assertFalse(hasClass(el, 'bar'));
    assertFalse(hasClass(el, 'oge'));
}
function testAddClass() {
    var el = document.createElement('div');
    addClass(el, 'hoge');
    assert(el.className == 'hoge');
    addClass(el, 'fuga');
    assert(el.className == 'hoge fuga');
    addClass(el, 'hoge');
    assert(el.className == 'hoge fuga');
}
function testRemoveClass() {
    var el = document.createElement('div');
    el.className = 'hoge fuga foobar fuga';
    assert(el.className == 'hoge fuga foobar fuga')
    removeClass(el, 'fuga');
    assert(el.className == 'hoge foobar');
    removeClass(el, 'hage');
    assert(el.className == 'hoge foobar');
    removeClass(el, 'hoge');
    assert(el.className == 'foobar');
}

JsUnit については JsUnit を使った JavaScript のユニットテスト - WebOS Goodies が詳しい。


追記

hasClass 駄目だな。クラス名に "foo-bar" が含まれているとき "bar" or "foo" でも true が返ってくる。

追記 2

とりあえず "-" ハイフン問題は大丈夫になった。他の文字にも対応すべきだろうけどパス。

追記 3

正規表現修正。単純になったけど、これで大丈夫かしら。テストの意味が…。

2009年06月12日

delicious に はてなブックマーク数を表示してみる

久しぶりにこういうの書いたな。

querySelector, querySelctorAll メソッドを使ってるので Opera 10, Firefox 3.1*1 以上でないと動かない。


f:id:higeorange:20090611235108j:image


// ==UserScript==
// @name hatebu counter at delicious
// @namespace http://opera.higeorange.com/
// @incude http://delicious.com/*
// ==/UserScript==

(function() {

	var hatebuBaseUrl = 'http://b.hatena.ne.jp/entry/';
	var hatebuImageBaseUrl = hatebuBaseUrl + 'image/';
	var posts = document.querySelectorAll('li.post');
	var post, h4a, link, img, li;
	for(var i = 0; post = posts[i++];) {
		h4a = post.querySelector('h4 a');
		img = new Image();
		img.alt = 'hatebu-counter'
		img.src = hatebuImageBaseUrl + h4a.href;
		link = document.createElement('a');
		link.href = hatebuBaseUrl + h4a.href
		img.appendChild(link);
		img.style.marginLeft = '5px';
		
		h4a.parentNode.insertBefore(img, h4a.nextSibling);		
	}

})();

querySelector 便利

*1:多分、確認していない。確認してないのに Greasemonkey というカテゴリーわけはどうよ

 |