рдХрдВрдЧреЛ - рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐

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

рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:




рдЕрдкрдиреЗ рдХрд╛рдВрдЧреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА

рдХрдВрдЧреЛ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
  1. рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг 2.7 рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ( http://www.python.org/download/ )
  2. рд▓рд┐рдВрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВред

рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ

рдбрд┐рд╕реНрдХ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ kango.py рдЪрд▓рд╛рдПрдБ
d:\dev\kango\kango.py create 
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, Gmail рдЪреЗрдХрд░ рджрд░реНрдЬ рдХрд░реЗрдВред
рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдирд╛рдо рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдЖрдо \ extension_info.json рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬреАрдореЗрд▓ рдЪреЗрдХрд░ рд▓рд┐рдЦрдирд╛

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдордп-рд╕рдордп рдкрд░ рдЬреАрдореЗрд▓ рдкрд░ рдЕрдкрдард┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдмрдЯрди рдкрд░ рдЗрд╕ рдирдВрдмрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, src \ common рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдБ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ main.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрд░реЛрдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реА рдмрди рдЪреБрдХрд╛ рд╣реИред

рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ


рд╣рдо рдпреВрдЖрдИ рдореЙрдбреНрдпреВрд▓ рдХреА рддрддреНрдкрд░рддрд╛ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рджреГрд╢реНрдп рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдмрдЯрдиред
 kango.ui.addEventListener(kango.ui.event.Ready, function() { return new MyExtension(); }); 

рдмрд┐рдирд╛ рдкрдврд╝реЗ рдИрдореЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рдЕрдкрдард┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдЯрдо 0.3 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ https://mail.google.com/mail/feed/atom рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд░реНрддрдорд╛рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬреАрдореЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред

AJAX рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП, kango.xhr.send рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

 var details = { url: 'https://mail.google.com/mail/feed/atom', method: 'GET', async: true, contentType: 'xml' }; kango.xhr.send(details, function(data) { if(data.status == 200) { var doc = data.response; var count = doc.getElementsByTagName('fullcount')[0].childNodes[0].nodeValue; } }); 

рдмрдЯрди рдкрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ

рдмрдЯрди рдЧреБрдг kango.ui.browserButton рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

 _setUnreadCount: function(count) { kango.ui.browserButton.setTooltipText('Unread count: ' + count); kango.ui.browserButton.setIcon('icons/icon16.png'); kango.ui.browserButton.setBadge((count != 0) ? {text: count} : null); } 

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛

рдПрдХ рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдЗрд╕ рдХреЛрдб рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓реЗрдЧрд╛:
 function GmailChecker() { var self = this; self.refresh(); kango.ui.browserButton.addEventListener(kango.ui.browserButton.event.Command, function() { self.refresh(); }); window.setInterval(function(){self.refresh()}, self._refreshTimeout); } GmailChecker.prototype = { _refreshTimeout: 60*1000*15, // 15 minutes _feedUrl: 'https://mail.google.com/mail/feed/atom', _setOffline: function() { kango.ui.browserButton.setTooltipText('Offline'); kango.ui.browserButton.setIcon('icons/icon16_gray.png'); kango.ui.browserButton.setBadge(null); }, _setUnreadCount: function(count) { kango.ui.browserButton.setTooltipText('Unread count: ' + count); kango.ui.browserButton.setIcon('icons/icon16.png'); kango.ui.browserButton.setBadge((count != 0) ? {text: count} : null); }, refresh: function() { var details = { url: this._feedUrl, method: 'GET', async: true, contentType: 'xml' }; var self = this; kango.xhr.send(details, function(data) { if(data.status == 200) { var doc = data.response; var count = doc.getElementsByTagName('fullcount')[0].childNodes[0].nodeValue; self._setUnreadCount(count); } else { // something went wrong self._setOffline(); } }); } }; kango.ui.addEventListener(kango.ui.event.Ready, function() { return new GmailChecker(); }); 

рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреБрд▓ 50 рд▓рд╛рдЗрдиреЗрдВ, рдЬреЛ рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░реЗрдВрдЧреАред

рдорд╛рдЙрд╕

рд╕рд╛рдорд╛рдиреНрдп / рдЖрдЗрдХрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдЖрдкрдХреЛ PNG рдЖрдЗрдХрди рдХреЛ icon16.png, icon32.png, icon48.png, icon128.png рдХреЗ рд╕рд╛рде рдХреНрд░рдорд╢рдГ 16x16, 32x32, 48x48, 128x128 рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде icon16_gray.png рдЖрдЗрдХрди рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓реА

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдб рддрд░реНрдХ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдкрде рдХреЗ рд╕рд╛рде kango.py рдЪрд▓рд╛рдПрдБ
 d:\dev\kango\kango.py build ./ 

Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Windows рдХреЗ рд▓рд┐рдП Google Chrome, рдпрд╛ Linux рдХреЗ рд▓рд┐рдП рдХреНрд░реЛрдорд┐рдпрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдЙрдЯрдкреБрдЯ gmailchecker_0.1.0.xpi рдФрд░ gmailchecker_0.1.0.crx рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред Chrome рдХреЗ рд▓рд┐рдП, рдПрдХ gmailchecker.pem рдлрд╝рд╛рдЗрд▓ рднреА рдЬреЗрдирд░реЗрдЯ рдХреА рдЬрд╛рдПрдЧреА рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЖрдЧреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг

рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреАрдЖрдИ рдмрдВрдж рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рд╣реИрдВ рдФрд░ рдЬрд▓реНрдж рд╣реА рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА (рдбреЛрдо рддрдХ рдкреВрд░реНрдг рдкрд╣реБрдВрдЪ) рдФрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдкреЙрдк-рдЕрдк HTML рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред

рд╕рдВрджрд░реНрдн

Source: https://habr.com/ru/post/In120430/


All Articles