Hatena::Let Omikuji
by
noromanba
2016-01-11 [2016/01/11 03:15:32]
Hatena::Let Fortune cookie
@@ -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 です。