SendAbuse классная кнопка.
При добавлении новых строчек и редактирования кнопки, если открыть любой установленный стиль, то кнопка "или Вставить" постоянно дублируется справа.
Перезагрузка убирает дубли кнопки.
и длинные новые строчки я так понял нельзя прописать?
Отредактировано skynet281978 (22-07-2012 01:09:10)
Отсутствует
При добавлении новых строчек и редактирования кнопки, если открыть любой установленный стиль, то кнопка "или Вставить" постоянно дублируется справа.
Перезагрузка убирает дубли кнопки.
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%3EorPaste%20for%20Stylish%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/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//%20%u0411%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043F%u043E%u0432%u0442%u043E%u0440%u043D%u044B%u0439%20%u0437%u0430%u043F%u0443%u0441%u043A%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u043E%u0432%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0430%u043D%u0435%u043B%u0435%u0439%20%u043D%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0438%u0442%u044C%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%20........................%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%20%20%20%20%20if%20%28%20reason%20%3D%3D%20%22update%22%29%20this.removeAttribute%28%22stopRepeat%22%29%3B%0A%7D%3B%0Aif%20%28this.hasAttribute%28%22stopRepeat%22%29%29%20return%3B%20%0A%0A%0Avar%20items%20%3D%20%5B%0A%0A//%20%22%u041D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u0443%u043D%u043A%u0442%u0430%20%u043C%u0435%u043D%u044E%22%2C%0A//%20%22%u0422%u0435%u043A%u0441%u0442%2C%20%u043A%u043E%u0442%u043E%u0440%u044B%u0439%20%u0431%u0443%u0434%u0435%u0442%20%u0432%u0441%u0442%u0430%u0432%u043B%u0435%u043D%22%2C%0A%0A%22%21important%3B%22%2C%0A%22%21important%3B%22%2C%0A%0A%22display%3A%20none%20%21important%3B%22%2C%0A%22display%3A%20none%20%21important%3B%22%2C%0A%0A%22width%3A%20%22%2C%0A%22width%3A%20%22%2C%0A%0A%22height%3A%20%22%2C%0A%22height%3A%20%22%2C%0A%0A%22font-weight%3A%20%22%2C%0A%22font-weight%3A%20%22%2C%0A%0A%5D%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%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.orPasteForStylish.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Afunction%20createButton%28%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20%22or-paste-by-cb%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0438%u043B%u0438%20%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%29%3B%0A%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i%20+%3D%202%29%20%7B%0A%20%20%20%20%20%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20items%5Bi%5D%29%3B%0A%20%20var%20%20commandString%20%3D%20%22insertCodeAtCaret%28%27%22%20+%20items%5Bi+1%5D%20+%20%22%27%29%22%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%20%7D%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20return%20button%3B%20%7D%0A%20%20%20%20%20%20%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20return%3B%0A%0A%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%0A%20%20%20%20hbox.insertBefore%28createButton%28%29%2C%20btn.nextElementSibling%29%3B%20%7D%7D%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//--------------------------------------------------------------------%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7B%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28%29%2C%20btn.nextElementSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28this.off%29%20%7B%20var%20b%20%3D%20doc.getElementById%28%22or-paste-by-cb%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%0Athis.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Areturn%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0A//%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u043C%20%u0444%u043B%u0430%u0433%2C%20%u0447%u0442%u043E%u0431%u044B%20%u0444%u0443%u043D%u043A%u0446%u0438%u0438%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20%u043D%u0435%20%u0438%u0441%u043F%u043E%u043B%u043D%u044F%u043B%u0430%u0441%u044C%20%u0434%u0432%u0430%u0436%u0434%u044B%20%20%0Athis.setAttribute%28%22stopRepeat%22%2C%22true%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Aif%20%28%21this.off%29%20this.image%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.run%28%29%3B%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
Отсутствует
Может, кому пригодится (хотя, наверное, такое добро всё время постят
Кнопка создаёт в контекстном меню подменю с настраиваемыми пользователем вставками.
'use strict'; /******************************************************************************/ // \x01 = selected text. \x02 = clipboard content. var clips = { "mail": "somebody@gmail.com", "link": "<a href='\x02'>\x01</a>", "image": "<img src='\x02'>", "bold": "<span style='font-weight: bold'>\x01</span>", "italic": "<span style='font-style: italic'>\x01</span>", } /******************************************************************************/ var transferService = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); transferService.addDataFlavor("text/unicode"); var clipboardService = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard); /******************************************************************************/ var fxContext = document.getElementById("contentAreaContextMenu"); var insetsMenu = document.createElement('menu'); insetsMenu.setAttribute("label", "Insets"); insetsMenu.setAttribute("class", "menu-iconic"); insetsMenu.setAttribute("image", "data:image/gif;base64,R0lGODlhEAAQANUAAIxje4Rje3tacwAhWjlSeylSjAgxYxA5ayFSjClalCFCazFSe0p7tWuc1hBCexhKhFqMxnOl3gAxYxhKeyFShEJ7tTlrnFqUzlKEtUJjhHu172uczkprjHOl1lJzlJzO/0pje0qMxkqEtVqUxmul1nu156XW/5zW/6Xe/3OEjIyMhP/enLWljOfGlP/WnPfOnN69lIyEe//OnP///8bGxoyMjHt7e8DAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADcALAAAAAAQABAAAAYpQIZwSCwaj8ihy5UsLpvEJ1QonVaNy6w2G916k9dmGMycMsZItHldDAIAOw=="); fxContext.appendChild(insetsMenu); var insetsMenuPopup = document.createElement('menupopup'); insetsMenu.appendChild(insetsMenuPopup); for (let clipName in clips) { let menuitem = document.createElement("menuitem"); menuitem.setAttribute("label", clipName); menuitem.setAttribute("tooltiptext", clips[clipName].replace(/\x01/, "\\x01").replace(/\x02/, "\\x02")); menuitem.addEventListener("click", function(){insetClip(this.label);}, true); insetsMenuPopup.appendChild(menuitem); } /******************************************************************************/ var checkInput = function(){ insetsMenu.hidden = !gContextMenu.onTextInput; } fxContext.addEventListener("popupshowing", checkInput, true); this.onDestroy = function() { fxContext.removeEventListener("popupshowing", checkInput, true); fxContext.removeChild(insetsMenu); } /******************************************************************************/ var insetClip = function(clipName){ if (!gContextMenu.onTextInput) { return; } var inpt = gContextMenu.target; var inset = clips[clipName]; var inptValue = inpt.value; var selStart = inpt.selectionStart; var selEnd = inpt.selectionEnd; var scrollY = inpt.scrollTop; var scrollX = inpt.scrollLeft; if (inset.indexOf("\x01") > -1) { inset = inset.replace(/\x01/g, inptValue.substring(selStart, selEnd)); } if (inset.indexOf("\x02") > -1) { let clipboardString = ""; clipboardService.getData(transferService, clipboardService.kGlobalClipboard); let str = new Object(), strLength = new Object(); try { transferService.getTransferData("text/unicode", str, strLength); if (str) { str = str.value.QueryInterface(Components.interfaces.nsISupportsString); } if (str) { clipboardString = str.data.substring(0, strLength.value / 2); } } catch (ex) {} inset = inset.replace(/\x02/g, clipboardString) } inpt.value = inptValue.substring(0, selStart) + inset + inptValue.substring(selEnd, inptValue.length); inpt.selectionStart = inpt.selectionEnd = selStart + inset.length; inpt.scrollTop = scrollY; inpt.scrollLeft = scrollX; inpt.focus(); } /******************************************************************************/
Потом мы получаем нужные для работы с буфером интерфейсы, создаём меню, задаём условия показа его и сокрытия, задаём деструкторы обработчиков и самого меню на случай переинициализации кнопки (например, при редактировании или пополнении списка вставок). В завершение кода создаём функцию самой вставки.
Отредактировано homo_nudus (23-07-2012 08:58:07)
Отсутствует
bunda1не сработало, также дублирует. Дубль-кнопка добавляется каждый раз при нажатии Ок, независимо о того редактировал её или нет.
Отредактировано skynet281978 (22-07-2012 01:55:23)
Отсутствует
bunda1 а у тебя что не дублирует?
Отсутствует
Выделить кодКод:
// Блокировать повторный запуск функций и обработчиков при открытии настройки панелей но разрешить обновление кнопки ........................ this.onDestroy = function(reason) { if ( reason == "update") this.removeAttribute("stopRepeat"); }; if (this.hasAttribute("stopRepeat")) return; ... // устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды this.setAttribute("stopRepeat","true");
Это все лечение симптомов, а не самой проблемы.
Все равно при правке кнопки будет тот же самый эффект. А так еще и перезапускаться придется.
Так что если уж использовать onDestroy(), то с пользой – чтобы он все подчищал за кодом инициализации.
Например, так:
--- stylishMenu.js +++ stylishMenu-mod.js @@ -1,24 +1,13 @@ -var items = [ +var items = { -// "Название пункта меню", -// "Текст, который будет вставлен", +// "Название пункта меню": "Текст, который будет вставлен", +"!important;": "!important;", +"display: none !important;": "display: none !important;", +"width: ": "width: ", +"height: ": "height: ", +"font-weight: ": "font-weight: " -"!important;", -"!important;", - -"display: none !important;", -"display: none !important;", - -"width: ", -"width: ", - -"height: ", -"height: ", - -"font-weight: ", -"font-weight: ", - -] +}; //==================================================================================== var prefs = Components.classes["@mozilla.org/preferences-service;1"] @@ -42,11 +31,11 @@ var menupopup = document.createElementNS(kXULNS, "menupopup"); button.appendChild(menupopup); -for (var i = 0; i < items.length; i += 2) { +for (var label in items) if (items.hasOwnProperty(label)) { var menuitem = document.createElementNS(kXULNS, "menuitem"); - menuitem.setAttribute("label", items[i]); - var commandString = "insertCodeAtCaret('" + items[i+1] + "')"; + menuitem.setAttribute("label", label); + var commandString = "insertCodeAtCaret(" + JSON.stringify(items[label]) + ")"; menuitem.setAttribute("oncommand", commandString); menupopup.appendChild(menuitem); } @@ -115,3 +104,14 @@ return; } this.run(); + +this.onDestroy = function() { + var on = !this.off; + if(on) + this.off = true; + this.run(); + if(on) { + this.off = false; + prefs.setBoolPref("off", false); + } +};
Плюс более удобный формат настроек и можно записывать строки «как есть».
Добавлено 22-07-2012 02:39:09
Только это несколько криво, лучше переделать архитектуру, чтобы не приходилось с восстановлением настройки возиться.
Отредактировано Infocatcher (22-07-2012 02:39:09)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Всем спасибо за обсуждение кнопки.
Infocatcher, тебе отдельная благодарность за onDestroy, помогает почти всегда,
а если держать её постоянно включённой то, наверное, вообще всегда.
okkamas_knife, специально для тебя, зацени черновик кнопки:
Итак, названия пунктов меню и текст для вставки
записываются, хранятся и редактируются на вкладке "Справка (H)".
Хранятся блоками разделёнными сепаратором.
Сепаратор - это отдельная строка
( указывается в начале кода Инициализаии, у меня по дефолту это
около 86 звёздочек, вроде смотрится... ).
Между сепараторами - блок данных, в котором:
первая строка - название пункта меню
остальное - текст для вставки
На самом деле всё просто, вот она сама на себе:
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%3ECustomPaste%20for%20CustomButtons%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//rq7///////////////////////9eXv////////////9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/////////////////////////////Xl7/////////////Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////+urv//Xl7//15e//9eXv//Xl7/////////////Xl7//15e//9eXv//Xl7/////////////3Nz//9jY/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////9eXv/////////////c3P//2Nj/////////////Xl7//15e//9eXv//Xl7//66u////////////////////////Xl7/////////////////////////////rq7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/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%5Bconst%20theSeparator%20%3D%20%22%5Cn%22%20+%0A%22**************************************************************************************%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%22%3B%0A%0Avar%20items%20%3D%20this.Help.split%28theSeparator%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.imageOn%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//rq7///////////////////////9eXv////////////9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/////////////////////////////Xl7/////////////Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////+urv//Xl7//15e//9eXv//Xl7/////////////Xl7//15e//9eXv//Xl7/////////////3Nz//9jY/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv//Xl7//15e/////////////15e//9eXv////////////9eXv//Xl7//15e//9eXv////////////////////////////9eXv/////////////c3P//2Nj/////////////Xl7//15e//9eXv//Xl7//66u////////////////////////Xl7/////////////////////////////rq7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7//15e//9eXv//Xl7/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.imageOff%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P/JyfD//////////////////////5ub4P///////////5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D///////////////////////////+bm+D///////////+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P///////////5ub4P+bm+D/m5vg/5ub4P///////////////////////////8nJ8P+bm+D/m5vg/5ub4P+bm+D///////////+bm+D/m5vg/5ub4P+bm+D////////////o6Pr/5ub6////////////m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P+bm+D/m5vg////////////m5vg/5ub4P///////////5ub4P+bm+D/m5vg/5ub4P///////////////////////////5ub4P///////////+jo+v/m5vr///////////+bm+D/m5vg/5ub4P+bm+D/ycnw//////////////////////+bm+D////////////////////////////JyfD/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/m5vg/5ub4P+bm+D/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%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.CustomPasteForCuctomButtons.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0A%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Avar%20place%20%3D%20null%3B%0Avar%20part1%20%3D%20%22%22%3B%0Avar%20part2%20%3D%20%22%22%3B%0Avar%20startPos%20%3D%200%3B%0A%0Afunction%20createButton%28aDoc%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.style.fontWeight%3D%20%22bold%22%3B%0A%20%20%20%20%20button.style.color%3D%20%22rgb%280%2C0%2C255%29%22%3B%0A%20%20%20%20%20button.style.maxHeight%3D%20%2220px%22%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20%22custom-paste-for-custom-buttons%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0412%20%u0441%20%u0442%20%u0430%20%u0432%20%u0438%20%u0442%20%u044C%22%29%3B%0A//-------------------------------------------------------------%0A%20%20%20%20%20button.onmouseover%20%3D%20function%28%29%7B%0A%0A%20%20%20%20%20%20%20%20%20%20var%20focusedElement%20%3D%20aDoc.commandDispatcher.focusedElement%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28focusedElement.nodeName%20%21%3D%20%22html%3Atextarea%22%29%20return%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20place%20%3D%20focusedElement%3B%0A%20%20%20%20%20%20%20%20%20%20var%20text%20%3D%20place.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20startPos%20%3D%20place.selectionStart%3B%0A%20%20%20%20%20%20%20%20%20%20var%20%20%20endPos%20%3D%20place.selectionEnd%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20part1%20%3D%20text.substring%280%2C%20startPos%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20part2%20%3D%20text.substring%28endPos%2C%20text.length%29%3B%20%7D%0A//--------------------------------------------------------------%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i++%29%20%7B%0A%20%20%20%20%20%0A%20%20var%20label%20%3D%20items%5Bi%5D.split%28%22%5Cn%22%2C1%29%3B%0A%20%20var%20insertText%20%3D%20items%5Bi%5D.replace%28label%20+%20%22%5Cn%22%2C%20%22%22%29%3B%0A%20%20%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20label%29%3B%0A%20%20%20%20%20%20%20menuitem.insertText%20%3D%20insertText%3B%0A//-------------------------------------------------------------%0A%20%20%20%20%20%20%20menuitem.inserter%20%3D%20function%20inserter%28aText%29%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20place.value%20%3D%20part1%20+%20aText%20+%20part2%3B%0A%20%20%20%20%20%20%20%20%20%20place.selectionStart%20%3D%20place.selectionEnd%20%3D%20startPos%20+%20aText.length%3B%0A%20%20%20%20%20%20%20%20%20%20place.focus%28%29%3B%20%7D%0A//-------------------------------------------------------------%0A%20var%20%20commandString%20%3D%20%22inserter%28event.target.insertText%29%22%3B%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%0A%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20button%3B%20%7D%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20pattern%20%3D%20/chrome%3A%5C/%5C/custombuttons%5C/content%5C/editor.xul/%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%20%28%21RegExp%28pattern%29.test%28doc.location.href%29%29%20return%3B%0A%0Avar%20tabs%20%3D%20doc.getElementsByTagName%28%22tabs%22%29%3B%0A%20%20%20%20tabs%5B0%5D.appendChild%28createButton%28doc%29%29%3B%20%7D%7D%3B%0A%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//--------------------------------------------------------------------%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21RegExp%28pattern%29.test%28doc.location.href%29%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7Bvar%20tbs%20%3D%20doc.getElementsByTagName%28%22tabs%22%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tbs%5B0%5D.appendChild%28createButton%28doc%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28this.off%29%20%7B%20var%20b%20%3D%20doc.getElementById%28%22custom-paste-for-custom-buttons%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%20this.image%20%3D%20this.imageOff%3B%20return%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%20//%20thanks%20for%20Infocatcher%2C%20again%0A%20%20%20%20var%20on%20%3D%20%21this.off%3B%0A%20%20%20%20if%28on%29%20this.off%20%3D%20true%3B%0A%20%20%20%20this.run%28%29%3B%0A%20%20%20%20if%28on%29%20%7B%20this.off%20%3D%20false%3B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20this.imageOff%3B%0Aif%20%28%21this.off%29%20this.image%20%3D%20this.imageOn%3B%0A%0Athis.run%28%29%3B%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.getElementById%28%22%0A.getElementById%28%22%0A**************************************************************************************%0AMulti-Sring-Construction%0AString%2001%3B%0A%20%20%20%20String%2002%3B%0A%20String%2003%3B%0A%0AString%2004%3B%0A**************************************************************************************%0AAny%20Code%20%28bonus%29%0A/*Initialization%20Code*/%0A%0Afunction%20clickTabUpFringe%28event%29%20%7B%20var%20target%20%3D%20event.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20%20pageY%20%3D%20event.pageY%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20if%20%28%28pageY%20%3C9%29%20%26%26%20%28target.className%20%3D%3D%20%27tabbrowser-tab%27%29%29%20%7B%0A%20%20%0A%20%20%20%20%20%20target.click%28%29%3B%20%7D%7D%0A%0Awindow.addEventListener%28%22mousemove%22%2C%20clickTabUpFringe%2C%20true%29%3B%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует
1 плохо что она двоится и троится итд..
Только если открыть второе и более окно.
Добавлено 22-07-2012 22:15:02
Проще всего добавить проверку наличия кнопки перед ее добавлением.
А иначе придется как-то определять, какая из кнопок (в каком окне) должна работать.
Отредактировано Infocatcher (22-07-2012 22:15:02)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
okkamas_knife
1. Это да . Но у меня, если кнопка всегда включена, она не двоится, а у тебя ?
2. Ну дак это же CustomButtons , находишь строчку:
button.setAttribute("label", "В с т а в и т ь"); и меняй как душе угодно
( кстати id через строку наверх )
3. Ты что их вручную набираешь и подсчитываешь ?
Тройной клик на сепараторе, Ctrl+C, курсор в нужную позицию,
Ctrl+V, ENTER - сепаратор готов. ( это всё на вкладке Справка )
Вообще-то, наверное, сепаратор может быть любым
главное - уверенность, что он не повстречается нигде между
ни в названии пунктов, ни в текстах (кодах) для вставки.
Так что - правь под себя как захочешь.
Отсутствует
Насчет двоится. Помогите разобраться. Взял за основу кнопку bunda1 "Очистить поле поиска" (не помню на какой странице). Захотел повесить на кнопку "searchbar-engine-button" по правому клику вызов окна "Поиск по текущему сайту". Если использовать код:
//Вызвать окно поиска по текущему сайту по правому клику на searchbar-engine-button ............... (function() { //........ var searchwindows = function(event) { if (event.button != 2) return; //отключать реакцию по умолчанию event.preventDefault(); event.stopPropagation(); //очистить this. showSearchDialog = function (callback, url) { XML. ignoreProcessingInstructions = false; var dialog = <> <?xml-stylesheet href="chrome://global/skin/"?> <?xml-stylesheet href="resource://gre/res/html.css"?> <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" id="dlg02" title="Поиск на сайте" onload="windowController.init()" ondialogaccept="return windowController.accept();"> <script type="application/x-javascript"> <![CDATA[ var windowController = { init: function () { var stb = document. getElementById ("sitetb"); stb. value = window. arguments [1]; window. sizeToContent (); }, accept: function () { var text = document. getElementById ("texttb"). value; var url = document. getElementById ("sitetb"). value; window. arguments [0] (text, url, true); } }; ]]> </script> <vbox flex="1"> <grid> <columns> <column/> <column flex="1"/> </columns> <rows> <row align="center"> <label value="Текст"/> <textbox id="texttb" flex="1"/> </row> <row align="center"> <label value="Website"/> <textbox id="sitetb" flex="1"/> </row> </rows> </grid> </vbox> </dialog> </>; window. openDialog ("data:application/vnd.mozilla.xul+xml," + dialog. toXMLString (), "", "chrome,dependent,minimizable,resizable=yes,centerscreen,dialog=yes", callback, url); }; this. searchGoogle = function (text, url, encode) { if (encode) { text = escape (convertFromUnicode ("UTF-8", text)); url = encodeURIComponent (url); } var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url; getBrowser (). addTab (searchUrl); }; var focusedWindow = document. commandDispatcher. focusedWindow; var text = focusedWindow. getSelection (). toString (); var doc = getBrowser (). contentDocument; try { var url = doc. location. hostname; } catch(e) { var url = ""; } this. showSearchDialog (this. searchGoogle, url); }; //Объявляем 'searchbar' ... var searchbar = document.getElementById("searchbar"); // добавляем обработчик для кнопки поиска.......... document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-engine-button") .addEventListener("click", searchwindows, false); // устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды this.setAttribute("stopRepeat","true"); }()); // удаление обработчика, при открытии настройки панелей this.onDestroy = function() { removeEventListener("dblclick", NewTabHome, false, gBrowser.mTabContainer); }; //удаление обработчика, при открытии настройки панелей this.onDestroy = function() { removeEventListener("dblclick", TabPin, false, gBrowser.mTabContainer); };
Если использовать вот этот код в отдельно взятой кнопке:
//Вызвать окно поиска по текущему сайту по правому клику на searchbar-engine-button ............... // Блокировать повторный запуск функций и обработчиков при открытии настройки панелей но разрешить обновление кнопки ........................ this.onDestroy = function(reason) { if ( reason == "update") this.removeAttribute("stopRepeat"); }; if (this.hasAttribute("stopRepeat")) return; //........ var searchwindows = function(event) { if (event.button != 2) return; //отключать реакцию по умолчанию event.preventDefault(); event.stopPropagation(); //очистить this. showSearchDialog = function (callback, url) { XML. ignoreProcessingInstructions = false; var dialog = <> <?xml-stylesheet href="chrome://global/skin/"?> <?xml-stylesheet href="resource://gre/res/html.css"?> <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" id="dlg02" title="Поиск на сайте" onload="windowController.init()" ondialogaccept="return windowController.accept();"> <script type="application/x-javascript"> <![CDATA[ var windowController = { init: function () { var stb = document. getElementById ("sitetb"); stb. value = window. arguments [1]; window. sizeToContent (); }, accept: function () { var text = document. getElementById ("texttb"). value; var url = document. getElementById ("sitetb"). value; window. arguments [0] (text, url, true); } }; ]]> </script> <vbox flex="1"> <grid> <columns> <column/> <column flex="1"/> </columns> <rows> <row align="center"> <label value="Текст"/> <textbox id="texttb" flex="1"/> </row> <row align="center"> <label value="Website"/> <textbox id="sitetb" flex="1"/> </row> </rows> </grid> </vbox> </dialog> </>; window. openDialog ("data:application/vnd.mozilla.xul+xml," + dialog. toXMLString (), "", "chrome,dependent,minimizable,resizable=yes,centerscreen,dialog=yes", callback, url); }; this. searchGoogle = function (text, url, encode) { if (encode) { text = escape (convertFromUnicode ("UTF-8", text)); url = encodeURIComponent (url); } var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url; getBrowser (). addTab (searchUrl); }; var focusedWindow = document. commandDispatcher. focusedWindow; var text = focusedWindow. getSelection (). toString (); var doc = getBrowser (). contentDocument; try { var url = doc. location. hostname; } catch(e) { var url = ""; } this. showSearchDialog (this. searchGoogle, url); }; //Объявляем 'searchbar' ... var searchbar = document.getElementById("searchbar"); // добавляем обработчик для кнопки поиска.......... document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-engine-button") .addEventListener("click", searchwindows, false); // устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды this.setAttribute("stopRepeat","true"); // удаление обработчика, при открытии настройки панелей this.onDestroy = function() { removeEventListener("dblclick", NewTabHome, false, gBrowser.mTabContainer); }; //удаление обработчика, при открытии настройки панелей this.onDestroy = function() { removeEventListener("dblclick", TabPin, false, gBrowser.mTabContainer); };
Но тут возникают вопросы:
1. Почему двоится это окно (чисто теоретически).
2. Как сделать первый вариант без удвоения окон.
3. Как сделать, ради интереса, повесить эту функцию на среднюю кнопку "search-go-button" (так как у меня и открывается окно поиска и открывается поиск в новой вкладке поисковика).
Также собрал (если кому интересно) с разных форумов в одну кнопку вариант расширения контекстного меню кнопок (лишнее можно выкинуть).
/*Initialization Code*/ /*Дополнительные пункты в контекстном меню кнопки*/ const cbNamespace = "http://xsms.nm.ru/custombuttons/"; const nsIFilePicker = Ci.nsIFilePicker; const nsILocalFile = Ci.nsILocalFile; function $(aId) { return document.getElementById(aId); } var lastDirectory = { _lastDir: null, get path() { if (!this._lastDir || !this._lastDir.exists()) { try { this._lastDir = cbu.ps.getComplexValue("custombuttons.XML.lastDir", nsILocalFile); if (!this._lastDir.exists()) this._lastDir = null; } catch(e) {} } return this._lastDir; }, set path(aValue) { if (!aValue || !aValue.exists() || !aValue.isDirectory()) return; this._lastDir = aValue.clone(); cbu.ps.setComplexValue("custombuttons.XML.lastDir", nsILocalFile, this._lastDir); } } function saveFile(aFileName, aStrData) { var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); fp.appendFilters(nsIFilePicker.filterXML); fp.init(window, "Export button to XML file", nsIFilePicker.modeSave); fp.defaultString = aFileName; fp.displayDirectory = lastDirectory.path; var res = fp.show(); if (res == nsIFilePicker.returnOK || res == nsIFilePicker.returnReplace) { lastDirectory.path = fp.file.parent.QueryInterface(nsILocalFile); var ostream = Cc["@mozilla.org/network/file-output-stream;1"]. createInstance(Ci.nsIFileOutputStream); ostream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0); var charset = "UTF-8"; var os = Cc["@mozilla.org/intl/converter-output-stream;1"]. createInstance(Ci.nsIConverterOutputStream); os.init(ostream, charset, 4096, 0x0000); os.writeString(aStrData); os.close(); } } function readFile(aFile) { var data = ""; var fstream = Cc["@mozilla.org/network/file-input-stream;1"]. createInstance(Ci.nsIFileInputStream); fstream.init(aFile, -1, 0, 0); var charset = "UTF-8"; const replacementChar = Ci.nsIConverterInputStream .DEFAULT_REPLACEMENT_CHARACTER; var is = Cc["@mozilla.org/intl/converter-input-stream;1"]. createInstance(Ci.nsIConverterInputStream); is.init(fstream, charset, 1024, replacementChar); var str = {}; while (is.readString(4096, str) != 0) { data += str.value; } is.close(); return data; } function stringToDOM(aString) { // https://developer.mozilla.org/en/Parsing_and_serializing_XML var parser = new DOMParser(); var dom = parser.parseFromString(aString, "text/xml"); if (dom.documentElement.nodeName == "parsererror") { return null; } else { return dom; } } function importXMLtoButton(aStrXMLData) { loadURI("custombutton://" + escape(aStrXMLData)); } function getCBOverlay() { var dirsvc = Cc["@mozilla.org/file/directory_service;1"]. getService(Ci.nsIProperties); var file = dirsvc.get("ProfD", Ci.nsIFile); file.append("custombuttons"); file.append("backup"); file.append("buttonsoverlay.xul.bak"); return file; } this.viewCBOverlay = function viewCBOverlay() { var fileURL = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService).getProtocolHandler("file"). QueryInterface(Ci.nsIFileProtocolHandler). getURLSpecFromFile(getCBOverlay()); gBrowser.selectedTab = gBrowser.addTab("view-source:" + fileURL); } this.importFromCBOverlay = function importFromCBOverlay(aTitle) { var id = custombuttons.promptBox(aTitle, "Введитете номер id кнопки:"); if (!id[1] || id[1] == "") return; id = "custombuttons-button" + id[1]; var dom = stringToDOM(readFile(getCBOverlay())); var button = dom.getElementById(id); if (!button) { custombuttons.alertBox(aTitle, "Копка Id " + id + " не найдена!"); return; } var cbName = button.getAttribute("cb-name") || button.getAttribute("label"); var cbImage = button.getAttribute("image") || button.getAttribute("cb-stdicon") || ""; var cbMode = button.getAttribute("mode") || ""; var cbInitCode = button.getAttribute("cb-init"); var cbCode = button.getAttribute("cb-oncommand"); var cbKey = button.getAttribute("accelkey") || ""; var cbHelp = button.getAttribute("Help") || ""; var cbAttr = button.getAttribute("attributes"); var cbXML = <custombutton xmlns:cb={cbNamespace}> <name>{cbName}</name> <image>{cbImage}</image> <mode>{cbMode}</mode> <initcode>{cbInitCode}</initcode> <code>{cbCode}</code> <accelkey>{cbKey}</accelkey> <help>{cbHelp}</help> <attributes>{cbAttr}</attributes> </custombutton>; var xml = "<?xml version='1.0' encoding='UTF-8'?>" + cbXML.toString(); //inspectDOMDocument(stringToDOM(xml)); importXMLtoButton(xml); } this.checkDocumentForCBXML = function checkDocumentForCBXML(aDocument) { if (((aDocument.contentType == "text/xml") || (aDocument.contentType == "application/xml"))&& (aDocument.documentElement.localName == "custombutton")) { var serializer = new XMLSerializer(); var xml = serializer.serializeToString(aDocument); importXMLtoButton(xml); } else { this.loadXML(); } } this.saveXML = function saveXML(aStrURI) { var cbURI = (aStrURI != undefined) ? aStrURI : readFromClipboard(); if (!cbURI || !/^custombutton\:\/\//.test(cbURI)) { custombuttons.uChelpButton(this); return; } var cbXML = cbURI.replace(/^custombutton\:\/\//, ""); var decodeXML = unescape(cbXML); var btnName = decodeXML.match(/\<name\/?.+/).toString(); var name = "untitled"; if (!/\<name\/\>/.test(btnName)) { name = btnName.replace(/\<\/?\w+\>/g, "").toString(); } var image = decodeXML.match(/\<image\/?.+/).toString(); var icon = ""; if (!/\<\image.*\[\].*\>$/.test(image)) { icon = image.match(/[^\[\]]+/g)[2].toString() .replace(/custombuttons\-stdicon\-\d/, "").toString(); } var xmlTemplate = "custombuttons/\"\n\ xmlns:html=\"http://www.w3.org/1999/xhtml\">\n\ <html:head>\n\ <html:title><![CDATA[" + name + "]]></html:title>\n\ <html:link rel=\"shortcut icon\" href=\"" + icon + "\"/>\n\ <html:style type=\"text/css\"><![CDATA[\n\ body { font-size: medium; margin: 0; }\n\ body, code:before, help:before, initcode:before {\n\ font-family: \"Verdana\", sans-serif;\n\ }\n\ #wrapper { position: fixed; top: 1em; right: 1em; text-align: center; }\n\ p { font-size: small; text-align: center; }\n\ #button {\n\ background-color: rgb(85, 168, 2);\n\ background-image: linear-gradient(to bottom, rgb(147, 200, 94),\ rgb(85, 168, 2));\n\ background-image: -moz-linear-gradient(top, rgb(147, 200, 94),\ rgb(85, 168, 2));\n\ background-image: -o-linear-gradient(top, rgb(147, 200, 94),\ rgb(85, 168, 2));\n\ background-image: -webkit-linear-gradient(top, rgb(147, 200, 94),\ rgb(85, 168, 2));\n\ border: 1px solid rgb(58, 116, 4);\n\ border-radius: .5em;\n\ -moz-border-radius: .5em;\n\ -webkit-border-radius: .5em;\n\ padding: 0;\n\ margin-bottom: 1em;\n\ box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\ -moz-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\ -o-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\ -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, .25);\n\ }\n\ #button a {\n\ color: #000;\n\ text-shadow: -1pt -1px 0pt rgba(255, 255, 255, .5);\n\ padding: 1em;\n\ text-decoration: none;\n\ }\n\ :-moz-any-link:focus {\n\ color: white;\n\ outline-color: transparent;\n\ text-decoration: none;\n\ }\n\ #button a, code, code:before, initcode, initcode:before, help, help:before {\ \n display: block;\n\ }\n\ #credits { position: fixed; bottom: 1em; right: 1em; font-size: small; }\n\ custombutton { background-color: rgb(171, 171, 171); margin: 1em; }\n\ date, image, mode, accelkey { display: none; }\n\ name { font-weight: bold; font-size: x-large; }\n\ code:before, help:before, initcode:before {\n\ font-weight: bold;\n\ font-size: large;\n\ margin: 0 0 1em;\n\ padding: .5em;\n\ }\n\ code:before { content: \"CODE\"; }\n\ help:before { content: \"Help\"; }\n\ initcode:before { content: \"Initialization Code\"; }\n\ code, initcode, help {\n\ background-color: rgb(255, 255, 255);\n\ border: 1px inset rgb(170, 170, 170);\n\ font: medium monospace;\n\ margin: 1em 1em 2em 0;\n\ padding: 1em;\n\ text-align: left;\n\ width: 840px;\n\ white-space: pre-wrap;\n\ word-wrap: break-word;\n\ }\n\ .clear { clear: both; }\n\ ]]></html:style>\n\ </html:head>\n\ <html:body>\n\ <html:div id=\"wrapper\">\n\ <html:div id=\"button\">\n\ <html:a href=\"" + cbURI + "\" rel=\"nofollow\" title=\"Установить " + name +"\">\n\ <![CDATA[Install this button]]>\n\ </html:a>\n\ </html:div>\n\ <html:a href=\"https://addons.mozilla.org/addon/custom-buttons/\ ?src=external-custombuttons-xml\">\n\ <![CDATA[What's this?]]>\n\ </html:a>\n\ <html:div id=\"credits\">\n\ <html:a href=\"" + topicURL +"\">\n\ <![CDATA[Custom Buttons XML]]><html:br/>\ <![CDATA[Exporter/Importer]]>\n\ </html:a>\n\ </html:div>\n\ </html:div>\n\ </html:body>"; // Inspect unformatted XML as DOM, for debugging only //inspectDOMDocument(stringToDOM(decodeXML)); return; decodeXML = decodeXML.replace(/custombuttons\/\"\>/, xmlTemplate); // Inspect formatted XML as DOM, for debugging only //inspectDOMDocument(stringToDOM(decodeXML)); return; name += ".xml"; saveFile(name, decodeXML); } this.loadXML = function loadXML() { var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); fp.init(window, "Импорт из XML файла и установить как новую кнопку", nsIFilePicker.modeOpen); fp.appendFilters(nsIFilePicker.filterXML); fp.appendFilter("All Files", "*.*"); fp.displayDirectory = lastDirectory.path; if (fp.show() == nsIFilePicker.returnOK) { if (fp.file && fp.file.exists()) { lastDirectory.path = fp.file.parent.QueryInterface(nsILocalFile); } } else { return; } var xmlData = readFile(fp.file); var xmlDOM = stringToDOM(xmlData).documentElement; if (!xmlDOM) { //Application.console.log(xmlDOM); custombuttons.alertBox("Импорт не удачный", "Не XML файл!"); return; } if ((xmlDOM.localName == "custombutton") && ((xmlDOM.getAttribute("xmlns:cb") == cbNamespace) || (xmlDOM.getAttribute("xmlns") == cbNamespace))) { importXMLtoButton(xmlData); } else { custombuttons.alertBox("Импорт не удачный", "XML не содержит Custom Buttons!"); } } this.clipboard = ""; this.copyImageURI = function copyImageURI() { var btn = document.popupNode; if (!btn) return; cbu.gClipboard.write(btn.image); custombuttons.alertSlide(btn.name, "Изображение кнопки скопировано в буфер обмена"); } this.copyToHTMLCode = function copyToHTMLCode() { var btn = document.popupNode; if (!btn) return; var code = "<p><div id=\"install\" style=\"background: transparent -moz-linear-gradient(center top , rgb(224, 102, 255) 30%, rgb(125, 38, 205) 55%); text-shadow: 0pt -1px 0pt rgb(122, 55, 139); border: 1px outset rgb(85, 26, 139); border-radius: 1em; padding: 0; width: 240px; text-align: center;\"><a href=\"" + btn.URI + "\" style=\"display: block; padding: 1em; color: #ffffff; text-decoration: none;\" title=\"Click here to install " + btn.name + "\" rel=\"nofollow\"><img src=\"" + btn.image + "\" alt=\"" + btn.name + "\" style=\"vertical-align: middle; float: left;\"/>" + btn.name + "</a></div></p>"; cbu.gClipboard.write(code); custombuttons.alertSlide(btn.name, "HTML кнопки скопировано в буфер обмена"); } this.copyToBBCode = function copyToBBCode() { var btn = document.popupNode; if (!btn) return; var code = "[url=" + btn.URI + "][B]" + btn.name + "[/B][/url]"; cbu.gClipboard.write(code); //.toXMLString()); custombuttons.alertSlide(btn.name, "BBCode кнопки скопировано в буфер обмена"); } this.saveImageURI = function saveImageURI() { var btn = document.popupNode; if (!btn) return; if (btn.image != "") saveImageURL(btn.image, btn.name); else custombuttons.alertBox("Эта кнопка не имееет изображения!"); } this.copyButtonsCodeText = function copyButtonsCodeText() { var btn = document.popupNode; if (!btn) return; var code = ((btn.cbCommand == "") || (btn.Command == "/*CODE*/")) ? "" : ("\n/*CODE*/\n" + btn.cbCommand + "\n"); var init = ((btn.cbInitCode == "") || (btn.cbInitCode == "/*Initialization Code*/")) ? "" : ("\n/*Initialization Code*/\n" + btn.cbInitCode); cbu.gClipboard.write(code + init); custombuttons.alertSlide(btn.name, "Code + INIT Code copied to Clipboard"); } this.saveToHTMLCode = function saveToHTMLCode() { var btn = document.popupNode; var xml = <html xmlns={xhtmlns}> <head> <title>{btn.name + ' for Custom Buttons'}</title> <link rel='icon' type='image/vnd.microsoft.icon' href={btn.image}/> <style type='text/css'><![CDATA[pre { border: 1px solid #aaa; }]]></style> </head> <body> <section id='install'><h1>{btn.name}</h1><a href={btn.URI}>Install</a></section> <section id='init'><h2>Initialization Code</h2><pre>{btn.cbInitCode}</pre></section> <section id='code'><h2>Code</h2><pre>{btn.cbCommand}</pre></section> <section id='help'><h2>Help</h2><pre>{btn.Help}</pre></section> </body> </html>; var html = '<!DOCTYPE html>\n' + xml.toXMLString(); var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker); var stream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream); fp.appendFilters(fp.filterHTML); fp.defaultExtension = 'htm'; fp.init(window, 'Сохранить как HTML', 1); fp.defaultString = btn.name + ' ' + aDate(); if(fp.show() != fp.returnCancel) { if(fp.file.exists()) fp.file.remove(true); fp.file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666); stream.init(fp.file, 0x02, 0x200, false); var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream); converter.init(stream, "windows-1251", 0, 0); converter.writeString(html); converter.close(); } custombuttons.alertSlide("Кнопка: " + btn.name, "сохранена"); } var Cc = Components.classes, Ci = Components.interfaces; var mrw = mostRecentWindow('navigator:browser'); var css = '@-moz-document url("chrome://browser/content/browser.xul"){' + this.Help + '}'; var uri = makeURI('data:text/css,' + encodeURIComponent(css)); var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); if (!sss.sheetRegistered(uri, sss.USER_SHEET)) sss.loadAndRegisterSheet(uri, sss.USER_SHEET); this.idMIonclick = function idMIonclick() { var btn = document.popupNode.id; var box = custombuttons.confirmBox("Копировать в буфер", btn, "Да", "Нет"); if (box) { custombuttons.cbService.writeToClipboard(btn); custombuttons.alertSlide(btn, "Скопирована в буфер"); } } function mostRecentWindow(windowType) { return Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getMostRecentWindow(windowType); } function aDate() { var date = new Date(), tds = date.toDateString(); if(tds.indexOf('May') != -1) var dStr = tds.substring(4, 7) + ' ' + tds.substring(8, 10) + ', ' + tds.substring(11, 15); else var dStr = tds.substring(4, 7) + '. ' + tds.substring(8, 10) + ', ' + tds.substring(11, 15); var tts = date.toTimeString(), tStr = tts.substring(0, 8); return dStr + ' ' + tStr.replace(/:/g, ''); } ///////////////////////////////////////////////////////////////////////////// /////////////////////////////// Context menus /////////////////////////////// ///////////////////////////////////////////////////////////////////////////// function addMenuItem(aNewIDs, aNodeIDs, aLabel, aIcon, aCommand) { for (var i = 0; i < aNewIDs.length; i++) { // Remove previously created menuitems if any if ($(aNewIDs[i])) $(aNewIDs[i]).parentNode.removeChild($(aNewIDs[i])); // Added 'Export to XML' menuitem to CB contextmenu let mi = cbu.makeXML(<menuitem xmlns={xulns} id={aNewIDs[i]} class="menuitem-iconic" image={aIcon} label={aLabel} oncommand={aCommand}/>); if (i == 0) mi.setAttribute("observes", "custombuttons-contextbroadcaster-primary"); if ($(aNodeIDs[i])) { if ($(aNodeIDs[i]).nextSibling) { $(aNodeIDs[i]).parentNode.insertBefore(mi, $(aNodeIDs[i]).nextSibling); } else { $(aNodeIDs[i]).parentNode.appendChild(mi); } } } } var loadImg = "data:image/x-icon;base64,\ AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAA\ AAAAAAD///8B////Af///wH///8B////AQAAAB+yg2l71ZRt+daTa//Wk2v/1pNr/9aTa//Wk2v/\ v4NlywYEAycAAAAX////Af///wH///8B////Af///wHdo4M53Zx3/+Sgef/innb/4p52/+Kedv/l\ o3r/5aR6/+mqgfvPj27N////Af///wH///8B////Af///wH///8B4KSD8+mmff/opH3/56N6/+Wh\ ef/no3r/66qB/8KBXf/Fg1//0Y5s78+Pbqn///8B////Af///wH///8B////AeGlg//trIX/7ayE\ /+6thP/urIX/9bWL/8eFYf/GhF//yYZh/9SPa/nkn3j/////Af///wH///8B////Af///wHkn3j/\ 76+G/+6uh//vrob/76+G//W3jP/GhF//y4di/9ONZ//XkWr/5J94/////wH///8B////Af///wH/\ //8B5J94/++wif/wsIj/8LGJ//CxiP/0toz/y4di/8+KZf/vroP/766D/+SfeP////8B////Af//\ /wH///8B////AeSfeP/xs4v/8bOL//Cziv/ws4v/87WL/9CNa+3QjWvt3p96/96fev/en3r/////\ Af///wH///8B////Af///wHkn3j/8rWN//K2jf/ytY3/8rWN//O2jvfdo4Lj0I5sJdCObCXQjmwl\ 0I5sJf///wH///8B////Af///wH///8B5J94//O3j//zuI//87iP//O4j//zuZDx3aOD7////wH/\ //8B////Af///wHdo4M/5J94/+SfeP/kn3j/5J94/++2j//zupH/9LqR//O6kv/0upL/87qR/+Sf\ eP/kn3j/5J94/+SfeP////8B////Af///wHkoXr/9cCY//W8k//0vJT/9L2T//S8lP/0vZT/9LyU\ //S8lP/1vJT/9cCY/+Shev////8B////Af///wH///8B9b+WC+SjfP/2yqP/9b+W//a/lf/2v5X/\ 9b6V//W+lv/1vpX/9sqj/+SjfP////8B////Af///wH///8B////Af///wH2wZgX5aZ+//fTrP/2\ wJj/9sCY//bAmP/2wZj/99Os/+Smf/////8B////Af///wH///8B////Af///wH///8B////Af//\ /wHkqYH/99ax//fCmv/3wpn/99aw/+Sogf////8B////Af///wH///8B////Af///wH///8B////\ Af///wH///8B////AeWrhP/317L/99ey/+WrhP////8B////Af///wH///8B////Af///wH///8B\ ////Af///wH///8B////Af///wH///8B5a2F/+Wthf////8B////Af///wH///8B////Af///wH/\ //8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\ //8AAP//AAD//w=="; var saveImg = "data:image/x-icon;base64,\ AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAA\ AAAAAAD///8B////Af///wH///8BAAAAHQAAACUXaE1dE55y/xOecv8XaE1dAAAAJQAAAB3///8B\ ////Af///wH///8B////Af///wH///8B////Af///wEmrX85F6J2/xHEj/8RxI//GKF2/yatfzn/\ //8B////Af///wH///8B////Af///wH///8B////Af///wEmrX85Hqd6/xHHkv8Rx5L/EceS/xHH\ kv8ep3r/Jq1/Of///wH///8B////Af///wH///8B////Af///wEhs4RJJq1//xHHkv8Rx5L/EceS\ /xHHkv8Rx5L/EciT/yatgP8mrX85////Af///wH///8B////Af///wEjsYJBLLKE/xHNlv8RyJP/\ EciT/xHIk/8RyJP/EciT/xHKlf8Rzpn/LLOE/yatfzn///8B////Af///wEmrX85MbaH/xTcqP8V\ 3qv/Fd2q/xHKlf8RypX/EcqV/xHKlf8W4a7/Fd6r/xTZpf8xtof/Jq1/Of///wEmrX1pMbaH/zG3\ iP8xt4j/MbeI/xfWov8RzJj/EcyY/xHMmP8RzJj/H8SR/zG3iP8xt4j/MbeI/zG2h/8mrX85////\ Af///wH///8B////Af///wEuuov/Ec+a/xHPmv8Rz5r/FNCc/xbUoPEisH7v////Af///wH///8B\ ////Af///wH///8B////Af///wH///8BLrqL/xHTnv8R057/EdOe/xXUoP8a2KT3H7J/4ymaaSUp\ mmklKZppJSmaaSX///8B////Af///wH///8B////AS66i/8R1aH/EdWh/xHVof8U1qL/Idyp/ySh\ b+0koW/tJKJw6ySlc+0noG/5////Af///wH///8B////Af///wEuuov/Edej/xHXo/8R16P/Edej\ /yzgsP8ZsH//GrOB/xm6hv8ZwI3/JqFw6////wH///8B////Af///wH///8BLrqL/xHapf8R2qX/\ Edql/xHapf895bf/KbCC/yCpef8gsH7/Hb6M/yidbNP///8B////Af///wH///8B////ASPNmv8Y\ 3ar/Edyn/xHcp/8V3aj/VerA/1DNpP8moHH/JqJz/yG7ifsvv5L/////Af///wH///8B////Af//\ /wEizJn1b+/J/2nux/9k7cX/b+/J/3Dvyf9r7cb/MJ9x/yype/8jt4XzL7+S/////wH///8B////\ Af///wH///8BFL+KOTjWp/9B6Lv/Oea4/zjmuP9G6Lz/WuzD/1rcs/9B0aT7L7+S/////wH///8B\ ////Af///wH///8B////Af///wEXwo5lFMWQzxPFkNUTxZDZE8WQ0xXEkNcmxJPVQsie/////wH/\ //8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\ //8AAP//AAD//w=="; var saveImg1 = "data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA=="; var saveImg2 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAADbAAADpcAAA//AAANVwAAD/8AAAKsAAAD/AAAP//AAAP8AAAD/AAAD/8AAAwDAAAP/wAAA/wAAAP8AAA"; var saveImg3 = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEH4j6xB8IesQeHDrEHD4axBh/CsQYf4rEGH8KxBw+GsQeHDrEHwh6xB+I+sQf//rEH//6xB//+sQQ=="; var saveImg4 = "data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAA/wAAAP8AAA"; var saveImg5 = "data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w=="; var saveImg6 = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKklEQVR42mNkQAMNDAxCQMoTiB2BWAEq/ACI9wPxdqD8O2T1jGia" + "o4HUEgb8IAaobimGAUDBGiDVzEAcqAWqb4EbQKTNWF3CCPXzW5ho/f//YDqHkZFhCpQNA7lAMV4gzY4QEmZEtx1mgCtQ8W4o2xLI" + "Pg5lJwDZUghDYkAGzAEyktENMAQqPA9l6wDZEkB6D6Yhc0EG7AGynfEZYAxkawHpxVC+A5CvC6RFGBj2Em2AIZCeg8Q3BtLSUAMI" + "egGkwQBIz8U0YC7OQEQ2wAjIPoekGRQTUC/E4IxGkMKzaNEI8jso4chDbGdgA0UjekJ6A8S3gRikFWQyKOF/higGR50UFLPBEhLM" + "9AZoUv4F1cAA1QTi/2SAJFkQnxdCoyZlJEPIz0xIhpCUnQFx83abgfUZOQAAAABJRU5ErkJggg=="; // Add 'Export to XML' menuitem to CB contextmenu let cIDs = ["custombuttons-contextpopup-exportXML", "custombuttons-contextpopup-exportXML-sub"]; let bIDs = ["custombuttons-contextpopup-bookmarkButton", "custombuttons-contextpopup-bookmarkButton-sub"]; addMenuItem(cIDs, bIDs, "Экспорт в XML", saveImg, "document.getElementById('" + this.id + "').saveXML(('triggerNode' in this.parentNode) " + "? this.parentNode.triggerNode.URI " + ": document.popupNode.URI);"); let fIDs = ["custombuttons-contextpopup-copyImageURI", "custombuttons-contextpopup-copyImageURI-sub"]; let b2IDs = ["custombuttons-contextpopup-copyURI", "custombuttons-contextpopup-copyURI-sub"]; addMenuItem(fIDs, b2IDs, "Копировать изображение кнопки в формате base64", saveImg1, "document.getElementById('" + this.id + "').copyImageURI();"); let f1IDs = ["custombuttons-contextpopup-saveButtonImage", "custombuttons-contextpopup-saveButtonImage-sub"]; addMenuItem(f1IDs, bIDs, "Сохранить изображение кнопки", saveImg1, "document.getElementById('" + this.id + "').saveImageURI();"); let f2IDs = ["custombuttons-contextpopup-copyButtonsCodeText", "custombuttons-contextpopup-copyButtonsCodeText-sub"]; addMenuItem(f2IDs, b2IDs, "Копировать код кнопки как текст", saveImg2, "document.getElementById('" + this.id + "').copyButtonsCodeText();"); let f3IDs = ["custombuttons-contextpopup-copyAsHTML", "custombuttons-contextpopup-copyAsHTML-sub"]; addMenuItem(f3IDs, b2IDs, "Копировать код кнопки как HTML ссылку", saveImg3, "document.getElementById('" + this.id + "').copyToHTMLCode();"); let f4Ds = ["custombuttons-contextpopup-copyToBBCode", "custombuttons-contextpopup-copyToBBCode-sub"]; addMenuItem(f4Ds, b2IDs, "Копировать код кнопки как BBcode сылку", saveImg4, "document.getElementById('" + this.id + "').copyToBBCode();"); let f5Ds = ["custombuttons-contextpopup-saveAsHTML", "custombuttons-contextpopup-saveAsHTML-sub"]; addMenuItem(f5Ds, bIDs, "Сохранить код кнопки как HTML файл", saveImg5, "document.getElementById('" + this.id + "').saveToHTMLCode();"); let f6Ds = ["custombuttons-contextpopup-getButtonId", "custombuttons-contextpopup-getButtonId-sub"]; let b1IDs = ["custombuttons-contextpopup-remove", "custombuttons-contextpopup-remove-sub"]; addMenuItem(f6Ds, b1IDs, "Показать Id кнопки", saveImg6, "document.getElementById('" + this.id + "').idMIonclick(content.document);"); var iconADD = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADg0lEQVR42l2Tf0wbZRjHv29717vrD7rKaMUx3MrAiib+KGKI6bK4TZ0hujlYNCFsiYgZxLgshLmEzA11Ya6wwEaiZEV+bMwYTMxmlikbE0RnJtERtGhNmcDWDRi0Be6u7fVar2cg0yd5k/eP5/N9n+/zvA/B/6Kurv5xSZYrzWbzZo5j1snxBJkLLf49ey90VZLjbZ1tTSP355PlS21tLWMwmhvtdvveAueTmowMEzREQowXEVpYwsTUNIZHxhNjvqnTDAm+6/F4IisCKdhms33tcrm25OVtgF5P4c6CH2yCAyQtFpdE5QiYC4Zxc2Ieg9duDIghaVtvb5OoChyp/+jUtpe2VufnO1S4Y6gFH39zBJRM49jOT5BN50KIiFjiY+CFKAIzIi73f3+692zzWyTl2eHIHSkuflGTlsYCyRgq2kvBPC0gLsn46YIXh19ogSWehWhM+tevxoCBH0eT3t9GC8iBg++37Cl//Z2cnDWgFM8RIYI/Q37s++oNPOZaD2ExguFLPry3yY30xFqV1+qMWBQYeD7rbCNHG5p+r6zYlW9RXo+KEdWvFCcIxCdQc6EcjqJsRUTEr1f8OLipURXRMSYQ3YNo7zzjJyeaW/ndZS/rWYpW4SWlAoGPgGhp8Nwcas6XIce5Rqksij9+uA3Pjj6EF+KgjZnoOfdlnLgbTwplpZu5FLAMpxrGKw0L03dRd7EK+c9lgeF08F+/g46dQ5ie5aEzPIT2jh6Z1B066i3bteVRimYhitEVeEaewAdX9mFDYSY4PYPJ0Wkce7ULZNYCmktXLGTC7T4+Tir21raWvrKxympdjZgUU+F5BHDo2yrYn7KB1etwa+wejm/vgi6UjkiMgsmSjZkgUH/4gIfsrtz/xCP2h38pLHBoCNGqXe72NyDA+MAZGNz9Kwj3a90qzAtJBVamxVpxpufz5OB3/c+qH6m8ouZTV5Gz0mZNg55TytXdwMmhD0EltWgqOQt2waZYS0JvsoJmM+D13cSJxobOnwc69qgCJSX7OW4VdclVVLhxbZYVdns2GLMEjjJhOsBDjCZBM6tAqDSM+cbReqr5WvDW3Fav9wt+ZZlSImDkltzcvDcLnM8Qi+UBBdKBplhoKAPmQyL6+i4mBwf6u/hZoToF/2cbl6N4R7UzCbxtWW193mg0rUskNAiGw5O3pyb7Y9FY2/BQ9/X78/8Bls+GdDCWYq8AAAAASUVORK5CYII="; var addMI = document.getElementById('custombuttons-contextpopup-addnewbutton'); var addMI1 = document.getElementById('custombuttons-contextpopup-addnewbutton-sub'); addMI.setAttribute('image', iconADD); addMI1.setAttribute('image', iconADD); let xIDs = ["custombuttons-contextpopup-importnewbutton", "custombuttons-contextpopup-importnewbutton-sub"]; let aIDs = ["custombuttons-contextpopup-addnewbutton", "custombuttons-contextpopup-addnewbutton-sub"]; addMenuItem(xIDs, aIDs, "Добавить новую кнопку из XML файла\u2026", loadImg, "document.getElementById('" + this.id + "').checkDocumentForCBXML(content.document);"); let aIDs = ["toolbar-context-menu", "menu_viewPopup", "menu_View_Popup"]; let yIDs = [aIDs[0] + "-importnewbutton", aIDs[1] + "-importnewbutton", aIDs[2] + "-importnewbutton"]; let zIDs = [aIDs[0] + "-addnewbutton", aIDs[1] + "-addnewbutton", aIDs[2] + "-addnewbutton"]; for (var i = 0; i < aIDs.length; i++) { if ($(aIDs[i])) { $(aIDs[i]).querySelector("[oncommand^='custombuttons.']").id = zIDs[i]; // because the "Add new button..." in toolbar contextmenu // and View menu don't have IDs } } addMenuItem(yIDs, zIDs, "Добавить новую кнопку из XML файла\u2026", "", "document.getElementById('" + this.id + "').checkDocumentForCBXML(content.document);"); // Remove contextmenu items when this button is deleted this.onDestroy = function() { let kIDs = [this.id + "-checkForUpdate", this.id + "-checkForUpdate-sub"]; $(kIDs[0]).parentNode.removeEventListener("popupshowing", initCbPopup, false); for (var i = 0; i < 3; i++) { $(kIDs[i]) && $(kIDs[i]).parentNode.removeChild($(kIDs[i])); $(cIDs[i]) && $(cIDs[i]).parentNode.removeChild($(cIDs[i])); $(f6IDs[i]) && $(f6IDs[i]).parentNode.removeChild($(f6IDs[i])); $(xIDs[i]) && $(xIDs[i]).parentNode.removeChild($(xIDs[i])); $(yIDs[i]) && $(yIDs[i]).parentNode.removeChild($(yIDs[i])); } } //---------- Remove old traces if any ----------// let tbitem = $(this.id + "-toolbaritem"); tbitem && tbitem.parentNode.removeChild(tbitem); let css = "\ @namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\ #navigator-toolbox:not([customizing=\"true\"]) #" + this.id + ",\ #navigator-toolbox[customizing=\"true\"] #" + this.id + "-toolbaritem\ { display: none; }"; let sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService); let uri = makeURI("data:text/css," + encodeURIComponent(css), null, null); if (sss.sheetRegistered(uri, sss.USER_SHEET)) { sss.unregisterSheet(uri, sss.USER_SHEET); } this.initPopup = function initPopup(aNode) { this.querySelector("[oncommand*='inspectCBOverlay']") .hidden = !("inspectDOMNode" in window); } /*Показать Вставить и вырезать в контекстном меню кнопки*/ const CB = custombuttons; const CBS = CB.cbService; const sCBCtxtMenu = CB2const.sCBCtxtMenu; var cbCtxtMenu = $(sCBCtxtMenu); this.clipboard = ""; var items = [ { id: sCBCtxtMenu + "-cut", label: "Вырезать", command: "c", icon: "data:image/png;base64,\ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI\ WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QocFh0xaEFkXgAAArRJREFUOMuFk11Ik1EYx59z3nev\ r9vUfaXbbPgVaHjRVRB0YZRJV0XeZCIRaGmWWKhpgZAElaV9gYgQlBjoEPRKkCS6DAK1MG0zNvJj\ 7zZ1m+51X+92zttNzmFa5+78/w8//s/znIMg5TzrfXIOAN7zPO9tunm7dI/Xz7LspTvNrbpUHade\ GIYZu9XYrI1Go8t9/a87Uz0Fq7hw5nS55sWrnk8HAggh/E+HHdfV1lcQQo7t6E97HpeZc82m7ZCI\ KKUnDgRgjENLS7+AT0tDsVisdCcFy7JThYWF4HF7KKXU8a8EFTabDVZdK6iutr44kUic6nnePVBS\ UqJAgMHhdAAAWA8E3G299xljvLy4aAc+jUeSJB3X6/TXZAqwvrFGAWCiraXj4YEAAABKaeXCjwV5\ bc0DjTeaVPFEHIliEObm5iQA6Npb/xegraVjGmM8ZF+00WBwC2s0GhDcgizL8ru2lo7p/wL+pJia\ nZnGTqcD0jkeMt8ORhBCb/arRXuFMaOxl1B6Pb65qSblZTIz+REVGHNAIHQLITRQ6fG07wsYM5k6\ 437/g6MmEyQoRd6tTdkX3h5mZVRVkJ3D8BxHJVkG5/o6KLKyrla63UPJFsbN5hrJ5+sqNhrpwsrK\ VDASlgJBEdfEaU2UIzqWwTQQEhOO1dUPR/R6EvP5BsfN5t2XOmowCPNFRWSEYe4DAMxYLCGrUpnY\ 8UcYhnzJNQcBAIYxbv+Wn09GDQZhd4ixmF6SJFJFyKMJleqlgmV5hLE9OWmOm1Hz6arJjIy+y5R2\ gyxTIMSwC+A4Qa1UMl/z8mImna5pXhC8iszMK8mPpNU2fHe5Ng4fOtQwa7HECKUYMA4AADAAANVa\ rc/l95/0SxIbAJA5tfrsRUFI7twqiu7q7GyPNxDI8YfDGl8k4lOoVOetouj+DaDzOgfcNME8AAAA\ AElFTkSuQmCC" }, { id: sCBCtxtMenu + "-paste", label: "Вставить", command: "p", icon: "chrome://custombuttons/skin/paste1.png" } ]; for (var i = 0; i < items.length; i++) { $(items[i].id) && cbCtxtMenu.removeChild($(items[i].id)); let m = menuitem(items[i].id, items[i].label + " кнопку", items[i].command == "c" ? "cut();" : "paste();", items[i].icon); switch (items[i].command) { case "c": m.cut = cut.bind(); break; case "p": m.paste = paste.bind(); } } cbCtxtMenu.addEventListener("popupshowing", popupShowing, false); cbCtxtMenu.removeEventListener("popuphiding", popupShowing, false); function $(aId) { return document.getElementById(aId); } function menuitem(aId, aLabel, aCommand, aIcon) { var x = <menuitem xmlns={xulns} id={aId} label={aLabel} class="menuitem-iconic" image={aIcon} oncommand={aCommand}/>; var s = $(sCBCtxtMenu + CB2const.sCBCtxtMenuSep2); return cbCtxtMenu.insertBefore(cbu.makeXML(x), s); } function popupShowing(aEvent) { //LOG(aEvent.target.id); var button = "triggerNode" in aEvent.target ? aEvent.target.triggerNode : document.popupNode; var copied = /^custombutton:\/\//.test(self.clipboard); $(items[0].id).hidden = copied || button == self; $(items[1].id).hidden = !copied; } function convertURItoDOM(aURL) { var string = unescape(aURL.replace(/^custombutton\:\/\//, "").toString()); var dom = (new DOMParser()).parseFromString(string, "text/xml"); if (dom.documentElement.nodeName == "parsererror") { return null; } else { return dom.documentElement; } } function getParamValue(aDocument, aNodeName) { var result = ""; var node = aDocument.getElementsByTagName(aNodeName)[0]; if (!node) return result; if (!node.firstChild || (node.firstChild && (node.firstChild.nodeType == node.TEXT_NODE))) { result = node. textContent; } else { // CDATA result = node.firstChild.textContent; } return result; } function getButtonParameters(aButtonLink, aURL) { var dom = convertURItoDOM(aURL); var params = CBS.getButtonParameters(aButtonLink).wrappedJSObject; params.name = getParamValue(dom, "name") params.image = getParamValue(dom, "image") || getParamValue(dom, "stdicon"); params.code = getParamValue(dom, "code") params.initCode = getParamValue(dom, "initcode") params.help = getParamValue(dom, "help") params.accelkey = getParamValue(dom, "accelkey") params.mode = getParamValue(dom, "mode") params.wrappedJSObject = params; return params; } function cut(aButton) { if (!aButton) { aButton = "triggerNode" in cbCtxtMenu ? cbCtxtMenu.triggerNode : document.popupNode; } self.clipboard = aButton.URI; var toolbarID = aButton.parentNode.id; var buttonID = aButton.id; var buttonsToRemove = document.getElementsByAttribute("id", buttonID); var removeFromOverlay = buttonsToRemove.length == 1; CBS.removeButton(aButton, removeFromOverlay); CB.persistCurrentSets(toolbarID, buttonID, null); } function paste(aButton) { if (!aButton) { aButton = "triggerNode" in cbCtxtMenu ? cbCtxtMenu.triggerNode : document.popupNode; } CB.cloneButton(aButton, true); var newButton = CB.makeButtonLink("update", aButton.nextSibling.id); var url = self.clipboard; var params = getButtonParameters(newButton, url); //inspectObject(params); CBS.installButton(params); self.clipboard = ""; } this.onDestroy = function(aReason) { cbCtxtMenu.removeEventListener("popupshowing", popupShowing, false); for (var i = 0; i < items.length; i++) { $(items[i].id) && cbCtxtMenu.removeChild($(items[i].id)); } }
Отредактировано Andrey_Krropotkin (23-07-2012 00:19:00)
Отсутствует
Также чуть изменил кнопку Troubleshoot Custom Buttons:
/*Initialization code*/ var dialog; var defaultFavicon = "http://forum.mozilla-russia.org/uploaded/custombuttons_button.png"; var checkFavicon = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAltJREFUOMtt0l9olXUcx/HX8zzThHh07cLQ" + "JSZoozXNONMonYxI6zhwhnVnGQldqASZKN50USgWE0ThgCEiZV2JyNDpEnXMLhbuNBC7SOnfVHQj5p/Hmmw+53hxzo7T9bv5Xfy+" + "78/v8/1+P4EnT7NqvIOMVEYkRF6q16hjegxBsVgMgiAoBk/AWRyQminyf2cguzi7veOrjg+xBD8H4+Cd2A7xNJLZxDUkMISrTH8Q" + "O7e3R/3z9TCKVSWBJitEOsFC1BOXpZOyfhzFOptPeW3O6wqFgh9Of7/7/bc/2BJoVi11CbVewXziMhiX4SSkY/lx2VktYOOejXJH" + "cwOmeKlKqkWk1jTiholNJ/iu6VAF/iL/uVx3jsiz7lsdlqdNLcaNdMxF2+Jd1s5bB/Zd2qOt70tmVcoyoUijiPq6F7SvPGNp7fLK" + "69b5m322YBs4fOVbn/R8WppJTbkgkqmSKsD+1gOWzmwyMDzgp+unrZm71q5X28Dxv9tt6N70uLsUkUIo0iuiMFIADc80aH7uLd8s" + "OygQ6L7RZf3ZVoqJeAweqmjlSynDyH+joK76RUdWtJsUTvLLP3nvda4ynD5aJ6VMPBL41wmp/puDN0FVWGVyONnlO79pPbXS8IOk" + "YhuSX3EL3JA6Frrgrsj6vit9Fdlr967KnnzTnfuDkrEwFUgu4iJK/X/svFulxP/lj5qG6hkL5r7c2D/Yb82Od12+9runUkYS/MnI" + "hbL1IkJf65Lz+ObR5A0cFJld/kXlhtR1fOS8H8eQYEL0FpnqaS3IoBGhVK9IHid0uT2+/CEAYcfQrHKJYQAAAABJRU5ErkJggg=="; var uncheckFavicon = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAeJJREFUOMudk81qU1EUhb+7krYZaIkUhQQc" + "qLVG30BKCyoOOtFROgiJZuxTXF/CcaEhhtyROCoO/C19BNOgM0mgk6IpGNN713WQUKMVU1yjczjrfJyz914Bf6hef5wbDn/clFTA" + "FJVVAPTiOO4lSdKJouj7tD+Y3lQqletID7DPAwjwyakAjjLi5XajsX8KUK1W7xmvYTD0wR2hHgjjonAJVJjY95rN5s4JYHNz81o2" + "m60BiWO/Kd0q7YZh6OnXhWGobvfTbfBdICNlnjca2/tBvV7PjYajJ4hF269brdZb/qFqpbpqfB84GgwGzzQajVaQFiUOkiT5wAwt" + "ryzvjb/IuXw+XxJQmJRqP4qiZBYgDENjdwDSlIKMixIEQabHGSWpB2DSooRSm/+SHaca00SaJMWzX3RxPBnqyXYfjKUb5XI5M7MG" + "T0MBpQmor8PDwy7wFfvS3Nzc+ixA52NnVVJB0sCJO8G4t5WrhkeSbPv98XH8Lorav3WkXC5nFhZya3ayBmQcu9lqt7q/RrlSuWNY" + "BwKkAxx34thfEGSz85eBEvbFiX232Wy+OhWmWq12JU3Th7bz0xHyZGX7mx2/aLfbn/+aRoCNjY2FpQtLK4gCdjE2QVb0YtPP5ea7" + "W1tbw2n/Tyf84OJw4lGJAAAAAElFTkSuQmCC"; var checkStyle = 'background:#FFF1AE url("' + checkFavicon + '") no-repeat left center;color:black;padding-left:24px'; var uncheckStyle = 'background:white url("' + uncheckFavicon + '") no-repeat left center;color:black;padding-left:24px'; function createURI(node) { var name = node.getAttribute("name") || node.getAttribute("label") || ""; var image = node.getAttribute("image") || node.getAttribute("cb-stdicon") || ""; var mode = node.getAttribute("cb-mode") || 0; var initcode = node.getAttribute("cb-init") || ""; var code = node.getAttribute("cb-oncommand") || ""; var accelkey = node.getAttribute("cb-accelkey") || ""; var help = node.getAttribute("Help") || ""; var xhr = new XMLHttpRequest(); xhr.open("GET", "chrome://custombuttons/content/nbftemplate.xml", false); xhr.send(null); var doc = xhr.responseXML; setText(doc, "name", name, 0); setText(doc, "image", image, 1); setText(doc, "mode", mode, 0); setText(doc, "initcode", initcode, 1); setText(doc, "code", code, 1); setText(doc, "accelkey", accelkey, 1); setText(doc, "help", help, 1); var ser = new XMLSerializer(); var data = ser.serializeToString(doc); return "custombutton://" + escape(data); } function setText(doc, nodeName, text, make_CDATASection) { var node = doc.getElementsByTagName(nodeName)[0], cds; if (!node) return; if (make_CDATASection) { try { cds = doc.createCDATASection(text || ""); } catch(e) { cds = doc.createTextNode(text || ""); } node.appendChild(cds); } else { node.textContent = text; } } function aDate() { var t=new Date(); var y=1900+t.getYear(); var min=t.getMinutes(); if (min<10){min="0"+min}; var h=t.getHours(); var m=t.getMonth();switch(m){case 0: m="Jan";break;case 1: m="Feb";break;case 2: m="Mar";break;case 3: m="Apr";break;case 4: m="May";break;case 5: m="Jun";break;case 6: m="Jul";break;case 7: m="Aug";break;case 8: m="Sep";break;case 9: m="Oct";break;case 10: m="Nov";break;default: m="Dec";} var d=t.getDate(); var curdate=y+"-"+d+"-"+m+"_"+h+"-"+min; var myfilename="my_cbuttons_"+curdate; return myfilename; } this.close = function() { dialog.close(); } const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; var data = <window onload={'opener.document.getElementById("' + this.id + '").load()'} title={"Инструменты CB"} xmlns={xulNS}> <keyset> <key keycode="VK_ESCAPE" oncommand="close()"/> </keyset> <vbox flex="1"> <listbox flex="1" id="listbox" height="555" width="500" context="menupopup" onclick={'opener.document.getElementById("' + this.id + '").handle(event)'} tooltiptext = "L=Выбрать M=Выбрать все R=Копировать/Сохранить как…"> <listhead> <listheader label="Label" width="300" tooltiptext = "Активные кнопки выделены жирным шрифтом"/> <listheader label="Id" tooltiptext = "Активные кнопки выделены жирным шрифтом"/> </listhead> <listcols> <listcol/> <listcol flex="1"/> </listcols> </listbox> <popupset> <menupopup id="menupopup"> <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==" label="Копировать изображение кнопки в base64" oncommand={'opener.document.getElementById("' + this.id + '").copyIMG()'}/> <menuitem class="menuitem-iconic" image="chrome://custombuttons/skin/copy.png" label="Копировать кнопку в буфер обмена" oncommand={'opener.document.getElementById("' + this.id + '").copyURI()'}/> <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAA/wAAAP8AAA" label="Копировать кнопку как BBcode ссылку" oncommand={'opener.document.getElementById("' + this.id + '").copyBBCode()'}/> <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBACAAEAAQCwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAADbAAADpcAAA//AAANVwAAD/8AAAKsAAAD/AAAP//AAAP8AAAD/AAAD/8AAAwDAAAP/wAAA/wAAAP8AAA" label="Копировать кнопку как текст" oncommand={'opener.document.getElementById("' + this.id + '").copyButtonsCodeText()'}/> <menuitem class="menuitem-iconic" image="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQf//rEH4j6xB8IesQeHDrEHD4axBh/CsQYf4rEGH8KxBw+GsQeHDrEHwh6xB+I+sQf//rEH//6xB//+sQQ==" label="Копировать кнопку как HTML ссылку" oncommand={'opener.document.getElementById("' + this.id + '").copyHTML()'}/> <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AESqAABHpgAASKAAAEukAQxMpQMYR6MAAEepAQ9MpgOLRKgACUenAABHpgAARKoAAP///wD///8A////AP///wBEqgAARaIAAFS2FVBj0jS3Y9AzyVG0EUROrwt8TKcDs0ikAANInwAAR6YAAESqAAD///8A////AP///wD///8ARKQAAVvJKJtj0jX/SaAJ/0abCv9UtSH/U7QX8lW5IMddwyfQW8Iii0mqBQ1DqQAA////AP///wD///8A////AEWlAAFYwB6YXsYc5F7GFt9bwA+vVbgWvU6rAKBRrgf0RZgA/02oDP9ezCzJR6UBA////wD///8A////AP///wBFrAAASKIAADiGNQAeYIIpF1iJHVa4GKEve0tFLHl1Pla7J51exRnUWL8VjEetAAP///8A////AP///wD///8AC0WuAAk/tAAANdpIAFD6/wA+7f8gd6jqBlPX+QBE9PIGS8uDLnZLADqNJwAzjDMA////AP///wD///8A////AAAw0QAALc0AAEPdegBI4f8AK8P/ADHX/wAwzf8AL8b/AEno/gAz2zYALtEQAC3VAP///wD///8A////AP///wAAMssAADjSMwBA2pIATen/ADG9/wBe1v8ATcz/ADHK/wBN5/4ASeH/AEvl6wA10DP///8A////AP///wD///8AADnTSQBO5/8ANc7/ADnR/xC+9/8C0f//AMj//wCP8P8ALcX/ACrC/wBE3f8ASeOf////AP///wD///8A////AABI4Z4ARN3/ACvG/wJAxP8Z5v//AMT//wDE//8Axv7/AETM/wA51P8AUervADjSPP///wD///8A////AP///wAAOdRiAFry+QBS6/QATOP/H+P8/xDe//8J1///E9H4/wFE2f8AReC6ADTOEwAyywD///8A////AP///wD///8AADDNAAAyzCcARN7WACvG/wVfzf8d0vf/HM30/whf0/8AI7n/ADzV+AA40kUAMswA////AP///wD///8A////AAAwywAAPNdTAEfg/wAsw/8AOdb/ADLP/wAswv8AReP/AC7H/wA40f8AR+GfADDKAP///wD///8A////AP///wAAMswAADfRQgBY8f8AT+j/AE7o7AA+1/8AK8T/AE7o/wBN5f8AVe7/AD/ZbAAwywD///8A////AP///wD///8AADPMAAAyywAANM4vADjSUQA0zikAU+z3AEff/wBJ4sMAN9EtADjROQAyywAAM8wA////AP///wD///8A////AAAzzAAAM8wAADHLAAAwywAAMcsAAD/YXQBK4pYAN9AxAC/KAAAwygAAM8wAADPMAP///wD///8A+R8AAPAfAADABwAAwAMAAPgDAADwHwAA8AcAAOADAADAAwAAwAMAAMAHAADgBwAA4AcAAOAHAADwDwAA/j8AAA==" label="Сохранить изображение кнопки" oncommand={'opener.document.getElementById("' + this.id + '").saveIMG()'}/> <menuitem class="menuitem-iconic" image="data:application/file;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAFwAAAGkAAABzAAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAADkAAAAP////AQAAAIdgZmj/YWlt/2FobP9haGz/YGhr/2Boa/9fZ2v/X2dr/15mav9dZWn/XGRo/0ZNUP8AAACdAAAAFf///wEAAACr2tzc/9ve4P/a3t//1dnZ/7S2tf+foJz/m5ya/6apqP/O0tP/09fZ/9DV1v+hqq//AAAAuQAAABX///8BAAAAq+3u7//e4eL/ub29/2hnXv9oVUX/U0As/zgxGf83Lx3/YWBX/7a5uv/S1tj/o6yx/wAAALkAAAAV////AQAAAKv29/f/19na/1dUQf9jXDv/dmtJ/4FoSP9VQiL/V0Ek/008Iv9HQTP/yc3P/6Wus/8AAAC5AAAAFf///wEAAACr+Pj4/5uamP9tY0L/g31b/6GLa/+McVH/eFY5/4xwUv9yXkD/RTki/4uMiv+nsLT/AAAAuQAAABX///8BAAAAq/n6+v+FfXL/waSM/8qznf/DrZP/ooFi/7WfhP+qh2//blk9/1A+Iv9aWlH/pK2x/wAAALkAAAAV////AQAAAKv6+/v/d3Rr/9zCsP/RxbH/z8Wu/9fJt//Qvab/qItv/5iOb/9tYUH/VVJK/6Wtsf8AAAC5AAAAFf///wEAAACr+/z8/4mHff+3pI//3NK//+HXxf/m3Mz/5trJ/9rMuf+bgWT/d14//2hnYP+osbX/AAAAuQAAABX///8BAAAAq/z9/f/FxL7/j4l+//Xw5f/29ez/8/Dl/+DMuv/VuaP/poZn/2dFKv+srav/oamt/wAAALkAAAAV////AQAAAKv+/v7/+/z8/5iZjf+5uqr/6+PW/+3i1P/kzL3/vZR+/4NhSf+Qh3z/z9HS/4qQkv8AAAC1AAAAFf///wEAAACr/v7+//7+/v/u7u3/tbiv/5WSgP+DfGj/e25Z/29gTv+sppz/vr6+/5aYmP90eHr/AAAApwAAABP///8BAAAAq/////////////////7+/v/9/f3//f39//v8/P/5+fn/1dXV/2pqav9TU1P/QUFB/wEBAYkAAAAJ////AQAAAKv7+/v//////////////////v7+//7+/v/+/v7/+vr6/9fY2P/V1tb/7Ozs/4KCgv8EBAQrAAAAA////wEAAACFlJSU/6ioqP+qqqr/qqqq/6qqqv+qqqr/qKio/6anp/2kpaX9o6Oj/4qKitUZGRk9////Af///wH///8BAAAAFQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABTBAQEUx8fH1dfX18z////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==" label="Сохранить кнопку как HTML файл" oncommand={'opener.document.getElementById("' + this.id + '").SaveButton()'}/> </menupopup> </popupset> <hbox> <button label="Сохранить избранное" oncommand={'opener.document.getElementById("' + this.id + '").exportHTML()'} oncontextmenu={'opener.document.getElementById("' + this.id + '").exportHTML(),opener.document.getElementById("' + this.id + '").close()'} tooltiptext = "Left - Сохранить выбранные кнопки Right - Сохранить выбранные кнопки и закрыть окно"/> <button label="Сохранить все" oncommand={'opener.document.getElementById("' + this.id + '").archiveall()'} oncontextmenu={'opener.document.getElementById("' + this.id + '").archiveall(),opener.document.getElementById("' + this.id + '").close()'} tooltiptext = "Left - Сохранить все кнопки Right - Сохранить все кнопки и закрыть окно"/> <button label="Выбрать все" oncommand={'opener.document.getElementById("' + this.id + '").handle1()'} tooltiptext = "Выбрать все кнопки"/> <button label="Выбрать папку" oncommand={'opener.document.getElementById("' + this.id + '").setFolder()'} tooltiptext = "Назначить папку для сохранения файлов с кнопками"/> <button label="Считать кнопки" oncommand={'opener.document.getElementById("' + this.id + '").setFolder1()'} tooltiptext = "Открыыть файл с кнопками из заданной папки"/> </hbox> <hbox> <spacer flex="1"/> <button label="Новая кнопка" oncommand={'opener.document.getElementById("' + this.id + '").newbutton()'} tooltiptext = "Создать новую кнопку рядом с выбранной"/> <button label="Удалить" oncommand={'opener.document.getElementById("' + this.id + '").delete()'} tooltiptext = "Удалить выбранную кнопку"/> <button label="Клонировать" oncommand={'opener.document.getElementById("' + this.id + '").clone()'} tooltiptext = "Клонировать рядом с собой выбранную кнопку"/> <button label="Редактировать" oncommand={'opener.document.getElementById("' + this.id + '").edit()'} tooltiptext = "Редактировать выбранную кнопку"/> <spacer flex="1"/> </hbox> <hbox> <spacer flex="1"/> <button label="Инспектор DOM" oncommand={'opener.document.getElementById("' + this.id + '").inspect()'} oncontextmenu={'opener.document.getElementById("' + this.id + '").inspect(),opener.document.getElementById("' + this.id + '").close()'} tooltiptext = "Left - Открыть кнопку в Инспекторе DOM Right - Открыть кнопку в Инспекторе DOM и закрыть окно"/> <button label="Просмотр" oncommand={'opener.document.getElementById("' + this.id + '").view()'} oncontextmenu={'opener.document.getElementById("' + this.id + '").view(),opener.document.getElementById("' + this.id + '").close()'} tooltiptext = "Left - Просмотреть в новой вкладке код,свойтва, атрибуты Right - Просмотреть в новой вкладке код,свойтва,атрибуты и закрыть окно"/> <button label="Открыть архив" oncommand={'opener.document.getElementById("' + this.id + '").viewCBOverlay()'} tooltiptext = "Открыть файл buttonsoverlay.xul.bak в новой вкладке"/> <button label="Кнопки из архива" oncommand={'opener.document.getElementById("' + this.id + '").importFromCBOverlay()'} tooltiptext = "Установить кнопки из файла buttonsoverlay.xul.bak. Надо знать id"/> <spacer flex="1"/> </hbox> </vbox> </window>; var bool = XML.prettyPrinting; XML.prettyPrinting = false; data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>' + data.toXMLString(); XML.prettyPrinting = bool; this.leftclick = function(event) { var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data); var feature = "chrome,centerscreen,dialog=no"; dialog = window.openDialog(url, "", feature); } this.reopen = function() { dialog.close(); var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data); var feature = "chrome,centerscreen,dialog=no"; dialog = window.openDialog(url, "", feature); } this.load = function() { var aList = [], node = /custombuttons-button\d+/; var nodeList = document.getElementsByClassName("toolbarbutton-1 chromeclass-toolbar-additional"); for(var i = 0; i < nodeList.length; i++) if(nodeList[i].id.match(node)) aList.push(nodeList[i]); aList.sort(function (a, b) { a = a.getAttribute("label"); b = b.getAttribute("label"); if(a < b) return -1; if(a > b) return 1; return 0; }) for(var i = 0; i < aList.length; i++) createItem(aList[i]); var bList = [], node = /custombuttons-button\d+/; var nodeList = custombuttons.palette.getElementsByClassName("toolbarbutton-1 chromeclass-toolbar-additional"); for(var i = 0; i < nodeList.length; i++) if(nodeList[i].id.match(node)) bList.push(nodeList[i]); bList.sort(function (a, b) { a = a.getAttribute("label"); b = b.getAttribute("label"); if(a < b) return -1; if(a > b) return 1; return 0; }) for(var i = 0; i < bList.length; i++) createItem(bList[i]); function createItem(button) { var item = document.createElement("listitem"); item.checked = false; item.setAttribute("style", uncheckStyle); item.setAttribute("value", button.id); var cell = document.createElement("listcell"); cell.setAttribute("class", "listcell-iconic"); cell.setAttribute("image", button.getAttribute("image") || getImage(button.getAttribute("cb-stdicon"))); cell.setAttribute("label", button.getAttribute("name") || button.getAttribute("label") || ""); // Style these three if(button.getAttribute("initialized")) cell.style.fontWeight = "bold"; if(button.getAttribute("initialized")) cell.style.fontSize = "12px"; if(button.getAttribute("initialized")) cell.style.textShadow = "#999 2px 2px 2px"; if(!button.getAttribute("initialized")) cell.style.color = "#666"; item.appendChild(cell); var cell = document.createElement("listcell"); cell.setAttribute("label", nodeList[i].id); item.appendChild(cell); dialog.document.getElementById("listbox").appendChild(item); } function getImage(s) { if (s == "custombuttons-stdicon-1") return "chrome://custombuttons/skin/button.png"; if (s == "custombuttons-stdicon-2") return "chrome://custombuttons/skin/stdicons/rbutton.png"; if (s == "custombuttons-stdicon-3") return "chrome://custombuttons/skin/stdicons/gbutton.png"; if (s == "custombuttons-stdicon-4") return "chrome://custombuttons/skin/stdicons/bbutton.png"; return defaultFavicon; } dialog.document.getElementById("listbox").focus(); dialog.document.getElementById("listbox").selectAll(); } function toggleChoice(item) { item.checked = !item.checked; if (item.checked) item.setAttribute("style", checkStyle); else item.setAttribute("style", uncheckStyle); } this.handle = function(event) { var listbox = dialog.document.getElementById("listbox"); if (event.button == 0) toggleChoice(listbox.selectedItem); if (event.button == 1) for (var i = 0; i < listbox.itemCount; i++) toggleChoice(listbox.getItemAtIndex(i)); } this.handle1 = function(event) { var listbox = dialog.document.getElementById("listbox"); for (var i = 0; i < listbox.itemCount; i++) toggleChoice(listbox.getItemAtIndex(i)); } this.copyURI = function() { var listbox = dialog.document.getElementById("listbox"); var button = document.getElementById(listbox.selectedItem.getAttribute("value")); var href, text; if (button) { href = button.URI; text = button.name; } else { var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) { href = createURI(nodeList[i]); text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; break; } } } custombuttons.cbService.writeToClipboard(href); custombuttons.alertSlide(text, "Код был скопирован в буфер обмена"); } this.copyBBCode = function() { var listbox = dialog.document.getElementById("listbox"); var button = document.getElementById(listbox.selectedItem.getAttribute("value")); var href, text; if (button) { href = button.URI; text = button.name; } else { var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) { href = createURI(nodeList[i]); text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; break; } } } custombuttons.cbService.writeToClipboard("Install [url=" + href + "][img]" + defaultFavicon + "[/img][B] " + text + "[/B][/url]"); custombuttons.alertSlide(text, "BBCode был скопирован в буфер обмена"); } this.copyButtonsCodeText = function copyButtonsCodeText() { var listbox = dialog.document.getElementById("listbox"); var btn = document.getElementById(listbox.selectedItem.getAttribute("value")); if (!btn) return; var code = ((btn.cbCommand == "") || (btn.Command == "/*CODE*/")) ? "" : ("\n/*CODE*/\n" + btn.cbCommand + "\n"); var init = ((btn.cbInitCode == "") || (btn.cbInitCode == "/*Initialization Code*/")) ? "" : ("\n/*Initialization Code*/\n" + btn.cbInitCode); cbu.gClipboard.write(code + init); custombuttons.alertSlide(btn.name, "Code + INIT Code скопированы в буфер обмена"); } this.copyHTML = function() { var listbox = dialog.document.getElementById("listbox"); var button = document.getElementById(listbox.selectedItem.getAttribute("value")); var href, src, text; if (button) { href = button.URI; src = button.image; text = button.name; } else { var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) { href = createURI(nodeList[i]); src = nodeList[i].getAttribute("image"); text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; break; } } } if (!src) src = defaultFavicon; custombuttons.cbService.writeToClipboard('<a href="' + href + '"><img alt="" src="' + src + '">' + " " + text + "</a>"); custombuttons.alertSlide(text, "HTML был скопирован в буфер обмена"); } this.copyIMG = function() { var listbox = dialog.document.getElementById("listbox"); var button = document.getElementById(listbox.selectedItem.getAttribute("value")); var href, src, text; if (button) { src = button.image; text = button.name; } else { var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) { src = nodeList[i].getAttribute("image"); text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; break; } } } if (!src) custombuttons.alertBox(text + "\n" + "Эта кнопка не имеет изображения!"); else {custombuttons.cbService.writeToClipboard(src); custombuttons.alertSlide(text, "Изображение кнопки было скопировано в буфер обмена"); } } this.saveIMG = function() { var listbox = dialog.document.getElementById("listbox"); var button = document.getElementById(listbox.selectedItem.getAttribute("value")); var href, src, text; if (button) { src = button.image; text = button.name; } else { var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) { src = nodeList[i].getAttribute("image"); text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; break; } } } if (!src) custombuttons.alertBox(text + "\n" + "Эта кнопка не имеет изображения!"); else saveImageURL(src, text); } this.SaveButton = function() { var listbox = dialog.document.getElementById("listbox"); var id = listbox.selectedItem.getAttribute("value"); var btn = document.getElementById(id); var btnname, btnimage, btnURI, btncbInitCode, btncbCommand, btnHelp; if (btn) { btnname = btn.name; btnimage = btn.image; btnURI = btn.URI; btncbInitCode = btn.cbInitCode; btncbCommand = btn.cbCommand; btnHelp = btn.Help; } else { var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id == listbox.selectedItem.getAttribute("value")) { btnimage = nodeList[i].getAttribute("image"); btnname = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; btnURI = createURI(nodeList[i]); btncbInitCode = nodeList[i].getAttribute("cb-init"); btncbCommand = nodeList[i].getAttribute("cb-oncommand"); btnHelp = nodeList[i].getAttribute("Help"); break; } } } if (!btnimage) btnimage = defaultFavicon; var xml = <html xmlns={xhtmlns}> <head> <title>{btnname + ' for Custom Buttons'}</title> <link rel='icon' type='image/vnd.microsoft.icon' href={btnimage}/> <style type='text/css'><![CDATA[pre { border: 1px solid #aaa; }]]></style> </head> <body> <section id='install'><h1>{btnname}</h1><a href={btnURI}>Install</a></section> <section id='init'><h2>Initialization Code</h2><pre>{btncbInitCode}</pre></section> <section id='code'><h2>Code</h2><pre>{btncbCommand}</pre></section> <section id='help'><h2>Help</h2><pre>{btnHelp}</pre></section> </body> </html>; var html = '<!DOCTYPE html>\n' + xml.toXMLString(); var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker); var stream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream); fp.appendFilters(fp.filterHTML); fp.defaultExtension = 'htm'; fp.init(window, 'Save As HTML', 1); fp.defaultString = btnname + ' ' + aDate(); if(fp.show() != fp.returnCancel) { if(fp.file.exists()) fp.file.remove(true); fp.file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666); stream.init(fp.file, 0x02, 0x200, false); var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream); converter.init(stream, "windows-1251", 0, 0); converter.writeString(html); converter.close(); } custombuttons.alertSlide("Кнопка: " + btn.name, "сохранена"); } this.newbutton = function() { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); var listbox = dialog.document.getElementById("listbox"); for (var i = 0; i < listbox.itemCount; i++) { if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) { var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")); custombuttons. cloneButton(document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"))); var newButtonLink = custombuttons. makeButtonLink ("update", document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")).nextSibling. id ); var params = custombuttons. cbService. getButtonParameters (newButtonLink). wrappedJSObject; params. image = ""; params. name = "" params. code = ""; params. initCode = ""; params. wrappedJSObject = params; custombuttons. cbService. installButton (params); this.reopen(); } } } this.edit = function() { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); var listbox = dialog.document.getElementById("listbox"); for (var i = 0; i < listbox.itemCount; i++) { if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) { var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")); custombuttons.editButton(document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"))); } } } this.clone = function() { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); var listbox = dialog.document.getElementById("listbox"); for (var i = 0; i < listbox.itemCount; i++) { if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) { var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")); custombuttons.cloneButton(document.getElementById(listbox.getItemAtIndex(i).getAttribute("value"))); this.reopen(); } } } this.delete = function() { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); var listbox = dialog.document.getElementById("listbox"); for (var i = 0; i < listbox.itemCount; i++) { if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) { var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")); var id = listbox.getItemAtIndex(i).getAttribute("value"); var oRemovedButton = document.getElementById(id); var sParentToolbarId = oRemovedButton.parentNode.id; var sRemovedButtonId = oRemovedButton.getAttribute("id"); var cButtonsToRemove = document.getElementsByAttribute("id", sRemovedButtonId); var bRemoveFromOverlay = cButtonsToRemove.length == 1; custombuttons.cbService.removeButton(oRemovedButton, bRemoveFromOverlay); custombuttons.persistCurrentSets(sParentToolbarId, sRemovedButtonId, null); this.reopen(); } } } this.view = function() { var listbox = dialog.document.getElementById("listbox"); var id = listbox.selectedItem.getAttribute("value"); var box = custombuttons.confirmBox3("CB TOOLS", "Просмотр в новой вкладке:", "Код", "Свойства", "Атрибуты"); if (box == 0) this.link(); if (box == 2) this.attr(); if (box == 1) this.prop(); this.reopen(); } var br = getBrowser(); function openTab(arr) { for (var i = 0; i < arr.length; i++) { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; arr[i] = converter.ConvertFromUnicode(arr[i]); arr[i] = arr[i].replace(/&/g, "&"); arr[i] = arr[i].replace(/>/g, ">"); arr[i] = arr[i].replace(/</g, "<"); arr[i] = arr[i].replace(/"/g, """); arr[i] = arr[i].replace(/'/g, "'"); } var data = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//En">'; data += "<html><head><title>" + arr[1] + "</title>"; data += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'; data += "</head><body><pre>" + arr.join("\n\n") + "</pre></body></html>"; var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo); if (info.name == "Firefox" || info.name == "SeaMonkey") { br.selectedTab = br.addTab("data:text/html;charset=utf-8;base64," + btoa(data)); } if (info.name == "Thunderbird") { openContentTab("data:text/html;charset=utf-8;base64," + btoa(data)); } } this.attr = function() { var listbox = dialog.document.getElementById("listbox"); var id = listbox.selectedItem.getAttribute("value"); var node = document.getElementById(id); var out = new Array(); out.push('windowtype="' + document.documentElement.getAttribute("windowtype") + '" id="' + id + '"'); out.push("Атрибуты"); for (var i = 0; i < node.attributes.length; i++) { if (node.attributes[i].nodeName == "cb-oncommand" || node.attributes[i].nodeName == "cb-init" || node.attributes[i].nodeName == "Help") { out.push(node.attributes[i].nodeName + " " + typeof node.attributes[i].nodeValue + "\n" + "[omitted]"); } else { out.push(node.attributes[i].nodeName + " " + typeof node.attributes[i].nodeValue + "\n" + node.attributes[i].nodeValue); } } openTab(out); } this.prop = function() { var listbox = dialog.document.getElementById("listbox"); var id = listbox.selectedItem.getAttribute("value"); var node = document.getElementById(id); var out = new Array(); out.push('windowtype="' + document.documentElement.getAttribute("windowtype") + '" id="' + id + '"'); out.push("Свойства"); for (var i in node) { if (i == "cbCommand" || i == "cbInitCode" || i == "Help" || i == "URI") { out.push(i + " " + typeof node[i] + "\n" + "[omitted]"); } else { out.push(i + " " + typeof node[i] + "\n" + node[i]); } } openTab(out); } this.link = function() { var listbox = dialog.document.getElementById("listbox"); var id = listbox.selectedItem.getAttribute("value"); var out = new Array(); out.push('windowtype="' + document.documentElement.getAttribute("windowtype") + '" id="' + id + '"'); out.push("Код"); out.push(unescape(document.getElementById(id).URI)); openTab(out); } this.inspect = function() { if (typeof(inspectDOMDocument) == "undefined") { custombuttons.alertBox(this.label, "DOM Инспектор не установлен."); return; } var listbox = dialog.document.getElementById("listbox"); var id = listbox.selectedItem.getAttribute("value"); inspectDOMNode(document.getElementById(id)); } const cEICB = "Export.Import.CB.type.HTML"; const cPathEI = "C:\\Custom Buttons\\Сохранение кнопок\\"; const cPathSetMsg = "Надо установить путь для чтения/записи кнопок"; const csImpT = "Импорт кнопок из HTML"; const csSetIET = "Каталог для Экспорта/Импорта кнопок в/из HTML"; //********************************************************************* //chkPath проверяет путь и тд, можно добовлять проверки, тк не всё проверяется. //return = -10 ошибка в определении синтаксиса пути (не используется) //return = -2 ошибочный путь или его не существует (почти не используется) // return = -1 ошибка настройки (для совместимости) // return = 0 требуется создать и определить путь // return = 1 всё ОК function chkPath(cPth){ var vPth = Application.prefs.getValue(cEICB, cEICB), res = -10; //предустановка if (vPth == cEICB ){ Application.prefs.setValue(cEICB, cPathEI); // Создали и путь по умолчанию из определения res = 1; //Переменная существует и определена } else if (typeof(vPth) != "string") res = -1; //Переменная определена и не того типа, значит она не наша else { //Пробуем проверить путь - ответ в исключении. var file = Components.classes["@mozilla.org/file/local;1"]. createInstance(Components.interfaces.nsILocalFile); try { file.initWithPath(cPth); if (!file.isDirectory() ) res = 0; //Такого пути нет надо создавать else res = 1; // Путь есть } catch(e) { res = -2; } } return res; } this.setFolder = function() { var sPathEI=Application.prefs.getValue(cEICB, 0); if (chkPath(sPathEI) == -1) { custombuttons. alertBox (csSetIET, "переменная "+cEICB+" уже существует и занята") return; //Нельзя создавать тк переменная уже занята }; // Диалог создания и установки пути var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(Components.interfaces.nsIFilePicker); fp.init(window, csSetIET, fp.modeGetFolder); var dd = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); dd.initWithPath(sPathEI); fp.displayDirectory = dd; if(fp.show() == fp.returnCancel) return; else { sPathEI = fp.file.path Application.prefs.setValue(cEICB, sPathEI+=(sPathEI[sPathEI.length-1] != "\\")?"\\":""); custombuttons. alertBox (csSetIET, "Установлен путь для записи/чтения \n " + sPathEI); } } this.setFolder1 = function(){ if (chkPath(Application.prefs.getValue(cEICB, 0)) != 1) custombuttons. alertBox (csImpT, cPathSetMsg); else { var mydir=Application.prefs.getValue(cEICB, 0); //, myfilename = GenFileName(); var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(Components.interfaces.nsIFilePicker); fp.init(window, csImpT, fp.modeOpen); var dd = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); dd.initWithPath(mydir); fp.displayDirectory = dd; if(fp.show() != fp.returnCancel) getBrowser (). selectedTab = getBrowser (). addTab (fp.file.path); } } this.exportHTML = function() { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); var listbox = dialog.document.getElementById("listbox"); for (var i = 0; i < listbox.itemCount; i++) { if (listbox.getItemAtIndex(i).checked && document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")) != null) { var button = document.getElementById(listbox.getItemAtIndex(i).getAttribute("value")); var href = button.URI; var src = button.image; var text = button.name; if (!src) src = defaultFavicon; out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>'); } } var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id.search("custombuttons-button") == 0 && document.getElementById(nodeList[i].id) == null) { for (var j = 0; j < listbox.itemCount; j++) { if (listbox.getItemAtIndex(j).checked && nodeList[i].id == listbox.getItemAtIndex(j).getAttribute("value")) { var href = createURI(nodeList[i]); var src = nodeList[i].getAttribute("image"); var text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; if (!src) src = defaultFavicon; out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>'); } } } } var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "", fp.modeSave); fp.defaultString = aDate() + ".htm"; fp.appendFilters(fp.filterHTML); fp.appendFilters(fp.filterAll); if (fp.show() == fp.returnCancel) return; var stream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); stream.init(fp.file, 0x02|0x08|0x20, parseInt("666", 8), 0); var data = document.getElementById(this.id).getAttribute("Help"). replace("<ol>", new Date() + "\n" + "<ol>" + "\n" + out.join("\n")); stream.write(data, data.length); stream.close(); custombuttons.alertSlide("Кнопки", "сохранены"); } this.archiveall = function() { var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); out.push("<hr><strong>Active buttons</strong><hr>"); var nodeList = document.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id.search("custombuttons-button") == 0) { var href = nodeList[i].URI; var src = nodeList[i].image; var text = nodeList[i].name; if (!src) src = defaultFavicon; out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>'); } } out.push("<hr><strong>Not active buttons</strong><hr>"); var nodeList = custombuttons.palette.getElementsByTagName("toolbarbutton"); for (var i = 0; i < nodeList.length; i++) { if (nodeList[i].id.search("custombuttons-button") == 0 && document.getElementById(nodeList[i].id) == null) { var href = createURI(nodeList[i]); var src = nodeList[i].getAttribute("image"); var text = nodeList[i].getAttribute("name") || nodeList[i].getAttribute("label") || ""; if (!src) src = defaultFavicon; out.push('<li><a href="' + href + '"><img alt="" src="' + src + '">' + converter.ConvertFromUnicode(text) + '</a></li>'); } } var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "", fp.modeSave); fp.defaultString = aDate() + ".htm"; fp.appendFilters(fp.filterHTML); fp.appendFilters(fp.filterAll); if (fp.show() == fp.returnCancel) return; var stream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); stream.init(fp.file, 0x02|0x08|0x20, parseInt("666", 8), 0); var data = document.getElementById(this.id).getAttribute("Help"). replace("<ol>", new Date() + "\n" + "<ol>" + "\n" + out.join("\n")); stream.write(data, data.length); stream.close(); custombuttons.alertSlide("Все кнопки", "сохранены"); } function readFile(file) { var data = ""; var fstream = Cc["@mozilla.org/network/file-input-stream;1"]. createInstance(Ci.nsIFileInputStream); fstream.init(file, -1, 0, 0); var charset = "UTF-8"; const replacementChar = Ci.nsIConverterInputStream .DEFAULT_REPLACEMENT_CHARACTER; var is = Cc["@mozilla.org/intl/converter-input-stream;1"]. createInstance(Ci.nsIConverterInputStream); is.init(fstream, charset, 1024, replacementChar); var str = {}; while (is.readString(4096, str) != 0) { data += str.value; } is.close(); return data; } function stringToDOM(aString) { // https://developer.mozilla.org/en/Parsing_and_serializing_XML var parser = new DOMParser(); var dom = parser.parseFromString(aString, "text/xml"); if (dom.documentElement.nodeName == "parsererror") { return null; } else { return dom; } } function getCBOverlay() { var dirsvc = Cc["@mozilla.org/file/directory_service;1"]. getService(Ci.nsIProperties); var file = dirsvc.get("ProfD", Ci.nsIFile); file.append("custombuttons"); file.append("backup"); file.append("buttonsoverlay.xul.bak"); return file; } this.viewCBOverlay = function viewCBOverlay() { var fileURL = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService).getProtocolHandler("file"). QueryInterface(Ci.nsIFileProtocolHandler). getURLSpecFromFile(getCBOverlay()); gBrowser.selectedTab = gBrowser.addTab("view-source:" + fileURL); } function importXMLtoButton(aStrXMLData) { loadURI("custombutton://" + escape(aStrXMLData)); } this.importFromCBOverlay = function importFromCBOverlay(aTitle) { var id = custombuttons.promptBox(aTitle, "Введитете номер id кнопки:"); if (!id[1] || id[1] == "") return; id = "custombuttons-button" + id[1]; var dom = stringToDOM(readFile(getCBOverlay())); var button = dom.getElementById(id); if (!button) { custombuttons.alertBox(aTitle, "Копка Id " + id + " не найдена!"); return; } var cbName = button.getAttribute("cb-name") || button.getAttribute("label"); var cbImage = button.getAttribute("image") || button.getAttribute("cb-stdicon") || ""; var cbMode = button.getAttribute("mode") || ""; var cbInitCode = button.getAttribute("cb-init"); var cbCode = button.getAttribute("cb-oncommand"); var cbKey = button.getAttribute("accelkey") || ""; var cbHelp = button.getAttribute("Help") || ""; var cbAttr = button.getAttribute("attributes"); var cbXML = <custombutton xmlns:cb={cbNamespace}> <name>{cbName}</name> <image>{cbImage}</image> <mode>{cbMode}</mode> <initcode>{cbInitCode}</initcode> <code>{cbCode}</code> <accelkey>{cbKey}</accelkey> <help>{cbHelp}</help> <attributes>{cbAttr}</attributes> </custombutton>; var xml = "<?xml version='1.0' encoding='UTF-8'?>" + cbXML.toString(); //inspectDOMDocument(stringToDOM(xml)); importXMLtoButton(xml); } this.setAttribute("onclick", "custombuttons.gQuot.mHandler(event, this)");
Отсутствует
может предусмотреть какимто образом вставку сепаратора?
Я тут подумал, и если делать просто, прямо в лоб, то можешь так:
Нужно вставить нижепоследущий код. Варианты:
1. Если хочешь видеть этот пункт первым, то вставляй после
этой строки: button.appendChild(menupopup);
2. Если хочешь видеть этот пункт последним, то вставляй до
этой строки: return button; }
P.S. Насчет названия пункта меню - это добрая шутка, не обижайся, сам придумай
var menuitem = document.createElementNS(kXULNS, "menuitem"); menuitem.setAttribute("label", "С Е П А Р А Т О Р"); var separatorString = theSeparator.substring(1, theSeparator.length); menuitem.insertText = separatorString; menuitem.inserter = function inserter(aText) { place.value = part1 + aText + part2; place.selectionStart = place.selectionEnd = startPos + aText.length; place.focus(); } var commandString = "inserter(event.target.insertText)"; menuitem.setAttribute("oncommand", commandString); menupopup.appendChild(menuitem);
Отсутствует
Autocopy+3 на перестала копировать даже двойным кликом.
Проверил Autocopy+3 на nightly (FF 17.0a1) и у меня все работает
Ты используешь последнюю версию Autocopy+3 ?
В настройках кнопки все нужные функции включены ?
Что показывает консоль ошибок ?
Отсутствует
Проверил Autocopy+3 на nightly (FF 17.0a1) и у меня все работает
Ты используешь последнюю версию Autocopy+3 ?
В настройках кнопки все нужные функции включены ?
Что показывает консоль ошибок ?
Обновил кнопку, копирование по двойному клику заработало. Возможно при переезде на новый профиль действительно восстановил из резервной копии не последнюю версию кнопки. А вот копировать выделением всё равно не хочет. Консоль ошибок молчит
Отсутствует
Как сделать первый вариант без удвоения окон.
Я бы добавил поиск выделенного текста.
// Вызвать окно поиска по текущему сайту по правому клику на searchbar-engine-button ............... // настройка функций кликов мыши ................................................... var searchwindows = function(event) { // правым кликом на кнопке .... if ( event.button == 2) { // отключать реакцию по умолчанию event.preventDefault(); event.stopPropagation(); // создаем модальное окно для ввода текста .... var URL = custombuttons.promptBox('Поиск по сайту', 'Bведите текст ....', ''); var text = ([URL[1]].toString().length >0)? [URL[1]]: false; if (text == false) return; // поиск вашего текста по сайту .... text = escape (convertFromUnicode ("UTF-8", text)); var host = gBrowser.currentURI.host; url = encodeURIComponent (host); var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url; gBrowser.selectedTab = gBrowser.addTab(searchUrl); // gBrowser.loadOneTab(searchUrl, null, null, null, true, false); } }; // объявляем 'searchbar', 'searchButton' .... var searchbar = document.getElementById("searchbar"); var searchButton = document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-engine-button"); // удаление обработчика, при открытии настройки панелей this.onDestroy = function() { searchButton.removeEventListener("click", searchwindows, false); }; // добавляем обработчик для кнопки поиска .......... searchButton.addEventListener("click", searchwindows, false);
Также собрал (если кому интересно) с разных форумов в одну кнопку вариант расширения контекстного меню кнопок (лишнее можно выкинуть).
За это спасибо.
Отредактировано bunda1 (23-07-2012 23:21:27)
Отсутствует
bunda1 спасибо. Все работает отлично.
Отсутствует
Если ещё актуально, то вот новый, переосмысленный вариант
кнопки "или Вставить" для Stylish.
Изменения:
1. Теперь не "двоится", не плодит дубликаты (надеюсь...)
2. Для снятия ограничений по длине и количеству строк
и, имхо, для удобства и наглядности
пользовательские настройки перенесены на вкладку "Справка (H)".
Принцип использования изложен здесь
Напомню, сепаратор можно изменить в коде кнопки,
главное, чтобы он был уникален.
3. id CustomButton кнопки и id кнопки "или Вставить" ею создаваемой
теперь связаны общим номером.
Зачем: Вдруг кому-то понадобится в окошке Stylish вторая (третья,...)
кнопка "или Вставить" с другими пунктами и вставками.
Достаточно клонировать сабж и перезаполнить
вкладку Справка новыми пунктами.
Всем заинтересованным просьба оценить, достойна ли кнопка называться Готовой.
( UPD: Нет, эту не берите, "правильная" - далее, на следующей странице ! )
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%3EorPaste%20for%20Stylish%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20theSeparator%20%3D%20%22%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%22%3B%0A%20%20%20%20theSeparator%20%3D%20%22%5Cn%22%20+%20theSeparator%20+%20%22%5Cn%22%3B%0A%0Avar%20items%20%3D%20this.Help.split%28theSeparator%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.imageOn%20%20%3D%20%22data%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%22%3B%0A%0Athis.imageOff%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.image%20%3D%20this.imageOn%3B%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20cbIdNumber%20%3D%20this.id.replace%28%22custombuttons-button%22%2C%20%22%22%29%3B%0Avar%20insertButtonId%20%3D%20%22or-paste-by-cb%22%20+%20cbIdNumber%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%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.orPasteForStylish.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Afunction%20createButton%28aWindow%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20insertButtonId%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0438%u043B%u0438%20%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%29%3B%0A%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%20%20%20%20%20%0A%20%20%20%20%20aWindow.textStorage%20%3D%20%5B%5D%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i++%29%20%7B%0A%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%0A%20%20var%20%20%20%20%20%20label%20%3D%20items%5Bi%5D.split%28%22%5Cn%22%2C1%29%3B%0A%20%20var%20insertText%20%3D%20items%5Bi%5D.replace%28label%20+%20%22%5Cn%22%2C%20%22%22%29%3B%0A%20%20%0A%20%20%20%20%20%20%20aWindow.textStorage.push%28insertText%29%20%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20label%29%3B%0A%0A%0A%20%20var%20%20Arg%20%3D%20%22this.ownerDocument.defaultView.textStorage%5B%22%20+%20i%20+%20%22%5D%22%3B%0A%20%20var%20%20commandString%20%3D%20%22insertCodeAtCaret%28%22%20+%20Arg%20+%20%22%29%22%3B%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%20%7D%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20return%20button%3B%20%7D%0A%20%20%20%20%20%20%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Afunction%20isButtonAlredyPresent%28aDoc%29%20%7B%20//%20advice%20by%20Inforcatcher%0A%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%21%21aDoc.getElementById%28insertButtonId%29%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20return%3B%0A%0A%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%0A%20%20%20%20if%20%28%21isButtonAlredyPresent%28doc%29%29%20%7B%0A%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%20%7D%7D%7D%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7B%20if%20%28%20isButtonAlredyPresent%28doc%29%29%20%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28this.off%29%20%20%7B%20var%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20%28b%29%20%7B%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%20this.image%20%3D%20this.imageOff%3B%20return%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%20//%20thanks%20for%20Infocatcher%2C%20again%0A%20%20%20%20var%20on%20%3D%20%21this.off%3B%0A%20%20%20%20if%28on%29%20this.off%20%3D%20true%3B%0A%20%20%20%20this.run%28%29%3B%0A%20%20%20%20if%28on%29%20%7B%20this.off%20%3D%20false%3B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%28%21this.off%29%20this.image%20%3D%20this.imageOn%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20this.imageOff%3B%0A%0Athis.run%28%29%3B%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%21important%3B%0A%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Adisplay%3A%20none%20%21important%3B%0Adisplay%3A%20none%20%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Awidth%3A%20%0Awidth%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Afont-weight%3A%20%0Afont-weight%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0AREAD%20ME%20%21%21%21%0A%0A%u042D%u0442%u043E%20%u043F%u0440%u0438%u043C%u0435%u0440%20%u041C%u043D%u043E%u0433%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%20%u0438%20%u0414%u043B%u0438%u043D%u043D%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%0A%u043F%u043E%u0441%u043B%u0435%20%u043F%u0440%u043E%u0447%u0442%u0435%u043D%u0438%u044F%2C%20%u0438%u0441%u043F%u044B%u0442%u0430%u043D%u0438%u044F%20%u0438%20%u043E%u0441%u043E%u0437%u043D%u0430%u043D%u0438%u044F%20-%20%u0443%u0434%u0430%u043B%u0438%u0442%u0435%20%u0435%u0433%u043E%0A%28%u0430%20%u043F%u043E%u0441%u043A%u043E%u043B%u044C%u043A%u0443%20%u044D%u0442%u043E%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0438%u0439%20%u043F%u0443%u043D%u043A%u0442%2C%20%u0442%u043E%20%u0438%20%u0441%u0435%u043F%u0430%u0440%u0430%u0442%u043E%u0440%20%u043F%u0435%u0440%u0435%u0434%20%u043D%u0438%u043C%29%0A%0A%u041D%u0443%20%u0441%u0442%u0440%u043E%u043A%2C%20%u043A%u0430%u043A%20%u0412%u044B%20%u0432%u0438%u0434%u0438%u0442%u0435%20%u043C%u043D%u043E%u0433%u043E%2C%20%u0430%20%u0432%u043E%u0442%20%u0438%20%u0434%u043B%u0438%u043D%u043D%u0430%u044F%20%u0441%u0442%u0440%u043E%u043A%u0430%3A%0A%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%28%u044D%u0442%u043E%2C%20%u043A%u0441%u0442%u0430%u0442%u0438%2C%20%u0441%u0442%u0430%u0440%u0430%u044F%20%u0438%u043A%u043E%u043D%u043A%u0430%2C%20%u0431%u0435%u0437%20%u0434%u0443%u0440%u0430%u0446%u043A%u043E%u0439%20gif-%u0430%u043D%u0438%u043C%u0430%u0446%u0438%u0438.%0A%20%u0442%u043E%u0447%u043A%u0430%20%u0441%20%u0437%u0430%u043F%u044F%u0442%u043E%u0439%20%u0432%20%u043A%u043E%u043D%u0446%u0435%20%u0435%u0441%u0442%u044C.%29%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отредактировано SendAbuse (25-07-2012 08:21:27)
Отсутствует
Всем заинтересованным просьба оценить, достойна ли кнопка называться Готовой.
Всё отлично, кнопка не двоится. Редактировать пункты теперь удобно.
НО! Заметила такой косяк: при клонировании кнопки и создании в ней новых пунктов меню, выбираю пункт из новой кнопки, а вставляется тот, который в первой кнопке.
Вот так это выглядит:
Отредактировано Alfina (25-07-2012 04:54:47)
Отсутствует
выбираю пункт из новой кнопки, а вставляется тот, который в первой кнопке.
Да, точно, виноват
Огромное спасибо за оперативный ответ.
Вот вроде исправил:
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%3EorPaste%20for%20Stylish%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20theSeparator%20%3D%20%22%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%22%3B%0A%20%20%20%20theSeparator%20%3D%20%22%5Cn%22%20+%20theSeparator%20+%20%22%5Cn%22%3B%0A%0Avar%20items%20%3D%20this.Help.split%28theSeparator%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.imageOn%20%20%3D%20%22data%3Aimage/gif%3Bbase64%2CR0lGODlhEAAQAN0DABop/8f//5zj/////+D//xpP/4rQ/xxk/xo8/0KH/3vA/xpH/1Ka/xpb/3W8/5DZ/6Lp/xow/1lo/yZr/0yU/zN6/zB1/2uz/z+IzDyEx+Hh4TJB/4bM8B9m/4/W/4jO/5be/+j//670/y50/1ed/3G1/6rM/7bF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUsASgAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAGlUCAcEgsCgNIJORhAAiezyPyAFgcDoUIgBMFICeFB2FA1jAOXSTgQQYZIIMLWiBFkBmFBADRUHSFCGMGWVVQdE4CCx5kAwQGegZdTx8IDmNkBBCIQk8GEhURDQyXBZICEiYnBwkICQMhHRgZnAIbAwECDhMCjQVqm4yMASUkv08WDRQKyw4VFEm0dBcJIxZeSQFG2kRBACH5BAkZACgALAAAAAAQABAAAAY5QJRwSCwKBUgkMcBkHpVGoRMFjaKm1ShWYJUGusPm9zq2TqfmMVPUPZfBZDAUHZ2/i0nvnZrkwotBADs%3D%22%3B%0A%0Athis.imageOff%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/6Ojo//Hx8f/srKy/62trf+tra3/o6Oj/+vr6//r6+v/6+vr/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/62trf+jo6P/uLi4/8zMzP/MzMz/zMzM/8nJyf+tra3/uLi4/+vr6//r6+v/6+vr/6Ojo/+jo6P/2dnZ/9nZ2f+jo6P/////////////////////////////////6+vr/8fHx/+9vb3/6+vr/+vr6/+jo6P/o6Oj/9nZ2f/Z2dn/ra2t///////r6+v/2dnZ/8fHx/+oqKj/2dnZ///////19fX/o6Oj/+vr6//r6+v/o6Oj/6Ojo//Z2dn/2dnZ/729vf/e3t7/4+Pj/6Ojo/+1tbX/o6Oj/7W1tf//////9/f3/6ampv+Hh4f/gICA/6Ojo/+jo6P/2dnZ/9nZ2f/R0dH/vb29/62trf+jo6P/o6Oj/729vf/19fX///////////+jo6P/2dnZ/9nZ2f+jo6P/o6Oj/9nZ2f/Z2dn/0dHR/6Ojo//Jycn/9fX1//////////////////X19f/b29v/o6Oj/9nZ2f/Z2dn/o6Oj/6Ojo//Z2dn/2dnZ/6Ojo//U1NT/////////////////9fX1/9HR0f+1tbX/o6Oj/9TU1P/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/9fX1///////R0dH/o6Oj/6Ojo/+jo6P/o6Oj/9nZ2f/Z2dn/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/o6Oj////////////urq6/6Ojo/+1tbX/o6Oj/6Ojo/+jo6P/zMzM/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/6Ojo//W1tb////////////W1tb/0dHR/9vb2///////xMTE/6ampv/Z2dn/2dnZ/6Ojo/+jo6P/6+vr/+vr6/+oqKj/o6Oj/9bW1v/19fX/////////////////4ODg/7q6uv+mpqb/2dnZ/9nZ2f+jo6P/o6Oj/+vr6//r6+v/6+vr/6ampv+jo6P/o6Oj/6ampv+mpqb/o6Oj/6Ojo/+jo6P/xMTE/9nZ2f/Z2dn/o6Oj/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2//U1NT/0dHR/6Ojo//Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%0Athis.image%20%3D%20this.imageOn%3B%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20cbIdNumber%20%3D%20this.id.replace%28%22custombuttons-button%22%2C%20%22%22%29%3B%0Avar%20insertButtonId%20%3D%20%22or-paste-by-cb%22%20+%20cbIdNumber%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%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.orPasteForStylish.%22%29%3B%0Atry%20%20%20%20%20%20%7B%20var%20pref%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%20%7D%0Acatch%28e%29%20%7B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%3B%0Athis.off%20%3D%20prefs.getBoolPref%28%22off%22%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0Afunction%20createButton%28aWindow%29%20%7B%0A%0Avar%20%20button%20%3D%20document.createElementNS%28kXULNS%2C%20%22button%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22id%22%2C%20insertButtonId%29%3B%0A%20%20%20%20%20button.setAttribute%28%22type%22%2C%20%22menu%22%29%3B%0A%20%20%20%20%20button.setAttribute%28%22label%22%2C%20%22%u0438%u043B%u0438%20%u0412%u0441%u0442%u0430%u0432%u0438%u0442%u044C%22%29%3B%0A%0Avar%20%20menupopup%20%3D%20document.createElementNS%28kXULNS%2C%20%22menupopup%22%29%3B%0A%20%20%20%20%20button.appendChild%28menupopup%29%3B%0A%20%20%20%20%20%0Avar%20%20str%20%3D%20%22aWindow.textStorage%22%20+%20cbIdNumber%20+%20%20%22%20%3D%20%5B%5D%3B%22%3B%0A%20%20%20%20%20eval%28str%29%3B%0A%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20items.length%3B%20i++%29%20%7B%0A%0A%20%20var%20%20menuitem%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%0A%20%20var%20%20%20%20%20%20label%20%3D%20items%5Bi%5D.split%28%22%5Cn%22%2C1%29%3B%0A%20%20var%20insertText%20%3D%20items%5Bi%5D.replace%28label%20+%20%22%5Cn%22%2C%20%22%22%29%3B%0A%20%20%0A%20%20%20%20%20%20%20str%20%3D%20%22aWindow.textStorage%22%20+%20cbIdNumber%20+%20%22.push%28insertText%29%22%3B%0A%20%20%20%20%20%20%20eval%28str%29%3B%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20label%29%3B%0A%0A%0A%20%20var%20%20Arg%20%3D%20%22this.ownerDocument.defaultView%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%22.textStorage%22%20+%20cbIdNumber%20+%20%22%5B%22%20+%20i%20+%20%22%5D%22%3B%0A%20%20var%20%20commandString%20%3D%20%22insertCodeAtCaret%28%22%20+%20Arg%20+%20%22%29%22%3B%0A%20%20%0A%20%20%20%20%20%20%20menuitem.setAttribute%28%22oncommand%22%2C%20commandString%29%3B%0A%20%20%20%20%20%20%20menupopup.appendChild%28menuitem%29%3B%20%7D%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20return%20button%3B%20%7D%0A%20%20%20%20%20%20%20%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Afunction%20isButtonAlredyPresent%28aDoc%29%20%7B%20//%20advice%20by%20Inforcatcher%0A%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%21%21aDoc.getElementById%28insertButtonId%29%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0A%0Avar%20observer%20%3D%20%7B%20//%20thanks%20for%20Infocatcher%0A%0Aobserve%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%20%7D%2C%0A%20%20%20%20%20%20%0AhandleEvent%3A%20function%28e%29%20%7B%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20return%3B%0A%0A%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%0A%20%20%20%20if%20%28%21isButtonAlredyPresent%28doc%29%29%20%7B%0A%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%20%7D%7D%7D%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%0Avar%20activeWin%20%3D%20null%3B%20%20%20%20%20%20%20%20%20%0Athis.onmouseover%20%3D%20function%28%29%20%7B%20activeWin%20%3D%20ww.activeWindow%3B%20%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.run%20%3D%20function%28%29%20%7B%20%0A%0A%20%20if%20%28%21this.off%29%20%20%7B%20oSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20if%20%28this.off%20%29%20%20%7B%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prefs.setBoolPref%28%22off%22%2C%20true%29%3B%20%7D%0A%20%20%20%0A%20%20var%20enumerator%20%3D%20ww.getWindowEnumerator%28%29%3B%0A%20%20var%20win%20%3D%20true%3B%0A%20%20while%20%28win%29%20%7B%20win%20%3D%20enumerator.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21win%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20doc%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28doc.location.href%20%21%3D%20%22chrome%3A//stylish/content/edit.xul%22%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21this.off%29%20%7B%20if%20%28%20isButtonAlredyPresent%28doc%29%29%20%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20hbox%20%3D%20doc.getElementById%28%22editor-tools%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20btn%20%3D%20hbox.firstChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hbox.insertBefore%28createButton%28win%29%2C%20btn.nextElementSibling%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28this.off%29%20%20%7B%20var%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20%28b%29%20%7B%20b%20%3D%20doc.getElementById%28insertButtonId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28b%29%20%7B%20b.parentElement.removeChild%28b%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28win%20%3D%3D%20activeWin%29%20win.focus%28%29%3B%20%20%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%7D%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aif%20%28this.off%29%20%7B%20this.image%20%3D%20this.imageOff%3B%20return%3B%20%7D%0A%0Athis.run%28%29%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%20//%20thanks%20for%20Infocatcher%2C%20again%0A%20%20%20%20var%20on%20%3D%20%21this.off%3B%0A%20%20%20%20if%28on%29%20this.off%20%3D%20true%3B%0A%20%20%20%20this.run%28%29%3B%0A%20%20%20%20if%28on%29%20%7B%20this.off%20%3D%20false%3B%20prefs.setBoolPref%28%22off%22%2C%20false%29%3B%20%7D%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.off%20%3D%20%21this.off%3B%0A%0Aif%20%28%21this.off%29%20this.image%20%3D%20this.imageOn%3B%0A%0Aif%20%20%28this.off%29%20this.image%20%3D%20this.imageOff%3B%0A%0Athis.run%28%29%3B%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%21important%3B%0A%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Adisplay%3A%20none%20%21important%3B%0Adisplay%3A%20none%20%21important%3B%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Awidth%3A%20%0Awidth%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0Afont-weight%3A%20%0Afont-weight%3A%20%0A%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%u25BA%0AREAD%20ME%20%21%21%21%0A%0A%u042D%u0442%u043E%20%u043F%u0440%u0438%u043C%u0435%u0440%20%u041C%u043D%u043E%u0433%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%20%u0438%20%u0414%u043B%u0438%u043D%u043D%u043E-%u0441%u0442%u0440%u043E%u0447%u043D%u043E%u0441%u0442%u0438%0A%u043F%u043E%u0441%u043B%u0435%20%u043F%u0440%u043E%u0447%u0442%u0435%u043D%u0438%u044F%2C%20%u0438%u0441%u043F%u044B%u0442%u0430%u043D%u0438%u044F%20%u0438%20%u043E%u0441%u043E%u0437%u043D%u0430%u043D%u0438%u044F%20-%20%u0443%u0434%u0430%u043B%u0438%u0442%u0435%20%u0435%u0433%u043E%0A%28%u0430%20%u043F%u043E%u0441%u043A%u043E%u043B%u044C%u043A%u0443%20%u044D%u0442%u043E%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0438%u0439%20%u043F%u0443%u043D%u043A%u0442%2C%20%u0442%u043E%20%u0438%20%u0441%u0435%u043F%u0430%u0440%u0430%u0442%u043E%u0440%20%u043F%u0435%u0440%u0435%u0434%20%u043D%u0438%u043C%29%0A%0A%u041D%u0443%20%u0441%u0442%u0440%u043E%u043A%2C%20%u043A%u0430%u043A%20%u0412%u044B%20%u0432%u0438%u0434%u0438%u0442%u0435%20%u043C%u043D%u043E%u0433%u043E%2C%20%u0430%20%u0432%u043E%u0442%20%u0438%20%u0434%u043B%u0438%u043D%u043D%u0430%u044F%20%u0441%u0442%u0440%u043E%u043A%u0430%3A%0A%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka///jnP//45z//+Oc//8pGv//tG7//4ZA//90Lv//dTD//yka////x////8f////H////x////8f//yka//8pGv//45z//+Oc//91MP//Vxr//5RM///Bev//wXr//8F6//+8df//ejP//5JK////x////8f////H//8pGv//KRr//+Oc///jnP//KRr////////////////////////////////////H//+0bv//nVf////H////x///KRr//yka///jnP//45z//0Ey/////////8b//+Oc//+1cf//ayb//+Oc/////////+X//1Ma////x////8f//yka//8pGv//45z//+Oc//9oWf//zKr//8W2//9eGv//h0L//zwa//+HQv/////////o//9mH//MiD//x4Q8//8pGv//KRr//+Oc///jnP//0Ir//2hZ//96M///NBr//14a//+bVP///+D/////////////Uxr//+Oc///jnP//KRr//yka///jnP//45z//86I//88Gv//vHX////g////////////////////4P//6KL//yka///jnP//45z//yka//8pGv//45z//+Oc//9EGv//1o/////////////////////g///TjP//h0L//yka///Vj///45z//+Oc//8pGv//KRr//yka//8pGv//PBr////l////////0Ir//1Ma//8tGv//KRr//0Aa///jnP//45z//+Oc///jnP//KRr//yka////x////8f//zwa/////f///////5pS//9PGv//h0L//yka//88Gv//Wxr//8B7///jnP//45z//yka//8pGv///8f////H//8pGv//3pb/////////////3pb//9CK///qo////////7Nr//9kHP//45z//+Oc//8pGv//KRr////H////x///ayb//0ca///elv///+D/////////////////4eHh//+aUv//ZBz//+Oc///jnP//KRr//yka////x////8f////H//9kHP//KRr//0ca//9mH///ZBz//08a//8wGv//KRr/8MyG///jnP//45z//yka//8pGv///8f////H////x////8f////H///pov//2ZD//9CK//8pGv//45z//+Oc///jnP//45z//+Oc//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr//yka//8pGv//KRr/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%28%u044D%u0442%u043E%2C%20%u043A%u0441%u0442%u0430%u0442%u0438%2C%20%u0441%u0442%u0430%u0440%u0430%u044F%20%u0438%u043A%u043E%u043D%u043A%u0430%2C%20%u0431%u0435%u0437%20%u0434%u0443%u0440%u0430%u0446%u043A%u043E%u0439%20gif-%u0430%u043D%u0438%u043C%u0430%u0446%u0438%u0438.%0A%20%u0442%u043E%u0447%u043A%u0430%20%u0441%20%u0437%u0430%u043F%u044F%u0442%u043E%u0439%20%u0432%20%u043A%u043E%u043D%u0446%u0435%20%u0435%u0441%u0442%u044C.%29%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует
Вот вроде исправил:
=>
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует