Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№7610-10-2023 09:54:42

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

Dumby пишет

Если нет, то почему бы не просто value, типа так

После этих правок падения со стрелками < прекратились. Продублирую линк на тестовый пост, чтобы народ не искал долго https://malwaretips.com/threads/testing … st-1052718
Эх, остался один бич - пустые строки.

Отредактировано fuchsfan (10-10-2023 09:57:51)

Отсутствует

 

№7710-10-2023 12:40:52

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1220
UA: Firefox 118.0

Re: userChrome.js

fuchsfan
Не пользуюсь userChrome.js, у меня UCF. Но внёс в свой скрипт последние правки. Если выделяю несколько абзацев, вылезает <br />
Вроде, раньше у меня такого не было или уже забыл... Скажите, у Вас также?

скрытый текст
googletranslate.png

Если нет, можете выложить свой полный скрипт, чтобы я проверил у себя?

Отсутствует

 

№7810-10-2023 13:16:59

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

xrun1 пишет

Скажите, у Вас также?

Точно так, <br /> вылазит.

Отсутствует

 

№7910-10-2023 14:34:03

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1220
UA: Firefox 118.0

Re: userChrome.js

fuchsfan
Не знаю, правильно ли, но так этого нет.

Выделить код

Код:

//                                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
                                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, ""));

UPD: Если у Вас этот код, там в 3-х местах поправить надо.

Отредактировано xrun1 (10-10-2023 16:08:08)

Отсутствует

 

№8010-10-2023 16:40:18

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

xrun1 пишет

Не знаю, правильно ли, но так этого нет.

Помогло, спасибо. До финального релиза скрипта совсем чуть-чуть :)

Отсутствует

 

№8111-10-2023 09:57:37

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

fuchsfan пишет

До финального релиза скрипта совсем чуть-чуть

Т.к. избавиться от пустых строк не получается, давайте считать текущее состояние скрипта финальным и прекратить дебаты :)

Отсутствует

 

№8211-10-2023 10:44:02

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: userChrome.js

fuchsfan пишет

избавиться от пустых строк не получается

Так хоть пробовал?

скрытый текст

Выделить код

Код:

/*
    if (text) cnt.value = text;
*/
    if (text) cnt.value = text.trimRight();

Отсутствует

 

№8311-10-2023 12:41:29

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

Dumby пишет

Так хоть пробовал?

Пробовал, эффекта не дает.

Отсутствует

 

№8411-10-2023 13:56:53

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: userChrome.js

fuchsfan
Что же там за responseText такой?

Отсутствует

 

№8511-10-2023 13:58:58

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: userChrome.js

Dumby, начальный размер окна 310 или 320 на 160. Пусть текст вписался идеально в 8 строк без пустых строк. Если на слово длиннее, то будет переполенние и размер окна станет 480х240. Сразу получаем 3-4 пустых строки + еще несколько, т.к. для текста требуется уже меньше 8 строк. Пробовал не так резко менять размер окна (с шагом 20, сохраняя пропорции), но все равно 1-3 пустых строки иногда присутствуют.

Отсутствует

 

№8611-10-2023 14:04:58

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 115.0

Re: userChrome.js

Dumby пишет

Что же там за responseText такой?

В таких вопросах я ничего не понимаю.

6e73epo пишет

(с шагом 20, сохраняя пропорции), но все равно 1-3 пустых строки иногда присутствуют.

Попробую это, если 1-3, да только иногда.

Добавлено 11-10-2023 14:15:48
Попробовал, ответ отрицательный, в основном 5-6 пустых строчек, редко-редко 1. Но ведь был же код для Custom Buttons, который не давал пустых строчек.

Отредактировано fuchsfan (11-10-2023 14:15:48)

Отсутствует

 

№8711-10-2023 14:16:11

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: userChrome.js

Dumby пишет

Что же там за responseText такой?

Это в варианте без ваших правок? Так окно падает даже если попытаться перевести только один символ '<' А вообще, не смотрел еще, по какой причине переводимая строка "When < SWH > and < WDAC > switches are ON" оказывается не на своем месте в массиве

Отредактировано 6e73epo (11-10-2023 14:23:54)

Отсутствует

 

№8812-10-2023 12:33:28

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: userChrome.js

6e73epo пишет

размер окна

Ааа! Речь не о каких не «пустых строках», а о размере <textarea>.
Ни за что бы не догадался.


Тут бы хорошо вообще весь разресайз переписать,
но это слишком сложно (в смысле для меня).


Но, наверно, можно попробовать сделать окончательную
подгонку уже под конец.
Тогда, на всякий случай, всё таки if (text) cnt.value = text.trim();
и, перед return w;

скрытый текст

Выделить код

Код:

//
    if (text) {
        var st = cnt.style;
        var div = cnt.editor.rootElement;

        var range = new Range();
        range.selectNode(div.firstChild);
        var rect = range.getBoundingClientRect();

        let w = Math.ceil(rect.width);
        if (cnt.scrollTopMax) {
            if (!matchMedia("(-moz-overlay-scrollbars)").matches) // ???
                w += InspectorUtils.getChildrenForNode(div, true, false).at(-1).clientWidth;
        }
        else st.height = Math.max(50, Math.ceil(rect.height) + 1) + "px";

        st.width = Math.max(200, w) + "px";
    }

Отсутствует

 

№8912-10-2023 13:26:44

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1220
UA: Firefox 118.0

Re: userChrome.js

Dumby пишет

Тут бы хорошо вообще весь разресайз переписать,

Я тоже пробовал, не смог. :) Отлично всё работает, спасибо.:beer:

скрытый текст
Image001_2023-10-12_13-29.png

Отредактировано xrun1 (12-10-2023 13:33:01)

Отсутствует

 

№9012-10-2023 13:44:02

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

Dumby пишет

Но, наверно, можно попробовать сделать окончательную
подгонку уже под конец.

Безусловно, лучше, чем с теми "пустыми строками", хотя у меня гарантированно появляется вертикальный скролл, в 1 строку, если текст короткий, или в несколько пикселей, если текст побольше.

Добавлено 12-10-2023 13:57:16
Причину выяснил, такое происходит при установке в css-стиле скрипта размера шрифта 24px и выше, при размере 22px скролл отсутствует. Может, это можно исправить?

Отредактировано fuchsfan (12-10-2023 13:59:14)

Отсутствует

 

№9112-10-2023 16:05:22

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2242
UA: Firefox 78.0

Re: userChrome.js

fuchsfan пишет

происходит при установке в css-стиле скрипта размера шрифта 24px и выше

Поставил 24px, и действительно, вижу,
пояляется ненужный вертикальный скролл.


Как ни странно, у меня помогает в строке
else st.height = Math.max(50, Math.ceil(rect.height) + 1) + "px";


заменить 1 на 2 (ну или сколько не жалко). Попробуй.

Отсутствует

 

№9212-10-2023 16:55:02

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 128
UA: Firefox 119.0

Re: userChrome.js

Dumby пишет

else st.height = Math.max(50, Math.ceil(rect.height) + 1) + "px";

заменить 1 на 2 (ну или сколько не жалко).

Супер, помогло. Благодарю.
Ну все, похоже, что приплыли, типа Final :)

Отредактировано fuchsfan (12-10-2023 16:55:19)

Отсутствует

 

№9313-10-2023 07:49:00

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 115.0

Re: userChrome.js

xrun1
У вас вот на этом скрине googletranslate переводит с русского на английский.
В моем google_translate.js вообще нет такой строки ну и нет перевода на английский.

Выделить код

Код:

var url = "http://translate.google.com/translate?u="+encodeURIComponent(urlt)+"&hl="+lng+"&langpair="+dir+"&tbb=1";

Все остальные правки с этой темы я сделал.Что нужно еще поправить, чтоб был перевод и на английский ?
google_translate.js для Aris-t2

скрытый текст

Выделить код

Код:

location.href.endsWith("://browser/content/browser.xhtml") && ({
	async init(func) {
		await delayedStartupPromise;
		var code = func.toString();
		code = code.slice(code.indexOf("{") + 1, -1).trim();

		var addEventListener = (...args) => {
			var trg = args[3];
			if (!trg) trg = args[3] = window;
			trg.addEventListener(...args);
			this.handlers.push(args);
		}
		new Function(
			"_id,xhtmlns,addDestructor,addEventListener,gClipboard,LOG", code
		).call(
			this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml",
			() => {}, addEventListener, {read: readFromClipboard}, Cu.reportError
		);
		window.addEventListener("unload", this, {once: true});
	},
	handlers: [],
	handleEvent() {
		for(var args of this.handlers)
			args.pop().removeEventListener(...args);
		delete this.handlers;
	}
}).init(() => {

	// Здесь код google-translate.js

//Google,
var langFrom_google_text = "auto";//авто
var langTo_google_text = "ru"; 

      
//Назначаем иконки
var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg==";
var gticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADKElEQVR42p2TX2hTdxTHPzfJTW6T3qQmapvWabUbog+udp3kYeLQ4f6wiZQNtjlXHyZaBYe6TekYVGRQYexFscOtuD7UdWxzMtAXEbZStKIbDsaUCbVj9o8mTW+aNrlJbu5vJ8Ex2OMO/Lj87jnne873nO9PSyTV3tkAfYi5NhQ1MB1Ijc3ijN+D7CQh28YK+GHDMyxpjlJTkmAdQi5dWvOsUrYkGB5QC5Kcg/aFBxxqqycmcY38a/1yTqYgMw8ByfFKjtZ4V6myCeW8IApyfOw2155fw1DG4dOJJK1r45x5BPDUpZuMr2uXSuAvgBMQgOitjLJNn7iDSJP0rIJ35dt19TeGoi0Es1MMP72KFvm3+88phuYM3HCd3ObQizpa/cW7Kh020E0Tz1yOUxvjdIr7o6t/cLpkEJqZp7s5zN62ZewfnWLQ9VIIBqodBdI5tIbBG8oKhSAaJZDN8tpSP5+3L8eVgLbeAdKal7NH3mKL3FcOXCfV1ITjc7FLFrWZIlpt/4+qEA7hLRrCwk/RusOXu7ax8xHvGTkVgi/89As/T8ia9EUyghKOWSaYyqNx8oIiuEgcshetsooceibJinvTfNH1DpseD3LHSZE4eprs6k24NQaevI1fF8q5FJqv9xvlmFLdkKZlhb77E8TdIlFD54OOl3mzdXm1k+sP0jzbdwF7cRhsj8ysAWYnpYPeQfXPnn3JJG8/sZT+PW8gkuDbkWEiRh3b29dV/edujNE5dB4nHJSCUrQsTdP9mUKrCKHA5piHK+918quVp/VoD9W9uhGejNRx6+N9VZAmoTJZmhbK4vR7BGDPCQEQ/qU8R15aT2/Hi/R8PcyxyyMyVBmaXwIfPiTVf5yYHiF28ARpOyuqk3nJ4DV2HFc4SamUZ3vrGr7vPlitFNraQc4SzZZt6ptWMv3DAOdGrrGj7yvR+2KYr5A0BeCVAwqvBQuyMG+MTzp3cvj15/ivfXfzNq++/yFEIlD7GFjZ6uPRaE4oGuNQI68jIINJu0QbTFoadIJlL7lSgb8sxbSVEb8geUUVtkh55r50MY5Wec6jibV9/A9LjP7e9TdFQScjW9P1XAAAAABJRU5ErkJggg==";


function GetXmlHttpObject(){
         if (window.XMLHttpRequest){ return new XMLHttpRequest();}
         if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP");}
        return null;
        };

var lc = navigator.lastClick = {};
addEventListener("mouseup", e => {
    if (e.button) return;
    lc.X = e.screenX - mozInnerScreenX;
    lc.Y = e.screenY - mozInnerScreenY;
}, false, gBrowser.tabpanels || 1);

var createWindow = function(text, status, title, id, pos, size){
var win = window, doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId);
    var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
    if(w)w.closeWin();
    w = doc.createElementNS(xhtmlns, 'div');
      w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:2px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#33343F;padding-top:0px;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
    w.id = wId;
    w.closeWin = function(){
        doc.removeEventListener('keydown', keyDown, false);
        this.parentNode.removeChild(this);
    };
    w.addEle = function(str, style){
        var ele = doc.createElementNS(xhtmlns, 'div');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }
                else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };

    var img = doc.createElementNS(xhtmlns, 'div');
    img.setAttribute('style', 'display:block;float:right;width:16px;height:16px;padding:0;margin-top:2px;margin-right:1px;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQUlEQVR4Xm2SPUhbURTHfzfNJ4nU0Axx7CJCN2kQtIgVCtq6OdQuBUftWIQqFNsKDo6iHTqIqN3a0kklUKTS2AZrcOjioFtRjFWUfH+803cS9GHwB4dzcu75/+8L9xgaSEDbLXhaASzAyXAMn5/DHxwwjeJgKLRxd3Q0atxuLhGgWqmQmp9PJ7LZJ5Ow3WhQFweDG20LC1FfRwc3kUsm+T48fPIzl3s8VTdxxLt+/2FhdlZkc1MkmdR8Pba2ajlrz3z1+9OvIOaIfb7DwsSEyNKSyM6OSLksEo/rbw2ttadntV7Gnv3k86VfqskvmDzv7hZ580Zkelrk4kJqFIsii4satVrRs+rYmBQHBuRvS4u8g/fuCmDOz+HgAIWpKRgfh3AYhoZQ8Hqxjo4o9PdT3d1FcQEl8KoBnJ7C/j6KZkZGYG4OIhEUFed7erD29q69jGrd1qVBqcQVKgwEuMSEQhjtXRk4JvW/kM1i2WGMga4uzMoKBIOIfbNiolEC6+uU+/qQRALFA1QBlwVYxmBcLmhuxqytQSgEKu7t1dBavwKvbeINh/Has2IMqnXpem4bky6qWLdvZgaOj2FwEHNyoqG19vRMZ8jZs1+NOfsNcZS3EFvzeNL51laRe/dEYrFadsLpZeyZDx7P6QN4Btwx1OE1xO4HAquP2tsjAZ+Pm8gWi3xMpc6W8/kXPyAO/DM4oOsZa2pafdjZGXF7PAgOpXKZL4nE2XImcyUGMDSg63kbhgvgtYCq8+akIL4J3y7Fyn+DokZOnLlMyQAAAABJRU5ErkJggg==");background:-o-skin("Caption Close Button Skin");');
    img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close';
    img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
    w.appendChild(img);
    var title = w.addEle(title, 'display:table;color:#000;font:17px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
        title.onclick = e => {
        e.preventDefault();
        var url = e.target.href;
        // Здесь открываем url как хотим.
        var ctabpos = gBrowser.selectedTab._tPos +1;
        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
        doc.getElementById(wId).closeWin();    
    }
    var cnt = doc.createElement("textarea");
    cnt.style.cssText = `
        color: #000;
        width: 310px;
        height: 160px;
        outline: none;
        padding-left: 3px;
        padding-bottom: 3px;
        border: 1px solid #aaa;
        background-color: #fafcfe;
        font: 17px Times New Roman;
    `;
    if (text) cnt.value = text.trim();
    w.append(cnt);
    w.addEle(status, 'display:table;font:12px Times New Roman;font-weight:bold;color:blue;width:auto;height:auto;padding-top:2px;margin:0 3px;cursor:pointer;');
    w.addEventListener('mousedown', function(e){
        if(e.target == w){
            e.preventDefault();
            var st = w.style;
            var mouseMove = e => {
                st.top = parseInt(st.top) + e.movementY + "px";
                st.left = parseInt(st.left) + e.movementX + "px";
            }
            doc.addEventListener('mousemove', mouseMove, false);
            doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
        }
    }, false);
    doc.documentElement.appendChild(w);
  
    if(size){
        cnt.style.height = size.height;
        cnt.style.width = size.width;
    }
    else{
        for(var i = 3; i < 10; i++){
            if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
                cnt.style.height = 80*i+'px';
                cnt.style.width = 160*i+'px';
            }
            else break;
        }
    };

    var docEle = (doc.compatMode == 'CSS1Compat' && win.postMessage) ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
    if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
    if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
    var hW = parseInt(w.offsetWidth/2);
    w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    w.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
	if (text) {
        var st = cnt.style;
        var div = cnt.editor.rootElement;

        var range = new Range();
        range.selectNode(div.firstChild);
        var rect = range.getBoundingClientRect();

        let w = Math.ceil(rect.width);
        if (cnt.scrollTopMax) {
            if (!matchMedia("(-moz-overlay-scrollbars)").matches) // ???
                w += InspectorUtils.getChildrenForNode(div, true, false).at(-1).clientWidth;
        }
        else st.height = Math.max(50, Math.ceil(rect.height) + 1) + "px";

        st.width = Math.max(200, w) + "px";
    }
    return w;
};

var getHash = function (txt) {
    TKK=eval('((function(){var a\x3d817046147;var b\x3d-335196159;return 410049+\x27.\x27+(a+b)})())');
    function sM(a) {
        var b;
        if (null !== yr)
            b = yr;
        else {
            b = wr(String.fromCharCode(84));
            var c = wr(String.fromCharCode(75));
            b = [b(), b()];
            b[1] = c();
            b = (yr = window[b.join(c())] || "") || ""
        }
        var d = wr(String.fromCharCode(116))
            , c = wr(String.fromCharCode(107))
            , d = [d(), d()];
        d[1] = c();
        c = "&" + d.join("") + "=";
        d = b.split(".");
        b = Number(d[0]) || 0;
        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var l = a.charCodeAt(g);
            128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023),
                e[f++] = l >> 18 | 240,
                e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224,
                e[f++] = l >> 6 & 63 | 128),
                e[f++] = l & 63 | 128)
        }
        a = b;
        for (f = 0; f < e.length; f++)
            a += e[f],
                a = xr(a, "+-a^+6");
        a = xr(a, "+-3^+b+-f");
        a ^= Number(d[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return c + (a.toString() + "." + (a ^ b))
    }

    var yr = null;
    var wr = function(a) {
        return function() {
            return a
        }
    }
        , xr = function(a, b) {
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2)
                , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d)
                , d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
            a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
        }
        return a
    };

    return sM(txt);
};

//----------Перевести  текст  из буфера в окне Google------------
var ujs_google_translat = function (dir){
   var lng = 'ru';
   var txt = gClipboard.read(); 
   var l = dir.split('|');
   var encTxt = encodeURIComponent(txt);
   var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)};
    if (txt) {
    winWait(lng);
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var urlt = "http://translate.google.com/translate_t?text="+encTxt+"&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&ujs=gtt";
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, ""));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                  //  result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();

                    createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
    };
};



//----------Перевести выделенный текст в окне Google------------
function ujs_google_translate (){
    var lng = 'ru';
    var txt = gContextMenu.selectionInfo.fullText;
    var encTxt = encodeURIComponent(txt);
    var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)};
    if (txt) {
    winWait(lng);
        var xhr = new XMLHttpRequest();
       // var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
        var urlt = "http://translate.google.com/translate_t?text="+encTxt+"&sl='  + langFrom_google_text + '&tl=' + langTo_google_text +'&hl=' + lng + '&eotf=0&ujs=gtt";
      
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xhr.onreadystatechange = function() {
            try{
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, ""));
                    for(var i = 0, n; n = tmp[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
                   // result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>';
                    //status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase();
                     status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + langTo_google_text.toUpperCase();
                     createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick);
                }
            } catch (x){LOG(x)};
        };
        xhr.send('q=' + encodeURIComponent(txt));
     };
};


//----------Заменить текст переводом Google------------
function ujs_google_TexReplace() {
    var lng = 'ru';
    var txt = gContextMenu.selectionInfo.fullText;
    if (txt) {
        var xhr = new XMLHttpRequest();
        var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt);
       
           function gettransdata(){
           xmlhttp=GetXmlHttpObject();
           xmlhttp.onreadystatechange=stateChanged;
           xmlhttp.open('POST', url, true);
           xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
           xmlhttp.send('q=' + encodeURIComponent(txt));
        }
        function stateChanged() {
            
           if (xmlhttp.readyState == 4 ) {
           var result = '';
           var data = JSON.parse(xmlhttp.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />"));
           for(var i = 0, n; n = data[0][i]; i++){
                        if(n[0])result += n[0].toString();
                    };
        var msgName = _id + ":ReplaceSelectionRangeAt0";
        var url = "data:," + encodeURIComponent(
       `addMessageListener("${msgName}", function listener(msg) {
        removeMessageListener("${msgName}", listener);
        var win = {};
        Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager)
            .getFocusedElementForWindow(content, true, win);

        var sel = win.value.document.getSelection();
        if (sel.isCollapsed) return;
        var range = sel.getRangeAt(0);
        range.deleteContents();
        range.insertNode(range.createContextualFragment(msg.data));
    });`
);
function replace(tagString) {
    var mm = gBrowser.selectedBrowser.messageManager;
    mm.loadFrameScript(url, false);
    mm.sendAsyncMessage(msgName, tagString);
}
replace('<span>'+result+'</span>');
                }
        }  
        gettransdata();
    } 
};



//--------Перевести страницу с Google--------------
function ujs_googlePage_translate() {
   var urlt = gBrowser.currentURI.spec;  
   var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1";
   gBrowser. fixupAndLoadURIString(url, {
   triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
};


//Контекстное меню для перевода из буфера-------------------------------------------  

(function () {
 if ( document.getElementById("TranslateBufer") ) return; 
 var contextMenu = document.getElementById("contentAreaContextMenu");  
 var Item = document.createXULElement("menuitem");
       Item.setAttribute("label", "Перевод из буфера");
       Item.setAttribute("class", "menuitem-iconic");
       Item.setAttribute("image", mainicon);
       Item.addEventListener("command", function(){ujs_google_translat('auto|ru')}, false);

    contextMenu.insertBefore(Item, document.getElementById("context-viewpartialsource-selection") ); 
    addDestructor(function() { contextMenu.removeChild( Item ) });
 })();

  

 //Контекстное меню для перевода страниц-------------------------------------------  

(function () {
 if ( document.getElementById("TranslatePage") ) return; 
  
  var menu = document.createXULElement("menu");  
  var menuPopup = document.createXULElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
  
    menu.id = "TranslatePage";
    menu.setAttribute("label", "Перевести страницу");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);
   
  contextMenu.insertBefore(menu, document.getElementById("context-viewsource") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) }); 

    var array = [
        {label:"Google", func: ujs_googlePage_translate, image:gticon},
        
        
        ];
        
   array.forEach(function( m ) {  
       if ( "separator" in m ) { menuPopup.appendChild( document.createXULElement("menuseparator") ); return };
       var mItem = document.createXULElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );

       });
   
     addEventListener("popupshowing", function() {
     menu.hidden = gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onTextInput ; 
  }, true, contextMenu );
})();



 //Контекстное меню для перевода текста-------------------------------------------  
(function () {
 if ( document.getElementById("TranslateSelected") ) return; 
  
  var menu = document.createXULElement("menu");  
  var menuPopup = document.createXULElement("menupopup");
  var contextMenu = document.getElementById("contentAreaContextMenu");  
      
    menu.id = "TranslateSelected";
    menu.setAttribute("label", "Перевести выделенный текст");
    menu.setAttribute("class", "menu-iconic");
    menu.setAttribute("image", mainicon);

  contextMenu.insertBefore(menu, document.getElementById("context-viewpartialsource-selection") ); 
  menu.appendChild( menuPopup );
  addDestructor(function() { contextMenu.removeChild( menu ) });
     
    
  var array = [
        {label:"В окне Google", func: ujs_google_translate, image:gticon},
       
        { separator: ''},
        {label:"Заменить текст переводом Google", func: ujs_google_TexReplace, image:gticon},
        
        
        
              ];
  array.forEach(function( m ) {  
        if ( "separator" in m ) { menuPopup.appendChild( document.createXULElement("menuseparator") ); return };
       var mItem = document.createXULElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.setAttribute("class", "menuitem-iconic");
       mItem.setAttribute("image", m.image);
       mItem.addEventListener("command", m.func, false);
       menuPopup.appendChild( mItem );
       });
 
     addEventListener("popupshowing", function() {
     menu.hidden = !gContextMenu.isTextSelected; 
  }, false, contextMenu ); 
 })();


});

Отсутствует

 

№9413-10-2023 13:15:27

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 301
UA: Google 2.1

Re: userChrome.js

В проекте Floorp появился скрипт для создания QR Code на текущую загруженную страницу. Сам скрипт базируется на функционале QR Code Styling. Работу проверял в [firefox] 115+ с загрузчиком от Xiao

qr-code.uc.js

Выделить код

Код:

// ==UserScript==
// @name	QR Code Generate
// @author	Project Floorp
// @include	main
// @homepageURL	https://github.com/Floorp-Projects/Floorp-core/blob/main/browser/base/content/browser-pageActions.js
// @description Need QR Code Styling https://unpkg.com/qr-code-styling@1.5.0/lib/qr-code-styling.js \n Place "qr-code-styling.js" in same folder with this script
// ==/UserScript==
/* eslint-disable no-undef */
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

if (location.href.startsWith("chrome://browser/content/browser.x")) {

  let strlngs = {
    'en-US': {
      'qrcode-generate-page-action-title': 'Scan QR Code with your Phone',
      'qrcode-generate-page-action': 'Share this page with your phone',
      'qrcode-generate-page-action-dl': 'L+Click: Download QR Code',
    },
    'ru': {
      'qrcode-generate-page-action-title': 'Сканировать QR-код с помощью телефона.',
      'qrcode-generate-page-action': 'Отправить страницу на телефон.',
      'qrcode-generate-page-action-dl': 'ЛКМ: Скачать QR Code',
        },
  };
  function QRCodeGenerateL10n(strlng) {
    let LOCALE = strlngs[Services.locale.requestedLocales[0]]
      ? Services.locale.requestedLocales[0]
      : 'en-US';
    return (!strlng)
      ? ""
      : strlngs[LOCALE][strlng]
        ? strlngs[LOCALE][strlng]
        : "";
  }

  let QRCodeGeneratePageActionButton = window.MozXULElement.parseXULToFragment(`
  <hbox id="QRCodeGeneratePageAction" label="${QRCodeGenerateL10n('qrcode-generate-page-action')}"
    class="urlbar-page-action" tooltiptext="${QRCodeGenerateL10n('qrcode-generate-page-action')}"
    role="button" popup="qrcode-panel">
    <image id="QRCodeGeneratePageAction-image" class="urlbar-icon"
    style="list-style-image: url(data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9ImNvbnRleHQtZmlsbCIgZmlsbC1vcGFjaXR5PSJjb250ZXh0LWZpbGwtb3BhY2l0eSI+CiAgPHBhdGggZD0iTTguMjUgMTAuMzc1YS42MjUuNjI1IDAgMCAxLTEuMjUgMGwwLTguMzIzLTMuMzA4IDMuMzA5YS42MjYuNjI2IDAgMCAxLS44ODUtLjg4NUw3LjI4NSAwbC42ODEgMCA0LjQ3NyA0LjQ3NmEuNjI2LjYyNiAwIDAgMS0uODg1Ljg4NUw4LjI1IDIuMDUybDAgOC4zMjN6Ii8+CiAgPHBhdGggZD0iTTEyLjI1IDE1YTIgMiAwIDAgMCAyLTJsMC0xLjM3NWEuNjI1LjYyNSAwIDAgMC0xLjI1IDBsMCAxLjUyNS0uNi42LTkuNTUgMC0uNi0uNiAwLTEuNTI1YS42MjUuNjI1IDAgMCAwLTEuMjUgMEwxIDEzYTIgMiAwIDAgMCAyIDJsOS4yNSAweiIvPgo8L3N2Zz4K);"/>
    <panel id="qrcode-panel" type="arrow" position="bottomright topright" tooltiptext="${QRCodeGenerateL10n('qrcode-generate-page-action-dl')}" onpopupshowing="generateCurrentTabQRCode()" onclick="if (event.button == 0) generateCurrentTabQRCode(true)">
     <vbox id="qrcode-box">
      <vbox class="panel-header">
       <html:h1>
        <html:span>${QRCodeGenerateL10n('qrcode-generate-page-action-title')}</html:span>
       </html:h1>
      </vbox>
      <toolbarseparator/>
      <a href="">
        <vbox id="qrcode-img-vbox"/>
      </a>
     </vbox>
    </panel>
  </hbox>
  `);

  function generateCurrentTabQRCode(DL) {
    let QRcodeStyling = Services.io.newURI(Components.stack.filename).resolve("qr-code-styling.js");
    // Need QR Code Styling from https://unpkg.com/qr-code-styling@1.5.0/lib/qr-code-styling.js
    // Place "qr-code-styling.js" in same folder with this script
    Services.scriptloader.loadSubScript(QRcodeStyling, window);

    let currentTab = gBrowser.selectedTab;
    let currentTabURL = currentTab.linkedBrowser.currentURI.spec;

    const qrCode = new QRCodeStyling({
      width: 250,
      height: 250,
      type: "svg",
      data: currentTabURL,
      image: "chrome://branding/content/about-logo.svg",
      dotsOptions: {
          color: "#4267b2",
      },
      cornersSquareOptions: {
        type: "extra-rounded",
      },
      backgroundOptions: {
          color: "#e9ebee",
      },
      imageOptions: {
          crossOrigin: "anonymous",
          margin: 10
      }
    });

  //remove old qrcode
    let QRCodeBox = document.getElementById("qrcode-img-vbox");

    while (QRCodeBox.firstChild) {
      QRCodeBox.firstChild.remove();
    }

    qrCode.append(QRCodeBox);
    if (DL)
      qrCode.download({ name: currentTabURL.replace(/[:\\\/<>?*|&#="]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).replace(/^\s+|\s+$/g, ''), extension: "svg" });
  }

  SessionStore.promiseInitialized.then(() => {
    document.getElementById("star-button-box").before(QRCodeGeneratePageActionButton);
  });
}


и
qr-code-styling.js

Выделить код

Код:

data:application/x-zip-compressed;base64,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

или qr-code-styling.js


Оба скрипта должны лежать в одной папке.


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№9513-10-2023 13:56:59

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1220
UA: Firefox 118.0

Re: userChrome.js

rubel
У нас скрипты разные. Вы изначально начали пилить скрипт с контекстным меню. У меня такой вариант:

скрытый текст
Image001_2023-10-13_12-56.png

Если текст выделен на странице - переводится в окне, если выделения нет - переводится вся страница. Исходный язык определяется автоматически, перевод на русский или английский соответственно.
Попробуйте в своём скрипте заменить 2 строки: 257 и 258

Выделить код

Код:

xhr.send('q=' + encodeURIComponent(txt));
    };

таким кодом

скрытый текст

Выделить код

Код:

xhr.send('q=' + encodeURIComponent(txt));
                    } else {
                        var urlt = gBrowser.currentURI.spec;
// Изменил строку ниже. Добавил параметр '&tl='+l[1] https://forum.mozilla-russia.org/viewtopic.php?pid=796999#p796999
                        var url = "http://translate.google.com/translate?u=" + encodeURIComponent(urlt) + '&tl=' + l[1] + "&hl=" + lng + "&langpair=" + dir + "&tbb=1";
                        var ctabpos = gBrowser.selectedTab._tPos +1;
                        gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos);
                    };


Проверить не могу, не пользуюсь методом Aris-t2, а ставить муторно.

Отсутствует

 

№9613-10-2023 14:13:48

6e73epo
Участник
 
Группа: Members
Зарегистрирован: 06-05-2022
Сообщений: 207
UA: Firefox 118.0

Re: userChrome.js

xrun1 пишет

внёс в свой скрипт последние правки. Если выделяю несколько абзацев, вылезает <br />

С абзацами: удалить замену, т.к. она уже не требуется .replace(/\\n/g, "<br />")
Для сплошного текста: заменять на пробел, а не на пусто .replace(/\\n/g, ' ')

Отсутствует

 

№9713-10-2023 14:47:19

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 115.0

Re: userChrome.js

xrun1
Заменил вашим кодом, не переводит.
3f4595a26d152086aca05e13638e8126.png 
Может еще что-то нужно сделать.?

Отсутствует

 

№9813-10-2023 15:06:01

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1220
UA: Firefox 118.0

Re: userChrome.js

6e73epo
Уже сделал.
rubel
У Вас там второй кусок подобный есть, не заметил. Попробуйте поиском в скрипте xhr.send('q=' + encodeURIComponent(txt));.
В исходном вашем это строки 292 и 293. Попробуйте там тоже заменить.

Добавлено 13-10-2023 15:21:46
Свой код для UCF выложил в соответствующей теме.

Отредактировано xrun1 (13-10-2023 15:21:46)

Отсутствует

 

№9913-10-2023 16:06:14

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 559
UA: Firefox 115.0

Re: userChrome.js

xrun1
Нет и это не помогло.

Отсутствует

 

№10013-10-2023 16:31:00

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1220
UA: Firefox 118.0

Re: userChrome.js

rubel
Тогда не знаю. Скрипты разные, а я разобраться не смогу. :(

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]