読者です 読者をやめる 読者になる 読者になる

バグじゃなくて仕様だけれども悩ましいメモ。

ニコニコ動画 Greasemonkey


Forza2」の「za2」を動画IDと認識してしまっているので動画ID誤爆しまくり。使用上しょうがないっちゃしょうがないんだけど,何かよい改善案は無いものか。
「za2」を取得しに行くと,削除された動画と違って「NOT_FOUND」が返ってくる。「NOT_FOUND」が返ってきたIDへのリンクを削除すればよいのだろうか。
悩ましい。てかしっかり対策しようとすると面倒臭い。どうしたものか。
てかまあ他にこだわるべきところはあるだろうという気はする。後回し。後回し。

いまやっていること


デザイン変更はとりあえず一段落。自分にはちょうどいいけど文字ちっちゃいかも。
はてなブックマーク数表示は実装できたけど,投稿者名表示をやろうとすると結構大規模な変更が必要っぽい。半分くらい変更完了。
現状 E4X→String→DOMツリー っていう非効率な変換を行っているので,最初からDOMツリーを作るようにしたい。あと,そうしないと投稿者名表示を実現するためにいろいろ面倒なことをやらなければいけないし。

できたー!無理矢理やった。GreasemonkeyだとdocumentFragmentのgetElementsByTagNameが使えないみたい。

いまやってることが終わったら

修正したい点。

  • ポップアップをプレイヤーの手前に表示したい。
    • position: fixed; にすれば可能らしい。→Ulmhaft
    • たぶんそんなに難しくない,と思う。位置指定のやり方変えるだけだし。


一応できた。position: fixed;に設定する方法は,なぜか説明文だけ動画の前面に表示された。

  • ポップアップ表示位置の改善
    • 連続してポップアップすると,x座標が同じになってしまうことがある。
  • 文字サイズを変更可能に。

以下の機能は簡単にon/offできるようにする。

  • マイリストのポップアップ表示
    • RSSからデータを取得。ポップアップのデザインは後で考える。動画の説明文じゃなくて,マイリストのコメントのみ表示する。
  • 最新コメントの表示
    • ポップアップ内のボタンを押すと最新コメントが表示される感じで。常時表示はしない。
  • タグ検索・キーワード検索のポップアップ表示
    • マイリストのポップアップと同じ形式で。
    • APIがあればいいのに。
  • タグ→大百科へのリンク
  • Alt+「smxxxx」を選択でポップアップ

今週中にやれたらいいな。

2008/6/26 追記

コメント欄でid:tasukuchanさんにアイディアをいただいたので,うまいこと実装できました。
Javascript正規表現に後方一致が無いのが少し辛かった。前方一致はあるのに。
最終的にできたのはこんな関数。

String.prototype.createLink = new function() {
    const url_regexp = new RegExp(
    '(^|[^a-z])' +
    '(?:' +
        '((?:sm|nm|fz|za|zb|ca|ax)\\d+)|' +
        '((?:mylist|myvideo|user|watch)/\\d+(?:/\\d+)?)|' +
        '((?:h?t?t?ps?|ftp)(?:://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+))' + 
    ')', 'g');
    const func = function(text, pre, video_id, mylist, url) {
        if(video_id)
            return pre + '<a href="http://www.nicovideo.jp/watch/' + video_id + '">' + video_id + '</a>';
        if(mylist)
            return pre + '<a href="http://www.nicovideo.jp/' + mylist + '">' + mylist + '</a>';
        if(url) {
            if(url.indexOf('p') == 0)
                url = 'htt' + url;
            else if(url.indexOf('tp') == 0)
                url = 'ht' + url;
            else if(url.indexOf('ttp') == 0)
                url = 'h' + url;
            return pre + '<a href="' + url + '">' + url + '</a>';
        }
    };
    return function() {
        return this.replace(url_regexp, func);
    }
}

これで誤爆はしなくなった。よかったよかった。
ただ,現状でも完璧で無いことに気づいてしまったわけで。
例えば。

1st: sm123456<br>
2nd: sm234567

なんて説明文があった場合,ニコニコ動画APIから取得できる文章は
「1st: sm1234562nd: sm234567」となってしまうので,「sm1234562」の部分にリンクが張られてしまう。これはもうどうしようもない。
どうしようもないけど以下のような方法でフォローできないかな,とは思う。

  • 選択範囲内にsm\d+が含まれていたらポップアップする
  • smxxxxxxxz をポップアップした結果がNOT_FOUNDだったら「もしかして→smxxxxxxx」とか表示する

これで割と万全になるんじゃないか,と思う。余力があったらやる。