aboutsummaryrefslogtreecommitdiffstats
path: root/scalapi.js
diff options
context:
space:
mode:
Diffstat (limited to 'scalapi.js')
-rw-r--r--scalapi.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/scalapi.js b/scalapi.js
new file mode 100644
index 0000000..55a3434
--- /dev/null
+++ b/scalapi.js
@@ -0,0 +1,93 @@
+var PLUGIN_INFO =
+<VimperatorPlugin>
+<name>{NAME}</name>
+<description>Scala API document</description>
+<description lang="ja">Scala API を検索し、補完します。</description>
+<minVersion>2.0pre</minVersion>
+<maxVersion>2.0pre</maxVersion>
+<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/scalapi.js</updateURL>
+<author mail="hotchpotch@gmail.com" homepage="http://tako3.net/http://d.hatena.ne.jp/secondlife/">Yuichi Tateno</author>
+<license>MPL 1.1/GPL 2.0/LGPL 2.1</license>
+<version>0.1</version>
+<detail><![CDATA[
+Scala の API を検索し、保管し、該当のページを開きます。
+
+:sc[alapi][!] List[tab]
+
+引数には正規表現も利用できます。
+]]></detail>
+</VimperatorPlugin>;
+
+(function() {
+var p = function(arg) {
+ Application.console.log(arg);
+ // liberator.log(arg);
+};
+
+var scalaApiURL = liberator.globalVariables.scalaApiURL || 'http://www.scala-lang.org/docu/files/api/';
+if (!liberator.globalVariables.scalaApiCache) {
+ let xhr = new XMLHttpRequest();
+ let regex = new RegExp('<a href="scala/([^.]+).html" target="contentFrame">([^.]+)</a></li>', 'g');
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200) {
+ let text = xhr.responseText;
+ let res = [];
+ res.hashMap = {};
+ text.replace(regex, function(m) {
+ let path = RegExp.$1;
+ let name = path.replace('$object', '');
+ name = name.replace(/\//g, '.');
+ res.push([name, path]);
+ res.hashMap[name] = path;
+ });
+ liberator.globalVariables.scalaApiCache = res;
+ } else {
+ liberator.echoerr('Scala API : XHR Error: ' + xhr.statusText);
+ // throw new Error(xhr.statusText);
+ }
+ }
+ };
+ xhr.open('GET', scalaApiURL + 'all-classes.html', true);
+ xhr.send(null);
+}
+
+commands.addUserCommand(
+ liberator.globalVariables.scalaApiCommands || ['scalapi', 'sc'],
+ 'Scala API Search',
+ function(args) {
+ var name = (args.string || '');
+ var url = (name && liberator.globalVariables.scalaApiCache.hashMap[name]) ? scalaApiURL + 'scala/' + liberator.globalVariables.scalaApiCache.hashMap[name] + '.html' : scalaApiURL + 'index.html';
+ liberator.open(url, args.bang ? liberator.NEW_TAB : null);
+ }, {
+ completer: function(context) {
+ context.title = ['API Name', 'API'];
+ var word = context.filter;// .toUpperCase();
+ /*
+ if (word.indexOf('.') >= 0) {
+ let regex = word.split(/\.+/).map(function(i) i + '[^.]*').join('.');
+ p(regex);
+ regex = new RegExp('^' + regex.replace(/\[\^\.\]\*$/, ''));
+ p(regex);
+ context.filters = [function(item) regex.test(item.item[0])];
+ } else {
+ context.filters = [function(item) item.item[0].toUpperCase().indexOf(word) != -1];
+ }
+ */
+ try {
+ var regex = new RegExp(word, 'i');
+ context.filters = [function(item) regex.test(item.item[0])];
+ } catch(e) {
+ var word = context.filter.toUpperCase();
+ context.filters = [function(item) item.item[0].toUpperCase().indexOf(word) != -1];
+ }
+ context.completions = liberator.globalVariables.scalaApiCache || [];
+ },
+ argCount: '*',
+ bang: true
+ },
+ true
+);
+
+})();
+