UNPKG

workshopper

Version:

A terminal workshop runner framework

104 lines (77 loc) 2.44 kB
const tmenu = require('terminal-menu') , path = require('path') , fs = require('fs') , xtend = require('xtend') , EventEmitter = require('events').EventEmitter , chalk = require('chalk') , util = require('util') const repeat = require('./util').repeat , applyTextMarker = require('./util').applyTextMarker , maxListenersPerEvent = 10 function showMenu (opts, i18n) { var emitter = new EventEmitter() , menu = tmenu(xtend({ width : opts.width , x : 3 , y : 2 }, opts.menu)) , __ = i18n.__ , __n = i18n.__n , menuStream function writeLine() { menu.write(repeat('\u2500', opts.width) + '\n') } function emit(event, value) { return process.nextTick.bind(process, emitter.emit.bind(emitter, event, value)) } function addEntry(entry) { menu.add(applyTextMarker(entry.name, entry.marker || '', opts.width), emit(entry.event, entry.payload)) } function addVariableEntry(variableEntry) { if (!variableEntry) return if (util.isArray(variableEntry)) return variableEntry.forEach(addVariableEntry) if (variableEntry.separator) return writeLine() addEntry(variableEntry) } menu.reset() menu.write(chalk.bold(__('title')) + '\n') if (i18n.has('subtitle')) menu.write(chalk.italic(__('subtitle')) + '\n') writeLine() menu.setMaxListeners(opts.entries.length * maxListenersPerEvent) opts.entries.forEach(addVariableEntry) function regexpEncode(str) { return str.replace(/([\.\*\+\?\{\}\[\]\- \(\)\|\^\$\\])/g, "\\$1") } function passDataToMenu(data) { // Node 0.10 fix menuStream.write(data) } menu.on('select', function (label) { menu.y = 0 menu.reset() menu.close() process.stdin.pause() process.stdin.removeListener('data', passDataToMenu) menuStream.unpipe(process.stdout) process.stdin.unpipe(menuStream) process.stdin.setRawMode(false) }) menuStream = menu.createStream() process.stdin .on("data", passDataToMenu) menuStream.pipe(process.stdout, {end: false}) if(!process.stdin.isTTY) { menu.reset() console.error(__('error.notty')) process.exit(1) } else { process.stdin.setRawMode(true) } process.stdin.resume() return emitter } module.exports = showMenu