ui/lib/shared/addon/components/input-command/component.js

88 lines
1.8 KiB
JavaScript

import { isArray } from '@ember/array';
import TextField from '@ember/component/text-field';
import ShellQuote from 'npm:shell-quote'
import layout from './template';
export const OPS = ['||','&&',';;','|&','&',';','(',')','|','<','>'];
export function reop(xs) {
return xs.map(function(s) {
if ( OPS.includes(s) ) {
return {op: s};
} else {
return s;
}
});
}
export function unparse(xs) {
return xs.map(function (s) {
if (s && typeof s === 'object') {
if (s.hasOwnProperty('pattern')) {
return '"' + s.pattern + '"';
} else {
return s.op;
}
}
else if (/["\s]/.test(s) && !/'/.test(s)) {
return "'" + s.replace(/(['\\])/g, '\\$1') + "'";
}
else if (/["'\s]/.test(s)) {
return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
}
else {
return String(s).replace(/([\\$`()!#&*|])/g, '\\$1');
}
}).join(' ');
}
export default TextField.extend({
layout,
type: 'text',
init() {
this._super(...arguments);
let initial = this.get('initialValue')||'';
if ( isArray(initial) )
{
this.set('value', unparse(reop(initial)));
}
else
{
this.set('value', initial);
}
},
valueChanged: function() {
let out = ShellQuote.parse(this.get('value')||'').map(function(piece) {
if ( typeof piece === 'object' && piece )
{
if ( piece.pattern )
{
return piece.pattern;
}
else if ( piece.op )
{
return piece.op;
}
else
{
return '';
}
}
return piece;
});
if ( out.length )
{
this.sendAction('changed', out);
}
else
{
this.sendAction('changed', null);
}
}.observes('value'),
});