三太子(Nalakuvara)計畫:技術細節
介入時機
Opera 初次安裝完成後,檔案都會放在 %ProgramFiles%\Opera
,直到第一次執行時,才把部分設定檔複製到 %APPDATA%\Opera
以及 %USERPROFILE%\Local Settings\Application Data\Opera
等處。因此最容易動手腳的時間,就是整個系統上第一次安裝 Opera 後、尚未執行前。
安裝指令
由於 Opera 官方的安裝檔預設會在安裝完成後就啟動 Opera,為了避免使用者誤按,所以要用這樣的指令來「安靜安裝」:
msiexec /i Opera_1060_int_Setup.msi /qn CREATE_DESKTOP_ICON_REG=1 CREATE_DESKTOP_ICON_REG_USR=1 CREATE_QUICKLAUNCH_ICON_REG=1 CREATE_QUICKLAUNCH_ICON_REG_USR=1 CREATE_STARTMENU_ICONS=1 CREATE_STARTMENU_ICONS_REG_USR=1 ISCHECKFORPRODUCTUPDATES=0 ALLUSERS=1 LAUNCH_OPERA_ON_FINISH=0 SET_DEFAULT_BROWSER=1
在這組參數當中,會指定:
- 要建立桌面圖示(
CREATE_DESKTOP_ICON_REG=1 CREATE_DESKTOP_ICON_REG_USR=1
) - 要建立快速啟動列圖示(
CREATE_QUICKLAUNCH_ICON_REG=1 CREATE_QUICKLAUNCH_ICON_REG_USR=1
) - 要建立開始選單圖示(
CREATE_STARTMENU_ICONS=1 CREATE_STARTMENU_ICONS_REG_USR=1
) - 安裝前不檢查是否有更新版(
ISCHECKFORPRODUCTUPDATES=0
) - 為所有的使用者安裝(
ALLUSERS=1
) - 安裝後不要自動啟動 Opera(
LAUNCH_OPERA_ON_FINISH=0
) - 將 Opera 設為預設瀏覽器(
SET_DEFAULT_BROWSER=1
)
如果有別的考量,而要採取不同的安裝選項,就可以修改上述各參數。如果需要指定安裝路徑,則可以再加上這樣的參數:
INSTALLDIR="路徑名稱"
也就是使用像這樣的指令:
msiexec /i Opera_1060_int_Setup.msi /qn CREATE_DESKTOP_ICON_REG=1 CREATE_DESKTOP_ICON_REG_USR=1 CREATE_QUICKLAUNCH_ICON_REG=1 CREATE_QUICKLAUNCH_ICON_REG_USR=1 CREATE_STARTMENU_ICONS=1 CREATE_STARTMENU_ICONS_REG_USR=1 ISCHECKFORPRODUCTUPDATES=0 ALLUSERS=1 LAUNCH_OPERA_ON_FINISH=0 SET_DEFAULT_BROWSER=1 INSTALLDIR="路徑名稱"
檔案位置
請注意:為了說明方便,以下的解說都是以 Opera 的預設安裝路徑為主。如果使用了自定的安裝路徑,則這些檔案的位置也都會有所不同。
Opera 當中,有一些設定檔可以放在 %ProgramFiles%\Opera\custom\defaults 內,如此不會真的蓋掉原本的預設設定檔,但是程式的預設行為就會以這些「自定的預設值」為優先。另外有一些設定檔可以放在 %ProgramFiles%\Opera\locale 內的各語系目錄當中,則只有切換成某個語系的時候,那些設定才會生效。因此一些跟「介面語言」有關的設定,最好都採用這樣的方式來做。不過有一些設定檔就非得要蓋掉原本的預設檔案才有用,這就沒有辦法了。
按照這樣的邏輯,最後完整安裝套件會把修改過的檔案複製到下列各處:
- %ProgramFiles%\Opera\custom\defaults\fastforward.ini
- %ProgramFiles%\Opera\custom\defaults\feedreaders.ini
- %ProgramFiles%\Opera\custom\defaults\operaprefs.ini
- %ProgramFiles%\Opera\defaults\webmailproviders.ini
- %ProgramFiles%\Opera\locale\zh-tw\bookmarks.adr
- %ProgramFiles%\Opera\locale\zh-tw\search.ini
- %ProgramFiles%\Opera\locale\zh-tw\zh-tw.lng
- %ProgramFiles%\Opera\program\plugins\npie_opera.dll
- %ProgramFiles%\Opera\styles\user\000_Antiflash.css
- %ProgramFiles%\Opera\styles\user\000_bantiad.css
- %ProgramFiles%\Opera\ui\standard_menu.ini
- %ProgramFiles%\Opera\ui\standard_toolbar.ini
- %APPDATA%\Opera\Opera\override.ini
修改使用者設定
補綴套件除了也會複製上述檔案外,還會再複製下列檔案,蓋掉使用者原有的設定:
- %APPDATA%\Opera\Opera\styles\000_Antiflash.css
- %APPDATA%\Opera\Opera\styles\000_bantiad.css
- %USERPROFILE%\Local Settings\Application Data\Opera\Opera\custom\defaults\fastforward.ini
- %USERPROFILE%\Local Settings\Application Data\Opera\Opera\custom\defaults\feedreaders.ini
- %USERPROFILE%\Local Settings\Application Data\Opera\Opera\custom\defaults\operaprefs.ini
並且會修改下列檔案的部分內容:
- %APPDATA%\Opera\Opera\operaprefs.ini
使用者設定一覽
使用者設定(修改過的檔案) | |||
---|---|---|---|
作用 | 功能設定連結 | 預設值 | 三太子設定值 |
滑鼠手勢(註:10.50 起預設為 1) | opera:config#UserPrefs|EnableGesture | 0 | 1 |
超級拖放 | opera:config#UserPrefs|EnableDrag | 247 | 255 |
在分頁頁籤雙擊就關閉頁籤 | opera:config#UserPrefs|DoubleclicktoCloseTab | 0 | 1 |
不要重新使用目前的頁籤 | opera:config#UserPrefs|NewWindow | 0 | 1 |
在背景開新分頁(註:10.50 起沒有這個設定項) | opera:config#UserPrefs|OpenNewWindowinBackground | 0 | 1 |
在背景分頁開啟拖曳的鏈結(註:10.60 起新增) | opera:config#UserPrefs|OpenDraggedLinkInBackground | 0 | 1 |
在視窗邊緣顯示面板切換區域 | opera:config#UserPrefs|Showpaneltoggle | 0 | 1 |
設定瀏覽列位置在上 | opera:config#UserPrefs|NavigationBarAlignment | 0 | 2 |
瀏覽列只在需要時出現 | oopera:config#UserPrefs|NavigationBarAutoAlignment | 0 | 1 |
啟用使用者 JavaScript | opera:config#UserPrefs|UserJavaScript | 0 | 1 |
使用者 JavaScript 目錄 | opera:config#UserPrefs|UserJavaScriptFile | C:\Program Files\Opera\UserJS | |
總是載入使用者 JavaScript | opera:config#UserPrefs|AlwaysLoadUserJavaScript | 0 | 1 |
瀏覽器對話方塊字型設為新細明體(Opera 10.60 起不再需要這項設定) | opera:config#Fonts|Dialog | 15,4,0,0,0,0,SimSun | 12,4,0,0,0,0,新細明體 |
瀏覽器選單字型設為新細明體(Opera 10.60 起不再需要這項設定) | opera:config#Fonts|Menu | 15,4,0,0,0,0,SimSun | 12,4,0,0,0,0,新細明體 |
瀏覽器面板字型設為新細明體(Opera 10.60 起不再需要這項設定) | opera:config#Fonts|Panel | 15,4,0,0,0,0,SimSun | 12,4,0,0,0,0,新細明體 |
瀏覽器工具列字型設為新細明體(Opera 10.60 起不再需要這項設定) | opera:config#Fonts|Toolbar | 15,4,0,0,0,0,SimSun | 12,4,0,0,0,0,新細明體 |
瀏覽器工具提示字型設為新細明體(Opera 10.60 起不再需要這項設定) | opera:config#Fonts|Tooltip | 15,4,0,0,0,0,SimSun | 12,4,0,0,0,0,新細明體 |
瀏覽網頁時優先使用繁體中文 | opera:config#Network|HTTPAcceptLanguage | zh-TW,zh;q=0.9,en;q=0.8 | zh-tw,en;q=0.9 |
在網址列輸入無效網址時不要查找區域網路主機名稱 | opera:config#Network|CheckLocalHostName | 1 | 0 |
在網址列輸入無效網址時不要自動補上前綴、後綴 | opera:config#Network|EnableHostNameExpansion | 1 | 0 |
在網址列輸入無效網址時就用搜尋引擎查詢 | opera:config#Network|EnableHostNameWebLookup | 0 | 1 |
在網址列輸入無效網址時要用搜尋引擎指令 | opera:config#Network|HostNameWebLookupAddress | http://www.google.com/search?q=%s&sourceid=opera&num=%i&ie=utf-8&oe=utf-8 |
使用者 CSS 一覽
使用者 CSS | |||
---|---|---|---|
作用 | 檔案 | 說明 | |
搭配 Flash Blocker 使用 | 000_Antiflash.css | 使用者 CSS 目錄當中所有的檔案照檔名排列時,這個檔案一定要是第一個 | |
搭配 Grafik Blocker 使用 | 000_bantiad.css | 使用者 CSS 目錄當中所有的檔案照檔名排列時,這個檔案一定要是第二個 |
使用者 JavaScript 一覽
使用者 JavaScript | |||
---|---|---|---|
作用 | 套件名稱 | 主要檔案 | 設定檔案 |
阻擋廣告 | AdBlock Plus | adblock.js | |
大圖自動縮小 | Auotsizer 2 | autosizer.js | |
調整 Google 各項網頁服務 | CustomizeGoogle | customizegoogle.js | customizegoogle_prefs.js |
繁簡中文互轉 | 同文堂 | transform_v2.js | |
增強對 W3C Ruby Annotation 標準的支援 | HTML Ruby | ruby.js | ruby.settings.js |
自動啟用 IE Tab | AutoRender in IE Tab | Autorender.in.IE.js | Autorender.in.IE.js |
長按連結在背景分頁開啟 | Open in Background with Long Press | open-in-background-with-long-press.js | |
自動備份文字區域輸入內容 | Textarea Backup | textareabackup.js | textareabackup.js |
外掛模組一覽
外掛模組 | ||
---|---|---|
作用 | 套件名稱 | 檔案 |
以 IE 引擎顯示分頁內容 | ie_opera(IE Tab) | npie_opera.dll |
網頁郵件服務清單補增項目一覽
Opera\defaults\webmailproviders.ini(修改過的檔案) | |||
---|---|---|---|
[名稱] | ID= | URL= | ICON= |
[Gmail - HTML5] | 8 | https://mail.google.com/mail/?extsrc=mailto&url=%s | https://mail.google.com/favicon.ico |
[Gmail] | 9 | https://mail.google.com/mail/?compose=1&view=cm&fs=1&to=%t&su=%j&body=%m&cc=%k&bcc=%l | |
[Hotmail] | 10 | http://mail.live.com/mail/EditMessageLight.aspx?n=&to=%t&cc=%k&subject=%j&body=%m&bcc=%l | http://mail.live.com/favicon.ico |
[Ymail - Generic] | 11 | http://compose.mail.yahoo.com/?To=%t&Subj=%j&Body=%m&Cc=%k&Bcc=%l | http://mail.yahoo.com/favicon.ico |
[Ymail - Classic Compose + New UI] | 12 | http://us.mg1.mail.yahoo.com/mc/compose?ymv=0&body=%m&Subj=%j&to=%t&cc=%k&bcc=%l | |
[Ymail - New UI + Blocking Workaround] | 13 | http://us.mg1.mail.yahoo.com/dc/launch?sysreq=ignore&action=compose&login=1&To=%t&Subj=%j&Cc=%k&Bcc=%l&Body=%m | |
[Mail2000] | 14 | http://www.mail2000.com.tw/cgi-bin/genMail.pl?adr=%t&content=%m&subject=%j | http://www.mail2000.com.tw/favicon.ico |
[PChome Mail] | 20 | http://mail.pchome.com.tw/compose_content?MailTo=%t&MailSubject=%j&MailCc=%k&MailBcc=%l&text2=%m | http://www.pchome.com.tw/favicon.ico |
[Webmail@URL (wm1)] | 21 | http://wm1.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | http://www.url.com.tw/images/url.ico |
[Webmail@URL (wm2)] | 22 | http://wm2.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | |
[Webmail@URL (wm3)] | 23 | http://wm3.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | http://www.url.com.tw/images/url.ico |
[Webmail@URL (wm4)] | 24 | http://wm4.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | |
[Webmail@URL (wm5)] | 25 | http://wm5.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | http://www.url.com.tw/images/url.ico |
[Webmail@URL (wm6)] | 26 | http://wm6.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | |
[Webmail@URL (wm7)] | 27 | http://wm7.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | http://www.url.com.tw/images/url.ico |
[Webmail@URL (wm8)] | 28 | http://wm8.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | |
[Webmail@URL (wm9)] | 29 | http://wm9.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m | http://www.url.com.tw/images/url.ico |
[Webmail@URL (wm10)] | 30 | http://wm10.url.com.tw/src/compose.php?mailbox=INBOX&startMessage=1&send_to=%t&sed_to_cc=%k&send_to_bcc=%l&subject=%j&body=%m |
語系檔變動一覽
Opera\locale\zh-tw\zh-tw.lng(修改過的檔案) Opera\locale\zh-cn\zh-cn.lng(修改過的檔案) Opera\locale\en\en.lng(修改過的檔案) |
||
---|---|---|
字串代號 | 原始內容 | 三太子修改 |
-1539396211 | 字典(D) | 韋氏英英字典(W) |
字典 | iCIBA爱词霸 | |
Dictionary | Merriam-Webster Online Dictionary | |
1634087069 | 百科全書(E) | 英文維基百科(E) |
百科全书 | 英语维基百科(E) | |
Encyclopedia | English Wikipedia | |
1209820046 | 法文 > 英文(E) | 法文 > 英文(2) |
法语译英语 | 法语译英语(2) | |
French to English | (2) French to English | |
1209820004 | 法文 > 德文(M) | 英文 > 繁體中文(T) |
法语译德语 | 英语译中文(C) | |
French to German | (T) English to Traditional Chinese | |
1209820184 | 法文 > 義大利文(T) | 繁體中文 > 英文(E) |
法语译意大利语 | 中文译英语(E) | |
French to Italian | (E) Traditional Chinese to English | |
1209820415 | 法文 > 葡萄牙文(O) | Yahoo!奇摩字典 |
法语译葡萄牙语 | 台湾Yahoo!奇摩字典 | |
French to Portuguese | Yahoo! Taiwan Dictionary | |
1209820051 | 法文 > 西班牙文(A) | 中文維基百科(Z) |
法语译西班牙语 | 中文维基百科(Z) | |
French to Spanish | Chinese Wikipedia | |
1206981023 | 德文 > 英文(N) | 德文 > 英文(3) |
德语译英语 | 德语译英语(3) | |
German to English | (3) German to English | |
1206981060 | 德文 > 法文(R) | 國家語文綜合連結檢索 |
德语译法语 | 台湾国家语文综合连结检索 | |
German to French | National Language Composite Search | |
1213449683 | 義大利文 > 英文(L) | 義大利文 > 英文(4) |
意大利语译英语 | 意大利语译英语(4) | |
Italian to English | (4) Italian to English | |
1213449720 | 義大利文 > 法文(Y) | 日文維基百科(J) |
意大利语译法语 | 日语维基百科(J) | |
Italian to French | Japanese Wikipedia | |
1221751130 | 葡萄牙文 > 英文(U) | 葡萄牙文 > 英文(5) |
葡萄牙语译英语 | 葡萄牙语译英语(5) | |
Portuguese to English | (5) Portuguese to English | |
1208670062 | 西班牙文 > 英文(H) | 西班牙文 > 英文(6) |
西班牙语译英语 | 西班牙语译英语(6) | |
Spanish to English | (6) Spanish to English | |
1208670099 | 西班牙文 > 法文(B) | 偽基百科(U) |
西班牙语译法语 | 伪基百科(U) | |
Spanish to French | Uncyclopedia | |
1208490529 | 英文 > 繁體中文(C) | 英文 > 日文(J) |
英语译日语 | 英语译日语(J) | |
English to Japanese | (J) English to Japanese | |
1213952801 | 繁體中文 > 英文(V) | 日文 > 英文(1) |
日语译英语 | 日语译英语(1) | |
Japanese to English | (1) Japanese to English | |
999999999 | 查字典(D) | |
查字典(D) | ||
Dictionary | ||
999999998 | 查百科(E) | |
查百科(E) | ||
Encyclopedia | ||
999999997 | 合併且保留 | |
合并且保留 | ||
Merge and Keep | ||
999999996 | 合併 | |
合并 | ||
Merge |
搜尋定義檔變動
請直接參考修改後的 Opera\locale\zh-tw\search.ini、Opera\locale\zh-cn\search.ini、Opera\locale\en\search.ini。
書籤定義檔變動
請直接參考修改後的 Opera\locale\zh-tw\bookmarks.adr。
快速翻頁定義檔變動
請直接參考修改後的 Opera\custom\defaults\fastforward.ini。
;Chinese (traditional and simplified) 前进 继续 翻页 下页 下頁 下篇 后页 后页> 往后>> 下一頁 下一页=101 下一页> 下一页>> 下一个 下一张 下一张 > 下一幅 下一幅 > 下一章 下一节 下一節 下一篇 后一页=90 下一步 翻下页 翻下頁 看下一页 下一页(快捷键→) "[下頁]" "[下页]" "[继续]" "[下一頁]" "[下一页]" "[翻下頁]" "[翻下页]" 下一張 (C) 下一頁 (C)
預設選單變動
請直接參考修改後的 Opera\ui\standard_menu.ini。
[Document Popup Menu] Item, MI_IDM_Prev_PM, = Back Item, MI_IDM_Next_PM, = Forward Item, M_REWIND, = Rewind Item, M_FAST_FORWARD, = Fast Forward --------------------1 Item, MI_IDM_Reload_PM, = Reload Submenu, MI_IDM_AUTORELOAD_TOGGLE_PARENT, Reload Menu --------------------2 Item, M_DOCUMENT_POPUP_MENU_BOOKMARK_PAGE = Add to bookmarks, 1 Item, MI_IDM_POPUP_ADDRESS = Copy document address Item, MI_IDM_SEND_URL_EMAIL = Send document address in mail --------------------3 Item, MI_IDM_Print = Print document Item, MI_IDM_Kilde = View document source Item, M_DOCUMENT_POPUP_MENU_VALIDATE = Validate frame source Submenu, M_OPEN_WITH, Open in menu --------------------5 Include, Internal Frame Include, Internal Document Background --------------------7 Submenu, MI_IDM_ENCODING_AUTOMATIC_PARENT, Encoding Menu Item, M_BLOCK_CONTENT = Content block mode on | Content block mode off Item, M_EDIT_SITE_PREFERENCES = Edit site preferences --------------------8 Item, MI_IDM_FULLSCREENTOGGLE = Enter fullscreen | Leave fullscreen
[Hotclick Popup Menu] Item, MI_IDM_DOCCOPY = Copy Item, M_COPY_TO_NOTE = Copy to note Platform Win2000-Unix-Mac-QNX, Feature Voice, Item, M_HOTCLICK_MENU_ITEM_SPEAK = Speak selection --------------------1 Item, MI_IDM_SELSEARCH = Hotclick search, 200 Submenu, MI_IDM_SEARCH_DUMMY_PARENT, Internal Search With Submenu, 999999999, Dictionary menu Submenu, 999999998, Encyclopedia menu --------------------2 Submenu, MI_IDM_SELTRANSLATE_EN_FR_PARENT, Translate menu --------------------3 Item, M_HOTCLICK_POPUP_MENU_GOTO_URL = Go to page, "%t" Item, MI_IDM_SELMAIL = Send text in mail
[Dictionary menu] Item, MI_IDM_SELTRANSLATE_FR_PT = Hotclick search, 109 Item, MI_IDM_SELDICTIONARY = Hotclick search, 50 --------------------1 Item, MI_IDM_SELTRANSLATE_DE_FR = Hotclick search, 112
[Encyclopedia menu] Item, MI_IDM_SELTRANSLATE_FR_ES = Hotclick search, 110 Item, MI_IDM_SELENCYCLOPED = Hotclick search, 51 Item, MI_IDM_SELTRANSLATE_IT_FR = Hotclick search, 114 --------------------1 Item, MI_IDM_SELTRANSLATE_ES_FR = Hotclick search, 117
[Translate menu] Item, MI_IDM_SELTRANSLATE_FR_DE = Hotclick search, 107 Item, MI_IDM_SELTRANSLATE_FR_IT = Hotclick search, 108 --------------------1 Item, MI_IDM_SELTRANSLATE_JA_EN = Hotclick search, 119 Item, MI_IDM_SELTRANSLATE_FR_EN = Hotclick search, 106 Item, MI_IDM_SELTRANSLATE_DE_EN = Hotclick search, 111 Item, MI_IDM_SELTRANSLATE_IT_EN = Hotclick search, 113 Item, MI_IDM_SELTRANSLATE_PT_EN = Hotclick search, 115 Item, MI_IDM_SELTRANSLATE_ES_EN = Hotclick search, 116 --------------------2 Item, MI_IDM_SELTRANSLATE_EN_JA = Hotclick search, 118 Item, MI_IDM_SELTRANSLATE_EN_FR = Hotclick search, 100 Item, MI_IDM_SELTRANSLATE_EN_DE = Hotclick search, 101 Item, MI_IDM_SELTRANSLATE_EN_IT = Hotclick search, 102 Item, MI_IDM_SELTRANSLATE_EN_PT = Hotclick search, 103 Item, MI_IDM_SELTRANSLATE_EN_ES = Hotclick search, 104
[Note Item Popup Menu] Item, MI_IDM_SELMAIL = Send text in mail --------------------1 Item, MI_IDM_HLITEM_CUT = Cut Item, MI_IDM_HLITEM_COPY = Copy Item, MI_IDM_HLITEM_PASTE = Paste Item, 999999997 = Copy & Paste to note Item, 999999996 = Copy & Delete & Paste to note Item, MI_IDM_HLITEM_DELETE = Delete --------------------5 Item, MI_IDM_HLITEM_SELECTALL = Select all --------------------6 Item, M_BOOKM_PANEL_VIEW_MENU_SORT_BY_MY_ORDER = Sort by column, -1 Item, M_BOOKM_PANEL_VIEW_MENU_SORT_BY_NAME = Sort by column, 0 --------------------7 Item, M_NEW_NOTE = New note Item, SI_NEW_FOLDER_BUTTON_TEXT = New folder Item, M_NEW_SEPARATOR = New Seperator
預設工具列(按鈕)變動
請直接參考修改後的 Opera\ui\standard_toolbar.ini。
[Customize Toolbar Custom.content] Button0, "Go to page"="Go to page, "javascript:void(function (){subscriptions = [];linksList = document.getElementsByTagName('link');for ( i = 0; i < linksList.length; i++ ){ type = linksList[i].type;if ( type == 'application/rss+xml' || type == 'application/atom+xml' || type == 'application/rdf+xml' ){ subscriptions.push( { 'title':linksList[i].title, 'href':linksList[i].href } );}}if ( subscriptions.length == 0 ) return;str = '你要訂閱哪個源料?請輸入編號\n';for ( i = 0; i < subscriptions.length; i++ ){str += i + ': ' + subscriptions[i].title + '\n';}str = str.substr( 0, str.length - 1 );ret = prompt( str );if ( ret < 0 || ret >= subscriptions.length ) return;document.location.href = 'feed://' + subscriptions[ret].href;})()", 1, "以支援 feed: 協定的桌面源料閱讀軟體來訂閱源料", "RSS"" Button1, "Select user CSS file"="Select user CSS file, 0, , "Flash Blocker 啟用中", "Transfer Loading" > Deselect user CSS file, 0, , "Flash Blocker 已停用", "Transfer Failure"" Button2, "Select user CSS file"="Select user CSS file, 1, , "Grafik Blocker 啟用中", "Transfer Loading" > Deselect user CSS file, 1, , "Grafik Blocker 已停用", "Transfer Failure"" Button3, "依據結構 (nth-child) 來阻擋網頁元素"="Go to page, "javascript:navigator.ujs_adblock.block()", , "依據結構 (nth-child) 來阻擋網頁元素", "Delete"" Button4, "阻擋網頁元素"="Go to page, "javascript:navigator.ujs_adblock.block(true)", , "阻擋網頁元素", "Delete"" Button5, "還原被擋掉的網頁元素"="Go to page, "javascript:navigator.ujs_adblock.unblock()", , "還原被擋掉的網頁元素", "Mail Redirected"" Button6, "還原前一個擋掉的網頁元素"="Go to page, "javascript:navigator.ujs_adblock.unblock(true)", , "還原前一個擋掉的網頁元素", "Mail Redirected"" Button7, "手動輸入要擋掉的 CSS 選擇符"="Go to page, "javascript:navigator.ujs_adblock.edit()", , "手動輸入要擋掉的 CSS 選擇符", "Window Mail Compose Icon"" Button8, "View in IE Tab"="Go to page, "javascript:(function(){var h=location.href;if(!h||/^(javascript|about|opera):/i.test(h)){return}window.open().document.write('<html>'+'<head>'+'<title>'+(document.title?document.title:location.href).replace(/</g,'<')+' - view in ie</title>'+'<style type=\x22text/css\x22>body{margin:0;padding:0;}embed{width:100\x25;height:100\x25;}</style>'+'</head>'+'<body>'+'<script type=\x22text/javascript\x22'+'src=\x22data:text/javascript,'+encodeURIComponent('document.write(\'<embed type=\x22application/viewinie\x22 param-location=\x22'+location.href+'\x22></embed>\');')+'\x22>'+'</script>'+'</body>'+'</html>')})();", , "View in IE", "View"" Button9, "View in IE Same Tab"="Go to page, "javascript:(function(){var h=location.href;if(!h||/^(javascript|about|opera):/i.test(h)){return}document.write('<html>'+'<head>'+'<title>'+(document.title?document.title:location.href).replace(/</g,'<')+' - view in ie</title>'+'<style type=\x22text/css\x22>body{margin:0;padding:0;}embed{width:100\x25;height:100\x25;}</style>'+'</head>'+'<body>'+'<script type=\x22text/javascript\x22'+'src=\x22data:text/javascript,'+encodeURIComponent('document.write(\'<embed type=\x22application/viewinie\x22 param-location=\x22'+location.href+'\x22></embed>\');')+'\x22>'+'</script>'+'</body>'+'</html>')})();", , "View in IE Same Tab", "View"" Button10, "繁"="Go to page, "javascript:void(TongWen.trans2Trad(document));", , "繁", "A"" Button11, "简"="Go to page, "javascript:void(TongWen.trans2Simp(document));", , "简", "A"" Button12, "BBS"="Go to page, "file://localhost/C:/ZTerm/ZTermApplet.html", , "BBS", "A"" Button13, "Google 即時小字典"="Go to page, "javascript:function translate(word){var glf=document.getElementById('glf');glf.contentWindow.gtrans(word)};function findAndReplace(searchText,replacement,searchNode){var regex=typeof searchText==='string'?new RegExp(searchText,'g'):searchText,childNodes=(searchNode||document.body).childNodes,cnLength=childNodes.length,excludes='html,head,style,title,link,meta,script,object,textarea,iframe';while(cnLength--){var currentNode=childNodes[cnLength];if(currentNode.nodeType===1&&(excludes+',').indexOf(currentNode.nodeName.toLowerCase()+',')===-1){arguments.callee(searchText,replacement,currentNode)}if(currentNode.nodeType!==3||!regex.test(currentNode.data)){continue}var parent=currentNode.parentNode,frag=(function(){var html=currentNode.data.replace(regex,replacement),wrap=document.createElement('div'),frag=document.createDocumentFragment();wrap.innerHTML=html;while(wrap.firstChild){frag.appendChild(wrap.firstChild)}return frag})();parent.insertBefore(frag,currentNode);parent.removeChild(currentNode)}};function inject(){findAndReplace('\\b[^ ]+\\b',function(term){return'<span onmouseover=\'translate(this)\'>'+term+'</span>'})};function init(){var glf=document.createElement('iframe');glf.id='glf';glf.width=0;glf.height=0;glf.frameborder=0;glf.style.borderWidth='0';glf.style.borderStyle='none';glf.style.position='fixed';glf.style.top='10px';glf.style.right='10px';document.body.appendChild(glf);var doc=glf.contentDocument;doc.open();doc.write('<head><title>Sample html</title><script type=\'text/javascript\' src=\'http://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22language%22%2C%22version%22%3A%221%22%7D%5D%7D\'></script><script type=\'text/javascript\'>function gtrans(word) {if(word.title) return; word.title = \'translating...\'; var text = word.innerHTML; google.language.detect(text, function(result) { if (!result.error && result.language) { google.language.translate(text, result.language, \'zh-tw\', function(result) {if (result.translation) { word.title = text + \': \' + result.translation;}});}});};</script></head><body style=\'margin:0; background-color: transparent;\'><div id=\'branding\' style=\'width : 0px; height : 0px; text-align: left;\'></div></body>');doc.close();inject()};init();", 1, "Google 即時小字典", "Window Chat Room Icon"" Button14, "搜尋已選詞"="Hotclick search, , , "搜尋已選詞", "Search Web"" Button15, "站內搜尋"="Go to page, "javascript:var t=window.location.hostname;var s=prompt('Google site search - enter search string:','');if(s){if(s.match(/^d%5cs.+/)){s=s.substring(2,s.length);t=t.match(/%5b^%5c.%5d+%5c.%5cw{2,4}$/)+''};void(location.href='http://www.google.com/search?q=site:'+t+'+'+s+'&sourceid=opera')}", 1, "站內搜尋", "Search Web""
- 以支援 feed: 協定的桌面源料閱讀軟體來訂閱源料
- Flash Blocker
- Grafik Blocker
- 依據結構 (nth-child) 來阻擋網頁元素
- 阻擋網頁元素
- 還原被擋掉的網頁元素
- 還原前一個擋掉的網頁元素
- 手動輸入要擋掉的 CSS 選擇符
- View in IE Tab
- View in IE Same Tab
- 搜尋已選詞
- [繁] 簡體轉繁體(同文堂)
- [簡] 繁體轉簡體(同文堂)
- [BBS] 在自己的電腦上使用 ZTermApplet (BBS/Telnet/SSH)
- [BBS] 連線使用 ZTermApplet (BBS/Telnet/SSH)
修改 ZTerm Applet 設定
%USERPROFILE%\.ztermrc(修改過的檔案) | ||
---|---|---|
設定項 | 預設值 | 三太子設定值 |
external-browser-command | explorer "%u" | opera "%u" |
安裝腳本
整個安裝及修改設定的過程主要是利用 AutoHotKey 所撰寫的腳本,腳本源碼提供如下,給有興趣的朋友參考(注意:這些腳本都是 Big5/ANSI 編碼,但是目前網頁伺服器會送出 UTF-8 標頭,所以請自行指定內容編碼──或者請先下載之後再閱讀):
- installer.ahk(完整安裝套件)
- patch.ahk(補綴套件)
- strings.ahk(各套件用到的訊息字串)
- eula.ahk(完整安裝套件的使用者授權同意畫面)
- installergui.ahk(完整安裝套件的安裝選項畫面)
- optionsgui.ahk(完整安裝套件的功能選項畫面)
- extensionsgui.ahk(選擇擴充功能的畫面)
- operapaf.ahk(PortableApps.com 套件用來啟動 Opera 的介接腳本)
- operausb.ahk(Opera@USB 套件用來啟動 Opera 的介接腳本)
- operau3.ahk(Opera@U3 套件用來啟動 Opera 的介接腳本)
- operator.ahk(OperaTor 套件用來啟動 OperaTor 的介接腳本)
另外一些小工具也是以 AutoHotKey 撰寫的腳本編譯而成,這些腳本的源碼也提供如下:
- build.ahk(用來建立/打包各種套件的主腳本)
- check.ahk(檢查檔案是否下載完整,需要額外用到 MD5Lib.dll 來處理 MD5 加總檢核碼)
- DeleteAllOperaFiles.ahk(清空 Opera 移除後殘留檔案)
- MouseGestureTrail.ahk(使用滑鼠手勢功能時顯示滑鼠軌跡)
- RegisterFeedProtocolApp.ahk(把任何應用程式註冊成為
feed:
通訊協定用的預設程式)
如果有人改善了這些腳本,也可以提供給我納入下一版改進,謝謝。
其他工具
為了製作各種不同的套件,我還用了下列這些工具:
- U3P2EXE Tool 用來製作 Opera@U3 安裝套件
- PortableApps.com Installer 用來製作 PortableApps 套件
- Opera Portable Builder 用來製作可攜式/無痕可攜式套件
打包
最後採用 WinRAR 來打包成自動解壓安裝檔。自動解壓檔的主要設定事項為:
- 一般設定:解壓縮之後執行 installer.exe 或 patch.exe
- 模式:解封裝至暫存資料夾
- 更新:覆寫模式:覆寫所有檔案
- 文字及圖示:自解檔視窗標題:Opera Nalakuvara
- 文字及圖示:自解檔標誌、自解檔圖示
另外為了安全起見,還加上這些設定:
- 一般設定:建立結實壓縮檔
- 一般設定:放置憑證驗證
- 一般設定:放置復原記錄
- 一般設定:測試壓縮檔
- 一般設定:鎖定壓縮檔
- 進階設定:復原記錄:10%
為了簡化作業流程,我寫了一個打包用的 AutoHotKey 腳本 build.ahk
佈署
所有的工作檔案都是使用 Perforce 進行版本管理,另一個好處就是檔案更新後祇要遞交(p4 submit
)到伺服器後,網頁伺服器就會定期同步更新(p4 sync
)。
另外為了減輕檔案下載負擔,因此打包好的專案檔案,會透過 RapidShare 提供下載。(採用 RapidShare 的其中一個原因是,我剛好有購買它的 Premium 帳號,所以不會有太久沒人下載而導致檔案消失的問題。)除了 RapidShare 之外,另外也使用 Coral CDN 的免費分流服務,也就是在下載網址的網域名稱部分,多加上 .nyud.net
即可。