Hatena::Diary

┐(´ー`)┌なJavaScript雑記

2008-12-19

URLの数字を増やしたり減らしたり

よくある Bookmarklet です。

正規表現とjavascripterさんの関数で使ってだいぶ短く書けそうだったので書いてみました。

これを普通の関数にして、条件式を足させていただきました。

fillZero 便利ー♪

URL増加

javascript:(function(){
	function fillZero(t,n){return (t.toString().length < n)? (new Array(n).join('0')+t).substr(-n): t;}
	location.href = location.href.replace(/^(.*[^\d])(\d+)($|[^\d]+)$/,function(str, first, num, last){
		return first + fillZero(parseInt(num,10)+1, num.length) + last;
	});
})();

URL減少(0で埋める)

10 → 09 って感じです。

javascript:(function(){
	function fillZero(t,n){return (t.toString().length < n)? (new Array(n).join('0')+t).substr(-n): t;}
	location.href = location.href.replace(/^(.*[^\d])(\d+)($|[^\d]+)$/,function(str, first, num, last){
		return first + fillZero(parseInt(num,10)-1, num.length) + last;
	});
})();

URL減少(0で埋めない)

10 → 9 です。

javascript:location.href = location.href.replace(/^(.*[^\d])(\d+)($|[^\d]+)$/,function(str, first, num, last){
	return first + (parseInt(num,10)-1) + last;
});

使用に当たって

エラーチェックを一切しておりません(ぇ

URL に数字が含まれなければ同じ URL に移動しますし、

減少の方では「0 → -1 → -0 → -1.....」となります。

2008-12-18

小物をちょこっと

寄せ集めて1つのファイルにするなり、似てるスクリプトに書き足すなりして使ってください。

長いURLの真ん中を省略する

tth://example.com/..../hogehoge.html って感じです。

リクをもらったんですが、自分はすでに使っていたので当たり前になりすぎて忘れてました(ぁ

document.getElementById('statusbar-display').setAttribute('crop', 'center');

アドレスバーの履歴検索の表示数を増やす

アドレスバーのオートコンプリート(URL補完)や、履歴検索の表示数を増やします。

gURLBar.setAttribute('maxrows','12');// Default 6

こうすることで12個まで履歴が表示されるようになります。

12個以上表示したい場合は about:config の設定を変えます

user_pref("browser.urlbar.maxRichResults", 18);//Default 12

これはアドレスバー右の▼のポップアップの表示数ですが、これがオートコンプリートの最大表示数も兼ねているようです。

Stylish管理ツールをタブで表示

ステータスバーの Stylishアイコンの「スタイルの管理」を 中クリック or Ctrl+クリックで新しいタブに開きます。

"chrome://stylish/content/manage.xul"をお気に入りに入れればそれで十分ですが(ぇ

document.getElementById('stylish-add-file').previousSibling.addEventListener('click', function(e){
    if (e.button == 1 || e.ctrlKey){
        gBrowser.selectedTab = gBrowser.addTab('chrome://stylish/content/manage.xul');
        document.getElementById('stylish-status-popup').hidePopup();
        e.preventDefault();
    }
},false);

右(左)のタブを全て閉じる

日本語を使っているので Unicode(UTF-8)で保存しないと文字化けするかもしれません。

(function(){
function closeRightTabs(){
    var tab = document.popupNode;
    while(tab.nextSibling){
        gBrowser.removeTab(tab.nextSibling);
    }
}
function closeLeftTabs(){
    var tab = document.popupNode;
    while(tab.previousSibling){
        gBrowser.removeTab(tab.previousSibling);
    }
}
    var tabmenu = document.getAnonymousElementByAttribute(gBrowser,'anonid','tabContextMenu');

    var closeRight = document.createElement('menuitem');
    closeRight.setAttribute('label', '右のタブをすべて閉じる');
    closeRight.addEventListener('command', closeRightTabs, false);
    tabmenu.insertBefore(closeRight, document.getElementById('context_closeOtherTabs'));

    var closeLeft = document.createElement('menuitem');
    closeLeft.setAttribute('label', '左のタブをすべて閉じる');
    closeLeft.addEventListener('command', closeLeftTabs, false);
    tabmenu.insertBefore(closeLeft, document.getElementById('context_closeOtherTabs'));
})();

2008-12-17

ステータスバーをURLバーと統合 その2

これの改良版。

カスタマイズをするとステータス表示欄が機能しなくなる問題の対処と、ステータスバーパネルを2箇所に分けられるようにしました。

ついでにプログレスバーURLバーの中に移動しました。


f:id:Griever:20081217205442j:image

// ==UserScript==
// @name           zzz_StatusbarInURLBar2.uc.js
// @namespace      http://d.hatena.ne.jp/Griever/
// @include        main
// ==/UserScript==

/* 
 * ステータスバー表示欄とプログレスバーを アドレスバーの中に移動
 * 拡張のパネルをアドレスバーの前に移動(mainPanel)
 * 標準のパネルを検索バーの後に移動(subPanel)
 */
(function() {
//subPanelの内容
var subPanels = ['page-report-button','security-button','download-monitor'];

    var identityBox = document.getElementById('identity-box');
    var urlbarIcons = document.getElementById('urlbar-icons');
    var searchContainer = document.getElementById('search-container');
    var urlbarContainer = document.getElementById('urlbar-container');
    var statusBar = document.getElementById('status-bar');

//プログレスバーを移動
    var progresspanel = document.getElementById('statusbar-progresspanel');
    urlbarIcons.insertBefore(progresspanel, urlbarIcons.firstChild);

//ステータス表示欄を移動
    var statusbarDisplay = document.getElementById('statusbar-display');
    urlbarIcons.insertBefore(statusbarDisplay, urlbarIcons.firstChild);//アドレスバーの右側に挿入。
/*
    identityBox.appendChild(statusbarDisplay);//アドレスバーの左側に挿入
    identityBox.style.borderRightWidth = '0px';
*/
//ステータスバーのパネルを格納(サブ)
    var subPanelContainer = document.createElement('toolbaritem');
    subPanelContainer.setAttribute('id', 'subpanel-container');
    subPanels.forEach(function(id){
        subPanelContainer.appendChild(document.getElementById(id));
    });
    searchContainer.parentNode.insertBefore(subPanelContainer, searchContainer.nextSibling);

//ステータスバーのパネルを格納(メイン)
    var mainPanelContainer = document.createElement('toolbaritem');
    mainPanelContainer.setAttribute('id', 'mainpanel-container');
    while(statusBar.hasChildNodes()){
        mainPanelContainer.appendChild(statusBar.lastChild);
    }
    urlbarContainer.parentNode.insertBefore(mainPanelContainer, urlbarContainer);

    statusBar.hidden = true;

    var style = <![CDATA[
        
        #urlbar-icons,#identity-box{
        }
        #statusbar-display{
            max-width: 600px !important;/* ステータス表示欄の最大幅 */
            padding-left: 10px !important;
            border: none !important;
            -moz-appearance: none !important;
            color: navy !important;
        }
        #mainpanel-container > statusbarpanel,
        #subpanel-container > statusbarpanel{
            margin: 0 !important;
        }
        /* プログレスバーを小さく */
        #statusbar-icon{
            width : 32px !important;
            max-width : 32px !important;
            min-width : 32px !important;
        }
    ]]>.toString();
    var sspi = document.createProcessingInstruction(
        'xml-stylesheet',
        'type="text/css" href="data:text/css,' + encodeURI(style) + '"'
    );
    document.insertBefore(sspi, document.documentElement);
    sspi.getAttribute = function(name) {
        return document.documentElement.getAttribute(name);
    };
})();

ステータスバーは非表示にするのでこのスクリプトの後にステータスバーに何かするスクリプトが実行しないようにしてください。

ステータスバーを消さない方法を考えた方が良いかな…?


移動させたパネルを右クリックすると通常のツールバー右クリックメニューがでることがあるけどスルー(ぇ


SS にあるタブの縦置きは作成中。

全画面表示を使わないのであれば問題なく動く状態ですが、ソースが汚すぎて公開できません(ぇ

2008-12-15

メニューバーを寄せ集める

Compact Menu ってありますよね。

メニューバーを一纏めにするやつです。

私が使ってるやつを公開します。


ググると色々出てきますね。


// ==UserScript==
// @name         MedleyMenu
// @namespace    http://d.hatena.ne.jp/Griever/
// @include      main
// ==/UserScript==

(function() {
	var medleyList = [
    'file-menu',      //ファイル
    'edit-menu',      //編集
    'view-menu',      //表示
    'history-menu',   //履歴
//    'bookmarksMenu',  //ブックマーク
//    'tools-menu',     //ツール
    'helpMenu',       //ヘルプ
    'endHistorySeparator',  //最近閉じたタブ の上の区切り
    'historyUndoMenu',      //最近閉じたタブ
    'menu_FileQuitItem'    //終了
    ];

    var mainMenubar = document.getElementById('main-menubar');
    var menu = mainMenubar.insertBefore(document.createElement('menu'), mainMenubar.firstChild);
    menu.setAttribute('label', 'Menu');
    menu.setAttribute('id', 'medley-menu');
    menu.setAttribute('accesskey', 'M');
    menu.setAttribute('disabled', false);

    var menupopup = menu.appendChild(document.createElement('menupopup'));
    medleyList.forEach(function(id){
        menupopup.appendChild(document.getElementById(id));
    });
})();

よく使うメニューをまとめると使いにくいので、使うメニューだけ選べるようになってます。

DOM Inspector の使い方さえわかれば好きなメニューを移動できます。


画像にしたかったらこんな感じの CSS を使います。

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

#medley-menu{
   -moz-binding: url("chrome://global/content/bindings/menu.xml#menu-iconic") !important;
   list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABtklEQVQ4ja2TTWsTURSG779z2diipRQ/UEoXwTENCSQpBalFoaJQijKNaZo4pDNpJ2SGDuEmJOkwEOIXitJC1XTvD+guuXlcXA3iQmzrC8/mXO7zLg5HiMtmyrDjT7zTs9zugGxlQNb6SqZ8QnrnmNT2EcnCZ5a2PnLf/IDx/B3xzTdktqKzKcOOCyGEeLh3qjbkd86L8SxUQgghcrsDLsLC+iFCCCGy1jcukjuP2lqQefUFgMWufuj3+/R6PaIoIgxDut0u7XabVquFlBIpJQC31po/BeWTvzaNx+MJSimUUgDceNDQgvTOsR5oMWEY0ul0aDabNBoNgiDA933q9Tq1Wg3XdQGYXwm0ILV99E+tvxiNRgDMLftakHz5CYCrvv4opSQIAjzPw3VdHMehUqlgWRblcplSqQTAbLauBcaL95PWP5t+ZzgcTgCYSe1rwb3NtwBc2QelFL7v47outm1jWRbFYpFCoUA+n8c0TUzTBGA6WdWC+Mbr86x/ktiSowWxhF1dfBqxsH7I3ccdbq+1uLkqmV85YG7ZZzbncT1T41raZSa1x3TSIZZwiCXs6qUP8b/kB3fkhrnvnMMsAAAAAElFTkSuQmCC") !important;
}

#medley-menu > hbox[anonid="accel"],
#medley-menu > .menu-right,
#medley-menu > .menu-iconic-text
	{ display: none !important; }

#medley-menu > .menu-iconic-left { padding: 0 2px !important; }

アイコンfamfamfam.comから拝借。

CSSuserstyles.org を参考にしました。

2008-12-14

XBL 良くわからん

これに影響を受けて色々試してます。


YouTube の動画のページを開いたら"&fmt=18"に移動させてみた。

DOMContentLoaded より早いので良い感じ。


2ch の「ime.nu」の削除もやってみた。

普通に出来る。ただ XBL と組み合わせる必要ないですね。

組み合わせるなら ime.nu を踏んだら即移動だけど、踏みたくないですよね(ぁ


Google Image でもリダイレクト削除してみた。

JavaScript を OFF にしてるとダメなのね...ψ(。。)メモメモ


Google 検索 にはてブの登録数を付けてみた。

良い感じ。

AutoPagerize との相性◎。

CSSセレクタの条件満たせば後から追加された要素にも即時適用されるのは気持ちいいです。


Opera の UserCSS + -o-link とはひと味違って面白いです。

Opera 10 は 「リンク + -o-link + oAutoPagerize」で落ちるのは直るかな…?



Elements - MDC

これによると dataスキームを登録できるらしいのですが、何度やってもうまくいかない。

Firebug の表示を見ると「-moz-binding:url(data:text/xml;」となっていてうまく認識できてない様子。

かと言って「;」を「%3B」にすると dataスキームとして認識しない。


これ無理じゃね?(ぇ

はてブに登録されてるか調べるBookmarklet

多分探せばあるはず。

どうやって付けるのか気になって調べたついでに書いてみました

ワンライナー

Bookmarkletワンライナー という突っ込みはナシでw

ここでは「1文で書いた物」ということにしておきます。

ブックマーク数が表示されるだけで、リンクは貼られません。。

  • リンクをチェック
javascript:Array.prototype.forEach.call(document.links, function(elem){elem.parentNode.insertBefore(new Image(), elem.nextSibling).src = 'http://b.hatena.ne.jp/entry/image/small/' + decodeURIComponent(elem.href).replace(/\#/g,'%23')});
  • 画像もチェック
javascript:Array.prototype.slice.call(document.links).concat(Array.prototype.slice.call(document.images)).forEach(function(elem){elem.parentNode.insertBefore(new Image(), elem.nextSibling).src = 'http://b.hatena.ne.jp/entry/image/small/' + decodeURIComponent(elem.href || elem.src).replace(/\#/g,'%23')})

  • 可読性重視で書いてみる
javascript:
var links = Array.prototype.slice.call(document.links);  //リンクを配列化
var images = Array.prototype.slice.call(document.images);//画像を配列化
var linksAndImages = links.concat(images);               //一度に走査するために、配列を1つにまとめる
linksAndImages.forEach(function(elem){                   //画像の作成
	var img = new Image();
	img.src = 'http://b.hatena.ne.jp/entry/image/small/' + decodeURIComponent(elem.href || elem.src).replace(/\#/g,'%23');
	elem.parentNode.insertBefore(img, elem.nextSibling);
});

document.links や getElementsBy〜 の動的な NodeList では追加されたリンクや画像も考慮しなきゃいけないけど、

配列に入れておけば後から要素が増えようが減ろうが関係ない。

実用版

画像+「このエントリーを含むブックマーク」のページ(?)にリンクを張ります

  • リンクのみチェック
javascript:
Array.prototype.slice.call(document.links).forEach(function(elem){
	var a = elem.parentNode.insertBefore(document.createElement('a'), elem.nextSibling);
	var s = decodeURIComponent(elem.href).replace(/\#/g,'%23');
	a.href='http://b.hatena.ne.jp/entry/' + s;
	a.appendChild(new Image()).src = 'http://b.hatena.ne.jp/entry/image/small/' + s;
});
  • 画像もチェック
javascript:
Array.prototype.slice.call(document.links).concat(Array.prototype.slice.call(document.images)).forEach(function(elem){
	var p = (elem.parentNode.tagName == 'A')? elem.parentNode: elem;
	var a = p.parentNode.insertBefore(document.createElement('a'), p.nextSibling);
	var s = decodeURIComponent(elem.href || elem.src).replace(/\#/g,'%23');
	a.href='http://b.hatena.ne.jp/entry/' + s;
	a.appendChild(new Image()).src = 'http://b.hatena.ne.jp/entry/image/small/' + s;
})

リンクの中にリンクができると クリックできるのは外側のリンクらしいので簡単なチェックも付けた。

XPath?面倒なので極力使いません(マテ

javascript:Array.prototype.forEach.call(document.querySelectorAll('a[href],[src]:not(embed)'), function(elem){
	var p = (elem.parentNode.tagName == 'A')? elem.parentNode: elem;
	var a = p.parentNode.insertBefore(document.createElement('a'), p.nextSibling);
	var s = decodeURIComponent(elem.href || elem.src).replace(/\#/g,'%23');
	a.href='http://b.hatena.ne.jp/entry/' + s;
	a.appendChild(new Image()).src = 'http://b.hatena.ne.jp/entry/image/small/' + s;
});

href と src で判断するから画像じゃなくてもマッチする。

一応 embed だけは避けてみた。

CSS セレクタは楽で良いな〜。

作ってみて

はてなスターの画像までブックマークされてるw

みんなでいろんな物をブックマークして気付いた人を笑わせましょう(マテ

カウンター
[PR] マンスリーマンション
AX