Dumby - вопрос по JS-синтаксису:
есть ли способ объединить две последние записи в одну? (_531906d3-e22f-4a6c-a102-8057b88a1a63_)
var tooltips = { get "stop-button"() { return GetDynamicShortcutTooltipText("stop-button") +"\n"+ hmap.get("wheel-stop"); }, "_531906d3-e22f-4a6c-a102-8057b88a1a63_-browser-action": hmap.get("#").split('|')[11], // SingleSave "_531906d3-e22f-4a6c-a102-8057b88a1a63_-BAP": hmap.get("#").split('|')[11] }
Ещё можешь пояснить что-нибудь по вопросу: как определить, что меню открыто?
Отсутствует
вопрос по JS-синтаксису:
есть ли способ объединить две последние записи в одну?
Разве что уже после определения объекта tooltips написать
tooltips["…-BAP"] = tooltips["…-browser-action"] = hmap.get("#").split('|')[11];
Ещё можешь пояснить что-нибудь по вопросу: как определить, что меню открыто?
Нет, не могу.
id менюшки «ToggleButton-Popup» я не смог увидеть, но есть "ToggleButton-secondaryPopup".
И, геттер XULPopupElement.prototype.state существует, и, у меня, работает.
Добавил в get "ToggleButton"() {…}
Services.console.logStringMessage(
window.event.target.closest("#ToggleButton").secondaryPopup.state
);
и мне показывает "open" или "closed".
Отсутствует
Dumby
сделал secondaryPopup.state, это был не глюк MacOS.
Не получается после сохранения сайта изменить стиль имени текущей вкладки.
Первая стока работает, а как изменить стиль шрифта вкладки?
Желательно одновременно overline и underline ? Или отдельно на italic ?
gBrowser.selectedTab.style.filter = "blur(0.5px) drop-shadow(0px 1px 0px #808)";
gBrowser.selectedTab.style.textDecoration = "overline";
Отредактировано Dobrov (08-06-2023 04:13:10)
Отсутствует
Не получается после сохранения сайта изменить стиль имени текущей вкладки.
gBrowser.selectedTab.style.…
Так может лучше использовать сам <label>, а не <tab>.
gBrowser.selectedTab.textLabel.style.textDecoration = "underline overline";
Отсутствует
Добрый день.
Перестала работать кнопка переводчика (вызывает гугловский виджет на текущей странице).
Не посмотрите ли, что с ним сейчас не так?
var vert = ` javascript:{var d, b, o, v, p; b = (d = document).body; o = d.createElement('script'); o.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); o.setAttribute('type', 'text/javascript'); b.appendChild(o); v = b.insertBefore(d.createElement('div'), b.firstChild); v.id = 'google_translate_element'; v.style.display = 'none'; p = d.createElement('script'); p.text = 'function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}'; p.setAttribute('type', 'text/javascript'); b.appendChild(p)};void(0);` ; gBrowser. loadURI(vert, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });
Отсутствует
leex посмотри этот пост
Отсутствует
Отсутствует
DomInspector – объекты JavaScript такого элемента не показывет
Значит это for-in не перечисляемое свойство, я же говорил.
Вот в консоли его видно, в прототипе.
Хотел уже querySelector() написать, но подумал, дай-ка загляну в кустомэлементщину
chrome://browser/content/tabbrowser-tab.js
вдруг там что-то подобное уже имеется, и точно, такой геттер есть
Отсутствует
leex посмотри этот пост
Благодарю, поправил код, теперь все работает
var vert = ` javascript:{var d, b, o, v, p; b = (d = document).body; o = d.createElement('script'); o.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); o.setAttribute('type', 'text/javascript'); b.appendChild(o); v = b.insertBefore(d.createElement('div'), b.firstChild); v.id = 'google_translate_element'; v.style.display = 'none'; p = d.createElement('script'); p.text = 'function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}'; p.setAttribute('type', 'text/javascript'); b.appendChild(p)};void(0);` ; gBrowser.loadURI(Services.io.newURI(vert), { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });
А еще вопрос по этой теме. Есть ли у кого код для кнопки, чтоб открывался гугл транслит, а из буфера обмена подгружался в переводчик текст?
Отсутствует
Кстати, этот код
javascript:{var d, b, o, v, p; b = (d = document).body; o = d.createElement('script'); o.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); o.setAttribute('type', 'text/javascript'); b.appendChild(o); v = b.insertBefore(d.createElement('div'), b.firstChild); v.id = 'google_translate_element'; v.style.display = 'none'; p = d.createElement('script'); p.text = 'function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}'; p.setAttribute('type', 'text/javascript'); b.appendChild(p)};void(0);
как букмарклет прекрасно работает, так что можно и без CB использовать.
Отсутствует
Всем привет! Это Ян, автор первых версий расширения.
Не заходил в тему 15 лет, а она за это время разрослась аж в целый раздел форума.
Большое спасибо всем причастным, кто все эти годы выпускал новые версии, создавал кнопки, прежде всего Anton'у, подхватившего у меня разработку.
Получилась славная история.
Отсутствует
про bunda1 https://forum.mozilla-russia.org/profile.php?id=48303 не забывайте. дофигища сделал в своё время. спасибо и ему. и вообще всем причастным
Отредактировано sonyas75 (21-06-2023 21:20:18)
Отсутствует
Dumby, I need your help. I want to add a button to make firefox always on top.
We have nsIAppWindow.zLevel setter (raisedZ), but bit glitch, and inside-app.
And absolute "alwaysontop" chrome-feature flag, but not toggleble dynamically, see bug 1788946.
Отсутствует
egorsemenov06
Хорошая прога, только google переводит не так как в simple-translate. Не знаю с чем связанно, там в скрипте что-то менять нужно. Тут была кнопка translate, там про это обсуждали. Кстати, у вас все переводит? У меня после обновления все сервисы отвалились, кроме google, babylon.
Отредактировано b0ttle (25-06-2023 19:03:23)
Отсутствует
возможноли вот эту кнопку адаптировать под UCF
Типа из пустого в порожнее?
Как-то так, наверно. Проверить особо неначем.
(async () => CustomizableUI.createWidget({ path: ["_QTranslate", "QTranslate.exe"], id: "805678", label: "label", tooltiptext: "tooltiptext", localized: false, onCreated(btn) { btn._handleClick = () => this.click(); btn.image = "chrome://browser/content/robot.ico"; }, click() { var file = Services.dirsvc.get("ProfD", Ci.nsIFile); this.path.forEach(file.append); // See https://gist.github.com/Noitidart/0de3be2442a0295eb386 // vk codes: https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes // Double Ctrl [Ctrl-Down, Ctrl-Up, Ctrl-Down, Ctrl-Up] var data = [[0x11, false], [0x11, true], [0x11, false], [0x11, true]]; var {ctypes} = ChromeUtils.importESModule("resource://gre/modules/ctypes.sys.mjs"); var KEYBDINPUT = ctypes.StructType("tagKEYBDINPUT", [ {wVk: ctypes.unsigned_short}, {wScan: ctypes.unsigned_short}, {dwFlags: ctypes.unsigned_long}, {time: ctypes.unsigned_long}, {dwExtraInfo: ctypes.voidptr_t.size == 8 ? ctypes.uint64_t : ctypes.unsigned_long}, {padding0: ctypes.uint8_t.array(8)} ]); var INPUT = ctypes.StructType("tagINPUT", [{type: ctypes.unsigned_long}, {ki: KEYBDINPUT}]); var pInputs = INPUT.array()(data.map(([vkCode, keyup]) => INPUT(1, KEYBDINPUT(vkCode, 0, keyup ? 2 : 0, 0, 0, ctypes.uint8_t.array(8)())) )); var declareArgs = ["SendInput", ctypes.winapi_abi, ctypes.unsigned_int, ctypes.unsigned_int, INPUT.ptr, ctypes.int]; var sendArgs = [pInputs.length, pInputs, INPUT.size]; var send = () => { var user32 = ctypes.open("user32"); try {user32.declare(...declareArgs)(...sendArgs);} finally {user32?.close();} } (this.click = () => { var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.runwAsync(null, 0); setTimeout(send, 100); })(); } }))();
Отсутствует
egorsemenov06
А как работает код? Нужно сперва запустить саму программу, потом дважды Ctrl по выделенному тексту?
Если так, то легче через хоткей. Ctrl+Q запуск программы, тоже самое действие по выделенному тексту переводит, и окно намного круче. Ну и понятное дело, можно сделать значок программы зеленым и также переводить через выделение.
В файле бардак, но работает.
/* https://forum.mozilla-russia.org/viewtopic.php?pid=786917#p786917 ||000|001Alt|101Ctrl+Alt|100Ctrl|110Ctrl+Shift <Vit.V. https://forum.mozilla-russia.org/viewtopic.php?pid=786906#p786906 786926#p786926 https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values https://forum.mozilla-russia.org/viewtopic.php?pid=787019#p78701> https://support.mozilla.org/ru/kb/sochetaniya-klavish#w_okna-i-vkladki || https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly ============================================================ */ (this.keyboardshortcuts={ get skip(){return docShell.isCommandEnabled("cmd_insertText");}, get ch(){delete this.ch;return this.ch=Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);}, init(that){var keydown={ "Backquote":{"false_false_false":(e)=>{this.skip||PlacesCommandHook.showPlacesOrganizer("BookmarksMenu");}}, "Digit1":{"false_false_false":(e)=>{this.skip||window.document.getElementById("unified-extensions-button").click();}}, "Digit2":{"false_false_false":(e)=>{this.skip||BrowserOpenAddonsMgr();}}, "Digit3":{"false_false_false":(e)=>{this.skip||openPreferences();}}, "Digit4":{"false_false_false":(e)=>{this.skip||duplicateTabIn(gBrowser.selectedTab,'tab');}}, "Digit5":{"false_false_false":(e)=>{if(this.skip)return;var s=prompt('Google_ site:.. ..','');if(s.length>0)gBrowser.addTrustedTab('https://www.google.com/search?q=site:'+encodeURIComponent(gBrowser.currentURI.host)+' '+encodeURIComponent(s));}}, "Digit6":{"false_false_false":(e)=>{if(this.skip)return;var p=Services.dirsvc.get('GreD',Ci.nsIFile);p.initWithPath(p.path+"\\..\\..\\..\\_Photo\\ShareX\\ShareX.exe");p.launch();}}, "Digit7":{"false_false_false":(e)=>{if(this.skip)return;gBrowser.fixupAndLoadURIString("javascript:(function(){var EnRuT=[['щ','shh'],['Щ','Shh'],['Щ','SHH'],['х','hh'],['Х','Hh'],['Х','HH'],['ж','zh'],['Ж','Zh'],['Ж','ZH'],['ц','cz'],['Ц','Cz'],['Ц','CZ'],['ю','yu'],['Ю','Yu'],['Ю','YU'],['ё','yo'],['Ё','Yo'],['Ё','YO'],['я','ya'],['Я','Ya'],['Я','YA'],['ч','ch'],['Ч','Ch'],['Ч','CH'],['ш','sh'],['Ш','Sh'],['Ш','SH'],['э','e`'],['Э','E`'],['ы','y'],['Ы','Y'],['ъ','``'],['ь','`'],['р','r'],['т','t'],['у','u'],['и','i'],['о','o'],['п','p'],['а','a'],['с','s'],['д','d'],['ф','f'],['г','g'],['й','j'],['к','k'],['л','l'],['з','z'],['х','x'],['ц','c'],['в','v'],['б','b'],['н','n'],['м','m'],['Р','R'],['Т','T'],['У','U'],['И','I'],['О','O'],['П','P'],['А','A'],['С','S'],['Д','D'],['Ф','F'],['Г','G'],['Й','J'],['К','K'],['Л','L'],['З','Z'],['Х','X'],['Ц','C'],['В','V'],['Б','B'],['Н','N'],['М','M'],['е','e'],['Е','E']],A=document.activeElement;A.onkeyup=function ftr(){for(var s=A.value,i=0;i<EnRuT.length;i++){s=s.replace(RegExp(EnRuT[i][1],'g'),EnRuT[i][0])};A.value=s}})()",{triggeringPrincipal:gBrowser.contentPrincipal}); }},//AutoTranslit- https://forum.ru-board.com/topic.cgi?forum=5&topic=46779&start=320#15 "F1":{"false_false_false":(e)=>{FileUtils.getFile('SysD',['sndvol.exe']).launch();}}, "F2":{"false_false_false":(e)=>{gBrowser.fixupAndLoadURIString("javascript:{d=document;b=d.body;o=d.createElement('scri'+'pt');o.setAttribute('src','https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit');o.setAttribute('type','text/javascript');b.appendChild(o);v=b.insertBefore(d.createElement('div'),b.firstChild);v.id='google_translate_element';v.style.display='none';p=d.createElement('scri'+'pt');p.text='function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:%22%22},%22google_translate_element%22);}';p.setAttribute('type','text/javascript');b.appendChild(p);}void 0",{triggeringPrincipal:gBrowser.contentPrincipal}); }},//Enable translation(https://forum.mozilla-russia.org/viewtopic.php?pid=805422#p805422 ||805427#p805427) "F3":{"false_false_false":(e)=>{e.preventDefault();gBrowser.fixupAndLoadURIString("javascript:(function(){var night=function(w){(function(d){var css='html{opacity:0.6!important;background:black!important;}body{background:white!important;}';var s=d.getElementsByTagName('style');for(var i=0,si;si=s[i];i++){if(si.innerHTML==css){si.parentNode.removeChild(si);return}};var heads=d.getElementsByTagName('head');if(heads.length){var node=d.createElement('style');node.type='text/css';node.appendChild(d.createTextNode(css));heads[0].appendChild(node)}})(w.document);for(var i=0,f;f=w.frames[i];i++){try{arguments.callee(f)}catch(e){}}};night(window)})();",{triggeringPrincipal:gBrowser.contentPrincipal}); }},//Night mode(Focus mode) "F4":{"false_false_false":(e)=>{e.preventDefault();var vert=`javascript:{const o=["contextmenu","selectstart","select","mousedown","mouseup","cut","copy"],t=["-webkit","-moz","-ms","-khtml",""],e=window.jQuery;[document,document.body,document.documentElement].forEach(n=>{for(const t of o)n["on"+t]=null,e&&e(n).off(t);if(n.style)for(const o of t){const t=[o,"user-select"].join("-");n.style[t]="initial"}}) };void(0);`;gBrowser.loadURI(Services.io.newURI(vert),{triggeringPrincipal:Services.scriptSecurityManager.getSystemPrincipal()}); }},//Re-enable selecting & copying text [maple3142] (Bookmarklet) "KeyG":{"true_false_false" :(e)=>{e.preventDefault();var bar=document.getElementById("ucf-additional-vertical-bar");setToolbarVisibility(bar,bar.collapsed);}}, "KeyW":{"false_true_false" :(e)=>{gBrowser.removeAllTabsBut(gBrowser.selectedTab);}}, "KeyV":{"false_false_false":(e)=>{if(this.skip)return;gClipboard.write(gURLBar.value);glob.flash_bg_text('urlbar-input-container',0,'rgba(240,176,0,0.5)',300);},//300,"CopyURL: "+gURLBar.value.slice(0,80)) "false_true_false" :(e)=>{e.preventDefault();let url=readFromClipboard();try{switchToTabHavingURI(url,true);}catch(ex){ var reg=/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/; if(!reg.test(url)){url='https://www.google.com/search?q='+encodeURIComponent(url); }else{if(url.substring(4,0).toLowerCase()=="http"){url=encodeURIComponent(url); }else{url='http://'+encodeURIComponent(url);}}switchToTabHavingURI(url,true);} }},//Open clipboard address "KeyU":{"true_true_false" :(e)=>{FileUtils.getFile('UChrm',['user_chrome_files','_','u.exe']).launch();}}, "KeyA":{"true_true_false" :(e)=>{FileUtils.getFile('UChrm',['user_chrome_files','_','.Ev','Everything.exe']).launch();}}, "KeyQ":{"true_false_false" :(e)=>{FileUtils.getFile('UChrm',['user_chrome_files','_','.QT','QTranslate.exe']).launch();}}, handleEvent(e){if(AppConstants.platform !="macosx"){ (this.handleEvent=e=>{this[e.code]?.[`${e.ctrlKey}_${e.altKey}_${e.shiftKey}`]?.(e);})(e);return;} (this.handleEvent=e=>{this[e.code]?.[`${e.metaKey}_${e.altKey}_${e.shiftKey}`]?.(e);})(e);},}; document.addEventListener("keydown",keydown,true); this.destructor=()=>document.removeEventListener("keydown",keydown,true); that.unloadlisteners.push("keyboardshortcuts");}, }).init(this);
Добавлено 24-06-2023 16:29:20
А, это хоткей самой прогаммы, там как раз Ctrl+Q вызывает то мини-окно. А двойной Ctrl вызывает окно программы. По Ctrl, можно настроить автоперевод в мини-окне. Тогда не ясно, что делает код. По описанию не совсем понятно.
Отредактировано b0ttle (15-07-2023 18:51:08)
Отсутствует
Можете просто описать действия, чтобы понять, нужен он мне или нет. Пытался проверить, но не пойму куда вставлять в CustomStylesScripts.jsm, или его нужно в custom_script_win.js? И как проверить код, если непонятно что она делает. Я не программист, чтобы понять по самому коду, хоть он и небольшой. Там что-то с хоткеем на Ctrl?
Добавлено 25-06-2023 21:26:35
Да.. почему простой вопрос превратился в фарс, у кого больше. Ладно, не важно.
Добавлено 07-07-2023 11:13:15
Понятно, мне казалось по другому. Про кнопку даже не подозревал. Казалось что там что-то другое, тот же хоткей. Для простого запуска код как-то великоват, что тоже запутало. Действительно CustomizableUI.createWidget, как не заметил. И построение похоже на другие кнопки. Мда. Сейчас все прояснилось. Моя невнимательность. А описание действий что делает код, было лишь предположением.
Отредактировано b0ttle (26-06-2023 02:02:02)
Отсутствует