Hatena::Let Omikuji

    @@ -1,58 +1,45 @@ /* * @title Hatena::Let::Omikuji - * @description コードおみくじ in Hatena::Let -> だいたい大吉 -> しあわせ(。◠‿​◠。) ご利益: コード力アップ ◆ 連続サーフィンでさらにご利益アップ + * @description Hatena::Let Fortune cookie * @include http://let.hatelabo.jp/* * @license MIT License http://nrm.mit-license.org/2012 * @require * @see https://en.wikipedia.org/wiki/Omikuji * @see https://en.wikipedia.org/wiki/Fortune_cookie - * @see http://liosk.blog103.fc2.com/blog-entry-34.html - * @see http://d.hatena.ne.jp/javascripter/20080709/1215597363 */ +// # NOTE +// Ten.XHR() 2nd args like this { data: { 'Content-Type' : 'application/xml', 'Accept' : 'application/xml'} } +// expected responseXML, but actual response: 'Content-Type:text/html; charset=utf-8' +// http://liosk.blog103.fc2.com/blog-entry-34.html -// Ten workout -// http://www.hatena.ne.jp/js/Ten.js -// http://s.hatena.ne.jp/js/HatenaStar.js -// http://let.hatelabo.jp/?of= (0 origin) -// -// Ten.XHR('', {}, callback) -// 2nd arg -> { data: { 'Content-Type' : 'application/xml', 'Accept' : 'application/xml'} } -// for responseXML. But actual response: 'Content-Type:text/html; charset=utf-8'. - - +// TODO feedback indicator (function () { - if (location.hostname === 'let.hatelabo.jp') { - if (!location.pathname.split('/')[1]) { - feelin(selectCounts()); - } - new Ten.XHR('http://let.hatelabo.jp/', null, function(req) { - // XXX Ten.DOM.createElementFromString(), createDocumentFragment(), createContextualFragment() - var frag = document.createElement('div'); - frag.innerHTML = req.responseText; - feelin(selectCounts(frag)); - }); - } -})(); + if (location.hostname !== 'let.hatelabo.jp') location.href = '//let.hatelabo.jp'; -function feelin(counts) { - var offset = random(counts - 1); - new Ten.XHR('http://let.hatelabo.jp/?of=' + offset, null, function(req) { - var frag = document.createElement('div'); - frag.innerHTML = req.responseText; - var lets = Ten.querySelectorAll('.code-path', frag); - var feelin = lets[random(lets.length - 1)].href; - //console.info('::Let:: ' + 'feelin: ' + feelin); - location.href = feelin; + new Ten.XHR('http://let.hatelabo.jp/', null, function(req) { + var countSelector = /<span\sclass=\"top-bookmarklet-count\">\s+(\d+)\sBookmarklets!\s+<\/span>/; + var total = countSelector.exec(req.responseText)[1] || []; + if (!total) return; + + oracle(total); }); -} -function selectCounts(node) { - var elm = Ten.querySelector('.top-bookmarklet-count', node); - var counts = elm.innerHTML.replace(/\s/g, '').replace(/(\d+)\D+/, '$1'); - //console.info('::Let:: ' + 'counts: ' + counts); - return counts; -} + function oracle(counts) { + var offset = random(counts - 1); + // http://let.hatelabo.jp/?of= (0 origin paging) + new Ten.XHR('http://let.hatelabo.jp/?of=' + offset, null, function(req) { + var repoSelector = /<a\shref\="(\/[\w-]+\/let\/[\w-]+)"/g; + var repo, stack =[]; + while ((repo = repoSelector.exec(req.responseText))) { + stack.push(repo[1]); // push captuerd group + } + if (!stack || stack.length < 1) return; -function random(num) { - return Math.floor(Math.random() * num + 1); -} + location.pathname = stack[random(stack.length - 1)]; + }); + } + + function random(num) { + return Math.floor(Math.random() * Number(num) + 1); + } +})();
  • /*
     * @title Hatena::Let::Omikuji
     * @description Hatena::Let Fortune cookie
     * @include http://let.hatelabo.jp/*
     * @license MIT License http://nrm.mit-license.org/2012
     * @require 
     * @see https://en.wikipedia.org/wiki/Omikuji
     * @see https://en.wikipedia.org/wiki/Fortune_cookie
     */
    // # NOTE
    // Ten.XHR() 2nd args like this { data: { 'Content-Type' : 'application/xml', 'Accept' : 'application/xml'} }
    // expected responseXML, but actual response: 'Content-Type:text/html; charset=utf-8'
    // http://liosk.blog103.fc2.com/blog-entry-34.html
    
    // TODO feedback indicator
    (function () {
        if (location.hostname !== 'let.hatelabo.jp') location.href = '//let.hatelabo.jp';
    
        new Ten.XHR('http://let.hatelabo.jp/', null, function(req) {
            var countSelector = /<span\sclass=\"top-bookmarklet-count\">\s+(\d+)\sBookmarklets!\s+<\/span>/;
            var total = countSelector.exec(req.responseText)[1] || [];
            if (!total) return;
            
            oracle(total);
        });
    
        function oracle(counts) {
            var offset = random(counts - 1);
            // http://let.hatelabo.jp/?of= (0 origin paging)
            new Ten.XHR('http://let.hatelabo.jp/?of=' + offset, null, function(req) {
                var repoSelector = /<a\shref\="(\/[\w-]+\/let\/[\w-]+)"/g;
                var repo, stack =[];
                while ((repo = repoSelector.exec(req.responseText))) {
                    stack.push(repo[1]); // push captuerd group
                }
                if (!stack || stack.length < 1) return;
    
                location.pathname = stack[random(stack.length - 1)];
            });
        }
    
        function random(num) {
            return Math.floor(Math.random() * Number(num) + 1);
        }
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2016/01/11 03:15:32 - 2016-01-11
  2. 2013/04/01 12:28:12 - 2013-04-01
  3. 2012/12/27 19:22:59 - 2012-12-27
  4. 2012/12/06 05:45:45 - 2012-12-06
  5. 2012/12/06 05:38:35 - 2012-12-06
  6. 2012/07/25 06:05:17 - 2012-07-25
  7. 2012/07/25 06:03:48 - 2012-07-25
  8. 2012/06/03 09:27:15 - 2012-06-03
  9. 2012/02/23 17:46:18 - 2012-02-23