| 1 | // IMPORTANT: choose one |
| 2 | var RL_LIB = "libreadline"; // NOTE: libreadline is GPL |
| 3 | //var RL_LIB = "libedit"; |
| 4 | |
| 5 | var HISTORY_FILE = require('path').join(process.env.HOME, '.mal-history'); |
| 6 | |
| 7 | var rlwrap = {}; // namespace for this module in web context |
| 8 | |
| 9 | var ffi = require('ffi'), |
| 10 | fs = require('fs'); |
| 11 | |
| 12 | var rllib = ffi.Library(RL_LIB, { |
| 13 | 'readline': [ 'string', [ 'string' ] ], |
| 14 | 'add_history': [ 'int', [ 'string' ] ]}); |
| 15 | |
| 16 | var rl_history_loaded = false; |
| 17 | |
| 18 | exports.readline = rlwrap.readline = function(prompt) { |
| 19 | prompt = typeof prompt !== 'undefined' ? prompt : "user> "; |
| 20 | |
| 21 | if (!rl_history_loaded) { |
| 22 | rl_history_loaded = true; |
| 23 | var lines = []; |
| 24 | if (fs.existsSync(HISTORY_FILE)) { |
| 25 | lines = fs.readFileSync(HISTORY_FILE).toString().split("\n"); |
| 26 | } |
| 27 | // Max of 2000 lines |
| 28 | lines = lines.slice(Math.max(lines.length - 2000, 0)); |
| 29 | for (var i=0; i<lines.length; i++) { |
| 30 | if (lines[i]) { rllib.add_history(lines[i]); } |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | var line = rllib.readline(prompt); |
| 35 | if (line) { |
| 36 | rllib.add_history(line); |
| 37 | try { |
| 38 | fs.appendFileSync(HISTORY_FILE, line + "\n"); |
| 39 | } catch (exc) { |
| 40 | // ignored |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | return line; |
| 45 | }; |
| 46 | var readline = exports; |