рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рдЙрдирдХреЗ рдкрд╕рдВрджреАрджрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдЖрдк рдШреБрдЯрдиреЗ рдкрд░ рдПрдлрдПрдл 4 рдХреЛ рдХреИрд╕реЗ рд╕рд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдирд╛ рдХрдИ рдмрд╛рд░ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реБрдЦрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрд╢рд╛ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдПрдордбреАрдПрди рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреЛрдиреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреИрд╕реЗ рдмрд┐рдЦрд░реЗ рд╣реБрдП рд╣реИрдВ, рдореИрдВ рдпрд╛ рддреЛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдирд╣реАрдВ рдкрд╛ рд╕рдХрд╛ ... рд╕рднреА рдЙрддреНрдкрдиреНрди (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рдореЗрдВ) рдкреНрд░рдзрд╛рди - рдиреЗ рдЗрд╕ рдорд┐рдердХ рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдЧреБрд░реБ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реИред рдпрд╣ рдорд┐рдердХ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА рдХреЛ рд╕рд╣реА рдХрд░реЗрдЧрд╛, рдорджрдж рдХреЗ рд▓рд┐рдП
рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлрд░ рд╕реЗрд╡рд╛ рдХреА рдУрд░ред

рдХрдо рд╢реБрд░реБрдЖрдд
рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдПрдлрдПрдл 4 рдореЗрдВ рд╣реА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдореЛрдЬрд╝рд┐рд▓рд╛ рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдлреЙрд░реНрдо
appversion>=4.0
рдХреЗ
рдЕрдиреБрд╢рдВрд╕рд┐рдд рдиреВрдбрд▓реНрд╕ рд▓рд┐рдЦрдирд╛ред
So.
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдХрдВрдХрд╛рд▓ рдмрдирд╛рдПрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдорд╛рд░рд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрд╛, рдЗрд╕рд▓рд┐рдП рдмрд╕
рдорджрдж рдорд╛рдБрдЧреЗрдВ ред рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЛрд▓реНрдб рдореЗрдВ рднрд░рддреЗ рд╣реИрдВ - рдФрд░ рд╕рдорд╛рдкреНрдд рдХрдВрдХрд╛рд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╕реЗрдЯрдЕрдк рдбрд╛рдпрд▓реЙрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЪреБрдирд╛, рдЯреВрд▓рдмрд╛рд░ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрдЯрди рдХреЗ рд╕рд╛рдеред рдпрд╣рд╛рдБ рдЬрдирд░реЗрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ:

рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдЗрдХрди рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рдо рдХрд░реЗрдЧреА (рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА
skin
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ)ред рддреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрдЯрди рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдФрд░
/chrome/locale/en-US/overlay.dtd
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЯреВрд▓рдЯрд┐рдк рдХреЛ рдареАрдХ рдХрд░реЗрдВрдЧреЗ:
<!ENTITY typographToolbarButton.label "Typo!"> <!ENTITY typographToolbarButton.tooltip "Proceed typography of selected text against Lebedev's tool">
рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдЖрдЗрдХрди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд░реЛрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
pushd chrome/skin && mv favicon.png toolbar-button.png && popd
рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рджрдмрд╛рдиреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред
рдХреБрдЫ рдХреЛрдб
рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдпрджрд┐ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ (
textarea
) рдореЗрдВ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкрд╛рда рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╡рд╣рд╛рдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЯрд╛рдЗрдк
textarea
ред рдпрджрд┐ рдкрд╛рда рдЪрдпрдирд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдзреНрдпрд╛рди рдХрд╣реАрдВ рдФрд░ рд╣реИ - рд╣рдо рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ :-)ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП (рдпрд╣ рд╕рдмрд╕реЗ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ)ред
рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рд╕рднреА рд╕рдВрдкрд╛рджрди
/chrome/content/overlay.js
рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВрдЧреЗред
рдореИрдВрдиреЗ рдЗрд╕ рдЬрд╛рджреВ рдХреЛ рдХрд╣реАрдВ рдХрд╣реАрдВ
MDN рдХреЗ рдХрдЯреЛрд░реЗ рдореЗрдВ рдЦреЛрджрд╛:
var getClipboard = function (flavor) { if (!flavor || flavor == "") flavor = "text/unicode"; var trans = Components.classes["@mozilla.org/widget/transferable;1"] .createInstance(Components.interfaces.nsITransferable); var clip = Components.classes["@mozilla.org/widget/clipboard;1"] .getService(Components.interfaces.nsIClipboard); if (!clip || !trans) return ''; trans.addDataFlavor(flavor); clip.getData(trans, clip.kGlobalClipboard); var str = new Object(); var strLength = new Object(); try { trans.getTransferData(flavor, str, strLength); if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString); } catch (e) {
рд╣рдо рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА, рдпрд╛ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд▓рдЧрддрд╛ рд╣реИ рдпрд╣рд╛рдБ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред
рд╣рдореЗрдВ рдЗрдирдкреБрдЯ рдлрд╝реЛрдХрд╕ рдХреЛ рднреА рдкрдХрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ (рдпрд╣ рдХреЛрдб, рдЗрд╕рдХреА рддреБрдЪреНрдЫрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛)ред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкрд╛рда рдХреЛ рдореБрджреНрд░рдг рд╕реЗрд╡рд╛ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
typo : function () { var focused = document.commandDispatcher.focusedElement; if (!focused || focused.tagName.toLowerCase() != 'textarea') { return; } if (focused.selectionStart != focused.selectionEnd ) { text = focused.value.substring(focused.selectionStart, focused.selectionEnd); } else { text = getClipboard(); } text = text.replace (/&/g, '&'); text = text.replace (/</g, '<'); text = text.replace (/>/g, '>'); var xmlRequest = '<?xml version="1.0" encoding="UTF-8"?>' + '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' + 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' + '<soap:Body>' + '<ProcessText xmlns="http://typograf.artlebedev.ru/webservices/">' + '<text>' + text + '</text>' + '<entityType>' + 3 + '</entityType>' + '<useBr>' + 0 + '</useBr>' + '<useP>' + 0 + '</useP>' + '</ProcessText>' + '</soap:Body>' + '</soap:Envelope>'; var req = new XMLHttpRequest(); req.open('POST', 'http://typograf.artlebedev.ru/webservices/typograf.asmx', true); req.onreadystatechange = function (aEvt) { if (req.readyState == 4) { if (req.status == 200) { var response = req.responseText; var re = /<ProcessTextResult>\s*((.|\n)*?)\s*<\/ProcessTextResult>/m; response = re.exec (response); response = RegExp.$1; response = response.replace (/>/g, '>'); response = response.replace (/</g, '<'); response = response.replace (/&/g, '&'); insertText(response, focused); } else {
рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред рдпрд╣ рдмрдЯрди рджрдмрд╛рдП рдЧрдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗ
typo
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ:
onToolbarButtonCommand: function(e) { typograph.typo(); }
рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рдХрдмрд╛рдбрд╝ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкреИрдХ рдХрд░реЗрдВ:
рд╕рдВрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╡рд┐рд╕реНрддрд╛рд░
рд▓реЛрдЧреЛрдВ рдкрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред XPI рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЬрд╝рд┐рдк рд╕реЗ рдЕрдирдЬрд╝рд┐рдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рд╕реНрд╡рдпрдВ рдЕрдВрджрд░ рд╣реЛрдЧрд╛ред