Skip to content

Instantly share code, notes, and snippets.

@edvakf
Created July 6, 2010 23:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save edvakf/466091 to your computer and use it in GitHub Desktop.
Save edvakf/466091 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name AutoPagerizeSITEINFOLoader.js
// @author edvakf
// @namespace http://d.hatena.ne.jp/edvakf/
// @description Help loading AutoPagerize SITEINFO
// @license The MIT License
// @version 0.2
// @include *
// @released 2010-06-06
// @updated 2010-06-06
// @compatible Opera
// ==/UserScript==
(function() {
var debug = false;
function log(msg) {if (debug) console.log(msg); return msg;}
var iframeSrc = 'http://0.0.0.0/AutoPagerizeSITEINFOLoader';
if (location.href === iframeSrc) {
var pf = 'AutoPagerize_SITEINFO_'; // prefix for each key of localStorage
var id = Math.floor((Date.now() + Math.random()) * 1000) + '';
var LS = localStorage;
var url; // url of parent page
var port; // message port to talk to parent page
var channel = new MessageChannel;
window.parent.postMessage({message: 'connect', src: iframeSrc}, '*', [channel.port2]);
port = channel.port1;
port.onmessage = function(e) {
// connection established, get url of parent
if (e.data.message !== 'connected') return;
url = e.data.url;
checkServer();
};
function checkServer() {
log(arguments.callee.name);
// send ping to the server. if there is a reply, send request. if no reply, start server
LS[pf + 'ping'] = JSON.stringify({from: id, to: LS[pf + 'server']});
addEventListener('storage', waitPong, false);
var timer = setTimeout(function timeoutPing() {
log(arguments.callee.name);
removeEventListener('storage', waitPong, false);
startServer();
}, 100);
function waitPong(e) {
log(arguments.callee.name);
if (e.key !== pf + 'pong') return;
var data = JSON.parse(e.newValue);
if (data.to !== id) return;
requestSiteinfo();
removeEventListener('storage', waitPong, false);
clearTimeout(timer);
}
}
function requestSiteinfo() {
log(arguments.callee.name);
LS[pf + 'request'] = JSON.stringify({from: id, to: LS[pf + 'server'], url: url});
addEventListener('storage', function onResponse(e) {
if (e.key !== pf + 'response') return;
log(arguments.callee.name);
var data = JSON.parse(e.newValue);
if (data.to !== id || data.url !== url) return;
port.postMessage({message: 'found', url: url, siteinfo: data.siteinfo});
port.postMessage({message: 'disconnect'});
removeEventListener('storage', onResponse, false);
}, false);
}
function startServer() {
log(arguments.callee.name);
LS[pf + 'server'] = id;
// update siteinfo
var siteinfo = LS[pf + 'data'];
var updated = LS[pf + 'updated'] || 0;
if (!siteinfo || Date.now() - updated > 24*60*60*1000) { // more than 1 day old
updateSiteinfo();
} else {
reallyStartServer(JSON.parse(siteinfo));
}
}
function updateSiteinfo() {
log(arguments.callee.name);
var timer = setTimeout(function timeoutJSONP(e) {
log(arguments.callee.name);
var siteinfo = LS[pf + 'data'];
if (!siteinfo) return;
window.AutoPagerizeCallbackSiteinfo = function() {};
reallyStartServer(siteinfo);
LS[pf + 'updated'] = Date.now();
}, 5000);
if (document.readyState === 'complete') return loadJSONP();
document.addEventListener('DOMContentLoaded', loadJSONP, false);
function loadJSONP() {
log(arguments.callee.name);
window.AutoPagerizeCallbackSiteinfo = function AutoPagerizeCallbackSiteinfo(siteinfo) {
log(arguments.callee.name);
LS[pf + 'data'] = JSON.stringify(siteinfo)
LS[pf + 'updated'] = Date.now();
reallyStartServer(siteinfo);
clearTimeout(timer);
}
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'http://ss-o.net/json/wedataAutoPagerizeSITEINFO.js';
document.body.appendChild(s);
}
}
function reallyStartServer(siteinfo) {
log(arguments.callee.name);
var lookup = SiteinfoLookupper(siteinfo);
port.postMessage({message: 'found', url: url, siteinfo: lookup(url)});
addEventListener('storage', function onStorageMessage(e) {
log(arguments.callee.name);
log(e.key + ' : ' + e.newValue);
if (e.key === pf + 'request') {
var data = JSON.parse(e.newValue);
if (data.to !== id) return;
log('request');
LS[pf + 'response'] = JSON.stringify({from: id, to: data.from, url: data.url, siteinfo: lookup(data.url)});
} else if (e.key === pf + 'ping') {
var data = JSON.parse(e.newValue);
if (data.to !== id) return;
log('ping');
LS[pf + 'pong'] = JSON.stringify({from: id, to: data.from});
} else if (e.key === pf + 'server' && e.newValue !== id) {
// this happens when accidentally start two servers at once
log('server change');
port.postMessage({message: 'disconnect'});
removeEventListener('storage', arguments.callee, false);
}
}, false);
}
function SiteinfoLookupper(_siteinfo) {
log(arguments.callee.name);
var siteinfo = [];
var microformats = [];
var n = _siteinfo.length;
while(--n) {
var info = _siteinfo[n];
var re = new RegExp(info.url);
if (re.test('http://a')) {
// isolate siteinfo that matches any url
microformats.push(info);
} else {
siteinfo.push([re, info]);
}
}
return function lookupSITEINFO(url) {
log(arguments.callee.name);
if (/^http:\/\/(www|images)\.google\.(?:[^.]+\.)?[^.\/]+\/images\?./.test(url)) {
url = url.replace(/^http:\/\/www/,'http://images') + '&gbv=1'; // Google Images hack see oAutoPagerize.js
}
var results = [];
var n = siteinfo.length;
var info;
while(info = siteinfo[--n]) {
var re = info[0];
if (re.test(url)) results.push(info[1]);
}
return results.concat(microformats);
}
}
} else if (window.self === window.top) {
opera.addEventListener('BeforeEvent.DOMContentLoaded', function() {
var f = document.createElement('iframe');
f.src = iframeSrc;
f.style = 'position:absolute; top:0; left:0; height:1px; width:1px; border:none; visibility: hidden;';
document.body.appendChild(f);
opera.addEventListener('BeforeEvent.message', function (ujsevent) {
var e = ujsevent.event;
if (!(e.origin === 'http://0.0.0.0'
&& e.data
&& e.data.message === 'connect'
&& e.data.src === iframeSrc
&& e.ports)) return;
ujsevent.preventDefault();
var port = e.ports[0];
port.postMessage({message: 'connected', url: location.href});
port.onmessage = function(e) {
var message = e.data.message;
if (message === 'found') {
// launch autopager
log('found');
var ev = document.createEvent('Event');
ev.initEvent('AutoPagerize_SiteinfoLoaded', true, false);
ev.SITEINFO = e.data.siteinfo;
document.dispatchEvent(ev);
}
if (message === 'disconnect') {
log('disconnect');
f.parentNode.removeChild(f);
port = port.onmessage = null; // cut reference
}
}
}, false);
}, false);
}
}());
@10crimes
Copy link

pls fix the bookmarklet of oAutopagerize,no longer working.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment