Источник
Вот мой перевод с некотрыми дополнениями:скрытый текстВыделить кодКод:
/*CODE*/ var icon1 = "data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w=="; var icon2 = "data:image/ico;base64,AAABAAEAFBQAAAEAIAC4BgAAFgAAACgAAAAUAAAAKAAAAAEAIAAAAAAAQAYAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMxkzMzMZMzMzIDMzMzMzMzMzMzMzMzMzMzMzMzMgMzMzGTMzMxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMZMzMzQCsrK2MhISGCHBwcjBwcHIwcHByMHBwcjBwcHIwcHByMHBwcjBwcHIwcHByMHBwcjCEhIYIrKytjMzMzQDMzMxkAAAAAAAAAADMzMyYzMzNAHR0dbv7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+/x0dHW4zMzNAMzMzJgAAAAAAAAAAAAAAAAAAAAAAAAA//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAzHMA/8xzAP/McwD/zHMA/8xzAP/McwD/zHMA/8xzAP/McwD/zHMA/8xzAP/McwD/zHMA/8xzAP/McwD/zHMA/wAAAAAAAAAAAAAAAAAAAADMcwD/5bV3/+W1d///////5bV3/+W1d///////5bV3/+W1d///////5bV3/+W1d///////5bV3/+W1d//McwD/AAAAAAAAAAAAAAAAAAAAAMxzAP/ou4D/4KRV///////gpFX/4KRV/+CkVf///////////+CkVf/gpFX/4KRV///////gpFX/6LuA/8xzAP8AAAAAAAAAAAAAAAAAAAAAzHMA/+vAif/kq2H//////+SrYf/kq2H/5Kth////////////5Kth/+SrYf/kq2H//////+SrYf/rwIn/zHMA/wAAAAAAAAAAAAAAAAAAAADMcwD/7saS/+izbf//////6LNt/+izbf/os23////////////os23/6LNt/+izbf//////6LNt/+7Gkv/McwD/AAAAAAAAAAAAAAAAAAAAAMxzAP/xy5v/////////////////8cub///////xy5v/8cub///////xy5v/////////////////8cub/8xzAP8AAAAAAAAAAAAAAAAAAAAAzHMA/8pzAf/KcwH/ynMB/8pzAf/KcwH/ynMB/8pzAf/KcwH/ynMB/8pzAf/KcwH/ynMB/8pzAf/KcwH/zHMA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx/wAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//4eHh/8PDw/+0tLT/urq6/7q6uv8AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/BwcH//////////////////////wAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/7Kysv////////////////8wMDBOAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/tra2////////////LCwsVgAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f+2trb//////2BgYHQAAAAUAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAALwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAEUAAAAwAAAAFAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AHwAIAAEACAABAA4ABwAMAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMADgAHAA4ABwAOAAcADgAHAA4ABwAOAAcADgAPAA4AHwAP//8AA="; try { Cu.import("resource://custombuttons-modules/addons4.js", {}); } catch(ex) {} var data = '<?xml version="1.0"?>' + '<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>' + '<window id="addonGenList-popup" onload="self.load(this)" title="Extension List" width="550" height="650" style="background: #EEE;" buttons="accept,extra1,extra2,cancel" ' + 'defaultButton="" windowtype="addonlist:gen" persist="screenX screenY width height sizemode" xmlns="' + xulns + '">' + '<textbox id="listBox" flex="1" multiline="true" style=" -moz-appearance: none; background: #FFF; border: 1px solid #999; border-radius: 8px 8px 8px 8px; box-shadow: 3px 3px 3px #444; padding-top: 4px;"/>' + '<groupbox id="gb1" style="padding:0; -moz-appearance: none; background: none; border: none;">' + '<hbox>' + '<checkbox id="editList" label="Редактировать список" onclick="self.check(id)"/>' + '<checkbox id="extBox" class="checkBox" label="Скрыть откл." onclick="self.check(id)"/>' + '</hbox>' + '<hbox align="center">' + '<label id="label" value="Категории: "/>' + '<checkbox id="extensionsView" class="checkBox" label="Расширения" onclick="self.check(id)"/>' + '<checkbox id="themesView" class="checkBox" label="Темы" onclick="self.check(id)"/>' + '<checkbox id="pluginsView" class="checkBox" label="Плагины" onclick="self.check(id)"/>' + '<checkbox id="stylesView" class="checkBox" label="Стили" onclick="self.check(id)"/>' + '<checkbox id="scriptView" class="checkBox" label="GM скрипты" onclick="self.check(id)"/>' + '<checkbox id="scriptsView" class="checkBox" label="Scriptish" onclick="self.check(id)"/>' + '<checkbox id="custombuttonsView" class="checkBox" label="СВ кнопки" onclick="self.check(id)"/>' + '</hbox>' + '<hbox align="center">' + '<label id="label" value="Заголовок: "/>' + '<checkbox id="Tilebox" class="checkBox" label="О программе" onclick="self.check(id)"/>' + '<checkbox id="Tilebox1" class="checkBox" label="Дата" onclick="self.check(id)"/>' + '<checkbox id="Tilebox2" class="checkBox" label="Всего" onclick="self.check(id)"/>' + '</hbox>' + '<hbox align="center">' + '<label id="label" value="Свойства: "/>' + '<checkbox id="idextBox" class="checkBox" label="id" onclick="self.check(id)"/>' + '<checkbox id="CompBox" class="checkBox" label="Совместимость" onclick="self.check(id)"/>' + '<checkbox id="DateIbox" class="checkBox" label="Дата установки" onclick="self.check(id)"/>' + '<checkbox id="Datebox" class="checkBox" label="Дата обновления" onclick="self.check(id)"/>' + '<checkbox id="Homebox" class="checkBox" label="Дом. страница" onclick="self.check(id)"/>' + '<checkbox id="Descriptbox" class="checkBox" label="Описание" onclick="self.check(id)"/>' + '</hbox>' + '</groupbox>' + '<hbox id="bntCont" style="margin-bottom: 4px">' + '<spacer flex="1"/>' + '<button dlgtype="accept" id="myAccept" image="' + icon2 + '" label="Создать TXT файл" oncommand="self.archiveTXT()"/>' + '<button dlgtype="extra1" id="HTMLBtn" image="' + icon1 + '" label="Создать HTML файл" oncommand="self.archiveHTML()"/>' + '<button dlgtype="extra2" id="myExtra1" label="Копировать" oncommand="self.copy()"/>' + '<button dlgtype="cancel" id="myCancel" label="Закрыть" oncommand="close()"/>' + '</hbox>' + '</window>'; data = data.replace(/self/g, "opener.document.getElementById('" + this.id + "')"); var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data); dialog = window.openDialog(url, 'extlist', 'chrome, centerscreen, dialog=no, resizable=yes').focus(); var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher); var em = ww.getWindowEnumerator(); var winName = "extlist"; var index = 1; while (em.hasMoreElements()) { var win = em.getNext(); if (win.name == winName) { win.focus(); return; } index++ } var matId = Components.utils.import("resource://gre/modules/AddonManager.jsm"); if(!matId) opener.document.getElementById("' + this.id + '").close();Выделить кодКод:
/*Initialization Code*/ // ===== Определяем настройки по умолчанию в about:config ===== pref.root = "extensions.custombuttons.addonlistgen."; pref.defaults = { editList: true, themesView: true, scriptView: true, stylesView: true, pluginsView: true, scriptsView: true, custombuttonsView: true, extensionsView: true, Tilebox: true, Tilebox1: true, Tilebox2: true, DateIbox: true, Datebox: true, idextBox: true, CompBox: true, Descriptbox: true, Homebox: true, extBox: true } // ===== Заносим настройки в about:config ===== let (branch = Services.prefs.getDefaultBranch(pref.root)) { for (let [key, val] in Iterator(pref.defaults)) { switch (typeof val) { case "boolean": branch.setBoolPref(key, val); break; case "number": branch.setIntPref(key, val); break; case "string": branch.setCharPref(key, val); break; } } } // ===== Заносим изменения настроек в about:config ===== pref.observe = function(prefs, callback) { let {root} = pref; function observe(subject, topic, data) { if (topic != "nsPref:changed") return; let pref = data.slice(root.length); if (prefs.indexOf(pref) == -1) return; callback(pref); } Services.prefs.addObserver(root, observe, false); unload(function() Services.prefs.removeObserver(root, observe)); } // ===== Считываем настройки из about:config ===== function pref(key) { let {branch, defaults} = pref; if (branch == null) branch = Services.prefs.getBranch(pref.root); switch (typeof defaults[key]) { case "boolean": return branch.getBoolPref(key); case "number": return branch.getIntPref(key); case "string": return branch.getCharPref(key); } return null; } let {classes: Cc, interfaces: Ci, utils: Cu} = Components; let ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); let sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); let nSpace = "@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);"; let gRoot = Services.prefs.getBranch(pref.root), u = "url(", v = ")"; let appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo); let app_info2 = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime); let mrw = Services.wm.getMostRecentWindow("navigator:browser"); // ===== Определение имени профиля===== function getProfileRegistry() { var rv = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties); try {var dir = rv.get("DefProfRt", Ci.nsIFile); while(dir) { var myFile = dir.clone(); myFile.append("profiles.ini"); if(myFile.exists()) return myFile; dir = dir.parent; } } catch(ex) {} return null; } function getProfileName() { var name = "", reg = getProfileRegistry(); var rv = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties); var profd = rv.get("ProfD", Ci.nsIFile); var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); var current = "", relative = "d", line = {}, path = ""; if(!reg) {return name;} stream.init(reg, 1, 0, 0); stream.QueryInterface(Ci.nsILineInputStream); while(stream.readLine(line)) { if(line.value.substring(0, 5) == "Name=") current = line.value.substring(5); if(line.value.substring(0, 11) == "IsRelative=") relative = line.value.substring(11); if(line.value.substring(0, 5) == "Path=") { path = line.value.substring(5); if(relative == "1") dir.setRelativeDescriptor(reg.parent, path); else dir.persistentDescriptor = path; if(dir.path == profd.path) {name = current; break;} } } stream.close(); if(name == "") name = "No Profile"; return name; } // ===== Вывод даты===== function aDate() { var t=new Date(); var y=1900+t.getYear(); var min=t.getMinutes(); if (min<10){min="0"+min}; var h=t.getHours(); var m=t.getMonth();switch(m){case 0: m="января";break;case 1: m="февраля";break;case 2: m="марта";break;case 3: m="апреля";break;case 4: m="мая";break;case 5: m="июня";break;case 6: m="июля";break;case 7: m="августа";break;case 8: m="сентября";break;case 9: m="октября";break;case 10: m="ноября";break;default: m="декабря";} var d=t.getDate(); var curdate=y+"г."+" "+d+" "+m+" "+h+":"+min; var myfilename=curdate; return myfilename; } // ===== Создание списка============================================================= function showExtensionList(aWin, aExt) { var exts = aExt, cnt = exts.length; var cntExt = 0, cntPlug = 0, cntTheme = 0, cntGm = 0, cntScript = 0, cntCustombuttons = 0, cntStyle = 0; var cntdisabled1 = 0, cntdisabled2 = 0, cntdisabled3 = 0,cntdisabled4 = 0, cntdisabled5 = 0, cntdisabled6 = 0, cntdisabled7 = 0; var cntenabled1 = 0, cntenabled2 = 0, cntenabled3 = 0,cntenabled4 = 0, cntenabled5 = 0, cntenabled6 = 0,cntenabled7 = 0; var ckExt = 0, ckPlug = 0, ckTheme = 0, ckGm = 0, ckScript = 0, ckCustombuttons = 0, ckStyle = 0; var ckdisabled1 = 0, ckdisabled2 = 0, ckdisabled3 = 0, ckdisabled4 = 0, ckdisabled5 = 0, ckdisabled6 = 0, ckdisabled7 = 0; var ckenabled1 = 0, ckenabled2 = 0, ckenabled3 = 0, ckenabled4 = 0, ckenabled5 = 0, ckenabled6 = 0, ckenabled7 = 0; for(var i = 0; i < cnt; i++) { if(exts[i].type == "extension") cntExt++; if(exts[i].type == "plugin") cntPlug++; if(exts[i].type == "theme") cntTheme++ ; if(exts[i].type == "greasemonkey-user-script") cntGm++; if(exts[i].type == "userscript") cntScript++; if(exts[i].type == "userstyle") cntStyle++; if(exts[i].type == "custombuttons") cntCustombuttons++; if(exts[i].type == "extension") {if (exts [i]. userDisabled) cntdisabled1++; else cntenabled1++;} if(exts[i].type == "plugin") {if (exts [i]. userDisabled) cntdisabled2++; else cntenabled2++;} if(exts[i].type == "theme"){if (exts [i]. userDisabled) cntdisabled3++; else cntenabled3++;} if(exts[i].type == "greasemonkey-user-script"){if (exts [i]. userDisabled) cntdisabled4++; else cntenabled4++;} if(exts[i].type == "userscript"){if (exts [i]. userDisabled) cntdisabled5++; else cntenabled5++;} if(exts[i].type == "userstyle"){if (exts [i]. userDisabled) cntdisabled6++; else cntenabled6++;} if(exts[i].type == "custombuttons"){ var str = exts[i].id; var id = str.substring(str.lastIndexOf("custombuttons-button"), str.length); var button = document.getElementById(id); if (!button == false)cntenabled7++; else cntdisabled7++;} } // ===== Не показывать типы расширений, если их нет в about:addons=== if(cntExt == 0) aWin.document.getElementById("extensionsView").style.display = "none"; if(cntTheme == 0) aWin.document.getElementById("themesView").style.display = "none"; if(cntPlug == 0) aWin.document.getElementById("pluginsView").style.display = "none"; if(cntGm == 0) aWin.document.getElementById("scriptView").style.display = "none"; if(cntScript == 0) aWin.document.getElementById("scriptsView").style.display = "none"; if(cntStyle == 0) aWin.document.getElementById("stylesView").style.display = "none"; if(cntCustombuttons == 0) aWin.document.getElementById("custombuttonsView").style.display = "none"; // ===== Подсчет всех и отключенных=== if(aWin.document.getElementById("extensionsView").checked) ckExt = cntExt, ckdisabled1 = cntdisabled1, ckenabled1 = cntenabled1; else ckExt = 0, ckdisabled1 = 0, ckenabled1 = 0; if(aWin.document.getElementById("pluginsView").checked) ckPlug = cntPlug, ckdisabled2 = cntdisabled2, ckenabled2 = cntenabled2; else ckPlug = 0, ckdisabled2 = 0, ckenabled2 = 0; if(aWin.document.getElementById("themesView").checked) ckTheme = cntTheme, ckdisabled3 = cntdisabled3, ckenabled3 = cntenabled3; else ckTheme = 0, ckdisabled3 = 0, ckenabled3 = 0; if(aWin.document.getElementById("scriptView").checked) ckGm = cntGm, ckdisabled4 = cntdisabled4, ckenabled4 = cntenabled4; else ckGm = 0, ckdisabled4 = 0, ckenabled4 = 0; if(aWin.document.getElementById("scriptsView").checked) ckScript = cntScript, ckdisabled5 = cntdisabled5, ckenabled5 = cntenabled5; else ckScript = 0, ckdisabled5 = 0, ckenabled5 = 0; if(aWin.document.getElementById("custombuttonsView").checked) ckCustombuttons = cntCustombuttons, ckdisabled7 = cntdisabled7, ckenabled7 = cntenabled7; else ckCustombuttons = 0, ckdisabled7 = 0, ckenabled7 = 0; if(aWin.document.getElementById("stylesView").checked) ckStyle = cntStyle, ckdisabled6 = cntdisabled6, ckenabled6 = cntenabled6; else ckStyle = 0, ckdisabled6 = 0, ckenabled6 = 0; var totalCnt = ckExt + ckTheme + ckPlug + ckGm + ckScript + ckCustombuttons + ckStyle; var totaldisabled = ckdisabled1 + ckdisabled2 + ckdisabled3 + ckdisabled4 + ckdisabled5 + ckdisabled6 + ckdisabled7; var totalenabled = ckenabled1 + ckenabled2 + ckenabled3 + ckenabled4 + ckenabled5 + ckenabled6 + ckenabled7; // ===== Заголовок=== var str0 = "Приложение" + ": " + appInfo.vendor + " " + appInfo.name + " " + appInfo.version + " (" + appInfo.appBuildID ; var str1 = "Операционная система" + ": " + navigator.oscpu + " (" + app_info2.XPCOMABI + ")"; var str2 = "Профиль: " + getProfileName(); if(aWin.document.getElementById("Tilebox2").checked){ var str3 = "Всего : " + totalCnt + "\u2007\u2007" + "Включено: " + totalenabled + "\u2007\u2007" + "Отключено: " + totaldisabled + "\n"; } else var str3 = ""; if(aWin.document.getElementById("Tilebox1").checked){ var str4 = "Создан: " + aDate()+ "\n"; } else var str4 = ""; if(aWin.document.getElementById("Tilebox").checked){ var str = str0 + ")\n" + str1 + "\n" + str2 + "\n"; } else var str = ""; var extList = str + str3 + str4; // == Сортировка по имени и типу===== exts.sort(function(a, b) { a = a.name.toLowerCase(); b = b.name.toLowerCase(); if (a < b) return -1; if (a > b) return 1; return 0; }) exts.sort(function(a, b) { a = a.type.toLowerCase(); b = b.type.toLowerCase(); if (a < b) return -1; if (a > b) return 1; return 0; }) exts.sort(function(a, b) { a = a.type.toLowerCase(); b = b.type.toLowerCase(); if (a == "custombuttons" || b == "extension") return 1; return 0; }) var typeExt = 0, typePlug = 0, typeTheme = 0, typeGm = 0, typeScript = 0, typeCustombuttons = 0, typeStyle = 0; for(var i = 0; i < cnt; i++) { // ===== Обявление переменных для свойств=== var nameOf = "", verOf = "", typeOf = "", idOf = "", CompOf = "", dateOf = "", homepageURLOf = "", descriptionOf = "", dateIOf = ""; // ===== Имя и версия=== if(exts[i].name && exts[i].version) { nameOf = '"' + exts[i].name + " "; verOf = exts[i].version + '"'; } if(exts[i].name && !exts[i].version) nameOf = '"' + exts[i].name + '"'; // ===== Совместимость=== if(aWin.document.getElementById("CompBox").checked){ var XPIProvider = Components.utils.import("resource://gre/modules/XPIProvider.jsm") var addons_db = XPIProvider.XPIDatabase.getAddons(); CompOf = Array(); var db_found = false; var tmp_addon = null; for (var tmp_i=0; (!db_found && tmp_i<addons_db.length); tmp_i++) { if (addons_db[tmp_i].id == exts[i].id) { tmp_addon = addons_db[tmp_i]; db_found = true; } } if (tmp_addon != null) { var target_app; for (var j=0; j<tmp_addon.targetApplications.length; j++) { target_app = tmp_addon.targetApplications[j]; } CompOf = "\u2007\u2007\u2007\u2007\u2007\u2007" + "Совместимость с Firefox:" + "\u2007" + target_app.minVersion + " \u2013" + target_app.maxVersion + "\n"; } } else var CompOf = ""; // ===== id === if(aWin.document.getElementById("idextBox").checked){ if(exts[i].id) idOf = "\u2007\u2007\u2007\u2007\u2007\u2007" + "id" + ":" + " " + exts[i].id + "\n"; } else var idOf = ""; // ===== тип стиля=== function ucFirst(str) { var firstLetter = str.slice(0, 1); return firstLetter.toUpperCase() + str.substring(1); } if(exts[i].styleTypes) typeOf = " (стиль " + ucFirst(exts[i].styleTypes) + ")"; // ===== дата обновления=== if(aWin.document.getElementById("Datebox").checked){ if(exts[i].updateDate) { var xDate = exts[i].updateDate.toString(); if(xDate.indexOf("May") != -1) { var xA = xDate.substring(4, 10), xB = xDate.substring(11, 15); dateOf = " (" + xA + ". " + xB + ")"; } else { var xA = xDate.substring(4, 7), xB = xDate.substring(8, 10), xC = xDate.substring(11, 15); dateOf = "\u2007\u2007\u2007\u2007\u2007\u2007" + "Дата обновления " + ":" + "\u2007" + xB + " " + xA + " " + xC + "\n"; } } } else var dateOf = ""; // ===== Дата установки=== if(aWin.document.getElementById("DateIbox").checked){ if(exts[i].installDate) { var xDate = exts[i].installDate.toString(); if(xDate.indexOf("May") != -1) { var xA = xDate.substring(4, 10), xB = xDate.substring(11, 15); dateOf = " (" + xA + ". " + xB + ")"; } else { var xA = xDate.substring(4, 7), xB = xDate.substring(8, 10), xC = xDate.substring(11, 15); dateIOf = "\u2007\u2007\u2007\u2007\u2007\u2007" + "Дата установки " + ":" + "\u2007\u2007\u2007" + xB + " " + xA + " " + xC + "\n"; } } } else var dateIOf = ""; // ===== Домашняя страница=== if(aWin.document.getElementById("Homebox").checked){ if(exts[i].homepageURL) homepageURLOf = "\u2007\u2007\u2007\u2007\u2007\u2007" + "Дом. страница" + ":" + " " + exts[i].homepageURL + "\n"; } else var homepageURLOf = ""; // ===== Описание=== if(aWin.document.getElementById("Descriptbox").checked){ if(exts[i].description) descriptionOf = "\u2007\u2007\u2007\u2007\u2007\u2007" + "Описание" + ":" + " " + exts[i].description + "\n"; } else var descriptionOf = ""; // ===== отключено=== var xx = exts[i].userDisabled; if(xx == true) var ud = " :: (отключено)"; else var ud = ""; // ===== СВ кнопка не вытащена=== if(exts[i].type == "custombuttons"){ var str = exts[i].id; var id = str.substring(str.lastIndexOf("custombuttons-button"), str.length); var button = document.getElementById(id); if (!button) { var SD = " :: (не вытащена)"; } else var SD = ""; } else var SD = ""; // ===== общий лист=== listStr = ". " + nameOf + verOf + typeOf + ud + SD + "\n" + idOf + CompOf + dateIOf + dateOf + homepageURLOf + descriptionOf; listStr = listStr.replace(/Jan/gi,'января').replace(/Feb/gi,'февраля').replace(/Mar/gi,'марта').replace(/Apr/gi,'апреля').replace(/May/gi,'мая').replace(/Jun/gi,'июня').replace(/Jul/gi,'июля').replace(/Aug/gi,'августа').replace(/Sep/gi,'сентября').replace(/Oct/gi,'октября').replace(/Nov/gi,'ноября').replace(/Dec/gi,'декабря').replace(/Global/gi,'глобальный').replace(/App/gi,'приложения').replace(/Site/gi,'для сайта'); // ===== Скрыть отключенные расширения=== if(pref("extBox") == true ){ if(exts[i].type == "extension" && exts[i].userDisabled == false) typeExt++; if(aWin.document.getElementById("extensionsView").checked) { if(typeExt != typeExt-1 && exts[i].type == "extension" && exts[i].userDisabled == false) { if(typeExt == 1) extList += "\nРАСШИРЕНИЯ: " + "Всего: " + cntExt + "\u2007" + "Включено: " + cntenabled1 + "\u2007" + "Отключено: " + cntdisabled1 + "\n" + "\u2007\u2007" + typeExt + listStr; if(typeExt > 1 && typeExt < 10) extList += "\u2007\u2007" + typeExt + listStr; if(typeExt >= 10) extList += "\u2007" + typeExt + listStr; } } if(exts[i].type == "plugin" && exts[i].userDisabled == false) typePlug++; if(aWin.document.getElementById("pluginsView").checked) { if(typePlug != typePlug-1 && exts[i].type == "plugin" && exts[i].userDisabled == false) { if(typePlug == 1) extList += "\nПЛАГИНЫ: " + "Всего: " + cntPlug + "\u2007" + "Включено: " + cntenabled2 + "\u2007" + "Отключено: " + cntdisabled2 + "\n" + "\u2007\u2007" + typePlug + listStr; if(typePlug > 1 && typePlug < 10) extList += "\u2007\u2007" + typePlug + listStr; if(typePlug >= 10) extList += "\u2007" + typePlug + listStr; } } if(exts[i].type == "theme" && exts[i].userDisabled == false) typeTheme++; if(aWin.document.getElementById("themesView").checked) { if(typeTheme != typeTheme-1 && exts[i].type == "theme" && exts[i].userDisabled == false) { if(typeTheme == 1) extList += "\nТЕМЫ: " + "Всего: " + cntTheme + "\u2007" + "Включено: " + cntenabled3 + "\u2007" + "Отключено: " + cntdisabled3 + "\n" + "\u2007\u2007" + typeTheme + listStr; if(typeTheme > 1 && typeTheme < 10) extList += "\u2007\u2007" + typeTheme + listStr; if(typeTheme >= 10) extList += "\u2007" + typeTheme + listStr; } } if(exts[i].type == "greasemonkey-user-script" && exts[i].userDisabled == false) typeGm++; if(aWin.document.getElementById("scriptView").checked) { if(typeGm != typeGm-1 && exts[i].type == "greasemonkey-user-script" && exts[i].userDisabled == false) { if(typeGm == 1) var extList3 = "\nGM СРИПТЫ: " + "Всего: " + cntGm + "\u2007" + "Включено: " + cntenabled4 + "\u2007" + "Отключено: " + cntdisabled4 + "\n" + "\u2007\u2007" + typeGm + listStr; if(typeGm > 1 && typeGm < 10) var extList3 = "\u2007\u2007" + typeGm + listStr; if(typeGm >= 10) var extList3 = "\u2007" + typeGm + listStr; extList +=extList3 } } if(exts[i].type == "userscript" && exts[i].userDisabled == false) typeScript++; if(aWin.document.getElementById("scriptsView").checked) { if(typeScript != typeScript-1 && exts[i].type == "userscript" && exts[i].userDisabled == false) { if(typeScript == 1) extList += "\nSCRIPTISH СКРИПТЫ: " + "Всего: " + cntScript + "\u2007" + "Включено: " + cntenabled5 + "\u2007" + "Отключено: " + cntdisabled5 + "\n" + "\u2007\u2007" + typeScript + listStr; if(typeScript > 1 && typeScript < 10) extList += "\u2007\u2007" + typeScript + listStr; if(typeScript >= 10) extList += "\u2007" + typeScript + listStr; } } if(exts[i].type == "userstyle" && exts[i].userDisabled == false) typeStyle++; if(aWin.document.getElementById("stylesView").checked) { if(typeStyle != typeStyle-1 && exts[i].type == "userstyle" && exts[i].userDisabled == false) { if(typeStyle == 1) extList += "\nСТИЛИ: " + "Всего: " + cntStyle + "\u2007" + "Включено: " + cntenabled6 + "\u2007" + "Отключено: " + cntdisabled6 + "\n" + "\u2007\u2007" + typeStyle + listStr; if(typeStyle > 1 && typeStyle < 10) extList += "\u2007\u2007" + typeStyle + listStr; if(typeStyle >= 10) extList += "\u2007" + typeStyle + listStr; } } if(exts[i].type == "custombuttons" && !button == false) typeCustombuttons++; if(aWin.document.getElementById("custombuttonsView").checked) { if(typeCustombuttons != typeCustombuttons-1 && exts[i].type == "custombuttons" && !button == false) { if(typeCustombuttons == 1) extList += "\nСВ кнопки: " + "Всего: " + cntCustombuttons + "\u2007" + "Включено: " + cntenabled7 + "\u2007" + "Отключено: " + cntdisabled7 + "\n" + "\u2007\u2007" + typeCustombuttons + listStr; if(typeCustombuttons > 1 && typeCustombuttons < 10) extList += "\u2007\u2007" + typeCustombuttons + listStr; if(typeCustombuttons >= 10) extList += "\u2007" + typeCustombuttons + listStr; } } } // ===== Показывать все (в т.ч. отключенные) расширения=== if(pref("extBox") == false ){ if(exts[i].type == "extension") typeExt++; if(aWin.document.getElementById("extensionsView").checked) { if(typeExt != typeExt-1 && exts[i].type == "extension") { if(typeExt == 1) extList += "\nРАСШИРЕНИЯ: " + "Всего: " + cntExt + "\u2007" + "Включено: " + cntenabled1 + "\u2007" + "Отключено: " + cntdisabled1 + "\n" + "\u2007\u2007" + typeExt + listStr; if(typeExt > 1 && typeExt < 10) extList += "\u2007\u2007" + typeExt + listStr; if(typeExt >= 10) extList += "\u2007" + typeExt + listStr; } } if(exts[i].type == "plugin") typePlug++; if(aWin.document.getElementById("pluginsView").checked) { if(typePlug != typePlug-1 && exts[i].type == "plugin") { if(typePlug == 1) extList += "\nПЛАГИНЫ: " + "Всего: " + cntPlug + "\u2007" + "Включено: " + cntenabled2 + "\u2007" + "Отключено: " + cntdisabled2 + "\n" + "\u2007\u2007" + typePlug + listStr; if(typePlug > 1 && typePlug < 10) extList += "\u2007\u2007" + typePlug + listStr; if(typePlug >= 10) extList += "\u2007" + typePlug + listStr; } } if(exts[i].type == "theme") typeTheme++; if(aWin.document.getElementById("themesView").checked) { if(typeTheme != typeTheme-1 && exts[i].type == "theme") { if(typeTheme == 1) extList += "\nТЕМЫ: " + "Всего: " + cntTheme + "\u2007" + "Включено: " + cntenabled3 + "\u2007" + "Отключено: " + cntdisabled3 + "\n" + "\u2007\u2007" + typeTheme + listStr; if(typeTheme > 1 && typeTheme < 10) extList += "\u2007\u2007" + typeTheme + listStr; if(typeTheme >= 10) extList += "\u2007" + typeTheme + listStr; } } if(exts[i].type == "greasemonkey-user-script") typeGm++; if(aWin.document.getElementById("scriptView").checked) { if(typeGm != typeGm-1 && exts[i].type == "greasemonkey-user-script") { if(typeGm == 1) extList += "\nGM СРИПТЫ: " + "Всего: " + cntGm + "\u2007" + "Включено: " + cntenabled4 + "\u2007" + "Отключено: " + cntdisabled4 + "\n" + "\u2007\u2007" + typeGm + listStr; if(typeGm > 1 && typeGm < 10) extList += "\u2007\u2007" + typeGm + listStr; if(typeGm >= 10) extList += "\u2007" + typeGm + listStr; } } if(exts[i].type == "userscript") typeScript++; if(aWin.document.getElementById("scriptsView").checked) { if(typeScript != typeScript-1 && exts[i].type == "userscript") { if(typeScript == 1) extList += "\nSCRIPTISH СКРИПТЫ: " + "Всего: " + cntScript + "\u2007" + "Включено: " + cntenabled5 + "\u2007" + "Отключено: " + cntdisabled5 + "\n" + "\u2007\u2007" + typeScript + listStr; if(typeScript > 1 && typeScript < 10) extList += "\u2007\u2007" + typeScript + listStr; if(typeScript >= 10) extList += "\u2007" + typeScript + listStr; } } if(exts[i].type == "userstyle") typeStyle++; if(aWin.document.getElementById("stylesView").checked) { if(typeStyle != typeStyle-1 && exts[i].type == "userstyle") { if(typeStyle == 1) extList += "\nСТИЛИ: " + "Всего: " + cntStyle + "\u2007" + "Включено: " + cntenabled6 + "\u2007" + "Отключено: " + cntdisabled6 + "\n" + "\u2007\u2007" + typeStyle + listStr; if(typeStyle > 1 && typeStyle < 10) extList += "\u2007\u2007" + typeStyle + listStr; if(typeStyle >= 10) extList += "\u2007" + typeStyle + listStr; } } if(exts[i].type == "custombuttons") typeCustombuttons++; if(aWin.document.getElementById("custombuttonsView").checked) { if(typeCustombuttons != typeCustombuttons-1 && exts[i].type == "custombuttons") { if(typeCustombuttons == 1) extList += "\nСВ кнопки: " + "Всего: " + cntCustombuttons + "\u2007" + "Включено: " + cntenabled7 + "\u2007" + "Отключено: " + cntdisabled7 + "\n" + "\u2007\u2007" + typeCustombuttons + listStr; if(typeCustombuttons > 1 && typeCustombuttons < 10) extList += "\u2007\u2007" + typeCustombuttons + listStr; if(typeCustombuttons >= 10) extList += "\u2007" + typeCustombuttons + listStr; } } } } aWin.document.title = "Addon List Genenerator"; var textbox = aWin.document.getElementById("listBox"); textbox.value = extList; textbox.selectionStart = 0; textbox.selectionEnd = 0; var mrd = Services.wm.getMostRecentWindow("addonlist:gen"); if(aWin.document.getElementById("editList").checked) { mrd.document.getElementById("listBox").style.MozUserInput = ""; mrd.document.getElementById("listBox").style.MozUserSelect = ""; mrd.document.getElementById("listBox").style.MozUserFocus = ""; } else { mrd.document.getElementById("listBox").style.MozUserInput = "none"; mrd.document.getElementById("listBox").style.MozUserSelect = "none"; mrd.document.getElementById("listBox").style.MozUserFocus = "ignore"; } } this.load = function(aWin) { try { var aView = aWin.document.getElementsByClassName("checkBox"); for(var i = 0; i < aView.length; i++) aView[i].checked = pref(aView[i].id); showExtensionList(aWin, Application.extensions.all); } catch(e) {AddonManager.getAllAddons(function(extensions) {showExtensionList(aWin, extensions);})} try { if(pref("editList")) { aWin.document.getElementById("listBox").style.MozUserInput = ""; aWin.document.getElementById("listBox").style.MozUserSelect = ""; aWin.document.getElementById("listBox").style.MozUserFocus = ""; } else { aWin.document.getElementById("listBox").style.MozUserInput = "none"; aWin.document.getElementById("listBox").style.MozUserSelect = "none"; aWin.document.getElementById("listBox").style.MozUserFocus = "ignore"; } } catch(ex) {} } this.copy = function() { var mrd = Services.wm.getMostRecentWindow("addonlist:gen"); var lb = mrd.document.getElementById("listBox").value.replace(/\u2007/g, " "); if(navigator.platform.indexOf("Win")) gClipboard.write(lb); else gClipboard.write(lb.replace(/\n/g, "\r\n")); } this.archiveHTML = function() { var mrd = Services.wm.getMostRecentWindow("addonlist:gen"); var lb = mrd.document.getElementById("listBox").value.replace(/\u2007/g, " "); var uc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); uc. charset = "utf-8"; lb = uc. ConvertFromUnicode (lb); var head = "<html>\n<head>\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\n</head>\n<body>\n<pre>\n"; var fileend = "\n</pre>\n</body>\n</html>" var htmlSource = head + lb + fileend; var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream); var nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); fp.appendFilters(fp.filterHTML); fp.appendFilters(fp.filterAll); fp.defaultExtension = ".html"; fp.init(window, "", fp.modeSave); fp.defaultString = "Addons " + aDate().replace(/:/g, "."); if(fp.show() != fp.returnCancel){ stream.init(fp.file, 0x02|0x20|0x08, 0x1B6, 0); stream.write(htmlSource, htmlSource.length); stream.close();} else {aWin.focus(); return;} mrd.close(); } this.archiveTXT = function() { var mrd = Services.wm.getMostRecentWindow("addonlist:gen"); var lb = mrd.document.getElementById("listBox").value.replace(/\u2007/g, " "); var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); var stream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream); fp.appendFilters(fp.filterText); fp.defaultExtension = ".txt"; fp.init(window, "Сохранить как Text", 1); fp.defaultString = "Addons " + aDate().replace(/:/g, "."); if(fp.show() != fp.returnCancel) { if(fp.file.exists()) fp.file.remove(true); fp.file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 420); stream.init(fp.file, 0x02|0x08|0x20, 0x1B6, 0); converter.init(stream, "UTF-8", 0, 0x0000); converter.writeString(lb, lb.length); converter.close(); stream.close(); } else { aWin.focus(); return; } mrd.close(); } this.check = function(id) { var enable = pref(id) != false ? false : true, mrd = Services.wm.getMostRecentWindow("addonlist:gen"); gRoot.setBoolPref(id, enable); try { showExtensionList(mrd, Application.extensions.all); } catch(e) {AddonManager.getAllAddons(function(extensions) {showExtensionList(mrd, extensions);})} }
Посмотрите пожалуйста как можно оптимизировать код? Хотел обхватить много, а получилось много строк. Может есть, что лишнее убрать ? Или может что нехватает?
А чем не устраивает эта?
Отредактировано voqabuhe (10-02-2013 22:59:30)
Отсутствует
voqabuhe В этой мало функционала.
Отсутствует
Dumby пишетЕсли в ремонтируемой кнопке встречается тэг (открывающий и закрывающий),
а где-то внутри него ещё один такой-же (с тем-же именем и тоже открывающий и закрывающий)
[...]Ааа...
С этим сложно, в общем случае надо менять регулярные выражения на полноценный XML-парсер.
Что-то на полноценный парсер имеющегося свободного времени не хватает, так что приделал хитрую распорку.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Вот переводяик гугл похож как в хроме только кнопку нужно нажимать.
Translate(Firefox 18 +)
Переводит страницы в новой активной вкладке сразу справа от текущей вкладки или в текущей вкладке.
Переводит страницы в сервисе Google Translate или в переводчике Microsoft.
https страници переводит в переводчике Microsoft.
Переводит выделенный текст или текст из буфера обмена с помощью сервиса Google Translate в новой активной вкладке сразу справа или в маленьком окошке который можно закрыть кликом на странице.
Переводит выделенный текст или текст из буфера обмена с помощью сервиса Google Translate в новой активной вкладке сразу справа или в маленьком окошке который можно закрыть кликом на странице.
Дает возможность закрывать вкладки двойным кликом на табе и переключиться на левую.Left => Перевести страницу / выделенный текст.
Middle => Перевести текст, из буфера обмена.
Right => Mеню кнопки + CB меню.
// Настройка функций кликов мыши для кнопки ........................................................................... this.onclick = function(event) { // Действие при клике ЛКМ .... if ( event.button == 0 ) { // перевод выделенного текста если текст выделенн .... var str = getSelect(); if ( str ) { custombuttons.getPrefs ("CB.Translate.TextInPopup")? translateTextInPopup(str): translateTextInGoogle(str); } // перевод страницы .... else { custombuttons.getPrefs ("CB.Translate.PageInMicrosoft")? translatePageInMicrosoft(): translatePageInGoogle(); } }; // Действие при клике СКМ .... if ( event.button == 1 ) { // перевод текста из буфера обмена .... var str = gClipboard.read(); translateTextInGoogle(str);; }; }; // Объявляем переменные для этой вкладки ................................................................................ var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); // Подсказка у нопки .................................................................................................... this.tooltipText = "Translate" +"\n"+ "Л: Перевести страницу / выделенный текст" +"\n"+ "С: Перевести текст из буфера обмена" +"\n"+ "П: Меню + CB меню"; // Проверить наличие строк в about:config и создать если не существует ................................................... if ( custombuttons.getPrefs("CB.Translate.version") !== '2') { prefs.setCharPref("CB.Translate.version", "2"); prefs.setBoolPref("CB.Translate.nextPage", true); prefs.setBoolPref("CB.Translate.TextInPopup", true); prefs.setBoolPref("CB.Translate.PageInMicrosoft", false); prefs.setBoolPref("CB.Translate.DblclickCloseTab", false); // удалить настройки старой версии кнопки из'about:config' .... custombuttons.clearPrefs("Translate.next_page"); custombuttons.clearPrefs("Translate.DblClick_close_Tab_focus_Left"); }; // Функции которые запускаются из меню кнопки ............................................................................ this.CBlabel = function (mi, id) { var c ='true'; var n = 'false'; // Перевод текста в маленьком окошке .... if ( !id || id == "Popup" ) { var s = "CB.Translate.TextInPopup"; togglePref(s); // изменить нужный пункт меню var cek = (custombuttons.getPrefs(s)? c : n); this.Pcek = cek; if ( mi ) mi.cek = cek; }; // Перевод страницы в переводчике Microsoft .... if ( !id || id == "Microsoft" ) { var s = "CB.Translate.PageInMicrosoft"; togglePref(s); // изменить нужный пункт меню var cek = (custombuttons.getPrefs(s)? c : n); this.Mcek = cek; if ( mi ) mi.cek = cek; }; // Перевод страницы в новой вкладке сразу справа .... if ( !id || id == "Translate" ) { var s = "CB.Translate.nextPage"; togglePref(s); // изменить нужный пункт меню var cek = (custombuttons.getPrefs(s)? c : n); this.Tcek = cek; if ( mi ) mi.cek = cek; }; // Двойной клик закрывает вкладку и переключает на вкладку слева .... if ( !id || id == "DblClick") { var s = "CB.Translate.DblclickCloseTab"; togglePref(s); // изменить нужный пункт меню var cek = (custombuttons.getPrefs(s)? c : n); this.Dcek = cek; if ( mi ) mi.cek = cek; }; /* Переключает настройки в 'about:config', выбор настройки завысит от параметра 's' для функции ....*/ function togglePref(s){ if ( !id ) return; // cтоп, при инициализации кнопки custombuttons.setPrefs(s, !custombuttons.getPrefs(s)); } }; this.CBlabel() // Пункти меню .... this.ss = [ { cek: this.Pcek, label: "Перевод текста в маленьком окошке", cmd: 'document.popupNode.CBlabel(this, "Popup")', sItemId: '', type:'checkbox'}, { cek: this.Mcek, label: "Перевод страницы в переводчике Microsoft", cmd: 'document.popupNode.CBlabel(this, "Microsoft")', sItemId: '', type:'checkbox'}, { label: "separator", sItemId: ''}, { cek: this.Tcek, label: "Перевод страницы в новой вкладке сразу справа", cmd: 'document.popupNode.CBlabel(this, "Translate")', sItemId: '', type:'checkbox'}, { cek: this.Dcek, label: "Двойной клик закрывает вкладку и переключает на вкладку слева", cmd: 'document.popupNode.CBlabel(this, "DblClick")', sItemId: '', type:'checkbox'} ]; // Our Initialization function for creating the context menu, setting up menuitems and telling var Cb = custombuttons; this.mObj = Cb.getCbContextObj(this); this.init = function(x) { x.mObj.setSub(); var nItem = {}, mItem = {}; document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()"); for(var i in x.ss) { nItem = new x.mObj.getItem(); nItem.id = 'Note'; nItem.label = x.ss[i].label; if (nItem.label == "separator") { nItem = document.createElement("menuseparator"); } nItem.value = String(i); mItem = x.mObj.insertBefore(nItem , x.mObj.oMenu.lastChild); this.ss[i].sItemId = mItem.id; mItem.setAttribute('oncommand',x.ss[i].cmd); if("type" in x.ss[i]) mItem.setAttribute('type', x.ss[i].type); mItem.setAttribute('checked', x.ss[i].cek); mItem.setAttribute( 'autocheck', true); } x.mObj.getItem(); nItem = x.mObj.getItem(); nItem.id = 'Note'; this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild); } this.init(this); // Блокировать повторный запуск функций и обработчиков при открытии настройки панелей ................................ if ( this.hasAttribute("stop") ) return; /* Oтдаст выделенный текст из страницы или текстового поля, если текст не выделен отдаст 'false' .................................................................*/ function getSelect() { // выделенный текст из страницы .... var selection = document.commandDispatcher.focusedWindow.getSelection(); var anchor = (selection.anchorNode !== null)? selection.anchorNode: false; // выделенный текст из 'PRE' .... if ( anchor && anchor.parentNode.tagName == 'PRE' ) { var node = selection.focusNode; var startPos = selection.anchorOffset; var endPos = selection.focusOffset; var selection = node.data.substring(startPos, endPos); } // выделенный текст из текстового поля .... if ( selection.toString().length == 0 ) { var theBox = document.commandDispatcher.focusedElement; if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { var startPos = theBox.selectionStart; var endPos = theBox.selectionEnd; var selection = theBox.value.substring(startPos, endPos); } } // исправляем проблему с переносом текста новую строку в стандартном win блокноте .... if ( selection.toString().length !== 0 ) { var selection = selection.toString(); var selection = selection.replace(/\u000A/g, "\u000D\u000A"); var selection = selection.replace(/\u000D\u000D\u000A/g, "\u000D\u000A"); } return ( selection == '')? false: selection; }; /* Переводит в переводчике Google страницы в новой активной вкладке сразу справа или в текущей вкладке в зависимости от настроек в 'about:config' .....................................*/ function translatePageInGoogle() { // если это https страница перевести в переводчике Microsoft .... var https = ( String(content.location).substring(0,6)== 'https:' )? true: false; if ( https ) { translatePageInMicrosoft(); return } ; // перевод страницы .... var url = "http://translate.google.com/translate?u=" + content.location + "&hl=ru&ie=UTF-8&sl=auto&tl=ru"; if ( custombuttons.getPrefs ("CB.Translate.nextPage") ) { // в новой активной вкладке var x = gBrowser.mCurrentTab._tPos +1; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab(url), x); } else { // в текущей вкладке loadURI(url); } }; /* Переводит в переводчике Microsoft страницы в новой активной вкладке сразу справа от текущей вкладки или в текущей вкладке в зависимости от настроек в 'about:config' .....................................*/ function translatePageInMicrosoft() { // Перевод страницы if ( custombuttons.getPrefs ("CB.Translate.nextPage") ) { // в новой активной вкладке var newTab = gBrowser.duplicateTab(gBrowser.mCurrentTab); ++gBrowser.tabContainer.selectedIndex; //... gBrowser.addEventListener("pageshow", function(event) { gBrowser.removeEventListener("pageshow", arguments.callee, true); // разрешить страницу для расширения NoScript .... if ( "noscriptUtil" in window ) { noscriptOverlay.allowPage(); BrowserStop(); } content.document.location = "javascript:var s = content.document.createElement('script'); s.type = 'text/javascript'; s.src = 'http://labs.microsofttranslator.com/bookmarklet/default.aspx?f=js&to=ru'; content.document.body.insertBefore(s, document.body.firstChild); void(0);"; }, true); } else { // разрешить страницу для расширения NoScript .... if ( "noscriptUtil" in window ) { noscriptOverlay.allowPage(); setTimeout(function() { BrowserStop() }, 0); } // в текущей вкладке content.document.location = "javascript:var s = content.document.createElement('script'); s.type = 'text/javascript'; s.src = 'http://labs.microsofttranslator.com/bookmarklet/default.aspx?f=js&to=ru'; content.document.body.insertBefore(s, document.body.firstChild); void(0);"; } }; /* Перевести текст в Google переводчике в новой активной вкладке сразу справа от текущей вкладки ......................................................................*/ function translateTextInGoogle(str) { var x = gBrowser.mCurrentTab._tPos +1; var url = "http://translate.google.com/translate_t?hl=ru#auto|ru|" + str; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab(url), x); }; // Перевести текст в Google переводчике в маленьком окошке .............................................. function translateTextInPopup(str) { var t = str; trtext = t; var url1 = "http://translate.google.com/translate_t?prev=hp&hl=ru&js=y&text="; var url2 = "&file=&sl=en&tl=ru&history_state0=#"; var urltr=url1+trtext+url2; var xmlhttp function gettransdata() { xmlhttp=GetXmlHttpObject(); if ( xmlhttp==null ) { alert ("Your browser does not support AJAX!"); return; }; xmlhttp.onreadystatechange=stateChanged; xmlhttp.open("GET",urltr,true); xmlhttp.send(null); }; function stateChanged() { if ( xmlhttp.readyState==4 ) { var trin=xmlhttp.responseText; var chkpoint='<span id=result_box'; var arrayOfStrings = trin.split(chkpoint); var trouttmp=arrayOfStrings[1]; var chkpoint='<div id=spell-place-holder'; var arrayOfStrings = trouttmp.split(chkpoint); trouttmp1=arrayOfStrings[0]; trouttmp2=trouttmp1.replace(/<span.+?">/g,"") trouttmp2=trouttmp2.replace(/<\/span>/g,"") trouttmp2=trouttmp2.replace(/class="long_text">/g,"") trouttmp2=trouttmp2.replace(/class="short_text">/g,"") trouttmp2=trouttmp2.replace(/class="medium_text">/g,"") trouttmp2=trouttmp2.replace(/<br><\/div><\/div>/g,"") var jurl='data:text/html,<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"><html><head><title></title><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>'+trouttmp2+'</body></html>'; var sizex = screen.width/2.2 var sizey = screen.height/2.2 var posx=screen.width-sizex; var posy=screen.height-sizey; qwertywnd = window.open(jurl, this.name, "width="+(sizex-30)+",height="+(sizey-87)+",screenX="+posx+",screenY="+posy+",status=no,scrollbars=yes,resizable=yes"); if ( qwertywnd.focus ) { qwertywnd.focus() }; } }; function GetXmlHttpObject() { if ( window.XMLHttpRequest ) { return new XMLHttpRequest() } if ( window.ActiveXObject ) { return new ActiveXObject("Microsoft.XMLHTTP") } return null; }; gettransdata(); // закрыть окно перевода левым кликом на странице .... gBrowser.addEventListener("click", function(event) { // закрыть окно перевода qwertywnd.close(); // удалить обработчик gBrowser.removeEventListener("click", arguments.callee, true); }, true); }; // Закрыть вкладку двойным щелчком мыши и фокус на левую вкладку ........................................ function TabClose(event) { if ( event.button == 0 && custombuttons.getPrefs("CB.Translate.DblclickCloseTab") ) { event.preventDefault(); event.stopPropagation(); var tab = gBrowser.mCurrentTab; if ( tab.previousSibling ) gBrowser.mTabContainer.selectedIndex--; gBrowser.removeTab(tab); }; }; addEventListener("dblclick", TabClose, false, gBrowser.mTabContainer); // устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды this.setAttribute("stop","true");
Нажимаем на кнопку переводится вся страница, а при выделение текста и нажатии кнопку переводится выделенное.
Добавлено 11-02-2013 17:11:32
куда-то мой пост делся. Напишу ещё раз.
serg00700 пишет: А как объединить строку поиска с адресной?Я не знаю как объединить строку поиска с адресной используя Custom Buttons. Но можно скрыть строку поиска через userChrome.css
#search-container:not([show = "true"]) { display: none !important; }И потом открывать сочетанием клавиш Snift + Z, а после поиска панель поиска сама закроется.Выделить кодКод:const searchbar = document.getElementById("searchbar"); const searchContainer = document.getElementById("search-container"); // Открывать панель поиска сочетанием клавиш Snift + Z ....................................... function handleKeydown(e) { if ( (e.shiftKey) && (!e.altKey) && (!e.ctrlKey) && (e.keyCode == 90) ) { e.preventDefault(); searchContainer.setAttribute('show', true ); searchbar.focus(); }; } window.addEventListener('keydown', handleKeydown, false); this.onDestroy = function(reason) { window.removeEventListener('keydown', handleKeydown, false); }; // Автоматически закрыть панель поиска после запуска поиска ................................ (function() { var func = BrowserSearch.searchBar.handleSearchCommand.toString() .replace(/^\s*function.+{/, '').replace(/}\s*$/, ''); var code = ['document.getElementById("search-container").setAttribute("show", false);', 'textBox.value="";' ].join(''); func += code; BrowserSearch.searchBar.handleSearchCommand = new Function('aEvent', func); })(); Отредактировано bunda1 (09-02-2013 14:47:43)
Добавлено 11-02-2013 17:17:33
Как значок в этом изображении уменьшить по ширине чтобы как у всех было? При добавлении на боковую панель её немного видно становится.
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAt1JREFUeNp8VD1PFUEUPTM7y4OACn5F/IqflVE7G6lptKQwwcTCGC3USqnsNWplLKBQQ5TE30CsrK1ojYqAQYPPPHDZ3bc7M+u5s/uEwrjZmbs7M/fce869uwo3ZsZgzDgAhd619bR1VapZr3j7Zo3PSoUlKF3BunmDoYE5XDx79EysYBvfchuOr7bsitYYKzNMdJZw5/oE5qbfYPLWVbydfo2Hu05h4cOnawYDfcOPTx/CaL+Go5Onp2uCe4aumFkVUqtQqAi7s3Vc/vgZ7sUMwW4iffUSV6IUy6MjmBpoDRt6+W9pQbAYlig9UN+AOk7rtsKGc/heaRzf3MS5pRWcn7qHxefPcOz2Xaw9uI+FfYlk4I3QyUuLr783UBZlkMo1NBPn8dM6tKnFqvfBaldAD57Awaez8G4HqiezKA5cwHvfL5nAiDhpnuLSQBejR0bgXC24zJbIBQugUWsf6kH6mT6MUuuwEHF3da2NboceTgCFJjM8uTfCsf3D6DoL7QPhuiAcGrWetVX0c6jobHlOcJfXc+xxEX5w34hDu7AEUtjsdgnuWBQf9KunXocwW2vJyjdtUq9rpSmZR1HqsB4of8ksIxrSdYxKONKsmn7xAkRtC+5prWA4FEF0yBeIGuA0BKpqyhEjW75bsaX9m5EtS6RSKDkTRSyYgGjqtq35Ka7m/mBZyxQoe8nMqgAoWUrbZKSfd3OeZ1YBTIUMxUmAjZKvhOCRritGZlJJExqWFAXIEVB0ytMcSZYRgI4mgg9gHthGU+koBNMEFDzrexnS9rNxDSPEXMjzDFmSBFqGXwbd0CcZEavVBGgZgziOoQjWx+e1WKMl7eYFkOomdHq3vIGRX0VNmUOoCMVY11bRKhEuNKRi1s0/gnZtPUGnGgolNyhtZ7md7HwkuypFaCwZytfOyvcap24XeRW9quaP4XvnEqlqx6BbTmJxdbwJ/e9f1/+uatvk3PwfAQYAbM2miWXUYiwAAAAASUVORK5CYII=
Отредактировано serg00700 (11-02-2013 17:20:24)
Mozilla Firefox - Просто "мега бомба"
Отсутствует
serg00700К чему было написано про кнопку-переводчик?
тут вроде про переводчик писали что и как . Не понадобилось ну и ладно. А как кнопку сузить? Много цифр и ничего не понятно
Mozilla Firefox - Просто "мега бомба"
Отсутствует
тут вроде про переводчик писали что и как . Не понадобилось ну и ладно. А как кнопку сузить? Много цифр и ничего не понятно
По описанию, это та же самая кнопка, которую мы обсуждали
Кнопку, сузить можно открыв data:image... через адресную строку и сохранить изображение, потом в редакторе каком-нибудь изменить размеры, а после опять закодировать в base64
Отсутствует
так что приделал хитрую распорку
Спасибо. Беру.
bunda1
Попробовал сделать, чтобы кнопка Save+ сохраняла ярлыки с favicon'ами, которые не .ico
В оффлайне вроде работает... test
Отсутствует
Попробовал сделать, чтобы кнопка Save+ сохраняла ярлыки с favicon'ами, которые не .ico
В оффлайне вроде работает... test
С этого сайта http://cameleo.ru/ почему то вообще не хочет сохранять ярлык, а так да, начал сохранять иконки где раньше не сохранялось.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Как значок в этом изображении уменьшить по ширине чтобы как у всех было? При добавлении на боковую панель её немного видно становится.
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACX0lEQVQ4jW2TvapWVxCGn5m19tmfiomC6AGNNgEDB1JILERsAiEkTXILphDBPlfgVViYLlUgWEZBjohgGQsjEeFEDMpR8Yfvb++9Zs2kWJyA4FTTvM8w874jXLr2HSldAAwQhA8rBAQIBwIiQCRAMjXuZo4evn747OnNE1QGhLqni6ZbBJSUuPhqh5+/OcOjv//hy5PHuHz7Ib/txsW8+cm+g1e/OMFGVIqDAx7gEYDgwCSJr+UFx7Zvcuj7H+h//YUrn3/FrcV4MBcLf7Yq9ARTgHv8D5kXZ9cqb7Rj8+lztr49z+sHf3L83Dke3nvEilOeEXi7XLN6957atsQCXpnxogT/mvOmwtQd5cmN+wxWmalw+7MtpievyaM5n5YFPx7vkX6Gu+MBY3WCQKVRJznCWrdAlW4YuLO7gmJkq85+KltHDmH7DkCZQNrRmyGBIFg41QxD2UiVPxgggmwevC+VoRRMJswmGiEAcHcmM8KDICAlZqMxlgCHbOa8HCtSnVINr7XZDUxTYTQjJyGpIiggJIExAsLJeEA1zA0rBrUSEayHkVIrKSVCE4ogAiEtWDPztgIReK2UYlQqtRjL9Qozo8uZEEFQAkgCqCCa2pE8yBBM7g0iheV8znoc6bqMu5OSE02HqCJJSUla0CLIVOit0uHEODAuF2RVcgidKBsi9Kr0XabPGZ3N6Cn0EVCDTBbdWVd+/+s5RRNuRs7aIEnbVAREW0IRtIw8Xihk1cwwzbdfjge2vUBKoArioAF72XTAfe9JWp86mMZ5Zrn6iZ3hAoh95Jk/XkFAZNzv/geBRm5JUhdRSAAAAABJRU5ErkJggg==
или
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAAsSAAALEgHS3X78AAACpElEQVQ4jW2UwYpdRRCGv+ruk3szSSZjFIS4uEZJBI0IbtwaxRcQX8FVBF/A13DhWtxm7ypZiMssBlyIZEhkNMwYRmfmnrnnnO6q38W5LkQLGmpTRf///3Ubn3/zseV8T9AAw/h3CcwMIZBAARgIkVLB42Hhxu7Xy/dvr26imACf52Db5xDHKXNr7PliseGj9+7w9Okhq1f2uP/jk/TDUf2sXN/dWX317q3lLkGVCCAEgQglEmKwzF7d8OlPj3j1N+PO3XdYPPiOL9/+kMf9H6tCaPIaS+9MDSN8XoSMJli34Bi4cXZBa41443WmF0csbr/JycGBVdubioDDfuDibG01gjAhwdqD4xoc1uC5g48D7bTjre8f05/3XNtZ8ODKa9RpTWkh8tDzweVKt1jgEQjYuHHuRiUzSDRd5WXd5a9xwHLhZBx5nq7BkxNKa8FVTXxy8wrd9ZfwacQMIsAQGSgGRuLUEoNAKcHpnzw6OGU/RAmJyZ2cDDPDthGbzXkLYxNOi0p2ZyecSJk09FyuDQSlOfw+OlOtMIzUWpHmkCVRm9M8MLZ8mJFyIjucOxBQcGddnRSiekPuGBASw1RprUEyulIoZmAJS0bOYBEgpwBkb0zRCPf5RDAMA6M7JRdyKoC2OAeWCmAsWsxykKju1NrwruFTpd9smGqllEzCSMlQGJEh2+wdZjgBEmXGM+gkJKe/6Bk3A7lkComSoMtGVxLLrpByJi8WMHakEIQoyMhNTOOoUYn+7HxOB4EBCawZZglZwjBsKzuFbJZTuHQwim9/fmHRFeROzomcjC7NJs7bDAkcIRkxDfxysYRslwrD+Gz/uF/tewtSY2v7P6DMb1pzlITPvccMU/bEOD4rXIz3+fXonmHtP7+Jtpf4v5KkGZGHfwMM8J30YIQefAAAAABJRU5ErkJggg==
P.S. Пожалуйста отвечай не вставляя в свой ответ весь текст моих сообщений и все коды. Это можно сделать по короче, например: Хочу спросить насчёт http://forum.mozilla-russia.org/viewtop … 96#p600996
Отсутствует
С этого сайта http://cameleo.ru/ почему то вообще не хочет сохранять ярлык, а так да, начал сохранять иконки где раньше не сохранялось.
Наверно потому что на этом сайте нет иконки
Отсутствует
bunda1
Попробовал сделать, чтобы кнопка Save+ сохраняла ярлыки с favicon'ами, которые не .ico
В оффлайне вроде работает... test
Это просто супер, не знал что можно так перекодировать или что там происходит ?
Большое спасибо
Отсутствует
serg00700 пишет: тут вроде про переводчик писали что и как . Не понадобилось ну и ладно. А как кнопку сузить? Много цифр и ничего не понятноПо описанию, это та же самая кнопка, которую мы обсуждали Кнопку, сузить можно открыв data:image... через адресную строку и сохранить изображение, потом в редакторе каком-нибудь изменить размеры, а после опять закодировать в base64
Всё получилось. Я просто раньше так делал что-то не совсем понимал, а вы направил на верный путь. Спасибо.
bunda1 чуть уменьшилась. Я сам подредактировал.
Спасибо за труд.
Отредактировано serg00700 (11-02-2013 23:17:18)
Mozilla Firefox - Просто "мега бомба"
Отсутствует
Наверно потому что на этом сайте нет иконки
Да, но кнопка от bunda1 пусть без иконки сайта но сохраняет ярлык который потом можно открыть, а здесь ничего не сохраняет.
http://forum.mozilla-russia.org/viewtopic.php?pid=588991#p588991
Отредактировано villa7 (11-02-2013 23:11:43)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Да, но кнопка от bunda1 пусть без иконки сайта но сохраняет ярлык который потом можно открыть, а здесь ничего не сохраняет.
Да подтверждаю, буду исправлять
Отредактировано bunda1 (11-02-2013 23:34:52)
Отсутствует
Да, но кнопка от bunda1 пусть без иконки сайта но сохраняет ярлык который потом можно открыть, а здесь ничего не сохраняет.
Я грешным делом подумал что вы про фавиконку, потому что перед этим проверил сохранение ярлыка и у меня сохраняет, а вот фавиконку нет (ну ее собственно и нет на сайте )
Отсутствует
serg00700
Тут обсуждают Custom Buttons кнопки и коды, тебе надо спрашивать тут Настройка внешнего вида Firefox в userChrome.css | Форум Mozilla Россия или Stylish | Форум Mozilla Россия
Отсутствует
Dumby
VT ( Firefox10+ ) по цвету отличается от стандартных панелей и с некоторыми темами оформления это сильно бросается в глаза. Не мог бы ты это поправить
Отредактировано bunda1 (13-02-2013 00:07:21)
Отсутствует
VT ( Firefox10+ ) по цвету отличается от стандартных панелей и с некоторыми темами оформления это сильно бросается в глаза.
Ну, я темами не пользуюсь вообще, и какой цвет, в зависимости от темы, нужен для VT - мне не ясно.
Но могу какую-нибудь глупость предложить, типа: среднеее от всех пикселей
Попробуй положить в onDestroy первой строчкой observer.destroy();
а перед onDestroy вот это...
var observer = { get obs() { return Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); }, init: function() { this.obs.addObserver(this, "lightweight-theme-styling-update", false); this.observe(); }, destroy: function() { try { this.obs.removeObserver(this, "lightweight-theme-styling-update"); } catch(ex) {} }, observe: function(subject, topc, data) { setTimeout(function() { var win = document.getElementById("main-window"); var bgi = window.getComputedStyle(win).backgroundImage; if (bgi == "none") { var bgc = window.getComputedStyle(win).backgroundColor; toolbar.style.backgroundColor = bgc; var brc = bgc; bgc.match(/\d+/g).forEach(function(color, i) { if (i > 2) return; brc = brc.replace(color, Math.round(color/1.5)); }); toolbar.style.borderRightColor = brc; return; } var url = bgi.replace('url("', "").replace('")', ""); const xhtml = "http://www.w3.org/1999/xhtml"; var img = document.createElementNS(xhtml, "img"); var canvas = document.createElementNS(xhtml, "canvas"); img.src = url; img.onload = function() { var width = canvas.width = img.width; var height = canvas.height = img.height; var context = canvas.getContext("2d"); context.drawImage(img, 0, 0); var arr = context.getImageData(0, 0, width, height).data; var r = 0, g = 0, b = 0; var len = arr.length; for (var i = 0; i < len; i += 4) { r += arr[i]; g += arr[i + 1]; b += arr[i + 2]; } var colors = [r, g, b], borderRightColors = []; colors.forEach(function(color, i) { var clr = Math.round(4 * color / len); colors[i] = clr; borderRightColors.push(Math.round(clr /1.5)); }); var rgb = "rgb(" + colors.join(", ") + ")"; var rgbBrc = "rgb(" + borderRightColors.join(", ") + ")"; toolbar.style.backgroundColor = rgb; toolbar.style.borderRightColor = rgbBrc; } }, 200); } }; observer.init();
Отсутствует
Ну, я темами не пользуюсь вообще, и какой цвет, в зависимости от темы, нужен для VT - мне не ясно.
Но могу какую-нибудь глупость предложить, типа: среднеее от всех пикселей
Ну просто супер , я попробовал несколько тем для FF - Themes :: Add-ons for Firefox - Mozilla Firefox и для Windows XP и вроде все отлично. Протестирую и потом обновлю VT ( Firefox10+ )
Добавлено 13-02-2013 22:04:10
Спасибо !
Добавлено 13-02-2013 22:08:12
Для некоторых тем для Windows XP нужен рестарт FF, но это мелочь.
Отредактировано bunda1 (13-02-2013 22:08:43)
Отсутствует
bunda1
Не знаю к кому обратиться, автор вроде как здесь не появляется, есть такая кнопка Context Search(Firefox 4+)
Отредактировано villa7 (16-02-2013 19:28:23)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует