{"id":205698,"date":"2013-12-12T12:36:02","date_gmt":"2013-12-12T08:36:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=205698"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=205698","title":{"rendered":"<span class=\"post_title\">\u041f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0438\u0437 Chrome \u0432 Firefox<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 (clip2net, gyazo, \u0438 \u0442.\u0434.), \u043d\u043e \u043d\u0435\u0442 opensource-\u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u0434 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0432 jira). \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (Chrome, Firefox), \u044d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. <\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/946\/ff7\/b49\/946ff7b497b73417b155b96d3e93eb85.jpg\"\/><\/p>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u0415\u0441\u043b\u0438 \u0434\u043b\u044f Chrome \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u00ab<a href=\"http:\/\/gc.codehum.com\/p\/chrome-screen-capture\/\">chrome-screen-capture<\/a>\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0432, \u0442\u043e \u0434\u043b\u044f Firefox \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0435\u0442. \u0414\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u044b \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434 Firefox \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 chrome-screen-capture.<\/p>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f Firefox \u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0435\u0441\u0442\u044c \u043d\u0430 <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Building_an_Extension\">\u0441\u0430\u0439\u0442\u0435 Mozilla<\/a>. <\/p>\n<p>  \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438:<\/p>\n<h3>Firefox XUL vs Chrome HTML<\/h3>\n<p>  \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c: \u0432\u0441\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f Firefox \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 XUL, \u0430 \u0432 Chrome \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 HTML.<\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u00ab\u0417\u0430\u0445\u0432\u0430\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\u00bb:<br \/>   <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/bb7\/ac4\/067\/bb7ac406707fbc58ae03b88cdc131596.jpg\"\/><\/p>\n<p>  HTML:  <\/p>\n<pre><code class=\"html\">&lt;div id=&quot;sc_drag_area_protector&quot;&gt;     &lt;div id=&quot;sc_drag_shadow_top&quot; style=&quot;height: 56px; width: 766px;&quot;&gt;&lt;\/div&gt;     &lt;div id=&quot;sc_drag_shadow_bottom&quot; style=&quot;height: 205px; width: 765px;&quot;&gt;&lt;\/div&gt;     &lt;div id=&quot;sc_drag_shadow_left&quot; style=&quot;height: 356px; width: 515px;&quot;&gt;&lt;\/div&gt;     &lt;div id=&quot;sc_drag_shadow_right&quot; style=&quot;height: 207px; width: 514px;&quot;&gt;&lt;\/div&gt;     &lt;div id=&quot;sc_drag_area&quot; style=&quot;left: 515px; top: 56px; width: 250px; height: 150px;&quot;&gt;         &lt;div id=&quot;sc_drag_container&quot;&gt;&lt;\/div&gt;         &lt;div id=&quot;sc_drag_size&quot;&gt;0 x 0&lt;\/div&gt;         &lt;div id=&quot;sc_drag_cancel&quot;&gt;\u041e\u0442\u043c\u0435\u043d\u0430&lt;\/div&gt;         &lt;div id=&quot;sc_drag_crop&quot;&gt;OK&lt;\/div&gt;         &lt;div id=&quot;sc_drag_north_west&quot;&gt;&lt;\/div&gt;         &lt;div id=&quot;sc_drag_north_east&quot;&gt;&lt;\/div&gt;         &lt;div id=&quot;sc_drag_south_east&quot;&gt;&lt;\/div&gt;         &lt;div id=&quot;sc_drag_south_west&quot;&gt;&lt;\/div&gt;     &lt;\/div&gt; &lt;\/div&gt; <\/code><\/pre>\n<p>  XUL:  <\/p>\n<pre><code class=\"html\">&lt;box id=&quot;sc_drag_area_protector&quot;&gt;     &lt;box id=&quot;sc_drag_shadow_top&quot; style=&quot;height: 167px; width: 766px;&quot;&gt;&lt;\/box&gt;     &lt;box id=&quot;sc_drag_shadow_bottom&quot; style=&quot;height: 130px; width: 765px;&quot;&gt;&lt;\/box&gt;     &lt;box id=&quot;sc_drag_shadow_left&quot; style=&quot;height: 281px; width: 515px;&quot;&gt;&lt;\/box&gt;     &lt;box id=&quot;sc_drag_shadow_right&quot; style=&quot;height: 318px; width: 514px;&quot;&gt;&lt;\/box&gt;     &lt;box id=&quot;sc_drag_area&quot; style=&quot;left: 515px; top: 167px; width: 250px; height: 150px;&quot;&gt;         &lt;box id=&quot;sc_drag_container&quot;&gt;&lt;\/box&gt;         &lt;box id=&quot;sc_drag_size&quot;&gt;0 x 0&lt;\/box&gt;         &lt;box id=&quot;sc_drag_cancel&quot;&gt;\u041e\u0442\u043c\u0435\u043d\u0430&lt;\/box&gt;         &lt;box id=&quot;sc_drag_crop&quot;&gt;OK&lt;\/box&gt;         &lt;box id=&quot;sc_drag_north_west&quot;&gt;&lt;\/box&gt;         &lt;box id=&quot;sc_drag_north_east&quot;&gt;&lt;\/box&gt;         &lt;box id=&quot;sc_drag_south_east&quot;&gt;&lt;\/box&gt;         &lt;box id=&quot;sc_drag_south_west&quot;&gt;&lt;\/box&gt;     &lt;\/box&gt; &lt;\/box&gt; <\/code><\/pre>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b. \u0418 \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0435\u043d\u044e:<br \/>   <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/16c\/7cd\/1b4\/16c7cd1b47215a78e4672705d5a0093f.jpg\"\/><\/p>\n<p>  \u0412 Chrome \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0437 manifest:  <\/p>\n<pre><code class=\"html\">&quot;browser_action&quot;: {     &quot;default_icon&quot;: &quot;images\/icon_19.png&quot;,     &quot;default_title&quot;: &quot;\u0417\u0430\u0445\u0432\u0430\u0442 \u044d\u043a\u0440\u0430\u043d\u0430&quot;,     &quot;default_popup&quot;: &quot;popup.html&quot; } <\/code><\/pre>\n<p>  \u0412 popup.html \u0443\u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043c\u0435\u043d\u044e. \u0412 Firefox \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 XUL:  <\/p>\n<pre><code class=\"html\">&lt;toolbarpalette id=&quot;BrowserToolbarPalette&quot;&gt;      &lt;toolbarbutton id=&quot;poputchikScreen&quot; type=&quot;menu-button&quot; label=&quot;Screenshot&quot; class=&quot;toolbarbutton-1&quot; oncommand=&quot;screenshot.screen.lastAction(); event.stopPropagation();&quot; image=&quot;chrome:\/\/screenshot\/skin\/img\/icon.png&quot;&gt;         &lt;menupopup&gt;             &lt;menuitem label=&quot;\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0437\u0430\u0445\u0432\u0430\u0442\u0430&quot; image=&quot;chrome:\/\/screenshot\/skin\/img\/custom.png&quot; oncommand=&quot;screenshot.screen.captureArea(); event.stopPropagation();&quot; class=&quot;menuitem-iconic&quot;\/&gt;             &lt;menuitem label=&quot;\u0417\u0430\u0445\u0432\u0430\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u0438&quot; image=&quot;chrome:\/\/screenshot\/skin\/img\/screen.png&quot; oncommand=&quot;screenshot.screen.captureWindow(); event.stopPropagation();&quot; class=&quot;menuitem-iconic&quot;\/&gt;             &lt;menuitem label=&quot;\u0417\u0430\u0445\u0432\u0430\u0442 \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b&quot; image=&quot;chrome:\/\/screenshot\/skin\/img\/whole.png&quot; oncommand=&quot;screenshot.screen.captureWebpage(); event.stopPropagation();&quot; class=&quot;menuitem-iconic&quot;\/&gt;         &lt;\/menupopup&gt;      &lt;\/toolbarbutton&gt; &lt;\/toolbarpalette&gt; <\/code><\/pre>\n<h3>LocalStorage<\/h3>\n<p>  \u0412 Firefox \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c localstorage, \u0430 \u0432 chrome-screen-capture \u043e\u043d \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 sqlite, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u043e\u043b\u0438\u0444\u0438\u043b <a href=\"https:\/\/github.com\/kirill09\/firefox-screen-capture\/blob\/master\/chrome\/content\/screenshot\/localStorage.js\">localStorage.js<\/a>:   <\/p>\n<pre><code class=\"javascript\">Object.defineProperty(window, &quot;localStorage&quot;, new (function () {     var aKeys = [], oStorage = {};     Object.defineProperty(oStorage, &quot;getItem&quot;, {       value: function (sKey) {            return sqliteStorage.getItem(escape(sKey));       },       writable: false,       configurable: false,       enumerable: false     });     Object.defineProperty(oStorage, &quot;key&quot;, {       value: function (nKeyId) { return aKeys[nKeyId]; },       writable: false,       configurable: false,       enumerable: false     });     Object.defineProperty(oStorage, &quot;setItem&quot;, {       value: function (sKey, sValue) {         if(!sKey) { return; }         sqliteStorage.setItem(escape(sKey), escape(sValue));       },       writable: false,       configurable: false,       enumerable: false     });     Object.defineProperty(oStorage, &quot;length&quot;, {       get: function () { return aKeys.length; },       configurable: false,       enumerable: false     });     Object.defineProperty(oStorage, &quot;removeItem&quot;, {       value: function (sKey) {         if(!sKey) { return; }         sqliteStorage.removeItem(escape(sKey));       },       writable: false,       configurable: false,       enumerable: false     });     this.get = function () {       var iThisIndx;       for (var sKey in oStorage) {         iThisIndx = aKeys.indexOf(sKey);         if (iThisIndx === -1) {              oStorage.setItem(sKey, oStorage[sKey]);          } else {              aKeys.splice(iThisIndx, 1);          }         delete oStorage[sKey];       }       for (aKeys; aKeys.length &gt; 0; aKeys.splice(0, 1)) { oStorage.removeItem(aKeys[0]); }       var aCouples = sqliteStorage.getAllItems();       for (var iKey in aCouples) {          iKey = unescape(iKey);          oStorage[iKey] = unescape(aCouples[iKey]);          aKeys.push(iKey);       }       return oStorage;     };     this.configurable = false;     this.enumerable = true;   })()); <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 sqlite <a href=\"https:\/\/github.com\/kirill09\/firefox-screen-capture\/blob\/master\/chrome\/content\/screenshot\/sqliteStorage.js\">sqliteStorage.js<\/a>:  <\/p>\n<pre><code class=\"javascript\">Object.defineProperty(window, &quot;sqliteStorage&quot;, new (function () {     var file = Components.classes[&quot;@mozilla.org\/file\/directory_service;1&quot;]                 .getService(Components.interfaces.nsIProperties)                 .get(&quot;ProfD&quot;, Components.interfaces.nsIFile);     var storageService = Components.classes[&quot;@mozilla.org\/storage\/service;1&quot;]                             .getService(Components.interfaces.mozIStorageService);     var mDBConn = null;     var tableName = 'screenshot';     var aKeys = [], sStorage = {};          file.append(&quot;ScreenshotData&quot;);     if( !file.exists() || !file.isDirectory() ) {        file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0777);     }     file.append(&quot;screenshot.sqlite&quot;);      mDBConn = storageService.openDatabase(file);          var create = function () {         mDBConn.createTable(tableName, &quot;id integer primary key autoincrement, Name_key TEXT, Key_value TEXT&quot;);         mDBConn.executeSimpleSQL('CREATE UNIQUE INDEX idx_name_key ON ' + tableName + ' (Name_key)');     };          Object.defineProperty(sStorage, &quot;getItem&quot;, {       value: function (sKey) {            var statement = null;           var result = null;            if (!mDBConn.tableExists(tableName)) {               create();           }           statement = mDBConn.createStatement(&quot;SELECT Key_value FROM &quot; + tableName + &quot; where Name_key = '&quot; + sKey + &quot;'&quot;);           while (statement.step()) {               result = statement.row['Key_value'];           }                      return result;       },       writable: false,       configurable: false,       enumerable: false     });          Object.defineProperty(sStorage, &quot;setItem&quot;, {       value: function (sKey, sValue) {            if (!mDBConn.tableExists(tableName)) {               create();           }           mDBConn.executeSimpleSQL(&quot;REPLACE INTO &quot; + tableName + &quot; (Name_key, Key_value) VALUES ('&quot;+sKey+&quot;', '&quot;+sValue+&quot;')&quot;);       },       writable: false,       configurable: false,       enumerable: false     });          Object.defineProperty(sStorage, &quot;removeItem&quot;, {       value: function (sKey) {            if (!mDBConn.tableExists(tableName)) {               create();           }           mDBConn.executeSimpleSQL(&quot;DELETE FROM &quot; + tableName + &quot; WHERE Name_key = '&quot;+sKey+&quot;'&quot;);       },       writable: false,       configurable: false,       enumerable: false     });          Object.defineProperty(sStorage, &quot;getAllItems&quot;, {       value: function () {            var statement = null;           var result = {};                      if (!mDBConn.tableExists(tableName)) {               create();           }           statement = mDBConn.createStatement(&quot;SELECT Name_key, Key_value FROM &quot; + tableName + &quot;&quot;);           while (statement.step()) {               result[statement.row['Name_key']] = statement.row['Key_value'];           }                      return result;       },       writable: false,       configurable: false,       enumerable: false     });          this.get = function () {       var iThisIndx;       for (var sKey in sStorage) {         iThisIndx = aKeys.indexOf(sKey);         if (iThisIndx === -1) { sStorage.setItem(sKey, sStorage[sKey]); }         else { aKeys.splice(iThisIndx, 1); }         delete sStorage[sKey];       }       for (aKeys; aKeys.length &gt; 0; aKeys.splice(0, 1)) { sStorage.removeItem(aKeys[0]); }       return sStorage;     };          this.configurable = false;     this.enumerable = true;   })()); <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 localStorage.setItem(&#8216;fontSize&#8217;, &#8217;16&#8217;). \u0410 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c localStorage.fontSize, \u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c localStorage.<\/p>\n<h3>\u041b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u0432 Chrome \u0432\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 _locales\/*\/messages.json, \u0430 \u0432 Firefox \u2014 \u0432 \u0434\u0432\u0443\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 locale\/*\/screenshot.dtd \u0438 locale\/*\/screenshot.properties, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u0424\u0430\u0439\u043b screenshot.dtd \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 XUL \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0444\u0430\u0439\u043b screenshot.properties \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 JS. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0438\u043d\u0443\u0441, \u0435\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HTML. \u0410 \u0432 chrome-screen-capture \u0432\u0441\u0442\u0440\u043e\u0435\u043d HTML-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b screenshot.properties:<\/p>\n<p>  \u0411\u044b\u043b\u043e:  <\/p>\n<pre><code class=\"html\">highlight=Highlight redact=Redact solid_black=Solid Black <\/code><\/pre>\n<p>  \u0421\u0442\u0430\u043b\u043e:  <\/p>\n<pre><code class=\"html\">var i18n = new Object(); i18n.highlight='Highlight'; i18n.redact='Redact'; i18n.solid_black='Solid Black'; <\/code><\/pre>\n<p>  \u0412 Firefox \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:  <\/p>\n<pre><code class=\"html\">&lt;stringbundleset id=&quot;stringbundleset&quot;&gt;         &lt;stringbundle id=&quot;string-bundle&quot; src=&quot;chrome:\/\/screenshot\/locale\/screenshot.properties&quot;\/&gt; &lt;\/stringbundleset&gt; <\/code><\/pre>\n<p>  \u0418 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 JS:  <\/p>\n<pre><code class=\"html\">var stringsBundle = document.getElementById(&quot;string-bundle&quot;); console.log(stringsBundle.getString(highlight) + &quot; &quot;); <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0435\u0435 \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0432 XUL, \u0442\u0430\u043a \u0438 \u0432 HTML.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:  <\/p>\n<pre><code class=\"html\">&lt;script src=&quot;chrome:\/\/screenshot\/locale\/screenshot.properties&quot;&gt;&lt;\/script&gt; <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 JS:   <\/p>\n<pre><code class=\"javascript\">console.log(i18n[\u2018highlight\u2019]); <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0438, \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 Chrome \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 Firefox <a href=\"https:\/\/github.com\/kirill09\/firefox-screen-capture\/blob\/master\/convert_locale.js\">convert_locale.js<\/a>:  <\/p>\n<pre><code class=\"javascript\">var fs = require('fs'); var path = require('path'); var filePath = process.argv[2]; var dirPath = path.dirname(filePath); var messages = {};  fs.readFile(filePath, function (err, data) {   if (err) throw err;   messages = JSON.parse(data);   generationProp(messages);   generationDTD(messages); });  function generationDTD (msg) {     var resultDTD = '';     for (var key in msg) {         resultDTD += '&lt;!ENTITY ' + key + ' &quot;' + msg[key].message + '&quot;&gt;' + &quot;\\n&quot;;     }     writeFile('screenshot.dtd', resultDTD); }  function generationProp(msg) {     var resultProp = '';     for (var key in msg) {         resultProp += key + '=' + msg[key].message + &quot;\\n&quot;;     }     writeFile('screenshot.properties', resultProp); }  function writeFile(fileName, data) {     var writeFile = path.join(dirPath, fileName);     fs.writeFile(writeFile, data, function (err) {         if (err) throw err;         console.log('generation finish: ' + fileName);     }); } <\/code><\/pre>\n<p>  \u0412 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0444\u0430\u0439\u043b messages.json \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442:  <\/p>\n<pre><code>node convert_locale.js .\/screenshot\/chrome\/locale\/de-DE\/messages.json  generation finish: screenshot.properties generation finish: screenshot.dtd <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435:<\/p>\n<p>  .\/screenshot\/chrome\/locale\/de-DE\/screenshot.properties <br \/>  .\/screenshot\/chrome\/locale\/de-DE\/screenshot.dtd<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>  \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434 \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c\u0438:<br \/>  1. \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 (opensource)<br \/>  2. \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u043b\u0438 \u0442\u0430\u0431\u044b.<br \/>  3. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438 \u043f\u043e\u043b\u043e\u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438.<br \/>  4. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 position:fixed, \u0442\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u043d\u0438\u0446\u044b.<br \/>  5. \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043e\u0448\u0438\u0431\u043a\u0438 (\u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430).<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f: <a href=\"http:\/\/habrastorage.org\/storage3\/df8\/221\/e85\/df8221e8551397ec7e6c0320ed9b339b.png\">\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/a>.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b (Picasa, Facebook, Sina microblog, Imgur), \u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438, \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430. \u0410 \u043c\u043e\u0436\u0435\u0442, \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0425\u0430\u0431\u0440\u0430 \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e? C \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0436\u0434\u0435\u043c \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432.<\/p>\n<p>  \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/kirill09\/firefox-screen-capture\">github<\/a>.    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/company\/mailru\/blog\/205698\/\"> http:\/\/habrahabr.ru\/company\/mailru\/blog\/205698\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 (clip2net, gyazo, \u0438 \u0442.\u0434.), \u043d\u043e \u043d\u0435\u0442 opensource-\u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u0434 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0432 jira). \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (Chrome, Firefox), \u044d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. <\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/946\/ff7\/b49\/946ff7b497b73417b155b96d3e93eb85.jpg\"\/><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-205698","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/205698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=205698"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/205698\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=205698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=205698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=205698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}