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

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№457615-08-2012 10:20:20

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

Re: Custom Buttons

Infocatcher пишет

Поверх редактора можно даже повесить неразвернутое окно браузера.

Ого ! Так сделать я не догадался  :( , панель задач скрыта и ничто на эту мысль не навело.

Ещё и отслеживать какое окно сверху и принудительно переключать обратно
конечно не стоит, ты прав - пусть будет opacity  :)

Отсутствует

 

№457715-08-2012 12:33:11

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

Re: Custom Buttons

okkamas_knife пишет

не понимаю а каков функциональный смысл в вашем копошении с окном редактора на весь экран?

Наверно никакого, но мне вот было интересно  :whistle:

Подсветка синтаксиса - ну первое, что приходит в голову - прицепить туда Orion,
но мне и за год не справиться, да и тебе не подойдёт - нужен Firefox гораздо новее 3.6.28

Могу только попробовать скрытие строк ввода урл, названия, и иконки, ну и, может быть, поиск...

Отсутствует

 

№457815-08-2012 13:17:30

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

okkamas_knife пишет

1 подсветка синтаксиса.(ясен пень это слишком большой гимор потому даже не спрашиваю.)

В новых версиях есть готовый модуль для подсветки синтаксиса, но с ним надо или забыть о всех возможностях текущего редактора, или их все переписать.
Переход к строке с ошибкой из ссылок в консоли точно придется переписать.

okkamas_knife пишет

2 поиск и замена.

Внезапно Ctrl+/, Ctrl+F и Ctrl+H.

Добавлено 15-08-2012 13:22:22
Собственно,
chrome://custombuttons/content/cbeditor.xml#custombuttons-codeeditor

Выделить код

Код:

<handlers>
            <handler event="keypress" keycode="VK_TAB" action="this.handleTabs(event)"/>
            <handler event="keypress" keycode="VK_TAB" action="this.handleTabs(event)" modifiers="shift"/>
            <handler event="keypress" keycode="VK_F3" action="this.findNext(event.shiftKey)"/>
            ...

Отредактировано Infocatcher (15-08-2012 13:22:53)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№457915-08-2012 15:08:55

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

Infocatcher пишет

В новых версиях есть готовый модуль для подсветки синтаксиса, но с ним надо или забыть о всех возможностях текущего редактора, или их все переписать.
Переход к строке с ошибкой из ссылок в консоли точно придется переписать.

А еще отслеживание изменений.

И там для контекстного меню нужно

Выделить код

Код:

<?xul-overlay href="chrome://global/content/editMenuOverlay.xul"?>

<!DOCTYPE dialog [
    <!ENTITY % internaledit SYSTEM "chrome://global/locale/editMenuOverlay.dtd">
    %internaledit;
]>

Вроде, такое программно не воткнуть.
Так что это надо в расширение встраивать.

Но посмотреть все-таки можно: cbOrionEditor.js
Только саморедактирование ведет себя очень странно. И может понадобиться отключение инициализации кнопок, если совсем странно. :)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№458015-08-2012 15:44:23

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

Re: Custom Buttons

Infocatcher,     Ура-а-а !    Orion Editor !!!     Красава !

Отсутствует

 

№458115-08-2012 16:17:48

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

okkamas_knife пишет

на 3.6 и СМ не работает..:(

И не будет. Хотя в SM, возможно, и портируют когда-нибудь.
В любом случае надо много чего изнутри менять и разбираться с API. Чтобы хотя бы встроенные возможности хоткеями вызывались.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№458215-08-2012 18:44:40

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 14.0

Re: Custom Buttons

okkamas_knife пишет

Infocatcher пишет: Но посмотреть все-таки можно: cbOrionEditor.jsна 13 всё ок.на 3.6 и СМ не работает..

на [firefox] 1.5 тоже не работает!!!1


mzfx

Отсутствует

 

№458315-08-2012 18:45:01

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4806
UA: Firefox 3.6

Re: Custom Buttons

Насчет подсветки синтаксиса, есть код JSCSS_Highlight.uc.js который может вам пригодится:

JSCSS_Highlight.uc.js
// ==UserScript==
// @name           JSCSS_Highlight.uc.js
// @description    Syntax Highlight js and css.
// @namespace      http://d.hatena.ne.jp/Griever/
// @author         Griever
// @license        MIT License
// @compatibility  Firefox 10
// @charset        UTF-8
// @include        main
// @version        0.0.1
// @note           
// ==/UserScript==

(function(){

var JS = {};
var CSS = {};
var XML = {};
var BASE = {};


JS.keyword = [
"abstract","boolean","break","byte","case","catch","char","class","const",
"continue","debugger","default","delete","do","double","else","enum","export",
"extends","false","final","finally","float","for","function","goto","if",
"implements","import","in","instanceof","int","interface","long","native","new",
"null","package","private","protected","public","return","short","static",
"super","switch","synchronized","this","throw","throws","transient","true","try",
"typeof","var","void","volatile","while","with",
"let","yield","infinity","NaN","undefined"
];

JS.object = [
"Array","Boolean","Date","Error","EvalError","Function","Number","Object",
"RangeError","ReferenceError","RegExp","String","SyntaxError","TypeError",
"URIError","eval","decodeURI","decodeURIComponent","encodeURI",
"encodeURIComponent","escape","unescape","isFinite","isNaN","parseFloat",
"parseInt"
];

JS.method = [
"addEventListener","removeEventListener","handleEvent","alert","prompt",
"confirm","setTimeout","setInterval","clearTimeout","clearInterval","toString",
"toSource"
];

JS.property = [
"window","document","prototype","callee","caller","event","arguments"
];

JS.hougen = [
"$","jQuery", "opera","chrome", "gBrowser","Components",
"GM_log","GM_addStyle","GM_xmlhttpRequest","GM_openInTab",
"GM_registerMenuCommand","GM_unregisterMenuCommand","GM_enableMenuCommand",
"GM_disableMenuCommand","GM_getResourceText","GM_getResourceURL",
"GM_setValue","GM_getValue","GM_listValues","GM_deleteValue",
"GM_getMetadata","GM_setClipboard","GM_safeHTMLParser","GM_generateUUID"
];

JS.keyword.sort(function(a,b) b.length - a.length);
JS.object.sort(function(a,b) b.length - a.length);
JS.method.sort(function(a,b) b.length - a.length);
JS.property.sort(function(a,b) b.length - a.length);
JS.hougen.sort(function(a,b) b.length - a.length);


CSS.keyword = [
"@import","@charset","@media","@font-face","@page","@namespace","@keyframes",
"(?:\\!important)\\;",
"@-moz-document",
":root",":not","::?before","::?after","::?first-letter","::?first-line",
":link",":visited",":active",":focus",":hover",
":target",":enabled",":disabled",":checked",":default",":empty",
":nth-(?:last-)child",":nth-(?:last-)of-type",":(?:first|last|only)-child",
":(?:first|last|only)-of-type"
];


CSS.property = ['padding','margin','border','background'];
CSS.hougen = [];
var s = getComputedStyle(document.documentElement, null);
for(var i = 0, p; p = s[i]; i++) {
    p[0] === "-" ? CSS.hougen.push(p) : CSS.property.push(p);
}

CSS.colors = [
'aliceblue','antiquewhite','aqua','aquamarine','azure','beige','bisque','black',
'blanchedalmond','blue','blueviolet','brass','brown','burlywood','cadetblue',
'chartreuse','chocolate','coolcopper','copper','coral','cornflower',
'cornflowerblue','cornsilk','crimson','cyan','darkblue','darkbrown','darkcyan',
'darkgoldenrod','darkgray','darkgreen','darkkhaki','darkmagenta',
'darkolivegreen','darkorange','darkorchid','darkred','darksalmon','darkseagreen',
'darkslateblue','darkslategray','darkturquoise','darkviolet','deeppink',
'deepskyblue','dimgray','dodgerblue','feldsper','firebrick','floralwhite',
'forestgreen','fuchsia','gainsboro','ghostwhite','gold','goldenrod','gray',
'green','greenyellow','honeydew','hotpink','indianred','indigo','ivory','khaki',
'lavender','lavenderblush','lawngreen','lemonchiffon','lightblue','lightcoral',
'lightcyan','lightgoldenrodyellow','yellowgreen',

'ActiveBorder','ActiveCaption','AppWorkspace','Background','ButtonFace',
'ButtonHighlight','ButtonShadow','ButtonText','CaptionText','GrayText',
'Highlight','HighlightText','InactiveBorder','InactiveCaption',
'InactiveCaptionText','InfoBackground','InfoText','Menu','MenuText',
'Scrollbar','ThreeDDarkShadow','ThreeDFace','ThreeDHighlight',
'ThreeDLightShadow','ThreeDShadow','Window','WindowFrame','WindowText'
];
CSS.property.sort(function(a,b) b.length - a.length);
CSS.hougen.sort(function(a,b) b.length - a.length);
CSS.colors.sort(function(a,b) b.length - a.length);


JS.keyword_r  = '\\b(?:' + JS.keyword.join('|') + ')\\b';
JS.object_r   = '\\b(?:' + JS.object.join('|') + ')\\b';
JS.method_r   = '\\b(?:' + JS.method.join('|') + ')\\b';
JS.property_r = '\\b(?:' + JS.property.join('|') + ')\\b';
JS.hougen_r   = '\\b(?:' + JS.hougen.join('|') + ')\\b';
JS.regexp_r   = "\\\/\(\(\?\:\\\\\.\|\\\[\(\?\:\\\\\.\|\[\^\\\]\]\)\*\\\]\|\[\^\\\/\\n\]\)\{0\,100\}\)\\\/\(\[gimy\]\*\)";
JS.CDATA_r    = "&lt\\;\\!\\\[CDATA\\\[\[\\s\\S\]\*\?\\\]\\\]&gt\\;";

CSS.keyword_r  = '(?:' + CSS.keyword.join('|') + ')';
CSS.property_r = '\\b(?:' + CSS.property.join('|') + ')\\b';
CSS.colors_r   = '\\b(?:' + CSS.colors.join('|') + ')\\b';
CSS.hougen_r   = '(?:' + CSS.hougen.join('|') + ')\\b';
CSS.url_r      = 'url\\([^)]+\\)';

XML.MComment_r = '&lt\\;!--[\\s\\S]+?--&gt\\;';

BASE.URL_r      = '(?:https?|ftp|file|chrome|data):\\/\\/\\/?[a-z0-9](?:[\\w#$%()=~^@:;?_.,\\/+-]|&amp;)+(?:[\\w#$%=:;?_,\\/+-]|&amp;)';
BASE.BASE64_r   = "data:image/[a-zA-Z-]+\;base64\,[a-zA-Z0-9/+]+={0,2}";
BASE.MComment_r = "\\\/\\\*\[\\s\\S\]\*\?\\\*\\\/";
BASE.SComment_r = "\\\/\\\/\.\*";
BASE.string_r   = '"(?:[^\n\"]|\\.|\\\\n)*\"' + '|' +
                  "'(?:[^\n\']|\\.|\\\\n)*\'"


JS.keyword_s  = 'color:#a09;';
JS.object_s   = 'color:#c15;';
JS.method_s   = 'color:#027;';
JS.property_s = 'color:#06a;';
JS.hougen_s   = 'color:#06a;';
JS.regexp_s   = 'color:#c11;';
JS.CDATA_s    = 'color:#c11;';

CSS.keyword_s  = 'color:#a09;';
CSS.property_s = 'color:#06a;';
CSS.hougen_s   = 'color:#06a;';

XML.MComment_s = 'color:#080;';

BASE.MComment_s = 'color:#080;';
BASE.SComment_s = 'color:#080;';
BASE.string_s   = 'color:#c11;';
BASE.URL_s      = '';
BASE.BASE64_s   = 'color:green;';

JS.R_keyword  = new RegExp(JS.keyword_r);
JS.R_object   = new RegExp(JS.object_r);
JS.R_method   = new RegExp(JS.method_r);
JS.R_property = new RegExp(JS.property_r);
JS.R_hougen   = new RegExp(JS.hougen_r);

CSS.R_keyword  = new RegExp(CSS.keyword_r);
CSS.R_property = new RegExp(CSS.property_r);
CSS.R_colors   = new RegExp(CSS.colors_r);
CSS.R_hougen   = new RegExp(CSS.hougen_r);
CSS.R_url      = new RegExp(CSS.url_r);

BASE.R_URL = new RegExp(BASE.URL_r, "g");
BASE.R_BASE64 = new RegExp(BASE.BASE64_r, "g");

JS.R_ALL = new RegExp([
    BASE.MComment_r
    ,BASE.SComment_r
    ,BASE.string_r
    ,JS.CDATA_r
    ,JS.keyword_r
    ,JS.object_r
    ,JS.method_r
    ,JS.property_r
    ,JS.hougen_r
//    ,JS.regexp_r
].join('|'), "g");

CSS.R_ALL = new RegExp([
    BASE.MComment_r
    ,BASE.string_r
    ,CSS.keyword_r
    ,CSS.property_r
    ,CSS.colors_r
    ,CSS.hougen_r
].join('|'), "g");

XML.R_ALL = new RegExp([
    XML.MComment_r
    ,JS.CDATA_r
    ,BASE.string_r
].join('|'), "g");

BASE.R_ALL = new RegExp([
    BASE.MComment_r
    ,XML.MComment_r
    ,BASE.string_r
    ,CSS.colors_r
].join('|'), 'g');

function parse(aText, type) {
    aText = aText.replace(/\&/g, '&amp;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;');
    if (type == "CSS") aText = CSSParser(aText);
    else if (type == "JS") aText = JSParser(aText);
    else if (type == "XML") aText = XMLParser(aText);
    else aText = EXParset(aText);

    aText = aText.replace(BASE.R_BASE64, '<img src="$&" alt="$&">');
    aText = aText.replace(BASE.R_URL, '<a href="$&" style="'+ BASE.URL_s +'">$&</a>');
    return aText;
}

function JSParser(aText) {
    return aText.replace(JS.R_ALL, function(str, offset, s) {
        if (str.indexOf("//") === 0)
        {
            return '<span style="'+ BASE.SComment_s +'">' + str + '</span>';
        }
        else if (str.indexOf("/*") === 0) {
            return '<span style="'+ BASE.MComment_s +'">' + str + '</span>';
        }
        else if (str.indexOf("'") === 0 || str.indexOf('"') === 0) {
            return '<span style="'+ BASE.string_s +'">' + str + '</span>';
        }
        else if (str.indexOf("/") === 0) {
            return '<span style="'+ JS.regexp_s +'">' + str + '</span>';
        }
        else if (str.indexOf("&lt;![CDATA[") === 0) {
            if (CSS.R_keyword.test(str)) return CSSParser(str);
            return '<span style="'+ JS.CDATA_s +'">' + str + '</span>';
        }
        else if (JS.R_keyword.test(str)) {
            return '<span style="'+ JS.keyword_s +'">' + str + '</span>';
        }
        else if (JS.R_object.test(str)) {
            return '<span style="'+ JS.object_s +'">' + str + '</span>';
        }
        else if (JS.R_method.test(str)) {
            return '<span style="'+ JS.method_s +'">' + str + '</span>';
        }
        else if (JS.R_property.test(str)) {
            return '<span style="'+ JS.property_s +'">' + str + '</span>';
        }
        else if (JS.R_hougen.test(str)) {
            return '<span style="'+ JS.hougen_s +'">' + str + '</span>';
        }
        else {
            return str;
        }
    });
}

function XMLParser(aText) {
    return aText.replace(XML.R_ALL, function(str, offset, s) {
        if (str.indexOf("&lt;!--") === 0) {
            return '<span style="'+ BASE.MComment_s +'">' + str + '</span>';
        }
        else if (str.indexOf("'") === 0 || str.indexOf('"') === 0) {
            return '<span style="'+ BASE.string_s +'">' + str + '</span>';
        }
        else if (str.indexOf("&lt;![CDATA[") === 0) {
            let res = JSParser(str.replace("&lt;![CDATA[", "").replace("]]&gt;", ""));
            return "&lt;![CDATA[" + res + "]]&gt;";
        }
        else {
            return str;
        }
    });
}

function CSSParser(aText) {
    return aText.replace(CSS.R_ALL, function(str, offset, s) {
        if (str.indexOf("/*") === 0) {
            return '<span style="'+ BASE.MComment_s +'">' + str + '</span>';
        }
        else if (str.indexOf("'") === 0 || str.indexOf('"') === 0) {
            return '<span style="'+ BASE.string_s +'">' + str.replace(/\"/g, "&quot;").replace(/\'/g, "&apos;") + '</span>';
        }
        else if (CSS.R_hougen.test(str)) {
            return '<span style="'+ CSS.hougen_s +'">' + str + '</span>';
        }
        else if (CSS.R_colors.test(str)) {
            return '<span style="color:'+ str +';">' + str + '</span>';
        }
        else if (CSS.R_keyword.test(str)) {
            return '<span style="'+ CSS.keyword_s +'">' + str + '</span>';
        }
        else if (CSS.R_property.test(str)) {
            return '<span style="'+ CSS.property_s +'">' + str + '</span>';
        }
        else {
            return str;
        }
    });
}

function EXParset(aText) {
    return aText.replace(BASE.R_ALL, function(str, offset, s) {
        if (str.indexOf("/*") === 0) {
            return '<span style="'+ BASE.MComment_s +'">' + str + '</span>';
        }
        else if (str.indexOf("&lt;!--") === 0) {
            return '<span style="'+ BASE.MComment_s +'">' + str + '</span>';
        }
        else if (str.indexOf("'") === 0 || str.indexOf('"') === 0) {
            return '<span style="'+ BASE.string_s +'">' + str.replace(/\"/g, "&quot;").replace(/\'/g, "&apos;") + '</span>';
        }
        else if (CSS.R_colors.test(str)) {
            return '<span style="color:'+ str +';">' + str + '</span>';
        }
        return str;
    });
}

if (window.JSCSS) {
    window.JSCSS.destroy();
    delete window.JSCSS;
}

var _disabled = true;
window.JSCSS = {
    get disabled () _disabled,
    set disabled (bool) {
        if (_disabled != bool) {
            if (bool) {
                gBrowser.mPanelContainer.removeEventListener("DOMContentLoaded", this, false);
            } else {
                gBrowser.mPanelContainer.addEventListener("DOMContentLoaded", this, false);
            }
        }
        document.getElementById("JSCSS-menuitem").setAttribute("checked", !bool);
        return _disabled = !!bool;
    },
    init: function() {
        var menuitem = document.createElement("menuitem");
        menuitem.setAttribute("id", "JSCSS-menuitem");
        menuitem.setAttribute("label", "JSCSS Highlight");
        menuitem.setAttribute("type", "checkbox");
        menuitem.setAttribute("checked", "true");
        menuitem.setAttribute("autoCheck", "false");
        menuitem.setAttribute("oncommand", "JSCSS.disabled = !JSCSS.disabled;");
        var ins = document.getElementById("devToolsSeparator");
        ins.parentNode.insertBefore(menuitem, ins);

        this.disabled = false;
        window.addEventListener("unload", this, false);
    },
    uninit: function() {
        this.disabled = true;
    },
    destroy: function() {
        this.disabled = true;
        var i = document.getElementById("JSCSS-menuitem");
        if (i) i.parentNode.removeChild(i);
    },
    handleEvent: function(event) {
        switch(event.type){
            case "DOMContentLoaded":
                var doc = event.target;
                if (!/css|javascript|plain/.test(doc.contentType) ||
                    doc.location.protocol === "view-source:"
                ) return;
                this.run(doc, 100000);
                break;
            case "unload":
                this.uninit();
                break;
        }
    },
    write: function(pre) {
        var doc = pre.ownerDocument;
        var { contentType, URL } = doc;
        var type = contentType.indexOf('javascript') >= 0 ? 'JS' :
            contentType.indexOf('css') >= 0 ? 'CSS' :
            contentType === 'text/plain' && /\.(?:xul|xml)$/.test(URL) ? 'XML' :
            /\.(?:js|jsm|jsee)$/i.test(URL) ? 'JS' :
            /\.(?:css)$/i.test(URL) ? 'CSS' :
            'TXT';
        var html = parse(pre.textContent, type);
        var preRange = doc.createRange();
        preRange.selectNodeContents(pre);
        preRange.deleteContents();
       
        var range = doc.createRange();
        range.selectNodeContents(doc.body);
        var df = range.createContextualFragment(html);
        range.detach();
        preRange.insertNode(df);
        preRange.detach();
    },
    run: function(doc, maxLength) {
        var self = this;
        doc || (doc = content.document);
        var pre = doc.getElementsByTagName('pre')[0];
        if (pre.textContent.length > maxLength) {
            var browser = gBrowser.getBrowserForDocument(doc);
            var notificationBox = gBrowser.getNotificationBox(browser);
            var message = "テキストが長すぎます。強調しますか?(フリーズする危険があります)"
            var buttons = [{
                label: "はい",
                accessKey: "Y",
                callback: function (aNotification, aButton) {
                     self.write(pre);
                }
            }];
            notificationBox.appendNotification(
                message, "JSCSS",
                "chrome://browser/skin/Info.png",
                notificationBox.PRIORITY_INFO_MEDIUM,
                buttons);
            return;
        }
        self.write(pre);
    },
};
JSCSS.init();

})();

Отсутствует

 

№458415-08-2012 19:39:55

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

bunda1
Для подсветки синтаксиса в любом случае придется отказаться от используемого сейчас textbox'а, так что проблемы при любом способе раскраски будут принципиально одними и теми же – текущий код, работающий с текстовыми полями, придется переписать.
А раз все равно много чего переделывать, лучше цеплять встроенный модуль, по-моему. Его хоть развивают. И возни поменьше.
Вдобавок этот JSCSS_Highlight.uc.js, кажется, не предусматривает подсветку «на лету».

Добавлено 15-08-2012 19:50:02

iDev.Pi пишет

на [firefox] 1.5 тоже не работает!!!1

Шутки шутками, но если сделать замену let на var и заменить Application.storage на использование

Выделить код

Код:

Components.classes["@mozilla.org/appshell/appShellService;1"]
    .getService(Components.interfaces.nsIAppShellService)
    .hiddenDOMWindow

, cbEditorToggleOnTop.js заработает в 1.5. И, наверное, в 2.0 тоже (там только Application нету).

Так что некоторыми местами у нас очень стабильные API. :)

Отредактировано Infocatcher (15-08-2012 19:50:02)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№458515-08-2012 20:00:51

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4806
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher
Да, понятно.

Помоги пожалуйста с кодом, проблема  в том что сохранят вместо русского текста непонято что: Пример текста > @8<5@ B5:AB0
Я так понимаю что тут проблема с кодировкой. Текст на английском сохранят без проблем.

Выделить код

Код:

function textToEditor(text) {

// путь к файлу ....
var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties). get("ProfD", Components.interfaces.nsIFile); //Profile Directory
file.append("custombuttons");
file.append("Save.txt");//
// ....
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. createInstance(Components.interfaces.nsIFileOutputStream);
foStream.init(file, 0x02|0x08|0x20, 0666, 0);
foStream.write(text, text.length);
foStream.close();
file.launch();
};
textToEditor('Пример текста');

Отредактировано bunda1 (15-08-2012 20:02:47)

Отсутствует

 

№458615-08-2012 20:42:21

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

bunda1
Там перекодировать в UTF-8, например, надо.

https://developer.mozilla.org/en-US/doc … ing_a_File ?


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№458715-08-2012 20:53:33

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4806
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher пишет

bunda1
Там перекодировать в UTF-8, например, надо.

Спасибо, вроде работает:

Выделить код

Код:

function textToEditor(text) {
// перекодировать текст в UTF-8 ....
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
                    .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset = "utf-8" ;
var text = converter.ConvertFromUnicode(text);
// путь к файлу ....
var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties). get("ProfD", Components.interfaces.nsIFile); //Profile Directory
file.append("custombuttons");
file.append("Save.txt");
// ....
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. createInstance(Components.interfaces.nsIFileOutputStream);
foStream.init(file, 0x02|0x08|0x20, 0666, 0);
foStream.write(text, text.length);
foStream.close();
// открыть файл ....
file.launch();
};
textToEditor('Пример текста');

Отредактировано bunda1 (15-08-2012 20:54:45)

Отсутствует

 

№458816-08-2012 01:20:52

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

Session Bookmarks 0.2.0pre32 (2012-08-15)
* Добавлено исправление для bug 682360 - Merge nsILocalFile and nsIFile interfaces
* Оптимизирована отрисовка индикатора позиции перетаскивания

Attributes Inspector 0.6.0pre9 (2012-08-16)
+ Реализован вывод информации об атрибутах во время перетаскивания (drag and drop). К сожалению, никакие сочетания клавиш при этом не работают.
* Оптимизировано обновление всплывающей подсказки при очень частом изменении атрибутов узла под курсором.
x Исправлена индикация копирования в модальных окнах, открытых из окна, в котором был запущен Attributes Inspector.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№458916-08-2012 02:34:01

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

Re: Custom Buttons

okkamas_knife пишет

плюс к этому можно добавить в редакторе скрытие строк ввода урл названия и иконки чтоб увеличить окно редактирования.

Вот примитивная переделка знаменитого watcher'а, посмотри - так подойдёт ?

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EField%20Hiders%20for%20CBEditor%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP////////////9eoP//XqD//16g//9eoP////////////9eoP//XqD/////////////XqD//16g//9eoP//XqD/////////////XqD//16g//9eoP//XqD/////////////XqD//16g/////////////16g//9eoP//XqD//16g/////////////16g//9eoP//XqD//16g/////////////16g//9eoP////////////9eoP//XqD//16g//9eoP///////////////////////16g//9eoP//////////////////////////////////XqD//16g//9eoP//XqD///////////////////////9eoP//XqD//////////////////////////////////16g//9eoP//XqD//16g/////////////16g//9eoP//XqD//16g/////////////16g//9eoP////////////9eoP//XqD//16g//9eoP////////////////////////////9eoP////////////9eoP//XqD/////////////XqD//16g//9eoP//XqD/7c/t////////////////////////XqD/////////////XqD//16g/////////////16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD//16g//9eoP//XqD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20The%20CORE%3A%20http%3A//infocatcher.ucoz.net/js/cb/cbEditorToggleOnTop.js%0A//%20mod%20by%20any%20stupid%20user.%0A%0Avar%20prefs%20%3D%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPrefService%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.getBranch%28%22custombutton.FieldHidersForCBEditor.%22%29%0A%0Atry%20%20%20%20%20%20%7B%20var%20p%20%3D%20prefs.getIntPref%28%22fields%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setIntPref%28%22fields%22%2C%206%29%3B%20%7D%3B%0A%0Aconst%20watcherId%20%3D%20%22FieldHidersForCBEditor%22%3B%0Avar%20watcher%20%3D%20Application.storage.get%28watcherId%2C%20null%29%3B%0Avar%20locale%20%3D%20%28cbu.getPrefs%28%22general.useragent.locale%22%29%20%7C%7C%20%22en%22%29.match%28/%5E%5Cw*/%29%5B0%5D%3B%0A%0Aif%28%21watcher%29%20%7B%0A%09watcher%20%3D%20%7B%20%20%20%20%20%20%0A%09%09%0A%09%09prefs%3A%20prefs%2C%0A%0A%09%09boxId%3A%20%22FieldHidersBox%22%2C%0A%0A%09%09btn1Id%3A%20%22urlFieldHider%22%2C%0A%09%09btn1Icon%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEADRAAAAEAIACoAwAAFgAAACgAAAANAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4KCEP+CghH/goIP/4KCD/+Cgg//goIR/4KCEAAAAAAAAAAAAAAAAAAAAAAAAAAA/4KCJv+goP//goL//4KC//+Cgv//goL//4KC//+jo///goImAAAAAAAAAAAAAAAA/4KCJv+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+CgiYAAAAA/4KCC/+jo///goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//o6P//4KCC/+Cggr/goL//4KC//+Cgv//l5f//4KCIv+Cggr/goIi/5eX//+Cgv//goL//4KC//+Cggr/goIH/4KC//+Cgv//goL//4KCIgAAAAAAAAAAAAAAAP+CgiL/goL//4KC//+Cgv//goIH/4KCB/+Cgv//goL//4KC//+CggwAAAAAAAAAAAAAAAD/goIM/4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goIPAAAAAAAAAAAAAAAA/4KCD/+Cgv//goL//4KC//+Cggf/goIH/4KC//+Cgv//goL//4KCDwAAAAAAAAAAAAAAAP+Cgg//goL//4KC//+Cgv//goIH/4KCB/+Cgv//goL//4KC//+Cgg8AAAAAAAAAAAAAAAD/goIP/4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goIPAAAAAAAAAAAAAAAA/4KCD/+Cgv//goL//4KC//+Cggf/goIK/4KC//+Cgv//goL//4KCEQAAAAAAAAAAAAAAAP+CghH/goL//4KC//+Cgv//goIK/4KCDf+Cgv//goL//4KC//+CghIAAAAAAAAAAAAAAAD/goIS/4KC//+Cgv//goL//4KCDQAAAAD/goIS/4KCFP+CghIAAAAAAAAAAAAAAAAAAAAAAAAAAP+CghL/goIU/4KCEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//isQeA4rEHAGKxBgAisQQAArEEAAKxBBwCsQQcArEEHAKxBBwCsQQcArEEHAKxBBwCsQQcArEGPiKxB//isQQ%3D%3D%22%2C%0A%09%09%09%09%09%09get%20btn1Tip%28%29%20%7B%20if%28locale%20%3D%3D%20%22ru%22%29%20return%20%27%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C/%u0441%u043A%u0440%u044B%u0442%u044C%20%u043F%u043E%u043B%u0435%20%22URL%20%u043A%u043D%u043E%u043F%u043A%u0438%22%27%3B%0A%09%09%09%09%09%09%20%20%20return%20%22Show/hide%20URL%20field%22%3B%0A%09%09%7D%2C%0A%0A%09%09btn2Id%3A%20%22nameFieldHider%22%2C%0A%09%09btn2Icon%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEADRAAAAEAIACoAwAAFgAAACgAAAANAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+CghL/goIU/4KCEgAAAAAAAAAAAAAAAAAAAAAAAAAA/4KCEv+CghT/goISAAAAAP+Cgg3/goL//4KC//+Cgv//goISAAAAAAAAAAAAAAAA/4KCEP+Cgv//goL//4KC//+Cgg3/goIK/4KC//+Cgv//goL//4KCEQAAAAAAAAAAAAAAAP+CgiX/goL//4KC//+Cgv//goIK/4KCB/+Cgv//goL//4KC//+Cgg4AAAAAAAAAAP+CgiP/goL//4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goIKAAAAAP+CgiT/goL//4KC//+Cgv//goL//4KC//+Cggf/goIH/4KC//+Cgv//goL//4KCBv+Cghz/goL//4KC//+Cgv//goL//4KC//+Cgv//goIH/4KCB/+Cgv//goL//4KC//+CgjT/goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KCNP+Cgv//goL//4KC//+Cggf/goIH/4KC//+Cgv//goL//4KC//+Cgv//goL//4KCHP+Cggb/goL//4KC//+Cgv//goIH/4KCB/+Cgv//goL//4KC//+Cgv//goL//4KCJAAAAAD/goIK/4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goL//4KCIwAAAAAAAAAA/4KCDv+Cgv//goL//4KC//+Cggf/goIK/4KC//+Cgv//goL//4KCJQAAAAAAAAAAAAAAAP+CghH/goL//4KC//+Cgv//goIK/4KCDf+Cgv//goL//4KC//+CghAAAAAAAAAAAAAAAAD/goIS/4KC//+Cgv//goL//4KCDQAAAAD/goIS/4KCFP+CghIAAAAAAAAAAAAAAAAAAAAAAAAAAP+CghL/goIU/4KCEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//isQY+IrEEHAKxBBwCsQQYArEEEAKxBAACsQQAArEEAAKxBAACsQQEArEEDAKxBBwCsQQcArEGPiKxB//isQQ%3D%3D%22%2C%0A%09%09%09%09%09%09get%20btn2Tip%28%29%20%7B%20if%28locale%20%3D%3D%20%22ru%22%29%20return%20%27%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C/%u0441%u043A%u0440%u044B%u0442%u044C%20%u043F%u043E%u043B%u0435%20%22%u0418%u043C%u044F%22%27%3B%0A%09%09%09%09%09%09%20%20%20return%20%22Show/hide%20Name%20field%22%3B%0A%09%09%7D%2C%0A%0A%09%09btn3Id%3A%20%22imageFieldHider%22%2C%0A%09%09btn3Icon%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEADRAAAAEAIACoAwAAFgAAACgAAAANAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+CghL/goIU/4KCEgAAAAAAAAAAAAAAAAAAAAAAAAAA/4KCEv+CghT/goISAAAAAP+Cgg3/goL//4KC//+Cgv//goISAAAAAAAAAAAAAAAA/4KCEv+Cgv//goL//4KC//+Cgg3/goIK/4KC//+Cgv//goL//4KCEQAAAAAAAAAAAAAAAP+CghH/goL//4KC//+Cgv//goIK/4KCB/+Cgv//goL//4KC//+Cgg4AAAAAAAAAAAAAAAD/goIO/4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goIKAAAAAP+CghIAAAAA/4KCCv+Cgv//goL//4KC//+Cggf/goIH/4KC//+Cgv//goL//4KCCf+CgiP/goL//4KCI/+Cggn/goL//4KC//+Cgv//goIH/4KCB/+Cgv//goL//4KC//+Cghz/goL//4KC//+Cgv//goIc/4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goI1/4KC//+Cgv//goL//4KCNf+Cgv//goL//4KC//+Cggf/goIH/4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goIH/4KCB/+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KCB/+Cggf/goL//4KC//+Cgv//goL//4KC//+Cgjb/goL//4KC//+Cgv//goL//4KC//+Cggf/goIK/4KC//+Cgv//goL//4KC//+CgiEAAAAA/4KCIf+Cgv//goL//4KC//+Cgv//goIK/4KCDf+Cgv//goL//4KC//+CgiYAAAAAAAAAAAAAAAD/goIm/4KC//+Cgv//goL//4KCDQAAAAD/goIS/4KCE/+CghAAAAAAAAAAAAAAAAAAAAAAAAAAAP+CghD/goIT/4KCEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//isQY+IrEEHAKxBBwCsQQcArEEFAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAgCsQQcArEGPiKxB//isQQ%3D%3D%22%2C%0A%09%09%09%09%09%09%09%09get%20btn3Tip%28%29%20%7B%20if%28locale%20%3D%3D%20%22ru%22%29%20return%20%27%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C/%u0441%u043A%u0440%u044B%u0442%u044C%20%u043F%u043E%u043B%u0435%20%22%u0418%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%22%27%3B%0A%09%09%09%09%09%09%20%20%20return%20%22Show/hide%20Image%20field%22%3B%0A%09%09%7D%2C%0A%0A%09%09REASON_STARTUP%3A%201%2C%0A%09%09REASON_SHUTDOWN%3A%202%2C%0A%09%09REASON_WINDOW_LOADED%3A%203%2C%0A%09%09REASON_WINDOW_CLOSED%3A%204%2C%0A%0A%09%09get%20obs%28%29%20%7B%0A%09%09%09delete%20this.obs%3B%0A%09%09%09return%20this.obs%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIObserverService%29%3B%0A%09%09%7D%2C%0A%09%09get%20ww%28%29%20%7B%0A%09%09%09delete%20this.ww%3B%0A%09%09%09return%20this.ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%09%09%7D%2C%0A%09%09get%20wm%28%29%20%7B%0A%09%09%09delete%20this.wm%3B%0A%09%09%09return%20this.wm%20%3D%20Components.classes%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIWindowMediator%29%3B%0A%09%09%7D%2C%0A%0A%09%09init%3A%20function%28reason%29%20%7B%0A%09%09%09this.obs.addObserver%28this%2C%20%22quit-application-granted%22%2C%20false%29%3B%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%0A%09%09%09%09this.initWindow%28ws.getNext%28%29%2C%20reason%29%3B%0A%09%09%09this.ww.registerNotification%28this%29%3B%0A%09%09%7D%2C%0A%09%09destroy%3A%20function%28reason%29%20%7B%20%20%20%20%0A%09%09%09this.obs.removeObserver%28this%2C%20%22quit-application-granted%22%29%3B%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%0A%09%09%09%09this.destroyWindow%28ws.getNext%28%29%2C%20reason%29%3B%0A%09%09%09this.ww.unregisterNotification%28this%29%3B%0A%09%09%7D%2C%0A%09%09initWindow%3A%20function%28window%2C%20reason%29%20%7B%0A%09%09%09if%28%21this.isTargetWindow%28window%29%29%0A%09%09%09%09return%3B%0A%09%09%09var%20document%20%3D%20window.document%3B%0A%0A%09%09%09var%20box%20%3D%20document.getElementById%28this.boxId%29%3B%0A%09%09%09box%20%26%26%20box.parentNode.removeChild%28box%29%3B%0A%09%09%09box%20%3D%20document.createElement%28%22hbox%22%29%3B%0A%09%09%09box.id%20%3D%20this.boxId%3B%0A%09%09%09%0A%09%09%09var%20spacer%20%3D%20null%3B%0A%09%09%09var%20btnBox%20%3D%20document.documentElement.getButton%28%22accept%22%29.parentNode%3B%0A%09%09%09for%20%28var%20node%20%3D%20btnBox.firstChild%3B%20node%3B%20node%20%3D%20node.nextSibling%29%20%7B%0A%09%09%09%09if%28node.localName%20%3D%3D%20%22spacer%22%29%20%7B%20spacer%20%3D%20node%3B%20break%3B%20%7D%0A%09%09%09%7D%09%09%09%0A%09%09%09%0A%09%09%09var%20btn1%20%3D%20document.createElement%28%22toolbarbutton%22%29%3B%0A%09%09%09btn1.id%20%3D%20this.btn1Id%3B%0A%09%09%09btn1.tooltipText%20%3D%20this.btn1Tip%3B%0A%09%09%09btn1.addEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09btn1.style.listStyleImage%20%3D%20%27url%28%22%27%20+%20this.btn1Icon%20+%20%27%22%29%27%3B%0A%09%09%09%0A%09%09%09var%20btn2%20%3D%20document.createElement%28%22toolbarbutton%22%29%3B%0A%09%09%09btn2.id%20%3D%20this.btn2Id%3B%0A%09%09%09btn2.tooltipText%20%3D%20this.btn2Tip%3B%0A%09%09%09btn2.addEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09btn2.style.listStyleImage%20%3D%20%27url%28%22%27%20+%20this.btn2Icon%20+%20%27%22%29%27%3B%0A%09%09%09%0A%09%09%09var%20btn3%20%3D%20document.createElement%28%22toolbarbutton%22%29%3B%0A%09%09%09btn3.id%20%3D%20this.btn3Id%3B%0A%09%09%09btn3.tooltipText%20%3D%20this.btn3Tip%3B%0A%09%09%09btn3.addEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09btn3.style.listStyleImage%20%3D%20%27url%28%22%27%20+%20this.btn3Icon%20+%20%27%22%29%27%3B%0A%09%09%09%0A%09%09%09box.appendChild%28btn1%29%3B%0A%09%09%09box.appendChild%28btn2%29%3B%0A%09%09%09box.appendChild%28btn3%29%3B%0A%09%09%09%0A%09%09%09btnBox.insertBefore%28box%2C%20spacer.nextSibling%29%3B%0A%09%09%09%0A%09%09%09this.toggleHideUrlField%28btn1%2C%20true%29%3B%0A%09%09%09this.toggleHideNameField%28btn2%2C%20true%29%3B%0A%09%09%09this.toggleHideImageField%28btn3%2C%20true%29%3B%0A%09%09%09%0A%09%09%7D%2C%0A%09%09destroyWindow%3A%20function%28window%2C%20reason%29%20%7B%0A%09%09%09if%28reason%20%3D%3D%20this.REASON_WINDOW_CLOSED%29%0A%09%09%09%09window.removeEventListener%28%22DOMContentLoaded%22%2C%20this%2C%20false%29%3B%20//%20Window%20can%20be%20closed%20before%20DOMContentLoaded%0A%09%09%09if%28%21this.isTargetWindow%28window%29%29%0A%09%09%09%09return%3B%0A%09%09%09var%20document%20%3D%20window.document%3B%0A%09%09%09%0A%09%09%09var%20btn%20%3D%20document.getElementById%28this.btn1Id%29%3B%0A%09%09%09btn.removeEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09document.getElementById%28this.btn2Id%29.removeEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09document.getElementById%28this.btn3Id%29.removeEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09%0A%09%09%09if%28reason%20%3D%3D%20this.REASON_SHUTDOWN%29%20%7B%0A%09%09%09%09let%20box%20%3D%20btn.parentNode%3B%0A%09%09%09%09box.parentNode.removeChild%28box%29%3B%0A%09%09%09%7D%0A%09%09%7D%2C%0A%09%09isTargetWindow%3A%20function%28window%29%20%7B%0A%09%09%09return%20window.location.href.substr%280%2C%2041%29%20%3D%3D%20%22chrome%3A//custombuttons/content/editor.xul%22%3B%0A%09%09%7D%2C%0A%09%09observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%09%09%09if%28topic%20%3D%3D%20%22quit-application-granted%22%29%0A%09%09%09%09this.destroy%28%29%3B%0A%09%09%09else%20if%28topic%20%3D%3D%20%22domwindowopened%22%29%0A%09%09%09%09subject.addEventListener%28%22DOMContentLoaded%22%2C%20this%2C%20false%29%3B%0A%09%09%09else%20if%28topic%20%3D%3D%20%22domwindowclosed%22%29%0A%09%09%09%09this.destroyWindow%28subject%2C%20this.REASON_WINDOW_CLOSED%29%3B%0A%09%09%7D%2C%0A%09%09handleEvent%3A%20function%28e%29%20%7B%0A%09%09%09if%28e.type%20%3D%3D%20%22DOMContentLoaded%22%29%20%7B%0A%09%09%09%09let%20window%20%3D%20e.originalTarget.defaultView%3B%0A%09%09%09%09window.removeEventListener%28%22DOMContentLoaded%22%2C%20this%2C%20false%29%3B%0A%09%09%09%09this.initWindow%28window%2C%20this.REASON_WINDOW_LOADED%29%3B%0A%09%09%09%7D%0A%09%09%09else%20if%28e.type%20%3D%3D%20%22command%22%29%20%7B%0A%0A%09%09%09%09if%20%28e.target.id%20%3D%3D%20this.btn1Id%29%20%7B%0A%09%09%09%09%0A%09%09%09%09%09this.toggleHideUrlField%28e.target%2C%20false%29%3B%0A%09%09%09%09%7D%0A%0A%09%09%09%09if%20%28e.target.id%20%3D%3D%20this.btn2Id%29%20%7B%0A%09%09%09%09%0A%09%09%09%09%09this.toggleHideNameField%28e.target%2C%20false%29%3B%0A%09%09%09%09%7D%0A%0A%09%09%09%09if%20%28e.target.id%20%3D%3D%20this.btn3Id%29%20%7B%0A%09%09%09%09%0A%09%09%09%09%09this.toggleHideImageField%28e.target%2C%20false%29%3B%0A%09%09%09%09%7D%0A%0A%09%09%09%7D%0A%09%09%7D%2C%0A%0A%09%09toggleHideUrlField%3A%20function%28btn%2C%20self%29%20%7B%0A%09%09%09var%20pref%20%3D%20this.prefs.getIntPref%28%22fields%22%29%3B%0A%09%09%09var%20status%20%3D%20%28pref%20%26%201%29%20%3D%3D%201%3B%0A%09%09%09if%20%28self%29%20%7B%20btn.ownerDocument.getElementById%28%22urlfield%22%29.hidden%20%3D%20%21status%3B%0A%09%09%09%09return%3B%20%7D%0A%09%09%09%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%20%7B%0A%09%09%09%09var%20win%20%3D%20ws.getNext%28%29%3B%0A%09%09%09%09if%20%28%21this.isTargetWindow%28win%29%29%20continue%3B%0A%09%09%09%09win.document.getElementById%28%22urlfield%22%29.hidden%20%3D%20status%3B%0A%09%09%09%09%7D%0A%09%09%09if%20%28status%29%20pref%20-%3D%201%3B%0A%09%09%09else%20pref%20+%3D%201%3B%0A%09%09%09this.prefs.setIntPref%28%22fields%22%2C%20pref%29%3B%0A%09%09%7D%2C%0A%0A%09%09toggleHideNameField%3A%20function%28btn%2C%20self%29%20%7B%0A%09%09%09var%20pref%20%3D%20this.prefs.getIntPref%28%22fields%22%29%3B%0A%09%09%09var%20status%20%3D%20%28pref%20%26%202%29%20%3D%3D%202%3B%0A%09%09%09if%20%28self%29%20%7B%20btn.ownerDocument.getElementById%28%22name%22%29.parentNode.hidden%20%3D%20%21status%3B%0A%09%09%09%09return%3B%20%7D%0A%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%20%7B%0A%09%09%09%09var%20win%20%3D%20ws.getNext%28%29%3B%0A%09%09%09%09if%20%28%21this.isTargetWindow%28win%29%29%20continue%3B%0A%09%09%09%09win.document.getElementById%28%22name%22%29.parentNode.hidden%20%3D%20status%3B%0A%09%09%09%09%7D%0A%09%09%09if%20%28status%29%20pref%20-%3D%202%3B%0A%09%09%09else%20pref%20+%3D%202%3B%0A%09%09%09this.prefs.setIntPref%28%22fields%22%2C%20pref%29%3B%0A%0A%09%09%7D%2C%0A%0A%09%09toggleHideImageField%3A%20function%28btn%2C%20self%29%20%7B%0A%09%09%09var%20pref%20%3D%20this.prefs.getIntPref%28%22fields%22%29%3B%0A%09%09%09var%20status%20%3D%20%28pref%20%26%204%29%20%3D%3D%204%3B%0A%09%09%09if%20%28self%29%20%7B%20btn.ownerDocument.getElementById%28%22image%22%29.parentNode.parentNode.hidden%20%3D%20%21status%3B%0A%09%09%09%09return%3B%20%7D%0A%09%09%09%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%20%7B%0A%09%09%09%09var%20win%20%3D%20ws.getNext%28%29%3B%0A%09%09%09%09if%20%28%21this.isTargetWindow%28win%29%29%20continue%3B%0A%09%09%09%09win.document.getElementById%28%22image%22%29.parentNode.parentNode.hidden%20%3D%20status%3B%0A%09%09%09%09%7D%0A%09%09%09if%20%28status%29%20pref%20-%3D%204%3B%0A%09%09%09else%20pref%20+%3D%204%3B%0A%09%09%09this.prefs.setIntPref%28%22fields%22%2C%20pref%29%3B%0A%09%09%7D%0A%09%7D%3B%0A%09Application.storage.set%28watcherId%2C%20watcher%29%3B%0A%09watcher.init%28watcher.REASON_STARTUP%29%3B%0A%7D%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%20%0A%09if%28reason%20%3D%3D%20%22update%22%20%7C%7C%20reason%20%3D%3D%20%22delete%22%29%20%7B%20%0A%09%09watcher.destroy%28watcher.REASON_SHUTDOWN%29%3B%0A%09%09Application.storage.set%28watcherId%2C%20null%29%3B%0A%09%7D%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№459016-08-2012 09:00:38

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

okkamas_knife
Да я думал все-таки сделать для каждой кнопки отдельную тему (там же еще и обсуждение может быть), но что-то лень возиться ради недопроверенных версий. :) Приоритетнее их доделать сначала.

А насчет отдельных тем... Может, раз уж встроенного обновления нет, стоит сделать одну общую тему для обновлений и новых кнопок? И писать туда в духе «добавлена такая-то кнопка, <ссылка>», «обновлена такая-то кнопка, изменения вот такие, <ссылка>».
Или даже две темы – по признаку проверенности и стабильности. Чтобы можно было подписаться отдельно на релизы и экспериментальные версии.

okkamas_knife пишет

чуть погодя добавлю в инструменты. как и орион.

С ним примечание нужно, что с ним не работают старые хоткеи, нет контекстного меню и сломан механизм «а не сохранить ли изменения?».

Отредактировано Infocatcher (16-08-2012 09:07:02)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№459116-08-2012 09:14:02

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 14.0

Re: Custom Buttons

Infocatcher пишет

Attributes Inspector 0.6.0pre9 (2012-08-16)
+ Реализован вывод информации об атрибутах во время перетаскивания (drag and drop). К сожалению, никакие сочетания клавиш при этом не работают.
* Оптимизировано обновление всплывающей подсказки при очень частом изменении атрибутов узла под курсором.
x Исправлена индикация копирования в модальных окнах, открытых из окна, в котором был запущен Attributes Inspector.

Перестала работать, консоль:

Выделить код

Код:

Метка времени: 16.08.2012 13:12:34
Ошибка: SyntaxError: missing ) after argument list
Источник: chrome://custombuttons/content/button.js?windowId=Firefox&id=custombuttons-button0@init
Строка 391, символ 35
Исходный код:
         + "outline-style: " + _b  if(!("setAttributeNS" in node))";"

Отсутствует

 

№459216-08-2012 09:29:27

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

Kamui
Ай, побилось при заливке, сейчас...

Добавлено 16-08-2012 09:31:49
Перезалил.

Добавлено 16-08-2012 09:59:02
Эх, не лезет орион во вкладку:

Выделить код

Код:

Error: SecurityError: The operation is insecure.
Source file: chrome://browser/content/orion.js
Line: 7105

Впрочем, chrome://browser/content/scratchpad.xul тоже во вкладку не лезет. Так что это не проблема способа встраивания.

Отредактировано Infocatcher (16-08-2012 09:59:02)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№459316-08-2012 13:37:19

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4338
UA: Firefox 14.0

Re: Custom Buttons

okkamas_knife
Там же внутри ссылок полно, точно все заменены оказались?
В явном виде же сообщает, что NS_ERROR_FILE_NOT_FOUND.

скрытый текст
resource:///modules/source-editor.jsm

Выделить код

Код:

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource:///modules/source-editor-ui.jsm");
Выделить код

Код:

const SOURCEEDITOR_L10N = "chrome://browser/locale/devtools/sourceeditor.properties";

Потом еще настройка

Выделить код

Код:

const PREF_EDITOR_COMPONENT = "devtools.editor.component";

и файл в соответствии с ней

Выделить код

Код:

Cu.import("resource:///modules/source-editor-" + component + ".jsm", obj);

Может, еще какие-то настройки из devtools.editor.*

resource:///modules/source-editor-orion.jsm =>

Выделить код

Код:

chrome://browser/skin/devtools/orion-container.css

В общем, там надо в коде поискать ссылки на требующиеся модули.


Добавлено 16-08-2012 13:39:15

сделать одну общую тему для обновлений и новых кнопок?

Только тогда не особо понятно, как быть с отдельными темами по кнопкам. Или там истории изменений не будит, или дублировать ее. :/

Отредактировано Infocatcher (16-08-2012 13:39:41)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№459417-08-2012 00:15:21

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 14.0

Re: Custom Buttons

http://forum.mozilla-russia.org/viewtopic.php?pid=418608#p418608
Cookie Manager(Firefox)
открывает окошко со списком сохранённых Cookie

при нажатии открывает окно:
825982.jpg 

а нужно что бы было так:
825985.jpg 

нужно, что бы показывались куки сайта, на котором нахожусь.
как сделать?
спасибо!

Отсутствует

 

№459517-08-2012 01:46:12

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 14.0

Re: Custom Buttons

firepox
у меня именно так и работает


mzfx

Отсутствует

 

№459617-08-2012 02:37:06

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

Re: Custom Buttons

firepox,  пока кто поумней не ответил, предлагаю вот такую несусветную дичь  :lol:

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

Выделить код

Код:

var oSvc = Components.classes["@mozilla.org/observer-service;1"]
           .getService(Components.interfaces.nsIObserverService);
var observer = {
observe: function(subject, topic, data) {
         subject.addEventListener("load", this, false); },
handleEvent: function(e) {
    var doc = e.target;
    var win = doc.defaultView;
    if (doc.location.href != "chrome://browser/content/preferences/cookies.xul") return;
    oSvc.removeObserver(observer, "domwindowopened", false);

  var filter = doc.getElementById("filter");
  filter.value = gBrowser.contentDocument.location.host;
  window.setTimeout(function() {win.gCookiesWindow.filter();}, 250) }};

oSvc.addObserver(observer, "domwindowopened", false);

var wm = Components. classes["@mozilla.org/appshell/window-mediator;1"].
     getService (Components. interfaces. nsIWindowMediator);
var win = wm. getMostRecentWindow ("Browser:Cookies");
if (win) {
    alert("Сначала закройте уже открытое окно с куками");
    oSvc.removeObserver(observer, "domwindowopened", false);
    return; }
else
    openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);

Отредактировано Dumby (17-08-2012 03:48:29)

Отсутствует

 

№459717-08-2012 02:50:55

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 14.0

Re: Custom Buttons

Dumby
826152.jpg 

www подставляется и куков не видно! )
если войти в куки стандартно:

826157.jpg 

то все ок. куки видно.

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

Отредактировано firepox (17-08-2012 02:51:46)

Отсутствует

 

№459817-08-2012 03:24:11

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

Re: Custom Buttons

firepox,  не-не, только не воспринимай мои ответы серьёзно ( чайник я )

Мешает www - уберём ! :lol:  Попробуй так:

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

Выделить код

Код:

var oSvc = Components.classes["@mozilla.org/observer-service;1"]
           .getService(Components.interfaces.nsIObserverService);

var observer = {

observe: function(subject, topic, data) {
         subject.addEventListener("load", this, false); },
      
handleEvent: function(e) {
    var doc = e.target;
    var win = doc.defaultView;
        win.removeEventListener("load", this, false);

    if (doc.location.href != "chrome://browser/content/preferences/cookies.xul") return;

    oSvc.removeObserver(observer, "domwindowopened", false);

  var filter = doc.getElementById("filter");
  filter.value = gBrowser.contentDocument.location.host.replace(/www./, "");
  window.setTimeout(function() {win.gCookiesWindow.filter();}, 250) }};

oSvc.addObserver(observer, "domwindowopened", false);

var wm = Components. classes["@mozilla.org/appshell/window-mediator;1"].
     getService (Components. interfaces. nsIWindowMediator);
var win = wm. getMostRecentWindow ("Browser:Cookies");
if (win) {
    alert("Сначала закройте уже открытое окно с куками");
    oSvc.removeObserver(observer, "domwindowopened", false);
    return; }
else
    openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);

Отредактировано Dumby (17-08-2012 03:46:21)

Отсутствует

 

№459917-08-2012 05:19:28

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 14.0

Re: Custom Buttons

Dumby
уже лучше...
но,
addons.mozilla.org - так показывает стантартно
через кнопку -  mozilla.org
(

Отсутствует

 

№460017-08-2012 10:21:43

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

Re: Custom Buttons

firepox,  что-то никак не могу воспроизвести описанный тобой случай.

Захожу на addons.mozilla.org,
жму на свою поделку,
в поле "Поиск:" - именно addons.mozilla.org

Да и вот специально разрешил им куки устанавливать - не хотят :)

Отредактировано Dumby (17-08-2012 10:22:39)

Отсутствует

 

Board footer

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