メタブ表示

    @@ -1,6 +1,6 @@ /* - * @title ブクマカのメタブ表示 - * @description ブクマカのメタブ表示 + * @title メタブ表示 + * @description メタブ表示 * @include http://b.hatena.ne.jp/entry/* * @license MIT License * @require @@ -14,7 +14,6 @@ //////////////////////////////////////////////////////////// - var HBBP_URL = "http://b.hatena.ne.jp/js/bookmark_blogparts.js"; var HATEB_DOMAIN = "http://b.hatena.ne.jp"; var API_DOMAIN = "//b.hatena.ne.jp"; var ICON_DOMAIN = "http://cdn1.www.st-hatena.com/users/"; @@ -29,6 +28,7 @@ '}', '.metab-container > .metab-title > .title{', ' display: inline-block;', + ' margin: 0px 10px 0px 0px;', ' font-size: 11px;', ' color: #69F;', '}', @@ -89,23 +89,19 @@ var p = function p() { if ( !DEBUG ) return; - con.log.apply(con, arguments); - }; + con.log.apply(con, arguments);}; var forEach = function forEach(a,f){ if(!a) return; for (var i=0,l=a.length;i<l;i++){ - if(f(a[i]) === false) break; - } - }; + if(f(a[i]) === false) break;}}; var gensym = (function(){ var rnd = function(){return Math.floor(Math.random() * (1<<30)).toString(16);}; var cnt = 0; var prefix = '$metabsym_' + Date.now().toString(16) + '_' + rnd() + '_'; - return function gensym(){ return prefix + (cnt++).toString(16); }; - })(); + return function gensym(){ return prefix + (cnt++).toString(16); };})(); var receiver = function(cb){ var name = gensym(); @@ -114,8 +110,7 @@ cb.apply(this, arguments); }; win[name] = func; - return encodeURIComponent( name ); - }; + return encodeURIComponent( name );}; //////////////////////////////////////////////////////////// @@ -126,12 +121,11 @@ cb(Hatena);})();}; var withStar = function(cb){ - withHatena(function(Hatena){ - (function(){ - if(typeof(Hatena.Star) === 'undefined'){ - setTimeout(arguments.callee, 100); - return;} - cb(Hatena.Star, Hatena);})();});}; + withHatena(function(Hatena){(function(){ + if(typeof(Hatena.Star) === 'undefined'){ + setTimeout(arguments.callee, 100); + return;} + cb(Hatena.Star, Hatena);})();});}; //////////////////////////////////////////////////////////// var PageEid = (function(){ @@ -303,67 +297,62 @@ node.appendChild(htmlifyBookmarks( entry)); return node;}; - var addStars = function(node){ - withStar(function(Star, Hatena){ - - var entries = []; - forEach(node.querySelectorAll('li.metab') || [], function(li){ - var uri = li.querySelector('a.username').href; - // var uri = li.querySelector('a.user-comment-link').href; - var sc = li.querySelector('.hatena-bookmark-star'); - var cc = doc.createElement('span'); - sc.parentNode.insertBefore(cc, sc); - var earg = { - entryNode: li, - uri: uri, - title: Star.EntryLoader.scrapeTitle(li) || '', - comment_container: cc, - star_container: sc}; - var e = new Star.Entry(earg); - e.showButtons(); - entries.push(e);}); - - // - var receive = receiver(function(res){ - var entries_ = res.entries; - var encodedUriToEntryInfoMap = {}; - if (!entries_) entries_ = []; - forEach(entries_, function(entryInfo){ - if ( !entryInfo.uri ) return; - var eURI = entryInfo.eURI; - if ( !eURI ) eURI = entryInfo.eURI = encodeURIComponent( entryInfo.uri ); - encodedUriToEntryInfoMap[eURI] = entryInfo; - }); - forEach(entries, function(e){ - if ( e.hasBoundToStarEntry() ) return; - if ( !e.eURI ) e.eURI = encodeURIComponent(e.uri); - var entryInfo = entryInfo = encodedUriToEntryInfoMap[e.eURI]; - if ( entryInfo ) e.bindStarEntry( entryInfo ); - if (typeof(e.can_comment) == 'undefined') e.setCanComment(res.can_comment); - e.showStars(); - e.showCommentButton(); - }); - if (res.rks) { - if (!Hatena.Visitor || typeof(Hatena.Visitor) == 'undefined') { - Hatena.Visitor = {};} - if (!Hatena.Visitor.RKS) { - Hatena.Visitor.RKS = res.rks;}} - Hatena.Star.User.RKS.ready(res.rks);}); - - - // getStarEntries - (function(){ - if (!entries.length) return; - var jsonpBase = Star.BaseURL.replace(/^http:/, - Star.BaseURLProtocol) + 'entries.json?'; - var url = jsonpBase; - for (var i = 0; i < entries.length; i++) { - if (url.length > Ten.JSONP.MaxBytes) { - new Ten.JSONP(url, win, receive); - url = jsonpBase;} - url += 'uri=' + encodeURIComponent(entries[i].uri) + '&';} - if (!Hatena.Visitor) url += 'timestamp=1'; - new Ten.JSONP(url, win, receive);})();});}; + var addStars = function(node){ withStar(function(Star, Hatena){ + var entries = []; + forEach(node.querySelectorAll('li.metab') || [], function(li){ + var uri = li.querySelector('a.username').href; + // var uri = li.querySelector('a.user-comment-link').href; + var sc = li.querySelector('.hatena-bookmark-star'); + var cc = doc.createElement('span'); + sc.parentNode.insertBefore(cc, sc); + var earg = { + entryNode: li, + uri: uri, + title: Star.EntryLoader.scrapeTitle(li) || '', + comment_container: cc, + star_container: sc}; + var e = new Star.Entry(earg); + e.showButtons(); + entries.push(e);}); + + // + var receive = receiver(function(res){ + var entries_ = res.entries; + var encodedUriToEntryInfoMap = {}; + if (!entries_) entries_ = []; + forEach(entries_, function(entryInfo){ + if ( !entryInfo.uri ) return; + var eURI = entryInfo.eURI; + if ( !eURI ) eURI = entryInfo.eURI = encodeURIComponent( entryInfo.uri ); + encodedUriToEntryInfoMap[eURI] = entryInfo;}); + forEach(entries, function(e){ + if ( e.hasBoundToStarEntry() ) return; + if ( !e.eURI ) e.eURI = encodeURIComponent(e.uri); + var entryInfo = entryInfo = encodedUriToEntryInfoMap[e.eURI]; + if ( entryInfo ) e.bindStarEntry( entryInfo ); + if (typeof(e.can_comment) == 'undefined') e.setCanComment(res.can_comment); + e.showStars(); + e.showCommentButton();}); + if (res.rks) { + if (!Hatena.Visitor || typeof(Hatena.Visitor) == 'undefined') { + Hatena.Visitor = {};} + if (!Hatena.Visitor.RKS) { + Hatena.Visitor.RKS = res.rks;}} + Hatena.Star.User.RKS.ready(res.rks);}); + + // getStarEntries + (function(){ + if (!entries.length) return; + var jsonpBase = Star.BaseURL.replace(/^http:/, + Star.BaseURLProtocol) + 'entries.json?'; + var url = jsonpBase; + for (var i = 0; i < entries.length; i++) { + if (url.length > Ten.JSONP.MaxBytes) { + new Ten.JSONP(url, win, receive); + url = jsonpBase;} + url += 'uri=' + encodeURIComponent(entries[i].uri) + '&';} + if (!Hatena.Visitor) url += 'timestamp=1'; + new Ten.JSONP(url, win, receive);})();});}; var addBehaviors = function(node){ if(! node.tagName) return node; @@ -406,6 +395,15 @@ slot.req = true; requestBookmark(uri, function(entry){recievedMetab(uri, entry);});}; + var reserveUserMetab = function(user, cont_){ + var uri = HATEB_DOMAIN + '/' + user + '/'; + var cont = cont_ instanceof Function ? cont_ : (function(){ + var container = cont_; + return function(entry, uri){ + container.appendChild(metabToHTML(entry, uri, + 'metab for id:'+user));};})(); + reserveMetab(uri, function(entry){cont(entry, uri);});}; + //////////////////////////////////////////////////////////// @@ -416,23 +414,21 @@ style.appendChild(doc.createTextNode(CSS)); doc.querySelector('head').appendChild(style);}; + var showCommentMetab = function(n){ + var nparent = n.parentNode; + var commentUri = nparent.querySelector('a.user-comment-link').href; + reserveMetab(commentUri, function(entry){ + nparent.appendChild(metabToHTML(entry, commentUri, + 'metab for this comment'));}); + + var user = n.href.match(/([^\/]+)\/$/)[1]; + reserveUserMetab(user, nparent);}; + var showMetabs = function(){ - forEach(doc.querySelectorAll('a.profile-icon'), function(n){ - var nparent = n.parentNode; - var commentUri = nparent.querySelector('a.user-comment-link').href; - reserveMetab(commentUri, function(entry){ - nparent.appendChild(metabToHTML(entry, commentUri, - 'metab for this comment'));}); - - var user = n.href.match(/([^\/]+)\/$/)[1]; - var userUri = HATEB_DOMAIN + '/' + user + '/'; - reserveMetab(userUri, function(entry){ - nparent.appendChild(metabToHTML(entry, userUri, - 'metab for id:'+user));});});}; - - var main = function(){ - applyStyle(); - showMetabs();}; + forEach(doc.querySelectorAll('a.profile-icon'), showCommentMetab);}; + + var main = function(){applyStyle(); + showMetabs();}; //// @@ -444,24 +440,6 @@ })(); - /*/ - hoge:( - {"count":2, - "bookmarks":[ - {"timestamp":"2016/06/24 18:41:59", - "comment":"","user":"aflat_1000dai4","tags":["meta bookmark"]}, - {"timestamp":"2014/11/27 23:31:08", - "comment":"","user":"kcolmun", - "tags":["\u30e1\u30bf\u30d6\u30c3\u30af\u30de\u30fc\u30af"]}], - "url":"http://b.hatena.ne.jp/guru_guru/", - "eid":234900219, - "title":"\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af - guru_guru \u306e\u30d6\u30c3\u30af\u30de\u30fc\u30af", - "screenshot":"http://screenshot.hatena.ne.jp/images/200x150/7/7/5/1/8/4cdd713947a7e5c74bf0b8244024e6ea7ae.jpg", - "entry_url":"http://b.hatena.ne.jp/entry/b.hatena.ne.jp/guru_guru/"} - ) - //*/ - -//*/// // Local Variables: // mode: hatena-let
  • /*
     * @title メタブ表示
     * @description メタブ表示
     * @include http://b.hatena.ne.jp/entry/*
     * @license MIT License
     * @require 
     */
    (function(){
    
      ////////////////////////////////////////////////////////////
      var doc = document, win = window, loc = location, con = console;
    
      var DEBUG        = true;
    
      ////////////////////////////////////////////////////////////
    
      var HATEB_DOMAIN = "http://b.hatena.ne.jp";
      var API_DOMAIN   = "//b.hatena.ne.jp";
      var ICON_DOMAIN  = "http://cdn1.www.st-hatena.com/users/";
    
      ////////////////////////////////////////////////////////////
      var CSS = [
        '.metab-container {',
        '  margin:  5px;',
        '  padding: 5px;',
        '  border: solid #9CF 1px;',
        '  border-radius: 10px;',
        '}',
        '.metab-container > .metab-title > .title{',
        '  display: inline-block;',
        '  margin: 0px 10px 0px 0px;',
        '  font-size: 11px;',
        '  color: #69F;',
        '}',
        '.metab-container > .metab-title > .metab-count{',
        '  font-size: 10px;',
        '  font-weight: 900;',
        '  color: #F00;',
        '  background-color: #FCC;',
        '  display: inline-block;',
        '  text-decoration: none;',
        '  line-height: 12px;',
        '  padding: 2px;',
        '  margin: 10px 0px;',
        '}',
        '.metab-container > .metab-title > .metab-count-detail{',
        '  display: inline-block;',
        '  margin: 0px 10px;',
        '  font-size: 11px;',
        '  color: rgb(153, 153, 153);',
        '}',
        '.metab-container > ul{',
        '  display: block;',
        '  margin: 0px;',
        '  padding: 0px;',
        '}',
        '.metab-container > ul.comments > li{',
        '  width: auto !important;',
        '  margin: 0px;',
        '  padding: 0px;',
        '  display: block;',
        '  list-style: none;',
        '}',
        '.metab-container > ul.no-comments > li{',
        ' width: auto !important;',
        ' margin: 0px 11px 0px 0px;',
        ' padding: 0px;',
        ' border: none;',
        ' list-style: none;',
        ' display: inline-block;',
        '}',
        '.metab-container > ul > li > span.headPart >  a.username{',
        '  display: inline-block;',
        '  margin: 0px 11px 0px 0px;',
        '}',
    
        '.metab-container > ul > li >  span.tags{',
        '  display: inline-block;',
        '  margin: 0px 11px 0px 0px;',
        '}',
    
        '.metab-container > ul > li > span.comment{',
        '  font-size: 11px;',
        '}',
        ''].join("\n");
    
    
      ////////////////////////////////////////////////////////////
      
      var p = function p() {
        if ( !DEBUG ) return;
        con.log.apply(con, arguments);};
    
    
      var forEach = function forEach(a,f){
        if(!a) return;
        for (var i=0,l=a.length;i<l;i++){
          if(f(a[i]) === false) break;}};
    
      var gensym = (function(){
        var rnd = function(){return Math.floor(Math.random() * (1<<30)).toString(16);};
        var cnt = 0;
        var prefix = '$metabsym_' + Date.now().toString(16) + '_' + rnd() + '_';
        return function gensym(){ return prefix + (cnt++).toString(16); };})();
    
      var receiver = function(cb){
        var name = gensym();
        var func = function(){
          delete win[name];
          cb.apply(this, arguments);
        };
        win[name] = func;
        return encodeURIComponent( name );};
    
      ////////////////////////////////////////////////////////////
    
      var withHatena = function(cb){(function(){
        if(typeof(Hatena) === 'undefined'){
          setTimeout(arguments.callee, 100);
          return;}
        cb(Hatena);})();};
    
      var withStar = function(cb){
        withHatena(function(Hatena){(function(){
          if(typeof(Hatena.Star) === 'undefined'){
            setTimeout(arguments.callee, 100);
            return;}
          cb(Hatena.Star, Hatena);})();});};
    
      ////////////////////////////////////////////////////////////
      var PageEid = (function(){
        var ucl = doc.querySelector('a.user-comment-link');
        if(!ucl) return null;
        return String(ucl.href).replace(/^\/entry\//,'').replace(/\/comments\/.*/,'');});
    
      var htmlifyIcon = function(bm){
        var a  = doc.createElement('a');
        a.href      = HATEB_DOMAIN + '/' + bm.user + '/';
        a.target    = '_blank';
        a.title     = bm.user;
        a.className = 'profile-icon';
        var icon = doc.createElement('img');
        icon.src =
          ICON_DOMAIN + '/' + bm.user.substring(0,2) + '/' + bm.user +
          '/profile_l.gif';
        icon.alt = bm.user;
        a.appendChild(icon);
        return a;
      };
    
      var htmlifyUsername = function(bm, entry){
        var a  = doc.createElement('a');
        var date    = String(bm.timestamp).replace(/ .+$/,'').replace(/\//g,'');
        a.href      = '/' + bm.user + '/' + date + '#bookmark-' + entry.eid ;
        a.target    = '_blank';
        a.title     = bm.user;
        a.className = 'username';
        a.appendChild(doc.createTextNode(bm.user));
        return a;
      };
    
      var htmlifyTags = function(bm){
        var tags = bm.tags || [];
        if(tags.length < 1) return doc.createDocumentFragment();
        var tagSpan = doc.createElement('span');
        tagSpan.className = 'tags';
        forEach(tags , function(tagName){
          var tagLink = doc.createElement('a');
          tagLink.className = 'user-tag';
          tagLink.href =
            HATEB_DOMAIN + '/' + bm.user + '/' + encodeURIComponent(tagName);
          tagLink.appendChild(doc.createTextNode(tagName));
          tagSpan.appendChild(tagLink);});
        return tagSpan;};
    
      var htmlifyComment = (function(){
    
        var reURL = (function(){
          var RE_HEX    = '%[a-fA-F0-9][a-fA-F0-9]';
          var RE_SCHEME = '[a-z]+:';
          var RE_CHAR   = '(?:[a-zA-Z0-9\-_\.]|' + RE_HEX + ')';
          var RE_STR    = RE_CHAR + '+';
          var RE_STR0   = RE_CHAR + '*';
          var RE_HOST   = RE_STR;
          var RE_PATH   = '(?:/(?:' + RE_STR + '/)*' + RE_STR0 + ')';
          var RE_QV     = RE_STR0 + '=' + RE_STR0;
          var RE_QUERY  = '(?:\\?(?:(?:' + RE_QV + '&)*'+RE_QV+')?|'+RE_QV+')';
          var RE_HASH   = '(?:#' + RE_STR0 + ')';
          var RE_URL    = 'https?://' + RE_HOST + RE_PATH +'?' +
                RE_QUERY + '?' + RE_HASH + '?';
          return  new RegExp('(.*?)(' + RE_URL + ')(.*)');
        })();
    
        return function(bm){
          var comment = bm.comment;
          var R = doc.createElement('span');
          R.className = 'comment';
          while(comment.length > 0){
            var match = comment.match(reURL);
            if(!match){
              if(comment.length > 0) R.appendChild(doc.createTextNode(comment));
              break;
            }
            var head = match[1];
            var url  = match[2];
            comment = match[3];
            if(head.length > 0) R.appendChild(doc.createTextNode(head));
            var a = doc.createElement('a');
            a.href = url;
            a.target = '_blank';
            a.appendChild(doc.createTextNode(url));
            R.appendChild(a);
          }
          return R;
        };})();
    
      var htmlifyMeta = function(bm, entry){
        var meta = doc.createElement('div');
        meta.className = 'user-comment-meta';
    
        var plink = doc.createElement('a');
        plink.className = 'user-comment-link';
        plink.href  = '/entry/' + entry.eid + '/comment/' + bm.user;
        plink.title = 'パーマリンク';
        plink.target = '_blank';
        plink.appendChild(doc.createTextNode('リンク'));
        meta.appendChild(plink);
    
        var tspan = doc.createElement('span');
        tspan.className = 'timestamp';
        tspan.appendChild(doc.createTextNode(bm.timestamp));
        meta.appendChild(tspan);
    
        var star = doc.createElement('span');
        star.className = 'hatena-bookmark-star';
        meta.appendChild(star);
        return meta;};
    
      var htmlifyCount = function(entry){
        var count = entry.count;
        var frgn = doc.createDocumentFragment();
        var a = doc.createElement('a');
        a.className = 'metab-count';
        a.href = entry.entry_url;
        a.target = "_blank";
        a.appendChild(doc.createTextNode(String(count) + " users"));
        frgn.appendChild(a);
        var bmc = (entry.bookmarks || []).length;
        if(count != bmc){
          var span = doc.createElement('span');
          span.className = 'metab-count-detail';
          span.appendChild(doc.createTextNode(String(bmc) + " comments + " +
                                              String(count - bmc)));
          frgn.appendChild(span);}
        return frgn;};
    
      var htmlifyBookmarks = function(entry){
        var node = doc.createDocumentFragment();
        if((entry.bookmarks || []).length < 1) return node;
        var comments   = doc.createElement('ul');
        comments.className = 'comments';
        var noComments = doc.createElement('ul');
        noComments.className = 'no-comments';
        forEach(entry.bookmarks, function(bm){
          var li = doc.createElement('li');
          li.className = 'metab';
          var headPart = doc.createElement('span');
          headPart.className = '.head-part';
          headPart.appendChild(htmlifyIcon(    bm, entry));
          headPart.appendChild(htmlifyUsername(bm, entry));
          li.appendChild(headPart);
          li.appendChild(htmlifyTags(    bm, entry));
          li.appendChild(htmlifyComment( bm, entry));
          li.appendChild(htmlifyMeta(    bm, entry));
          (String(bm.comment).length > 0 // || tags.length > 0
           ? comments : noComments).appendChild(li);});
        if(comments.firstChild)  node.appendChild(comments);
        if(noComments.firstChild) node.appendChild(noComments);
        return node;};
    
      var htmlifyTitle = function(entry, title){
        if(!(title && title.length > 0)) return doc.createDocumentFragment();
        var node = doc.createElement('div');
        node.className = 'metab-title';
        var tspan = doc.createElement('span');
        tspan.appendChild(doc.createTextNode(title));
        tspan.className = 'title';
        node.appendChild(tspan);
        node.appendChild(htmlifyCount(     entry));
        return node; };
    
      var htmlifyEntry = function(entry, title){
        if((entry || {count:0}).count < 1) return doc.createDocumentFragment();
        var node = doc.createElement('div');
        node.className = 'metab-container';
        node.appendChild(htmlifyTitle(entry, title));
        node.appendChild(htmlifyBookmarks( entry));
        return node;};
    
      var addStars = function(node){ withStar(function(Star, Hatena){
        var entries = [];
        forEach(node.querySelectorAll('li.metab') || [], function(li){
          var uri = li.querySelector('a.username').href;
          //        var uri = li.querySelector('a.user-comment-link').href;
          var sc = li.querySelector('.hatena-bookmark-star');
          var cc = doc.createElement('span');
          sc.parentNode.insertBefore(cc, sc);
          var earg = {
            entryNode:         li,
            uri:               uri,
            title:             Star.EntryLoader.scrapeTitle(li) || '',
            comment_container: cc,
            star_container:    sc};
          var e = new Star.Entry(earg);
          e.showButtons();
          entries.push(e);});
    
        //
        var receive = receiver(function(res){
          var entries_ = res.entries;
          var encodedUriToEntryInfoMap = {};
          if (!entries_) entries_ = [];
          forEach(entries_, function(entryInfo){
            if ( !entryInfo.uri ) return;
            var eURI = entryInfo.eURI;
            if ( !eURI ) eURI = entryInfo.eURI = encodeURIComponent( entryInfo.uri );
            encodedUriToEntryInfoMap[eURI] = entryInfo;});
          forEach(entries, function(e){
            if ( e.hasBoundToStarEntry() ) return;
            if ( !e.eURI ) e.eURI = encodeURIComponent(e.uri);
            var entryInfo = entryInfo = encodedUriToEntryInfoMap[e.eURI];
            if ( entryInfo ) e.bindStarEntry( entryInfo );
            if (typeof(e.can_comment) == 'undefined') e.setCanComment(res.can_comment);
            e.showStars();
            e.showCommentButton();});
          if (res.rks) {
            if (!Hatena.Visitor || typeof(Hatena.Visitor) == 'undefined') {
              Hatena.Visitor = {};}
            if (!Hatena.Visitor.RKS) {
              Hatena.Visitor.RKS = res.rks;}}
          Hatena.Star.User.RKS.ready(res.rks);});
    
        // getStarEntries
        (function(){
          if (!entries.length) return;
          var jsonpBase = Star.BaseURL.replace(/^http:/,
                                               Star.BaseURLProtocol) + 'entries.json?';
          var url = jsonpBase;
          for (var i = 0; i < entries.length; i++) {
            if (url.length > Ten.JSONP.MaxBytes) {
              new Ten.JSONP(url, win, receive);
              url = jsonpBase;}
            url += 'uri=' + encodeURIComponent(entries[i].uri) + '&';}
          if (!Hatena.Visitor) url += 'timestamp=1';
          new Ten.JSONP(url, win, receive);})();});};
    
      var addBehaviors = function(node){
        if(! node.tagName) return node;
        addStars(node);
        return node;};
    
    
      ////////////////////////////////////////////////////////////
    
      var requestBookmark = function(uri,cont){
        var apiEndPoint = API_DOMAIN + '/entry/jsonlite/?';
        var request = apiEndPoint + 'url=' + encodeURIComponent(uri) +
              '&callback=' + receiver(function(entry){ cont(entry);});
        var scriptTag  = doc.createElement('script');
        scriptTag.src  = request;
        scriptTag.type = 'text/javascript';
        doc.body.appendChild(scriptTag);};
    
      ////////////////////////////////////////////////////////////
    
      var entries = {};
      var metabToHTML = function(entry, uri, title){
        var slot = entries[uri];
        var node = slot.html || (slot.html = node = htmlifyEntry(entry,title));
        return addBehaviors(node.cloneNode(true));
      };
      var recievedMetab = function(uri, entry){
        var slot = entries[uri];
        slot.entry = entry || false;
        slot.cont.forEach(function(c){c(entry);});};
    
      var reserveMetab = function(uri, cont){
        var slot = (entries[uri] ||
                    (entries[uri] = {entry: null, cont:[], req: false}));
        if(slot.entry !== null){
          cont(slot.entry);
          return; }
        slot.cont.push(cont || function(){});
        if(slot.req) return;
        slot.req = true;
        requestBookmark(uri, function(entry){recievedMetab(uri, entry);});};
    
      var reserveUserMetab = function(user, cont_){
        var uri = HATEB_DOMAIN + '/' + user + '/';
        var cont = cont_ instanceof Function ? cont_ : (function(){
          var container = cont_;
          return function(entry, uri){
            container.appendChild(metabToHTML(entry, uri,
                                              'metab for id:'+user));};})();
        reserveMetab(uri, function(entry){cont(entry, uri);});};
    
    
      ////////////////////////////////////////////////////////////
    
    
      var applyStyle = function(){
        var style = doc.createElement('style');
        style.type = 'text/css';
        style.appendChild(doc.createTextNode(CSS));
        doc.querySelector('head').appendChild(style);};
    
      var showCommentMetab = function(n){
        var nparent = n.parentNode;
        var commentUri = nparent.querySelector('a.user-comment-link').href;
        reserveMetab(commentUri, function(entry){
          nparent.appendChild(metabToHTML(entry, commentUri,
                                          'metab for this comment'));});
        
        var user = n.href.match(/([^\/]+)\/$/)[1];
        reserveUserMetab(user, nparent);};
    
      var showMetabs = function(){
        forEach(doc.querySelectorAll('a.profile-icon'), showCommentMetab);};
    
      var main = function(){applyStyle();
                            showMetabs();};
    
      ////
      
      if((function(pn){
        if(pn.match(/^\/entry\/\d+\/comment\//)) return true;
        return false;
      })(String(loc.pathname))) return;
      main();
    
    
    })();
    
    // Local Variables:
    // mode: hatena-let
    // End:
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2016/08/15 20:22:44 - 2016-08-15
  2. 2016/08/02 21:43:13 - 2016-08-02
  3. 2016/07/11 19:41:45 - 2016-07-11
  4. 2016/07/11 06:44:39 - 2016-07-11
  5. 2016/07/11 03:34:28 - 2016-07-11
  6. 2016/07/11 03:12:04 - 2016-07-11
  7. 2016/07/11 02:59:16 - 2016-07-11
  8. 2016/07/03 09:28:27 - 2016-07-03
  9. 2016/07/02 06:31:25 - 2016-07-02
  10. 2016/07/01 10:22:11 - 2016-07-01
  11. 2016/06/28 10:16:34 - 2016-06-28
  12. 2016/06/27 09:43:45 - 2016-06-27
  13. 2016/06/27 09:41:26 - 2016-06-27
  14. 2016/06/25 17:14:17 - 2016-06-25
  15. 2016/06/18 13:39:29 - 2016-06-18
  16. 2016/06/18 10:40:52 - 2016-06-18
  17. 2016/06/17 06:47:34 - 2016-06-17