Anyone can be a B!KUMA Girl

    @@ -19,52 +19,53 @@ // sometimes .search timespamping e.g. // http://cdn1.www.st-hatena.com/users/fu/furutaseika/profile.gif?1365414170 +// URL object c.f. +// https://developer.mozilla.org/en-US/docs/Web/API/URL +// https://developer.mozilla.org/en-US/docs/Web/API/URL.URL + (function() { + // TBD data scheme var BKUMA = 'http://f.st-hatena.com/images/fotolife/h/hatenapr/20111228/20111228162520.png', slice = Array.prototype.slice; - var bkumaize = function(node) { + var bkumaize = function(context) { + // like a NodeFilter; c.f. + // https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter + var filterNode = function(node, nodeName) { + if (node.nodeName === nodeName.toUpperCase()) { + return [node]; + } + if (!node.querySelectorAll) { + return []; + } + return slice.call(node.querySelectorAll(nodeName)); + }; var changeIcon = function(imgs) { imgs.forEach(function(img) { if (!img.src || !/^http/.test(img.src)) return; - - // URL object c.f. - // https://developer.mozilla.org/en-US/docs/Web/API/URL - // https://developer.mozilla.org/en-US/docs/Web/API/URL.URL + // c.f. URL object var src = new URL(img.src); // c.f. Hatena CDN, avatar syntax if (/(?:st\-hatena\.com$|hatena\.ne\.jp$)/.test(src.hostname) && /^\/users\//.test(src.pathname) && - /^profile[\w]{0,2}\.gif$/.test(src.pathname.split('/').pop())) { + /^profile\w{0,2}\.gif$/.test(src.pathname.split('/').pop())) { img.src = BKUMA; } }); }; - // like a NodeFilter; c.f. - // https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter - var filterNode = function(node, typeName) { - if (node.nodeType === document.TEXT_NODE) { - return []; - } - if (node.nodeName === typeName.toUpperCase()) { - return [node]; - } - return slice.call(node.querySelectorAll(typeName)); - }; - - changeIcon(filterNode(node, 'img')); + changeIcon(filterNode(context, 'img')); }; bkumaize(document.body); // c.f. MutationObserver - // https://developer.mozilla.org/en/docs/Web/API/MutationObserver + // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver // http://caniuse.com/#feat=mutationobserver - new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - bkumaize(mutation.target); + new MutationObserver(function(records) { + records.forEach(function(record) { + bkumaize(record.target); }); - }).observe(document.body, {childList: true, subtree: true}); + }).observe(document.body, { childList: true, subtree: true }); })();
  • /*
     * @title Anyone can be a B!KUMA Girl
     * @description B!KUMAize everyone's icon on Hatena or Other
     * @include http://*
     * @contributor yuta25  http://let.hatelabo.jp/yuta25/let/hJmetPek3eZM (Fork of)
     * @license MIT License http://opensource.org/licenses/MIT
     * @javascript_url
     */
    
    // document.images ver.
    // http://let.hatelabo.jp/noromanba/let/hLHWtfnH1_9B
    
    // Hatena CDN c.f.
    // http://let.hatelabo.jp/noromanba/let/gYC-yeGlqrueQQ
    // http://let.hatelabo.jp/noromanba/let/hJmetae5l6sv/rev/hLHWtafen-12
    
    // avatar syntax c.f.
    // http://subtech.g.hatena.ne.jp/h2u/20110405/1302002459
    // sometimes .search timespamping e.g.
    // http://cdn1.www.st-hatena.com/users/fu/furutaseika/profile.gif?1365414170
    
    // URL object c.f.
    // https://developer.mozilla.org/en-US/docs/Web/API/URL
    // https://developer.mozilla.org/en-US/docs/Web/API/URL.URL
    
    (function() {
      // TBD data scheme
      var BKUMA = 'http://f.st-hatena.com/images/fotolife/h/hatenapr/20111228/20111228162520.png',
          slice = Array.prototype.slice;
    
      var bkumaize = function(context) {
        // like a NodeFilter; c.f.
        // https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter
        var filterNode = function(node, nodeName) {
          if (node.nodeName === nodeName.toUpperCase()) {
              return [node];
          }
          if (!node.querySelectorAll) {
            return [];
          }
          return slice.call(node.querySelectorAll(nodeName));
        };
    
        var changeIcon = function(imgs) {
          imgs.forEach(function(img) {
            if (!img.src || !/^http/.test(img.src)) return;
            // c.f. URL object
            var src = new URL(img.src);
    
            // c.f. Hatena CDN, avatar syntax
            if (/(?:st\-hatena\.com$|hatena\.ne\.jp$)/.test(src.hostname) &&
              /^\/users\//.test(src.pathname) &&
              /^profile\w{0,2}\.gif$/.test(src.pathname.split('/').pop())) {
              img.src = BKUMA;
            }
          });
        };
    
        changeIcon(filterNode(context, 'img'));
      };
      bkumaize(document.body);
    
      // c.f. MutationObserver
      // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
      // http://caniuse.com/#feat=mutationobserver
      new MutationObserver(function(records) {
        records.forEach(function(record) {
          bkumaize(record.target);
        });
      }).observe(document.body, { childList: true, subtree: true });
    })();
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2014/11/18 04:50:35 - 2014-11-18
  2. 2014/11/15 05:49:30 - 2014-11-15
  3. 2014/11/15 05:16:58 - 2014-11-15
  4. 2014/11/15 04:18:02 - 2014-11-15
  5. 2014/11/15 02:45:48 - 2014-11-15
  6. 2014/11/14 03:47:59 - 2014-11-14
  7. 2014/11/14 03:42:55 - 2014-11-14