Show
Ignore:
Timestamp:
08/02/08 11:21:43 (4 months ago)
Author:
cho45
Message:
  • JSDeferred を最新に
  • Deferred 返す関数は動詞じゃないとおかしいので修正
  • pdc つかうように
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/userscripts/jautopagerize.user.js

    r15727 r16968  
    108108BeCompatible(); 
    109109 
    110 function Resource (uri, convertfun) { 
     110function getResource (uri, convertfun) { 
    111111        var d = Deferred(); 
    112112        if (!convertfun) convertfun = function (i) { return i }; 
    113         if (uri.indexOf("http://") != 0) { 
    114                 // resolve relative path; for Safari 
    115                 var i = new Image(); 
    116                 i.src = uri; 
    117                 uri = i.src; 
    118                 i.src = "#"; 
    119         } 
    120113        log("Getting Resource: "+uri); 
    121114        GM_xmlhttpRequest({ 
    122115                method  : "GET", 
    123                 url     : uri, 
     116                url     : absoluteURI(uri), 
    124117                overrideMimeType: 'text/html; charset=' + document.characterSet, 
    125118                headers: { 
     
    137130} 
    138131 
    139 function HTMLResource (uri) { 
    140         return Resource(uri, HTMLResource.createDocumentFromString); 
    141 } 
    142 HTMLResource.createDocumentFromString = function (s) { 
     132function getHTMLResource (uri) { 
     133        return getResource(uri, getHTMLResource.createDocumentFromString); 
     134} 
     135getHTMLResource.createDocumentFromString = function (s) { 
    143136        s = String(s).replace(/<script[ \t\r\n<>][\S\s]*?<\/script(?:[ \t\r\n]*>|[ \t\r\n]+)|<(?:i?frame|html|object|script)(?:[ \t\r\n][^<>]*(?:>|(?=<))|[ \t\r\n]*>)|<\/(?:i?frame|html|object|script)(?:[ \t\r\n]*>|[ \t\r\n]+)/gi, ""); 
    144137        var d = createHTMLDocument(); 
     
    158151}; 
    159152 
    160 function CachedResource (uri, convertfun, expire) { 
     153function getCachedResource (uri, convertfun, expire) { 
    161154        var d   = Deferred(); 
    162155        var key = uri; 
     
    221214 
    222215        AutoPagerize._loading = true; 
    223         HTMLResource(AutoPagerize._nextURI).next(function (r) { 
     216        getHTMLResource(AutoPagerize._nextURI).next(function (r) { 
    224217                var ib  = AutoPagerize._insertBefore; 
    225218                var pib = ib.parentNode; 
    226                 pib.insertBefore(h("<hr/><p>AutoPagerized: <a href='%s'>%s</a></p>".replace(/%s/g, AutoPagerize._nextURI)), ib); 
     219                pib.insertBefore( 
     220                        dom("<div class='_autopagerize'><hr /><p>AutoPagerized: <a href='#{next}'>#{next}</a></p></div>", null, { 
     221                                next : AutoPagerize._nextURI 
     222                        }).root, 
     223                        ib 
     224                ); 
    227225                var pages = $X(AutoPagerize._pageinfo.pageElement, r).map(function (i) { 
    228226                        i = document.importNode(i, true); 
     
    272270AutoPagerize.clearCache = function () { 
    273271        AutoPagerize.Config.site_info_urls.forEach(function (url_info) { 
    274                 CachedResource(url_info.url).clear().cancel(); 
     272                getCachedResource(url_info.url).clear().cancel(); 
    275273        }); 
    276274        AutoPagerize.icon.innerHTML = 'cleared cache'; 
     
    295293        // get siteinfo 
    296294        parallel(AutoPagerize.Config.site_info_urls.map(function (url_info) { 
    297                 var cr = CachedResource(url_info.url, parseSiteInfo, AutoPagerize.Config.cache_expire); 
     295                var cr = getCachedResource(url_info.url, parseSiteInfo, AutoPagerize.Config.cache_expire); 
    298296                if (location.href == url_info.url) cr.clear(); 
    299297                return cr; 
     
    307305                                case 'HTML': 
    308306                                default: 
    309                                         var d = HTMLResource.createDocumentFromString(data); 
     307                                        var d = getHTMLResource.createDocumentFromString(data); 
    310308                                        $X(".//*[@class='autopagerize_data']", d).forEach(function (e) { 
    311309                                                // using replace as scan and folding key/value to i 
     
    493491// register menu for clearing cache 
    494492GM_registerMenuCommand('jAutoPagerize - clear cache', AutoPagerize.clearCache); 
    495 // for bookmarklet 
    496 unsafeWindow.XPathGenerator = XPathGenerator; 
    497493 
    498494} // end with 
     
    620616} 
    621617 
     618function absoluteURI (uri) { 
     619        if (uri.indexOf("http://") != 0) { 
     620                // resolve relative path; for Safari 
     621                var i = new Image(); 
     622                i.src = uri; 
     623                uri = i.src; 
     624                i.src = "#"; 
     625        } 
     626        return uri; 
     627} 
     628 
     629 
     630function dom (str, cur, txt) { 
     631        var t, ret = {}, stack = [cur = cur || document.createElement("div")]; 
     632        while (str.length) { 
     633                if (str.indexOf("<") == 0) { 
     634                        if (t = str.match(/^\s*<(\/?[^\s>\/]+)([^>]+?)?(\/)?>/)) { 
     635                                var tag = t[1], attrs = t[2], isempty = !!t[3]; 
     636                                if (tag.indexOf("/") == -1) { 
     637                                        child = document.createElement(tag); 
     638                                        if (attrs) attrs.replace(/([a-z]+)=(?:'([^']+)'|"([^"]+)")/gi, 
     639                                                function (m, name, v1, v2) { 
     640                                                        var v = text(v1 || v2); 
     641                                                        if (name == "class") ret[v] = child; 
     642                                                        child.setAttribute(name, v); 
     643                                                } 
     644                                        ); 
     645                                        cur.appendChild(ret.root ? child : (ret.root = child)); 
     646                                        if (!isempty) { 
     647                                                stack.push(cur); 
     648                                                cur = child; 
     649                                        } 
     650                                } else cur = stack.pop(); 
     651                        } else throw("Parse Error: " + str); 
     652                } else { 
     653                        if (t = str.match(/^([^<]+)/)) cur.appendChild(document.createTextNode(text(t[0]))); 
     654                } 
     655                str = str.substring(t[0].length); 
     656        } 
     657        return ret; 
     658 
     659        function text (str) { 
     660                return str 
     661                        .replace(/&(#(x)?)?([^;]+);/g, function (_, isNumRef, isHex, ref) { 
     662                                return isNumRef ? String.fromCharCode(parseInt(ref, isHex ? 16 : 10)): 
     663                                                  {"lt":"<","gt":"<","amp":"&"}[ref]; 
     664                        }) 
     665                        .replace(/#\{([^}]+)\}/, function (_, name) { 
     666                                return txt[name]; 
     667                        }); 
     668        } 
     669} 
     670 
    622671 
    623672function log (m) { 
     
    663712 
    664713        switch (type) { 
    665                 case String: 
    666                         return exp.evaluate( 
    667                                 context, 
    668                                 XPathResult.STRING_TYPE, 
    669                                 null 
    670                         ).stringValue; 
    671                 case Number: 
    672                         return exp.evaluate( 
    673                                 context, 
    674                                 XPathResult.NUMBER_TYPE, 
    675                                 null 
    676                         ).numberValue; 
    677                 case Boolean: 
    678                         return exp.evaluate( 
    679                                 context, 
    680                                 XPathResult.BOOLEAN_TYPE, 
    681                                 null 
    682                         ).booleanValue; 
     714                case String: return exp.evaluate(context, XPathResult.STRING_TYPE, null).stringValue; 
     715                case Number: return exp.evaluate(context, XPathResult.NUMBER_TYPE, null).numberValue; 
     716                case Boolean: return exp.evaluate(context, XPathResult.BOOLEAN_TYPE, null).booleanValue; 
    683717                case Array: 
    684                         var result = exp.evaluate( 
    685                                 context, 
    686                                 XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
    687                                 null 
    688                         ); 
    689                         var ret = []; 
    690                         for (var i = 0, len = result.snapshotLength; i < len; ret.push(result.snapshotItem(i++))); 
     718                        var result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
     719                        for (var ret = [], i = 0, len = result.snapshotLength; i < len; i++) { 
     720                                ret.push(result.snapshotItem(i)); 
     721                        } 
    691722                        return ret; 
    692723                case undefined: 
     
    696727                                case XPathResult.NUMBER_TYPE : return result.numberValue; 
    697728                                case XPathResult.BOOLEAN_TYPE: return result.booleanValue; 
    698                                 case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: { 
     729                                case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: 
    699730                                        // not ensure the order. 
    700                                         var ret = []; 
    701                                         var i = null; 
    702                                         while (i = result.iterateNext()) { 
    703                                                 ret.push(i); 
    704                                         } 
     731                                        var ret = [], i = null; 
     732                                        while (i = result.iterateNext()) ret.push(i); 
    705733                                        return ret; 
    706                                 } 
    707734                        } 
    708735                        return null; 
    709                 default: 
    710                         throw(TypeError("$X: specified type is not valid type.")); 
    711         } 
    712 } 
    713  
     736                default: throw(TypeError("$X: specified type is not valid type.")); 
     737        } 
     738} 
    714739 
    715740// Usage:: with (D()) { your code } 
    716 // JSDefeered (c) Copyright (c) 2007 cho45 ( www.lowreal.net ) 
     741// JSDeferred 0.2.1 (c) Copyright (c) 2007 cho45 ( www.lowreal.net ) 
    717742// See http://coderepos.org/share/wiki/JSDeferred 
    718743function D () { 
     
    741766 
    742767        _post : function (okng, fun) { 
    743                 this._next = new Deferred(); 
     768                this._next =  new Deferred(); 
    744769                this._next.callback[okng] = fun; 
    745770                return this._next; 
     
    780805                        }); 
    781806                        num++; 
    782                 })(dl[i], i) 
    783         } 
     807                })(dl[i], i); 
     808        } 
     809        if (!num) Deferred.next(function () { ret.call() }); 
     810        ret.canceller = function () { 
     811                for (var i in dl) if (dl.hasOwnProperty(i)) { 
     812                        dl[i].cancel(); 
     813                } 
     814        }; 
    784815        return ret; 
    785816}; 
     
    791822                d.call((new Date).getTime() - t.getTime()); 
    792823        }, n * 1000); 
    793         d.canceller   = function () { try { clearTimeout(id) } catch (e) {} }; 
     824        d.canceller = function () { try { clearTimeout(id) } catch (e) {} }; 
    794825        return d; 
    795826}; 
     
    798829        var d = new Deferred(); 
    799830        var id = setTimeout(function () { clearTimeout(id); d.call() }, 0); 
    800         d.callback.ok = fun; 
    801         d.canceller   = function () { try { clearTimeout(id) } catch (e) {} }; 
     831        if (fun) d.callback.ok = fun; 
     832        d.canceller = function () { try { clearTimeout(id) } catch (e) {} }; 
    802833        return d; 
    803834}; 
     
    806837        args = Array.prototype.slice.call(arguments); 
    807838        f    = args.shift(); 
    808         return next(function () { 
     839        return Deferred.next(function () { 
    809840                return f.apply(this, args); 
    810841        }); 
     
    814845        var o = { 
    815846                begin : n.begin || 0, 
    816                 end   : n.end   || (n - 1), 
     847                end   : (typeof n.end == "number") ? n.end : n - 1, 
    817848                step  : n.step  || 1, 
    818849                last  : false, 
     
    820851        }; 
    821852        var ret, step = o.step; 
    822         return next(function () { 
     853        return Deferred.next(function () { 
    823854                function _loop (i) { 
    824855                        if (i <= o.end) { 
     
    832863                                        return ret.next(function (r) { 
    833864                                                ret = r; 
    834                                                 return call(_loop, i + step); 
     865                                                return Deferred.call(_loop, i + step); 
    835866                                        }); 
    836867                                } else { 
    837                                         return call(_loop, i + step); 
     868                                        return Deferred.call(_loop, i + step); 
    838869                                } 
    839870                        } else { 
     
    841872                        } 
    842873                } 
    843                 return call(_loop, o.begin); 
     874                return (o.begin < o.end) ? Deferred.call(_loop, o.begin) : null; 
    844875        }); 
    845876}; 
     
    866897        if (!list) list = ["parallel", "wait", "next", "call", "loop"]; 
    867898        if (!obj)  obj  = (function () { return this })(); 
    868         list.forEach(function (n) { obj[n] = Deferred[n] }); 
     899        for (var i = 0; i < list.length; i++) { 
     900                var n = list[i]; 
     901                obj[n] = Deferred[n]; 
     902        } 
    869903        return Deferred; 
    870904}; 
     
    882916                d.fail(res); 
    883917        }; 
    884         GM_xmlhttpRequest(opts); 
     918        setTimeout(function () { 
     919                GM_xmlhttpRequest(opts); 
     920        }, 0); 
    885921        return d; 
    886922} 
    887 xhttp.get  = function (url)       { return xhttp({method:"get", url:url}) }; 
    888 xhttp.post = function (url, data) { return xhttp({method:"post", url:url, data:data}) }; 
     923xhttp.get  = function (url)       { return xhttp({method:"get",  url:url}) }; 
     924xhttp.post = function (url, data) { return xhttp({method:"post", url:url, data:data, headers:{"Content-Type":"application/x-www-form-urlencoded"}}) }; 
     925 
    889926 
    890927function http (opts) { 
     
    892929        var req = new XMLHttpRequest(); 
    893930        req.open(opts.method, opts.url, true); 
     931        if (opts.headers) { 
     932                for (var k in opts.headers) if (opts.headers.hasOwnProperty(k)) { 
     933                        req.setRequestHeader(k, opts.headers[k]); 
     934                } 
     935        } 
    894936        req.onreadystatechange = function () { 
    895937                if (req.readyState == 4) d.call(req); 
    896938        }; 
    897939        req.send(opts.data || null); 
     940        d.xhr = req; 
    898941        return d; 
    899942} 
    900 http.get  = function (url)       { return http({method:"get", url:url}) }; 
    901 http.post = function (url, data) { return http({method:"post", url:url, data:data}) }; 
     943http.get   = function (url)       { return http({method:"get",  url:url}) }; 
     944http.post  = function (url, data) { return http({method:"post", url:url, data:data, headers:{"Content-Type":"application/x-www-form-urlencoded"}}) }; 
     945http.jsonp = function (url, params) { 
     946        if (!params) params = {}; 
     947 
     948        var Global = (function () { return this })(); 
     949        var d = Deferred(); 
     950        var cbname = params["callback"]; 
     951        if (!cbname) do { 
     952                cbname = "callback" + String(Math.random()).slice(2); 
     953        } while (typeof(Global[cbname]) != "undefined"); 
     954 
     955        params["callback"] = cbname; 
     956 
     957        url += (url.indexOf("?") == -1) ? "?" : "&"; 
     958 
     959        for (var name in params) if (params.hasOwnProperty(name)) { 
     960                url = url + encodeURIComponent(name) + "=" + encodeURIComponent(params[name]) + "&"; 
     961        } 
     962 
     963        var script = document.createElement('script'); 
     964        script.type    = "text/javascript"; 
     965        script.charset = "utf-8"; 
     966        script.src     = url; 
     967        document.body.appendChild(script); 
     968 
     969        Global[cbname] = function callback (data) { 
     970                delete Global[cbname]; 
     971                document.body.removeChild(script); 
     972                d.call(data); 
     973        }; 
     974        return d; 
     975}; 
    902976 
    903977Deferred.Deferred = Deferred; 
     
    905979Deferred.xhttp    = xhttp; 
    906980return Deferred; 
    907 } 
     981}// End of JSDeferred 
    908982 
    909983})();