沒穿方服

封存

顯示╱隱藏內文
自訂完成的樣子。

Firefox 套件 SiteLauncher 協助你快速前往常用網站,在「目前分頁」浮現一個捷徑列表,比起快速撥號(Speed Dial)系列在「新分頁」開啟時顯示,總是快上一些。

衝著這點效率裝來,卻有勉強遷就的感覺;一來我沒有使用熱鍵啟動的習慣,二來也不愛它的設定介面(至少字體太小啦),試著調適一番,終於得心應手。


2009-11-07:因應 1.6.0 版釋出,部分自訂也要修改,詳見 SiteLauncher 1.6.0

手不在鍵盤上,用滑鼠手勢開啦

原設計比較著重使用鍵盤,按個鍵就直接開站。1.5.0 版因應用戶要求,修改為不必每站設鍵,但要叫出 Launcher 畫面還是得用 key 的,預設還是 Ctrl + Space 呢…… 還是用 FireGestures 自訂滑鼠手勢吧:

新增這個腳本手勢 → SiteLauncher

sitelauncherLauncher.mode = sitelauncherLauncher.m.aT;
sitelauncherLauncher.ab();

微調樣式

userChrome.css 對 Launcher 面板主要做兩件事:字調大、隱藏網站快速鍵顯示(因為沒設熱鍵的話,那格是空的):

#sitelauncherBox {font:18px Georgia,'中文字型',sans-serif !important;}
#sitelauncherBox label.sitelauncherKeyLabel {display:none !important;}
#sitelauncherBox #sitelauncherSites hbox {padding:0; cursor:pointer;}
#sitelauncherBox #sitelauncherSites hbox:hover label {color:#fc0;}
#sitelauncherSites label {cursor:pointer !important; opacity:0.9 !important;}
SiteLauncher 格線構造。

順便附圖看看 Launcher 構造,用的是以下規則:

#sitelauncherBoxRows row {border:1px solid red;}
#sitelauncherBoxRows row>hbox {border:1px solid white;}
#sitelauncherBoxRows row>*>* {border:1px solid blue;}
#sitelauncherBoxColumns column {border:1px solid green;}

可以從別的網站抓 favicon

Bookmarklet 可以自設圖示

這是本來就有的功能,只要捷徑以 javascript: 開頭,就會蹦出一個輸入框,看要抓誰家的 favicon 來用。

不過一般網站、Chrome URL 還是不能換圖示真無奈。


[陽春] 由 Fast Dial、Speed Dial 轉換書籤

Fast DialSpeed Dial 分別可匯出書籤為 ***.json ***.speeddial(文字檔),但 SiteLauncher 吃的是 XML…… 納悶是否有 Yahoo! Pipes 之類的服務,可以簡單做個轉換器,讓使用者上傳轉檔啊?

找無辦法又不願手工,退而做了個陽春轉換器,只能轉出網站的 URL 和名稱:

捷徑轉換



<Script Inside>


避免找不到匯出功能,參考擷圖:

Fast Dial 你得在書籤資料夾上按右鍵 Speed Dial 選項視窗裡就有

Bye Bye 舊手機

說要換,也拖延了不短的日子,我懷疑手機世界嗎?
如今改用親友綁約配的,又得意了起來。


舊機較厚些。

Nokia 2650
(obsolete)
練這蛻變大法
怕有半年了
且由他藏龍去

偶然幻想身邊小物是昆蟲類心驚驚。 諾忌牙、諾忌牙啟動了K皮夾模式!(超暴力激鬥) 冰淇淋的顏色。 銜環設計,材料為橡皮筋。
Chrome, telnet 網址也有圖示。

網站加入書籤會有 favicon,不過 bookmarklet(網址為 javascript: 開頭)或本地端檔案(網址為 file: 開頭)沒那好處,只能顯示預設的圖了。

修改辦法是靠 userChrome.css,搜尋發現相關的碼隨 Firefox 版本偶有變動,以下為 Fx 3.5.3 適用規則:

.bookmark-item[scheme="javascript"] {list-style-image:url("http://userscripts.org/images/script_icon.png") !important;}
.bookmark-item[scheme="file"] {list-style-image:url("http://127.0.0.1/favicon_green.ico") !important;}
.bookmark-item[scheme="chrome"] {list-style-image:url("http://www.spreadfirefox.com/sites/all/themes/sfxBB/img/favicon.png") !important;}
.bookmark-item[scheme="telnet"] {list-style-image:url("http://pcman.openfoundry.org/favicon.ico") !important;}

其中圖示是按 scheme 分辨,例如第四行會對應 telnet://ptt.cc 而跑出 PCMan 的圖(直連人家網站,僅為示範用啊)。

原版如前文,縮小的感覺真好,如今再改得稍微親切一點: 1)不在 chrome url 的話會提示, 2)顯示 sqlite 檔案前後大小。

若不在 chrome url 內,會提示你問題。 指定次數。 現在會算出檔案大小了。 動手前,還是要問一下。 縮減比率,看了開心。

將 bookmarklet 加入書籤 → Places Cleaner


原始碼拆開如下:

// 原創想法&程式碼來自 Irvin Chen 的 PlacesCleaner 收藏庫清潔工
// https://addons.mozilla.org/firefox/addon/13860/  (以 MPL 1.1 釋出)
// http://irvin.sto.tw/2009/08/firefox-3.html
// 請於 chrome url (例: chrome://browser/content/places/places.xul ) 中執行
var PlacesCleaner = {

clean: function(){

  // 測試是否有 XPConnect 權限
  if( ! netscape.security.PrivilegeManager.isPrivilegeEnabled('UniversalXPConnect') ) {
    alert('操作失敗:\n請於 chrome url 中執行這支 bookmarklet。\n例: chrome://browser/content/places/places.xul');
    return;
  }

  var PIPlacesDatabase = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
  var ProfD = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
  var sqliteFile = ProfD.clone();
      sqliteFile.append("places.sqlite");
  var originalSize = sqliteFile.fileSize;

  var intViewTime = parseInt(prompt('清除瀏覽次數不超過「幾次」的歷史紀錄?'),10);
  if(intViewTime+''=='NaN') { alert('輸入值非數字,已停止操作。'); return; }

  if(confirm('目前 places.sqlite 檔案大小為 ' + Math.round(originalSize/10.24)/100 + ' KB。\n若要備份,請選擇儲存檔案的位置:')) {
    var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
    fp.init(window, null, fp.modeSave);
    fp.defaultString='places';
    fp.defaultExtension='sqlite';
    fp.appendFilter(".sqlite","*.sqlite");
    if (fp.show() != fp.returnCancel) {
      if (fp.file.exists()) fp.file.remove(true);

      try {
        sqliteFile.copyTo( fp.file.parent, fp.file.leafName );
      }
      catch(e) {
        alert('操作失敗:無法儲存備份檔案。');
        return;
      }
    }
  }

  if(!confirm('確定要開始清除了嗎?\n也許會花上一點時間……')) return;
  try {
    // 取自 https://addons.mozilla.org/firefox/addon/13860/  原始碼授權條款: MPL 1.1
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM moz_places WHERE visit_count <=" + intViewTime + ");");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_places WHERE (visit_count <=" + intViewTime + " AND hidden <> 1 AND id NOT IN (SELECT place_id FROM moz_annos UNION SELECT fk FROM moz_bookmarks));");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_inputhistory WHERE place_id NOT IN (SELECT id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_favicons WHERE id NOT IN (SELECT favicon_id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_annos WHERE anno_attribute_id IN (SELECT id FROM moz_anno_attributes WHERE name = 'google-toolbar/thumbnail-score' OR name = 'google-toolbar/thumbnail');");
    PIPlacesDatabase.executeSimpleSQL("VACUUM");
  }
  catch(e) {
    alert('操作失敗:清除中出了狀況……');
    alert('Places Cleaner bookmarklet 錯誤訊息:\n '+e);
    return;
  }

  // 重新取得 fileSize
  sqliteFile = ProfD.clone();
  sqliteFile.append("places.sqlite");

  var ratio = Math.round( (originalSize-sqliteFile.fileSize)*10000/originalSize )/100;
  alert('清除完畢。\n\n檔案大小:' + Math.round(originalSize/10.24)/100 + ' KB → ' + Math.round(sqliteFile.fileSize/10.24)/100 + ' KB(已縮減 ' + ratio  + ' %)');

}

};

PlacesCleaner.clean();

2009-10-14: 稍作修改,新版比較親切好用,請參考 PlacesCleaner bookmarklet (更新)

原創想法&程式碼取自 Irvin Chen 的貢獻,詳見:

這支 bookmarklet 會跑原文所述的幾行 SQL,可指定刪除瀏覽次數(不超過)多少的紀錄,且刪除前可備份 places.sqlite。
※請於 Chrome URL 中執行(例: chrome://browser/content/places/places.xul )否則沒效。

將 bookmarklet 加入書籤 → Places Cleaner


原始碼拆開如下:

// 原創想法&程式碼來自 Irvin Chen 的 PlacesCleaner 收藏庫清潔工
// https://addons.mozilla.org/firefox/addon/13860/  (以 MPL 1.1 釋出)
// http://irvin.sto.tw/2009/08/firefox-3.html
// 請於 chrome url (例: chrome://browser/content/places/places.xul ) 中執行
var PlacesCleaner = {

clean: function(){

  var PIPlacesDatabase = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
  var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  
  var intViewTime = parseInt(prompt('清除瀏覽次數不超過「幾次」的歷史紀錄?'),10);
  if(intViewTime+''=='NaN') { alert('輸入值非數字,已停止操作。'); return; }

  if(confirm('若要備份 places.sqlite,請選擇儲存檔案的位置:')) {
    fp.init(window, null, fp.modeSave);
    fp.defaultString='places';
    fp.defaultExtension='sqlite';
    fp.appendFilter(".sqlite","*.sqlite");
    if (fp.show() != fp.returnCancel) {
      if (fp.file.exists()) fp.file.remove(true);
      var oldFile = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
      oldFile = oldFile.clone();
      oldFile.append("places.sqlite");
      try {
        oldFile.copyTo( fp.file.parent, fp.file.leafName );
      }
      catch(e) {
        alert('操作失敗:無法儲存備份檔案。');
        return;
      }
    }
  }
  
  if(!confirm('確定要開始清除了嗎?\n也許會花上一點時間……')) return;
  try {
    // 取自 https://addons.mozilla.org/firefox/addon/13860/  原始碼授權條款: MPL 1.1
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM moz_places WHERE visit_count <=" + intViewTime + ");");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_places WHERE (visit_count <=" + intViewTime + " AND hidden <> 1 AND id NOT IN (SELECT place_id FROM moz_annos UNION SELECT fk FROM moz_bookmarks));");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_inputhistory WHERE place_id NOT IN (SELECT id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_favicons WHERE id NOT IN (SELECT favicon_id FROM moz_places);");
    PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_annos WHERE anno_attribute_id IN (SELECT id FROM moz_anno_attributes WHERE name = 'google-toolbar/thumbnail-score' OR name = 'google-toolbar/thumbnail');");
    PIPlacesDatabase.executeSimpleSQL("VACUUM");
  }
  catch(e) {
    alert('操作失敗:清除中出了狀況……');
    alert('Places Cleaner bookmarklet 錯誤訊息:\n '+e);
    return;
  }
  alert('清除完畢。');

}

};

PlacesCleaner.clean();