Changeset 16968 for lang/javascript/userscripts
- Timestamp:
- 08/02/08 11:21:43 (4 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/javascript/userscripts/jautopagerize.user.js
r15727 r16968 108 108 BeCompatible(); 109 109 110 function Resource (uri, convertfun) {110 function getResource (uri, convertfun) { 111 111 var d = Deferred(); 112 112 if (!convertfun) convertfun = function (i) { return i }; 113 if (uri.indexOf("http://") != 0) {114 // resolve relative path; for Safari115 var i = new Image();116 i.src = uri;117 uri = i.src;118 i.src = "#";119 }120 113 log("Getting Resource: "+uri); 121 114 GM_xmlhttpRequest({ 122 115 method : "GET", 123 url : uri,116 url : absoluteURI(uri), 124 117 overrideMimeType: 'text/html; charset=' + document.characterSet, 125 118 headers: { … … 137 130 } 138 131 139 function HTMLResource (uri) {140 return Resource(uri,HTMLResource.createDocumentFromString);141 } 142 HTMLResource.createDocumentFromString = function (s) {132 function getHTMLResource (uri) { 133 return getResource(uri, getHTMLResource.createDocumentFromString); 134 } 135 getHTMLResource.createDocumentFromString = function (s) { 143 136 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, ""); 144 137 var d = createHTMLDocument(); … … 158 151 }; 159 152 160 function CachedResource (uri, convertfun, expire) {153 function getCachedResource (uri, convertfun, expire) { 161 154 var d = Deferred(); 162 155 var key = uri; … … 221 214 222 215 AutoPagerize._loading = true; 223 HTMLResource(AutoPagerize._nextURI).next(function (r) {216 getHTMLResource(AutoPagerize._nextURI).next(function (r) { 224 217 var ib = AutoPagerize._insertBefore; 225 218 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 ); 227 225 var pages = $X(AutoPagerize._pageinfo.pageElement, r).map(function (i) { 228 226 i = document.importNode(i, true); … … 272 270 AutoPagerize.clearCache = function () { 273 271 AutoPagerize.Config.site_info_urls.forEach(function (url_info) { 274 CachedResource(url_info.url).clear().cancel();272 getCachedResource(url_info.url).clear().cancel(); 275 273 }); 276 274 AutoPagerize.icon.innerHTML = 'cleared cache'; … … 295 293 // get siteinfo 296 294 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); 298 296 if (location.href == url_info.url) cr.clear(); 299 297 return cr; … … 307 305 case 'HTML': 308 306 default: 309 var d = HTMLResource.createDocumentFromString(data);307 var d = getHTMLResource.createDocumentFromString(data); 310 308 $X(".//*[@class='autopagerize_data']", d).forEach(function (e) { 311 309 // using replace as scan and folding key/value to i … … 493 491 // register menu for clearing cache 494 492 GM_registerMenuCommand('jAutoPagerize - clear cache', AutoPagerize.clearCache); 495 // for bookmarklet496 unsafeWindow.XPathGenerator = XPathGenerator;497 493 498 494 } // end with … … 620 616 } 621 617 618 function 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 630 function 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 622 671 623 672 function log (m) { … … 663 712 664 713 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; 683 717 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 } 691 722 return ret; 692 723 case undefined: … … 696 727 case XPathResult.NUMBER_TYPE : return result.numberValue; 697 728 case XPathResult.BOOLEAN_TYPE: return result.booleanValue; 698 case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {729 case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: 699 730 // 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); 705 733 return ret; 706 }707 734 } 708 735 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 } 714 739 715 740 // Usage:: with (D()) { your code } 716 // JSDefe ered(c) Copyright (c) 2007 cho45 ( www.lowreal.net )741 // JSDeferred 0.2.1 (c) Copyright (c) 2007 cho45 ( www.lowreal.net ) 717 742 // See http://coderepos.org/share/wiki/JSDeferred 718 743 function D () { … … 741 766 742 767 _post : function (okng, fun) { 743 this._next = new Deferred();768 this._next = new Deferred(); 744 769 this._next.callback[okng] = fun; 745 770 return this._next; … … 780 805 }); 781 806 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 }; 784 815 return ret; 785 816 }; … … 791 822 d.call((new Date).getTime() - t.getTime()); 792 823 }, n * 1000); 793 d.canceller = function () { try { clearTimeout(id) } catch (e) {} };824 d.canceller = function () { try { clearTimeout(id) } catch (e) {} }; 794 825 return d; 795 826 }; … … 798 829 var d = new Deferred(); 799 830 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) {} }; 802 833 return d; 803 834 }; … … 806 837 args = Array.prototype.slice.call(arguments); 807 838 f = args.shift(); 808 return next(function () {839 return Deferred.next(function () { 809 840 return f.apply(this, args); 810 841 }); … … 814 845 var o = { 815 846 begin : n.begin || 0, 816 end : n.end || (n - 1),847 end : (typeof n.end == "number") ? n.end : n - 1, 817 848 step : n.step || 1, 818 849 last : false, … … 820 851 }; 821 852 var ret, step = o.step; 822 return next(function () {853 return Deferred.next(function () { 823 854 function _loop (i) { 824 855 if (i <= o.end) { … … 832 863 return ret.next(function (r) { 833 864 ret = r; 834 return call(_loop, i + step);865 return Deferred.call(_loop, i + step); 835 866 }); 836 867 } else { 837 return call(_loop, i + step);868 return Deferred.call(_loop, i + step); 838 869 } 839 870 } else { … … 841 872 } 842 873 } 843 return call(_loop, o.begin);874 return (o.begin < o.end) ? Deferred.call(_loop, o.begin) : null; 844 875 }); 845 876 }; … … 866 897 if (!list) list = ["parallel", "wait", "next", "call", "loop"]; 867 898 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 } 869 903 return Deferred; 870 904 }; … … 882 916 d.fail(res); 883 917 }; 884 GM_xmlhttpRequest(opts); 918 setTimeout(function () { 919 GM_xmlhttpRequest(opts); 920 }, 0); 885 921 return d; 886 922 } 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}) }; 923 xhttp.get = function (url) { return xhttp({method:"get", url:url}) }; 924 xhttp.post = function (url, data) { return xhttp({method:"post", url:url, data:data, headers:{"Content-Type":"application/x-www-form-urlencoded"}}) }; 925 889 926 890 927 function http (opts) { … … 892 929 var req = new XMLHttpRequest(); 893 930 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 } 894 936 req.onreadystatechange = function () { 895 937 if (req.readyState == 4) d.call(req); 896 938 }; 897 939 req.send(opts.data || null); 940 d.xhr = req; 898 941 return d; 899 942 } 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}) }; 943 http.get = function (url) { return http({method:"get", url:url}) }; 944 http.post = function (url, data) { return http({method:"post", url:url, data:data, headers:{"Content-Type":"application/x-www-form-urlencoded"}}) }; 945 http.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 }; 902 976 903 977 Deferred.Deferred = Deferred; … … 905 979 Deferred.xhttp = xhttp; 906 980 return Deferred; 907 } 981 }// End of JSDeferred 908 982 909 983 })();
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)