#!/usr/bin/env node var ok = require('./ircoK'); var fs = require('fs'); var os = require('os'); var readline = require('readline'); var conv = require('./ircconvert'); const spawnSync = require('child_process').spawnSync; const crypto = require('crypto'); const happydir = '/tmp/happyok'; // web stuff function curl(x) { let url = conv.tojs(x); let res = spawnSync('curl', ['-s', '-L', '--url', url], {'timeout': 5000}); if (res.stderr != "") { throw new Error(res.stderr); } return res.stdout.toString('utf-8'); } function readText(x) { return conv.tok(curl(x)); } function readJSON(x) { return conv.tok(JSON.parse(curl(x))); } ok.setIO('0:', 1, readText); ok.setIO('1:', 1, readJSON); var env; var printed = ''; // printing shit function print(x, y) { // ignore x for now var s = conv.tojs(y); if (Array.isArray(s)) { s = s.join('\n') + '\n'; } if (typeof s !== 'string') { throw Error('ERROR: type'); } printed += s; return y; } ok.setIO('0:', 2, print); ok.setIO('0:', 3, print); ok.setIO('0:', 4, print); ok.setIO('0:', 5, print); // run user prelude file if exists function resetEnv() { env = ok.extendedEnv(); try { var preludeFile = os.homedir() + "/offtopiabday/okrc.k" var program = fs.readFileSync(preludeFile, 'utf8'); ok.run(ok.parse(program), env) } catch (err) { if (err.code != 'ENOENT') throw err } } resetEnv(); // actual REPL var rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on('line', function (line) { if (line == "reset") { resetEnv(); } else if (line == "manual") { process.stdout.write("https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md\n"); } else if (line == "reference" || line == "ref") { process.stdout.write("http://kparc.com/k.txt\n"); } else if (line == "okrc" || line == "rc") { process.stdout.write("https://zgrep.org/taxreturns/okrc.txt\n"); } else if (line.replace(/\s|;/g, '') == '2+2') { process.stdout.write("5\n"); } else { var output = ''; printed = ''; var showtime = false; if (line.lastIndexOf("\\t") == 0) { line = line.slice(2); showtime = true; } try { if (line.trim()) { var starttime = new Date().getTime(); output = ok.format(ok.run(ok.parse(line), env)); output = output.replace(/\n\s*/g, ";"); output += "\n"; if (showtime) { var endtime = new Date().getTime(); output += "completed in "+(endtime-starttime)+"ms.\n"; } } } catch (err) { output += err.message + '\n'; } if (output.trim() || printed.trim()) { // add newline where necessary if (printed.slice(-1) != '\n') { printed += '\n'; } if (! printed.trim()) { printed = printed.trim(); } if (! output.trim()) { output = output.trim(); } output = printed + output; spl = output.split('\n'); if ( spl.length - 1 > 4 || Math.max.apply(null, spl.map(x => x.length)) > 400 ) { // we need to pastebin it // make dir if (!fs.existsSync(happydir)) { fs.mkdirSync(happydir); } // make fname var fn = crypto.createHash('md5').update(output).digest('hex'); fn = fn.slice(0,10) + '.txt'; // write fname fs.writeFileSync(happydir + '/' + fn, output); output = 'https://zgrep.org/ok/' + fn + '\n' } // output checking code goes here. process.stdout.write(output); } } });