aboutsummaryrefslogtreecommitdiffstats
path: root/_libly.js
diff options
context:
space:
mode:
authorsuVene2008-12-09 11:28:50 +0000
committersuVene2008-12-09 11:28:50 +0000
commit91953a2e1ef9e52fa448f9956a34375e5e47bb1d (patch)
treef6b5919c50c06edbf5839924af75d9d38f6f571c /_libly.js
parent65aebeaeb495185cefb32663dd555065fe821423 (diff)
downloadvimperator-plugins-91953a2e1ef9e52fa448f9956a34375e5e47bb1d.tar.bz2
$U整理。Request の getNodesFromXPath などを $U に移動など。
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26222 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to '_libly.js')
-rw-r--r--_libly.js191
1 files changed, 123 insertions, 68 deletions
diff --git a/_libly.js b/_libly.js
index 36b20d6..301a552 100644
--- a/_libly.js
+++ b/_libly.js
@@ -5,16 +5,22 @@ var PLUGIN_INFO =
<description>vimperator plugins library?</description>
<description lang="ja">適当なライブラリっぽいものたち。</description>
<author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
- <version>0.1.3</version>
+ <version>0.1.4</version>
<minVersion>1.2</minVersion>
<maxVersion>2.0pre</maxVersion>
<detail><![CDATA[
-== メソッド一覧 ==
-* liberator.plugins.libly.$U
+== Objects ==
+- liberator.plugins.libly.$U
+- liberator.plugins.libly.Request
+- liberator.plugins.libly.Response
+
+== Logger ==
getLogger(prefix):
log(msg, level), echo(msg, flg), echoerr(msg)
のメソッドを持つ logger インスタンスを取得します。
ログの書式は prefix + ': ' + yyyy/MM/dd + msg となります。
+
+== Object Utility ==
extend(dst, src):
オブジェクトを拡張します。
A(hash):
@@ -22,9 +28,6 @@ A(hash):
bind(obj, func):
func に obj を bind します。
func内からは this で obj が参照できるようになります。
-stripTags(str, tags):
- str から tags で指定されたタグを取り除いて返却します。
- tags は文字列、または配列で指定して下さい。
eval(text):
Sandbox による、window.eval を極力利用するようにします。
Snadbox が利用できない場合は、unsafe な window の eval が直接利用されます。
@@ -32,29 +35,52 @@ evalJson(str, toRemove):
str を decode します。
toRemove が true の場合、文字列の前後を1文字削除します。
"(key:value)" 形式の場合などに true を指定して下さい。
-pathToURL(path):
- 相対パスを絶対パスに変換します。
deteFormat(dtm, fmt):
Date型インスタンスを、指定されたフォーマットで文字列に変換します。
fmt を省略した場合、"%y/%M/%d %h:%m:%s" となります。
+
+== Browser ==
+getSelectedString:
+ window の選択文字列を返却します。
+getUserAndPassword(hostname, formSubmitURL, username):
+ login-manager から [username, password] を取得します。
+ 引数の username が省略された場合、検索された 1件目を返却します。
+ データが存在しない場合は、null を返却します。
+
+== System ==
readDirectory(path, fileter, func):
path で指定したディレクトリから、filter で指定された正規表現に match する場合、
func をファイル名を引数にコールバックします。
filter は Function を指定することも可能です。
+
+== HTML, XML, DOM, E4X ==
+pathToURL(path):
+ 相対パスを絶対パスに変換します。
+getHTMLFragment(html):
+ <html>※1</html>
+ ※1 の文字列を取得します。
+stripTags(str, tags):
+ str から tags で指定されたタグを取り除いて返却します。
+ tags は文字列、または配列で指定して下さい。
+createHTMLDocument(str):
+ 引数 str より、HTMLFragment を作成します。
+getNodesFromXPath(xpath, doc, callback, obj):
+ xpath を評価し snapshot の配列を返却します。
]]></detail>
</VimperatorPlugin>;
//}}}
if (!liberator.plugins.libly) {
liberator.plugins.libly = {};
-var lib = liberator.plugins.libly;
+var libly = liberator.plugins.libly;
-lib.$U = {//{{{
+libly.$U = {//{{{
+ // Logger {{{
getLogger: function(prefix) {
return new function() {
this.log = function(msg, level) {
if (typeof msg == 'object') msg = util.objectToString(msg);
- liberator.log(lib.$U.dateFormat(new Date()) + ': ' + (prefix || '') + ': ' + msg, (level || 0));
+ liberator.log(libly.$U.dateFormat(new Date()) + ': ' + (prefix || '') + ': ' + msg, (level || 0));
};
this.echo = function(msg, flg) {
flg = flg || commandline.FORCE_MULTILINE;
@@ -67,6 +93,8 @@ lib.$U = {//{{{
};
}
},
+ // }}}
+ // Object Utility {{{
extend: function(dst, src) {
for (let prop in src)
dst[prop] = src[prop];
@@ -82,10 +110,6 @@ lib.$U = {//{{{
return func.apply(obj, arguments);
}
},
- stripTags: function(str, tags) {
- var ignoreTags = '(?:' + tags.join('|') + ')';
- return str.replace(new RegExp('<' + ignoreTags + '(?:[ \\t\\n\\r][^>]*|/)?>([\\S\\s]*?)<\/' + ignoreTags + '[ \\t\\r\\n]*>', 'ig'), '');
- },
eval: function(text) {
var fnc = window.eval;
var sandbox;
@@ -106,15 +130,6 @@ lib.$U = {//{{{
return json.decode(str);
} catch (e) { return null; }
},
- getSelectedString: function() {
- return (new XPCNativeWrapper(window.content.window)).getSelection().toString();
- },
- pathToURL: function(path) {
- if (/^https?:\/\//.test(path)) return path;
- var link = document.createElement('a');
- link.href= path;
- return link.href;
- },
dateFormat: function(dtm, fmt) {
var d = {
y: dtm.getFullYear(),
@@ -131,6 +146,35 @@ lib.$U = {//{{{
}
return (fmt || '%y/%M/%d %h:%m:%s').replace(/%([yMdhms%])/g, function (_, n) d[n]);
},
+ // }}}
+ // Browser {{{
+ getSelectedString: function() {
+ return (new XPCNativeWrapper(window.content.window)).getSelection().toString();
+ },
+ getUserAndPassword: function(hostname, formSubmitURL, username) {
+ try {
+ var passwordManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
+ var logins = passwordManager.findLogins({}, hostname, formSubmitURL, null);
+ if (logins.length) {
+ if (username) {
+ for (let i = 0, len = logins.lengh; i < len; i++) {
+ if (logins[i].username == username)
+ return [logins[i].username, logins[i].password]
+ }
+ throw 'username notfound.';
+ } else {
+ return [logins[0].username, logins[0].password];
+ }
+ } else {
+ throw 'account notfound.';
+ }
+ } catch (e) {
+ liberator.log('[getUserAndPassword] error: ' + e, 0);
+ return null;
+ }
+ },
+ // }}}
+ // System {{{
readDirectory: function(path, filter, func) {
var d = io.getFile(path);
if (d.exists() && d.isDirectory()) {
@@ -149,6 +193,41 @@ lib.$U = {//{{{
}
}
},
+ // }}}
+ // HTML, XML, DOM, E4X {{{
+ pathToURL: function(a) {
+ var path = (a.href || a.action || a.value || a);
+ if (/^https?:\/\//.test(path)) return path;
+ var link = document.createElement('a');
+ link.href = path;
+ return link.href;
+ },
+ getHTMLFragment: function(html) {
+ if (!html) return html;
+ return html.replace(/^[\s\S]*?<html(?:[ \t\n\r][^>]*)?>|<\/html[ \t\r\n]*>[\S\s]*$/ig, '').replace(/[\r\n]+/g, ' ');
+ },
+ stripTags: function(str, tags) {
+ var ignoreTags = '(?:' + [].concat(tags).join('|') + ')';
+ return str.replace(new RegExp('<' + ignoreTags + '(?:[ \\t\\n\\r][^>]*|/)?>([\\S\\s]*?)<\/' + ignoreTags + '[ \\t\\r\\n]*>', 'ig'), '');
+ },
+ createHTMLDocument: function(str) {
+ var htmlFragment = document.implementation.createDocument(null, 'html', null);
+ var range = document.createRange();
+ range.setStartAfter(window.content.document.body);
+ htmlFragment.documentElement.appendChild(htmlFragment.importNode(range.createContextualFragment(str), true));
+ return htmlFragment;
+ },
+ getNodesFromXPath: function(xpath, doc, callback, obj) {
+ var ret = [];
+ if (!xpath || !doc) return ret;
+ var node = doc || document;
+ var nodesSnapshot = (node.ownerDocument || node).evaluate(xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+ for (let i = 0, l = nodesSnapshot.snapshotLength; i < l; i++) {
+ if (typeof callback == 'function') callback.call(obj, nodesSnapshot.snapshotItem(i), i);
+ ret.push(nodesSnapshot.snapshotItem(i));
+ }
+ return ret;
+ },
xmlSerialize: function(xml) {
try {
return (new XMLSerializer()).serializeToString(xml)
@@ -156,19 +235,20 @@ lib.$U = {//{{{
.replace(/<[^>]+>/g, function(all) all.toLowerCase());
} catch (e) { return '' }
}
+ // }}}
};
//}}}
-lib.Request = function() {//{{{
+libly.Request = function() {//{{{
this.initialize.apply(this, arguments);
};
-lib.Request.EVENTS = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-lib.Request.requestCount = 0;
-lib.Request.prototype = {
+libly.Request.EVENTS = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+libly.Request.requestCount = 0;
+libly.Request.prototype = {
initialize: function(url, headers, options) {
this.url = url;
this.headers = headers || {};
- this.options = lib.$U.extend({
+ this.options = libly.$U.extend({
asynchronous: true,
encoding: 'UTF-8'
}, options || {});
@@ -197,12 +277,12 @@ lib.Request.prototype = {
_request: function(method) {
try {
- lib.Request.requestCount++;
+ libly.Request.requestCount++;
this.transport = new XMLHttpRequest();
this.transport.open(method, this.url, this.options.asynchronous);
- this.transport.onreadystatechange = lib.$U.bind(this, this._onStateChange);
+ this.transport.onreadystatechange = libly.$U.bind(this, this._onStateChange);
this.setRequestHeaders();
this.transport.overrideMimeType('text/html; charset=' + this.options.encoding);
@@ -232,11 +312,11 @@ lib.Request.prototype = {
return !status || (status >= 200 && status < 300);
},
respondToReadyState: function(readyState) {
- var state = lib.Request.EVENTS[readyState];
- var res = new lib.Response(this);
+ var state = libly.Request.EVENTS[readyState];
+ var res = new libly.Response(this);
if (state == 'Complete') {
- lib.Request.requestCount--;
+ libly.Request.requestCount--;
try {
this._complete = true;
this.fireEvent('on' + (this.isSuccess() ? 'Success' : 'Failure'), res, this.options.asynchronous);
@@ -276,10 +356,10 @@ lib.Request.prototype = {
}
};//}}}
-lib.Response = function() {//{{{
+libly.Response = function() {//{{{
this.initialize.apply(this, arguments);
};
-lib.Response.prototype = {
+libly.Response.prototype = {
initialize: function(req) {
this.req = req;
this.transport = req.transport;
@@ -297,45 +377,20 @@ lib.Response.prototype = {
},
status: 0,
statusText: '',
- getStatus: lib.Request.prototype.getStatus,
+ getStatus: libly.Request.prototype.getStatus,
getStatusText: function() {
try {
return this.transport.statusText || '';
} catch (e) { return ''; }
},
- getHTMLDocument: function(xpath, xmlns, ignoreTags) {
+ getHTMLDocument: function(xpath, xmlns, ignoreTags, callback) {
if (!this.doc) {
- this.htmlFragmentstr = this.responseText.replace(/^[\s\S]*?<html(?:[ \t\n\r][^>]*)?>|<\/html[ \t\r\n]*>[\S\s]*$/ig, '').replace(/[\r\n]+/g, ' ');
- let iTags = ['script'];
- if (ignoreTags) {
- iTags.concat(ignoreTags.split(','));
- }
- this.htmlStripScriptFragmentstr = lib.$U.stripTags(this.htmlFragmentstr, iTags);
- this.doc = this._createHTMLDocument(this.htmlStripScriptFragmentstr, xmlns);
+ this.htmlFragmentstr = libly.$U.getHTMLFragment(this.responseText);
+ this.htmlStripScriptFragmentstr = libly.$U.stripTags(this.htmlFragmentstr, ignoreTags);
+ this.doc = libly.$U.createHTMLDocument(this.htmlStripScriptFragmentstr, xmlns);
}
-
- var ret = this.doc;
- if (xpath) {
- ret = this.getNodeFromXPath(xpath, this.doc);
- }
- return ret;
- },
- _createHTMLDocument: function(str) {
- var htmlFragment = document.implementation.createDocument(null, 'html', null);
- var range = document.createRange();
- range.setStartAfter(window.content.document.body);
- htmlFragment.documentElement.appendChild(htmlFragment.importNode(range.createContextualFragment(str), true));
- return htmlFragment;
- },
- getNodeFromXPath: function(xpath, doc, parentNode) {
- if (!xpath || !doc) return doc;
- var node = doc || document;
- var nodesSnapshot = (node.ownerDocument || node).evaluate(xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
-
- if (nodesSnapshot.snapshotLength == 0) return parentNode;
- parentNode = parentNode || document.createElementNS(null, 'div');
- for (let i = 0, l = nodesSnapshot.snapshotLength; i < l; parentNode.appendChild(nodesSnapshot.snapshotItem(i++)));
- return parentNode;
+ if (!xpath) return this.doc;
+ return libly.$U.getNodesFromXPath(xpath, this.doc, callback);
}
};
//}}}