タグ「greasemonkey」による検索結果 21

Search Form

Greasemonkey: tish.user.js

tako3.comからJSONを取得の図

tish.user.js

tinyshell.user.jsを書き換えたもの。

シェルっぽい何か。

注意

  • Minibuffer(+LDRize)との併用不可
    • ショートカットキーが競合
    • &にしようかと思ったけどSHIFT同時押しが使いづらいのでやめた
  • コマンドの移植度が微妙
    • 実装したもの:cat cd clear cut date echo exit expr find go google grep hatena head inspect jot logout ls maketoc open parse printf prompt pwd rm save sed seq settimer sort tac tail tee tr uniq up wc wget xargs
    • seqが自然数でしか使えなかったり、sedがエディタになってなかったり、いろいろ

起動方法など

:ALT+xで起動。

clearコマンドもしくはCTRL+Lでクリア。

TAB2回で候補表示。候補が1つだけのときはTAB1回で補完。

ファイルシステムもどき

$ pwd
http://mayokara.info/note/
$ cat links|head > outfile
$ cat outfile
http://mayokara.info/note/
http://mayokara.info/note/1
http://mayokara.info/note/view/325
http://mayokara.info/note/view/257
http://mayokara.info/note/search/tag/個人的メモ
http://mayokara.info/note/search/tag/JavaScript
http://mayokara.info/
http://mayokara.info/note/view/325
http://mayokara.info/note/view/325#comment
http://mayokara.info/note/view/325#trackback
$ cat feeds
http://mayokara.info/note/rss2
$ cat //h2/a/@href
http://mayokara.info/note/view/325
http://mayokara.info/note/view/324
http://mayokara.info/note/view/323
http://mayokara.info/note/view/322
http://mayokara.info/note/view/321
http://mayokara.info/note/view/320
http://mayokara.info/note/view/319
http://mayokara.info/note/view/318
http://mayokara.info/note/view/317
http://mayokara.info/note/view/316

text,links,images,stext,slinks,simages,feeds,next,prevなどは読み込み専用で、現在のページ/選択範囲に対するさまざまな情報を返す。

スラッシュを含む指定はXPathとみなされる。

書き出したファイルはコマンド履歴とは異なり、そのタブを開いている間しか参照できない。

wget & parse

$ cat feeds
http://mayokara.info/note/rss2
$ cat feeds|wget -i -|parse //item/link
wget: waiting for response... http://mayokara.info/note/rss2
wget: HTTP/1.x 200 OK
wget: Date: Sat, 23 Aug 2008 11:38:15 GMT
wget: Server: Apache
wget: Last-Modified: Sat, 23 Aug 2008 11:33:34 GMT
wget: Content-Type: text/xml;charset=UTF-8
wget: Content-Encoding: gzip
wget: Content-Length: 13016
http://mayokara.info/note/view/325
http://mayokara.info/note/view/324
http://mayokara.info/note/view/323
http://mayokara.info/note/view/322
http://mayokara.info/note/view/321
http://mayokara.info/note/view/320
http://mayokara.info/note/view/319
http://mayokara.info/note/view/318
http://mayokara.info/note/view/317
http://mayokara.info/note/view/316
http://mayokara.info/note/view/315
http://mayokara.info/note/view/314
http://mayokara.info/note/view/313
http://mayokara.info/note/view/312
http://mayokara.info/note/view/311

wgetでresponseTextを取得し、parseでXPathを用いて抽出。

wget -i - -l3とすれば、標準入力の3行目を読み込む。

parse -jで入力をJSONとみなし、DOMツリーに変換する。

tako3.comからデータを取得

$ echo http://tako3.com/json/likely/ `pwd`|tr -d " "|wget -i -|parse -j //jsonarray|tee tako3|cat -n
wget: waiting for response... http://tako3.com/json/likely/http://mayokara.info/note/
wget: HTTP/1.x 200 OK
wget: Date: Sat, 23 Aug 2008 11:43:25 GMT
wget: Server: Apache
wget: Content-Type: text/plain
wget: Transfer-Encoding: chunked
     1  http://mayokara.info/blog/
     2  http://mayokara.info/
     3  http://d.hatena.ne.jp/mayokara384/
     4  http://mayokara.info/note/
$ open tako3 -l3

現在のロケーションに関する情報をtako3.comから取得する。

番号を振る前のデータをtako3というファイルにtee。

open tako3 -l3で3行目を開く。

echo ...|tr -d " "の代わりにprintf "%s%s" http://tako3.com/json/likely/ `pwd`でも可。

しょぼいカレンダーから直近の番組データを取得

$ wget "http://cal.syoboi.jp/rss.php?titlefmt=$(StTime) $(ChName) $(Title)"|parse //x:item/x:title|head
wget: waiting for response... http://cal.syoboi.jp/rss.php?titlefmt=$(StTime)%20$(ChName)%20$(Title)
wget: HTTP/1.x 200 OK
wget: Date: Sat, 23 Aug 2008 11:44:53 GMT
wget: Server: Apache/2.2.3 (Unix) PHP/5.2.5
wget: X-Powered-By: PHP/5.2.5
wget: Cache-Control: no-cache, must-revalidate
wget: Expires: Mon, 26 Jul 1997 05:00:00 GMT
wget: Content-Type: text/xml; charset=UTF-8
wget: Transfer-Encoding: chunked
08/23 21:00 文化放送(1134) A&G超RADIO SHOW~アニスパ!~
08/23 22:30 TOKYO MX 鉄腕バーディー DECODE
08/23 22:30 キッズステーション NARUTO -ナルト- 疾風伝
08/23 23:00 BS11デジタル 鉄腕バーディー DECODE
08/23 23:00 文化放送(1134) A&Gメディアステーション こむちゃっとカウントダウン
08/23 23:30 BS11デジタル ウルトラヴァイオレット コード044
08/24 00:00 tvk アニメTV
08/24 00:00 BS11デジタル 真ゲッターロボ 世界最後の日
08/24 00:30 tvk 薬師寺涼子の怪奇事件簿
08/24 01:00 tvk 狂乱家族日記

RSS1.0ではデフォルト名前空間があるのでXPathにx:が必要。

Twitterの「フォロー中」にリストされているユーザIDを取得

$ pwd
http://twitter.com/XXXXXX
$ inspect
inspect: 'id("friends")/span[@class="vcard"][1]/a[@class="url"][1]'
$ cat id("friends")//a/@href|cut -d / -f 4
XXXXXX
XXXXXX
XXXXXX
...

inspectでXPathを調べる。左/右クリックで終了。

@href、@srcはAbsolute URLに変換して返される(場当たり的対応)。

外部ファイルによる操作

// ==UserScript==
// @name           dot_tishrc
// @namespace      http://mayokara.info/
// @description    .tishrc
// @include        http://*
// ==/UserScript==

(function(){

var Shell = window.Tish;
if (!Shell) return;

Shell.addAlias('tako3', 'printf "%s%s" http://tako3.com/json/likely/ `pwd`|wget -i -|parse -j //jsonarray|tee tako3|cat -n');

Shell.addCommand("hitori-goto", function(STDIN, ARGV, $0){
    if (ARGV.length > 0) {
        var callback = function(res){
            Shell.println($0 + ": " + res.status + " " + res.statusText);
        };
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://hitori-goto.appspot.com/say",
            data: "comment=" + encodeURIComponent(ARGV.join(" ")),
            headers: { "Content-Type": "application/x-www-form-urlencoded" },
            onload: callback,
            onerror: callback,
        });
        Shell.println($0 + ": waiting for response...");
    } else {
        return Shell.exec("wget http://hitori-goto.appspot.com/rss2|parse //item/title", "");
    }
});

})();

エイリアスやコマンドを追加できる。

cd、go/open

cdは引数のURLを開く。go/openは標準入力あるいはファイル内のURLを開く。

googleとかhatenaとか

$ google --code printf
http://www.google.com/codesearch?q=printf
$ hatena id:mayokara384
http://d.hatena.ne.jp/mayokara384/
$ hatena b:id:mayokara384
http://b.hatena.ne.jp/mayokara384/

URLを作って返すだけ。

「tinyshell.user.js」更新 & hitori-gotoコマンド

Greasemonkey: tinyshell.user.js - mayokara note

仕様変更しまくりました。

  • 標準入力をコマンド関数の引数に
    • 変数名もそれっぽく変更
    • STDINは文字列
    • ARGVは引数の配列
      • \s+で区切られるので無視したいときはjoinする
      • クオート考慮してない……考慮するように修正済
    • STDOUTは返り値、自動的に文字列にされる
    • throw "error message"で文字列をSTDERRに出力して終了
  • window.TinyShell.printlnを追加
    • 遅延して文字列を出力できるように
  • その他cosmetic changes

hitori-gotoコマンド

こんな感じで拡張できます、という例。

// ==UserScript==
// @name           TinyShell extends
// @namespace      http://mayokara.info/
// @description    add some commands to TinyShell
// @include        http://*
// ==/UserScript==

(function(){

var Shell = window.TinyShell;
if (!Shell) return;

Shell.addCommand("hitori-goto", function(STDIN, ARGV, $0){
    var showStatus = function(response){
        Shell.println($0 + ": " + response.status + " " + response.statusText);
    };
    if (ARGV.length > 0) {
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://hitori-goto.appspot.com/say",
            data: "comment=" + encodeURIComponent(ARGV.join(" ")),
            headers: { "Content-type": "application/x-www-form-urlencoded" },
            onload: showStatus,
            onerror: showStatus,
        });
    } else {
        GM_xmlhttpRequest({
            method: "GET",
            url: "http://hitori-goto.appspot.com/rss2",
            onload: function(response){
                showStatus(response);
                var rss = new XML(response.responseText.replace(/^<\?xml\s.*?\?>/, "")), ary = [];
                for each (var title in rss.channel.item.title) {
                    ary.push(title);
                }
                Shell.println(ary.slice(0,15).join("\n"));
            },
            onerror: showStatus,
        });
    }
    Shell.println($0 + ": waiting for response...");
});

})();
$ hitori-goto test
hitori-goto: waiting for response...
hitori-goto: 200 OK

Greasemonkey: tinyshell.user.js

標準出力を表示の図

tinyshell.user.jsGreasemonkey: tish.user.js - mayokara note

標準出力を書き出せるMinibuffer的な以下略。

Minibufferとの差異

  • 標準出力を表示できる
  • 付属コマンドが違う
  • 補完機能がしょぼい
    • 一応TABを押せば全コマンドから絞り込みをかけた結果が出ます
  • コマンドの返り値が配列ではなく文字列

使用例

中身を読めばわかります。

任意のユーザのはてなダイアリーからはてなブックマークへ移動

$ pwd|sed s/d./b./|go

ページ内検索

$ grep JavaScript

簡易電卓

$ calc sin(1)*cos(1)

searchやhashやサブドメインを削ったりしてくれるParent Directory

$ up

cd

$ cd /note/view/1

URLを指定して新しいタブを開く

$ echo http://hitori-goto.appspot.com/|open

参考にしたもの

Minibuffer – Userscripts.org

追記

イマイチだったところをいろいろ修正。

Greasemonkey: headsliding.user.js

headsliding.user.js

SITEINFOなしで動くLDRize的な何か。

paragraphの推定

  1. microformatsから
  2. 指定行数以上のtableの各列
  3. firstChildがh1~h6要素のdivコンテナの中から最も見出しレベルの低い群
  4. h1~h6要素全部

これらをy座標昇順でソートして使う。

追記

「headsliding.user.js」更新 - mayokara note

改良したのでこちらも参照。

linkの推定

microformatsで指定されたa要素、なければparagraph内最初のa要素。

focusの推定

ドキュメント内最初のinput[@type="text"]

microformats

hAtom、xFolkに対応してるけど、rel-bookmarkとかtaggedlinkとかみないので対応できてないも同然。みるようにした。

そのうち何とかしたいけど、放置するかも。

LDRizeとの差異

  • ピンなし
  • ストライプなし
  • iframe絡みの機能なし
  • Minibuffer連携なし
  • 精度悪い
  • マイコミジャーナルで気持ち悪い動きをする
  • livedoor Reader(or Fastladder)が使えなくなる
    • とりあえずGreasemonkey側でhttp://reader.livedoor.com/reader/を適用対象から外してください

参考にしたもの

LDRize – Userscripts.org

追記

  • paragraphが見つからなかったときもカーソルとスペーサーを追加してしまうミスを修正
  • DOM_VK_RETURNを潰していたミスを修正
  • Firefox3でスクロールが詰まってしまうミスを修正
    • elem.getBoundingClientRect()の各プロパティが小数値を返すのを忘れていた

追追記

  • TABLE_MIN_ROWCOUNT_THRESHOLDのデフォルト値を10から15に修正

Greasemonkey: continue_reading.user.js

continue_reading.user.js

SITEINFOなしで動くAutoPagerize的な何か。

nextLinkの推定

Greasemonkey: nisefastforward5.user.js - mayokara note

nisefastforward5.user.jsと同じく、以下の順で探索。

  1. link[@rel="next"]
  2. a[@rel="next"]
  3. 特定のキーワードで始まるリンク(デフォルトは「Next」「次」の2つ)
  4. URLをインクリメントして、そこにリンクが貼られていればそれを使う
  5. テキストが「2」ちょうどのリンク

@rel="next"が存在せず、@rel="prev"のみが存在するときは進行方向を逆にする(Twitterなど)。

pageElementの推定

JavaScript: pageElementの推定 - mayokara note

これの「親要素も使う」版を手直ししたものを採用。

親・子ノードとの描画領域比を使う。

ちょっと重いかも。

microformatsが見つかったときは、それを利用する。

microformats

hAtom、xFolk、AutoPagerize独自形式に対応。

AutoPagerizeとの互換性

window.AutoPagerize.addDocumentFilterwindow.AutoPagerize.addFilterを実装。

その他

  • GM_xmlhttpRequestdocument.implementation.createDocument+Range#createContextualFragment方式
  • 任意の場所をダブルクリックでON/OFF切り替え

「koko-de-yomu.user.js」「sbmc.user.js」更新

Greasemonkey: koko-de-yomu.user.js - mayokara note

  • http/httpsスキーム以外のときは発火しないようにした

Greasemonkey: sbmc.user.js - mayokara note

  • ブックマークカウントにプライベートユーザが含まれていなかったのを修正
  • ブックマークカウントのクリックでエントリページに飛べるように
  • CSSの微調整など

Greasemonkey: sbmc.user.js

右下マウスオーバーで表示の図


sbmc.user.js

sbmc_without_delicious.user.js(はてなブックマークとlivedoorクリップのみ)


はてなブックマークlivedoor クリップdelicious.comのブックマークコメントを表示するuser.js。

右下マウスオーバー時に一度だけ取得。明るい水色が「livedoor クリップ」のコメント。緑がかった青が「delicious.com」のコメント。

max-widthなどはうまくパーセント指定できなかったので、ちょっと大きめ。

delicious.comはAPIの都合により最大100件(コメントなしも含む)までしか取得できません。


というか、CSSのリセット面倒すぎる……

参考にしたもの

追記

delicious.comにも対応させました。

Greasemonkey: koko-de-yomu.user.js

アンカー・ドラッグ・オープンの図

koko-de-yomu.user.js


アンカーを引っ張るとその場にiframeを開くuser.js。

開いた後は、iframe外のクリックで消す。


便利かどうかは、まだ判断しかねる感じ。

デフォルトの挙動を潰すので、タブバーに引っ張っていって開くとかができなくなる。CTRL/SHIFT/ALT/METAを同時押しで発火しないようにしました。

というか、誰か作ってたような気がするんだけど、気のせいなのか見つからない……


あと、iframe.src = hrefでURLをセットすると、href === location.hrefのときに理由はわからないけど、エラーになる。

iframe.contentWindow.location.href = hrefとすると、うまくいく。

Greasemonkey: draggable_textarea.user.js

draggable_textarea.user.js

任意textarea右下16px平方、ドラッグ→リサイズ。


textarea の大きさの呪縛から逃れるための GM スクリプト < 22 < March < 2006 < nulog, NULL::something : out of the headphone

の再発明(というか複製)。

document.getBoxObjectForを使ったり、XPathを使わなかったり。

便利便利。

Greasemonkey: nisefastforward5.user.js

nisefastforward5.user.js

  • アンカーテキストマッチに最大文字数制限をつけた
    • 次リンクのアンカーテキストはたいてい短い
    • 世代ブラウザ「Firefox 3」の国別ダウンロード数をカウントする「Firefox Download counter」』みたいなリンクの誤検出を防ぐ
    • デフォルトは12(「Next Article」が12文字なので)
  • URLインクリメントにドメイン名を含まないようにした
    • 具体的にはlocation.hrefじゃなくてlocation.pathnameをみるようにした
    • location.pathnamelocation.hrefにそのまま突っ込んでもよしなに図らってくれるのがうれしい
    • www.w3.orgみてたらwww.w4.orgに飛んでヒンヤリしたのがきっかけ
      • ルート以外が404で助かった
  • どれにもマッチしなかった場合、アンカーテキストがちょうど「2」のリンクを探すようにした
    • //a[text() = "2"]//a[self::node() = "2"](=//a[. = "2"])は違う
      • 前者:子テキストノードの内容と比べる
      • 後者:孫ノードの中身も含めたテキストに変換して、その内容と比べる
    • Google検索のナビゲーションバーのような構造のとき、違いが表われる
  • URLインクリメントの年月パターンを12月限定にした
    • 要するに0713.htmlの次が0802.htmlではなく0714.htmlとなるようにした

pathnameと年月パターンについては4のほうも修正しておきました。

Google検索のくだりの詳細

<a href="/search?hl=ja&amp;q=${SEARCHWORD}&amp;start=10&amp;sa=N">(実際は空白なし)
    <div class=nr></div>(同上)
    <span>2</span>(同上)
</a>

こういうXHTML構造のとき

document.evaluate('id("navbar")/table/tbody/tr/td[3]/a/text()', document, null, XPathResult.STRING_TYPE, null).stringValue
// -> ""
document.evaluate('id("navbar")/table/tbody/tr/td[3]/a/self::node()', document, null, XPathResult.STRING_TYPE, null).stringValue
// -> "2"

こうなる。


ノード型にはすべて、その型のノードの文字列値を決定する方法がある。 文字列値がそのノードの一部となるノード型もあれば、文字列値を子孫ノードの文字列値から計算するノード型もある。

注: エレメントノードやルートノードの場合、ノードの文字列値は、DOM の nodeValue メソッド ([DOM] 参照) が返す文字列と同じではない。

XML Path Language (XPath)

ということで、文字列化はXPath独自の方法で行なわれる模様。

さすがに@altをみたりはしないみたい。