| // Generated by CoffeeScript 1.3.3 |
| (function() { |
| var ACCESSOR, CoffeeScript, Module, REPL_PROMPT, REPL_PROMPT_CONTINUATION, REPL_PROMPT_MULTILINE, SIMPLEVAR, Script, autocomplete, backlog, completeAttribute, completeVariable, enableColours, error, getCompletions, inspect, multilineMode, pipedInput, readline, repl, run, stdin, stdout; |
| |
| stdin = process.openStdin(); |
| |
| stdout = process.stdout; |
| |
| CoffeeScript = require('./coffee-script'); |
| |
| readline = require('readline'); |
| |
| inspect = require('util').inspect; |
| |
| Script = require('vm').Script; |
| |
| Module = require('module'); |
| |
| REPL_PROMPT = 'coffee> '; |
| |
| REPL_PROMPT_MULTILINE = '------> '; |
| |
| REPL_PROMPT_CONTINUATION = '......> '; |
| |
| enableColours = false; |
| |
| if (process.platform !== 'win32') { |
| enableColours = !process.env.NODE_DISABLE_COLORS; |
| } |
| |
| error = function(err) { |
| return stdout.write((err.stack || err.toString()) + '\n'); |
| }; |
| |
| ACCESSOR = /\s*([\w\.]+)(?:\.(\w*))$/; |
| |
| SIMPLEVAR = /(\w+)$/i; |
| |
| autocomplete = function(text) { |
| return completeAttribute(text) || completeVariable(text) || [[], text]; |
| }; |
| |
| completeAttribute = function(text) { |
| var all, completions, key, match, obj, possibilities, prefix, val; |
| if (match = text.match(ACCESSOR)) { |
| all = match[0], obj = match[1], prefix = match[2]; |
| try { |
| val = Script.runInThisContext(obj); |
| } catch (error) { |
| return; |
| } |
| val = Object(val); |
| possibilities = Object.getOwnPropertyNames(val); |
| for (key in val) { |
| if (~possibilities.indexOf(val)) { |
| possibilities.push(key); |
| } |
| } |
| completions = getCompletions(prefix, possibilities); |
| return [completions, prefix]; |
| } |
| }; |
| |
| completeVariable = function(text) { |
| var completions, free, keywords, possibilities, r, vars, _ref; |
| free = (_ref = text.match(SIMPLEVAR)) != null ? _ref[1] : void 0; |
| if (text === "") { |
| free = ""; |
| } |
| if (free != null) { |
| vars = Script.runInThisContext('Object.getOwnPropertyNames(Object(this))'); |
| keywords = (function() { |
| var _i, _len, _ref1, _results; |
| _ref1 = CoffeeScript.RESERVED; |
| _results = []; |
| for (_i = 0, _len = _ref1.length; _i < _len; _i++) { |
| r = _ref1[_i]; |
| if (r.slice(0, 2) !== '__') { |
| _results.push(r); |
| } |
| } |
| return _results; |
| })(); |
| possibilities = vars.concat(keywords); |
| completions = getCompletions(free, possibilities); |
| return [completions, free]; |
| } |
| }; |
| |
| getCompletions = function(prefix, candidates) { |
| var el, _i, _len, _results; |
| _results = []; |
| for (_i = 0, _len = candidates.length; _i < _len; _i++) { |
| el = candidates[_i]; |
| if (el.indexOf(prefix) === 0) { |
| _results.push(el); |
| } |
| } |
| return _results; |
| }; |
| |
| process.on('uncaughtException', error); |
| |
| backlog = ''; |
| |
| run = function(buffer) { |
| var code, returnValue, _; |
| buffer = buffer.replace(/(^|[\r\n]+)(\s*)##?(?:[^#\r\n][^\r\n]*|)($|[\r\n])/, "$1$2$3"); |
| buffer = buffer.replace(/[\r\n]+$/, ""); |
| if (multilineMode) { |
| backlog += "" + buffer + "\n"; |
| repl.setPrompt(REPL_PROMPT_CONTINUATION); |
| repl.prompt(); |
| return; |
| } |
| if (!buffer.toString().trim() && !backlog) { |
| repl.prompt(); |
| return; |
| } |
| code = backlog += buffer; |
| if (code[code.length - 1] === '\\') { |
| backlog = "" + backlog.slice(0, -1) + "\n"; |
| repl.setPrompt(REPL_PROMPT_CONTINUATION); |
| repl.prompt(); |
| return; |
| } |
| repl.setPrompt(REPL_PROMPT); |
| backlog = ''; |
| try { |
| _ = global._; |
| returnValue = CoffeeScript["eval"]("_=(" + code + "\n)", { |
| filename: 'repl', |
| modulename: 'repl' |
| }); |
| if (returnValue === void 0) { |
| global._ = _; |
| } |
| repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n"); |
| } catch (err) { |
| error(err); |
| } |
| return repl.prompt(); |
| }; |
| |
| if (stdin.readable) { |
| pipedInput = ''; |
| repl = { |
| prompt: function() { |
| return stdout.write(this._prompt); |
| }, |
| setPrompt: function(p) { |
| return this._prompt = p; |
| }, |
| input: stdin, |
| output: stdout, |
| on: function() {} |
| }; |
| stdin.on('data', function(chunk) { |
| var line, lines, _i, _len, _ref; |
| pipedInput += chunk; |
| if (!/\n/.test(pipedInput)) { |
| return; |
| } |
| lines = pipedInput.split("\n"); |
| pipedInput = lines[lines.length - 1]; |
| _ref = lines.slice(0, -1); |
| for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
| line = _ref[_i]; |
| if (!(line)) { |
| continue; |
| } |
| stdout.write("" + line + "\n"); |
| run(line); |
| } |
| }); |
| stdin.on('end', function() { |
| var line, _i, _len, _ref; |
| _ref = pipedInput.trim().split("\n"); |
| for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
| line = _ref[_i]; |
| if (!(line)) { |
| continue; |
| } |
| stdout.write("" + line + "\n"); |
| run(line); |
| } |
| stdout.write('\n'); |
| return process.exit(0); |
| }); |
| } else { |
| if (readline.createInterface.length < 3) { |
| repl = readline.createInterface(stdin, autocomplete); |
| stdin.on('data', function(buffer) { |
| return repl.write(buffer); |
| }); |
| } else { |
| repl = readline.createInterface(stdin, stdout, autocomplete); |
| } |
| } |
| |
| multilineMode = false; |
| |
| repl.input.on('keypress', function(char, key) { |
| var cursorPos, newPrompt; |
| if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) { |
| return; |
| } |
| cursorPos = repl.cursor; |
| repl.output.cursorTo(0); |
| repl.output.clearLine(1); |
| multilineMode = !multilineMode; |
| if (!multilineMode && backlog) { |
| repl._line(); |
| } |
| backlog = ''; |
| repl.setPrompt((newPrompt = multilineMode ? REPL_PROMPT_MULTILINE : REPL_PROMPT)); |
| repl.prompt(); |
| return repl.output.cursorTo(newPrompt.length + (repl.cursor = cursorPos)); |
| }); |
| |
| repl.input.on('keypress', function(char, key) { |
| if (!(multilineMode && repl.line)) { |
| return; |
| } |
| if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'd')) { |
| return; |
| } |
| multilineMode = false; |
| return repl._line(); |
| }); |
| |
| repl.on('attemptClose', function() { |
| if (multilineMode) { |
| multilineMode = false; |
| repl.output.cursorTo(0); |
| repl.output.clearLine(1); |
| repl._onLine(repl.line); |
| return; |
| } |
| if (backlog) { |
| backlog = ''; |
| repl.output.write('\n'); |
| repl.setPrompt(REPL_PROMPT); |
| return repl.prompt(); |
| } else { |
| return repl.close(); |
| } |
| }); |
| |
| repl.on('close', function() { |
| repl.output.write('\n'); |
| return repl.input.destroy(); |
| }); |
| |
| repl.on('line', run); |
| |
| repl.setPrompt(REPL_PROMPT); |
| |
| repl.prompt(); |
| |
| }).call(this); |