From 720564652fe8b68581523b24609bb2b92a41fc79 Mon Sep 17 00:00:00 2001 From: Aaron Mueller Date: Sun, 11 Aug 2013 20:22:36 +0200 Subject: [PATCH] Integrate the CoffeeScript Compiler for .coffee files Simple integration of CoffeeScript support. The code uses the JavaScript implementation of the CoffeeScript compiler. All *.coffee files get compiled to JavaScript just before eval(). Additionaly a new command named /coffe is introduced to run CoffeeScript code straight in the Minecraft console. --- build.xml | 5 ++++ .../scriptcraft/ScriptCraftPlugin.java | 13 +++++++- src/main/javascript/core/_scriptcraft.js | 30 +++++++++++++------ src/main/resources/plugin.yml | 7 ++++- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/build.xml b/build.xml index eca12ac..c1c35d8 100644 --- a/build.xml +++ b/build.xml @@ -38,6 +38,11 @@ Creating default ops.txt for your user + + Retrieving Coffeescript compiler + + diff --git a/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java b/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java index a68dae8..d843eb3 100644 --- a/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java +++ b/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java @@ -98,7 +98,12 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener this.engine.put("__plugin",this); this.engine.put("__script",boot.getCanonicalPath().replaceAll("\\\\","/")); reader = new FileReader(boot); - this.engine.eval(reader); + this.engine.eval(reader); + + // Load the CoffeeScript compiler + File coffeescript = new File(JS_PLUGINS_DIR + "/core/_coffeescript.js"); + this.engine.eval(new FileReader(coffeescript)); + }catch(Exception e){ e.printStackTrace(); }finally { @@ -147,7 +152,13 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener javascriptCode = "command()"; this.engine.put("__cmdArgs",args); result = true; + } else if (cmd.getName().equalsIgnoreCase("coffee")) { + for (int i = 0;i < args.length; i++) + javascriptCode += args[i] + " "; + javascriptCode = "eval(CoffeeScript.compile(\""+javascriptCode+"\", {bare: true}))"; + result = true; } + if (result){ this.engine.put("self",sender); try{ diff --git a/src/main/javascript/core/_scriptcraft.js b/src/main/javascript/core/_scriptcraft.js index 4b80da6..68a213b 100644 --- a/src/main/javascript/core/_scriptcraft.js +++ b/src/main/javascript/core/_scriptcraft.js @@ -276,10 +276,22 @@ var server = org.bukkit.Bukkit.server; if (file.exists()) { var parent = file.getParentFile(); var reader = new java.io.FileReader(file); + var br = new java.io.BufferedReader(reader); __engine.put("__script",canonizedFilename); __engine.put("__folder",(parent?_canonize(parent):"")+"/"); + + var code = ""; try{ - result = __engine.eval(reader); + if (file.getCanonicalPath().endsWith(".coffee")) { + var r = undefined; + while ((r = br.readLine()) !== null) code += "\"" + r + "\" +\n"; + code += "\"\""; + var code = "load(__folder + \"../core/_coffeescript.js\"); var ___code = "+code+"; eval(CoffeeScript.compile(___code, {bare: true}))"; + } else { + while ((r = br.readLine()) !== null) code += r + "\n"; + } + + result = __engine.eval(code); _loaded[canonizedFilename] = true; reader.close(); }catch (e){ @@ -296,7 +308,7 @@ var server = org.bukkit.Bukkit.server; /* recursively walk the given directory and return a list of all .js files */ - var _listJsFiles = function(store,dir) + var _listSourceFiles = function(store,dir) { if (typeof dir == "undefined"){ dir = new java.io.File(_originalScript).getParentFile().getParentFile(); @@ -305,9 +317,9 @@ var server = org.bukkit.Bukkit.server; for (var i = 0;i < files.length; i++){ var file = files[i]; if (file.isDirectory()){ - _listJsFiles(store,file); + _listSourceFiles(store,file); }else{ - if (file.getCanonicalPath().endsWith(".js") && + if ((file.getCanonicalPath().endsWith(".js") || file.getCanonicalPath().endsWith(".coffee")) && !(file.getName().startsWith("_")) && file.exists()) { @@ -348,10 +360,10 @@ var server = org.bukkit.Bukkit.server; var _reload = function(pluginDir) { _loaded = []; - var jsFiles = []; - _listJsFiles(jsFiles,pluginDir); + var sourceFiles = []; + _listSourceFiles(sourceFiles,pluginDir); - jsFiles.sort(sortByModule); + sourceFiles.sort(sortByModule); // // script files whose name begins with _ (underscore) @@ -363,9 +375,9 @@ var server = org.bukkit.Bukkit.server; // then it's assumed that _myMiniGame_currency.js and _myMiniGame_events.js will be loaded // as dependencies by myMiniGame.js and do not need to be loaded via js reload // - var len = jsFiles.length; + var len = sourceFiles.length; for (var i = 0;i < len; i++){ - load(_canonize(jsFiles[i]),true); + load(_canonize(sourceFiles[i]),true); } }; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8a4006b..56f245e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -11,7 +11,12 @@ commands: description: run a javascript plugin command. usage: / command-name command-parameters permission: scriptcraft.proxy - permission-message: You don't have permission. + permission-message: You don't have permission. + coffee: + description: Evaluate coffeescript. + usage: / Coffeescript code + permission: scriptcraft.evaluate + permission-message: You don't have permission. permissions: scriptcraft.*: