ブックマークレット作法

今や少し複雑なブックマークレットは外部から読み込むのが当たり前になり,gist やら coderepos やらのおかげで置く場所にも困らない。*1
この際の書き方は人によって結構まちまちだが,やることは同じなのだから「これコピペすれば FA」的なテンプレがあってもいいはずと考え,模索してみた。

方針
  1. 変更する所を前方にまとめて共通部分は後方に括り出す
    • まず名前を明記 (↓で自明なら省略)
    • その後にスクリプトURI
      • 複数読めるように
  2. 「%nn」が入ると何かと面倒*2なので空白文字を避ける
  3. 汚染しない

この3つは単体で動くものを書くときにも気を付けると吉。

成果物
javascript:'{name}',['http://a.b.com/0.js','http://l.m.net/1.js',function(d,i,e){for(i=this.length;--i;d.body.appendChild(e))e=d.createElement('script'),e.src=this[i],e.charset='utf-8'}].reverse()[0](document)

http://labs.gmo.jp/blog/ku/2008/04/wedatasiteinfofirefox_autopagerize_iteration_detector.html

javascript:'AutoPagerizeIDE',['http://gist.github.com/33794.txt',function(d,i,e){for(i=this.length;--i;d.body.appendChild(e))e=d.createElement('script'),e.src=this[i],e.charset='utf-8'}].reverse()[0](document)

Jash + jQuery 1.3.1

javascript:'Jash+jQuery1.3.1',['http://www.billyreisinger.com/jash/source/latest/Jash.js','http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js',function(d,i,e){for(i=this.length;--i;d.body.appendChild(e))e=d.createElement('script'),e.src=this[i],e.charset='utf-8'}].reverse()[0](document)
+

未使用変数を消去。最初こう書いてて

javascript:'{name}',['http://a.b.com/0.js','http://l.m.net/1.js',function(d,i,e,s){for(;s=this[++i];d.body.appendChild(e))e=d.createElement('script'),e.src=s,e.charset='utf-8'}].reverse()[0](document,0)

後ろから追加するのは直感に反するかもとひっくり返したときにゴミが残った。

+

上で強調しきれてないが,先頭に名前を置くやり方だけでも流行ってほしい。
パッと見で何をするものか判ったほうがいいに決まっているので。

javascript:/*ReverseStatuses*/void($('#timeline_body').append([].reverse.call($('tr.status'))))

コメントでもいいし

javascript:ClimbLocation:with(location)void(hash?hash='':search?search='':href=/\/$/.test(href)?'..':'.')

ラベルにしてみるとか*3

javascript:(function(R,E,P,L){while(P=prompt(R,E))try{R=eval(E=P)}catch(L){R=L}}('REPL',''))

こんな手も。

*1:この前のやつみたいなのは結局ネタでしかない

*2:eval できなくなるとか

*3:但し

  • 使える文字が限られる
  • 大文字でも使わないと判り辛い
といった欠点あり