Beagle
view release on metacpan or search on metacpan
share/public/js/base/jquery.terminal.js view on Meta::CPAN
result += String(object);
break;
}
result += (level > 1 ? ',' : '');
// quick hacks below
if (level == 1) {
// fix last comma
result = result.replace(/,([\]}])/g, '$1');
}
// fix comma before array or object
return result.replace(/([\[{]),/g, '$1');
};
// -----------------------------------------------------------------------
// :: HISTORY CLASS
// -----------------------------------------------------------------------
function History(name) {
var enabled = true;
if (typeof name === 'string' && name !== '') {
name += '_';
}
var data = $.Storage.get(name + 'commands');
var bc = new BCycle(data ? eval('(' + data + ')') : ['']);
$.extend(this, {
append: function(item) {
if (enabled && bc.current() != item) {
bc.append(item);
$.Storage.set(name + 'commands', $.json_stringify(bc.data()));
}
},
data: function() {
return bc.data();
},
next: function() {
return bc.right();
},
last: function() {
bc.reset();
},
previous: function() {
return bc.left();
},
clear: function() {
bc = new BCycle();
$.Storage.remove(name + 'commands');
},
enable: function() {
enabled = true;
},
disable: function() {
enabled = false;
}});
}
// -----------------------------------------------------------------------
// :: COMMAND LINE PLUGIN
// -----------------------------------------------------------------------
$.fn.cmd = function(options) {
var self = this;
self.addClass('cmd');
self.append('<span class="prompt"></span><span></span>' +
'<span class="cursor"> </span><span></span>');
var clip = $('<textarea/>').addClass('clipboard').appendTo(self);
if (options.width) {
self.width(options.width);
}
var num_chars; // calculates by draw_prompt
var prompt_len;
var mask = options.mask || false;
var command = '';
var position = 0;
var prompt;
var enabled = options.enabled;
var name, history;
var blink = (function() {
var cursor = self.find('.cursor');
return function(i) {
cursor.toggleClass('inverted');
};
})();
var cursor = self.find('.cursor');
function change_num_chars() {
var W = self.width();
var w = cursor.innerWidth();
num_chars = Math.floor(W / w);
}
function get_splited_command_line(string) {
var first = string.substring(0, num_chars - prompt_len - 1);
var rest = string.substring(num_chars - prompt_len - 1);
return [first].concat(str_parts(rest, num_chars));
}
var redraw = (function(self) {
var cursor = self.find('.cursor');
var before = cursor.prev();
var after = cursor.next();
function draw_cursor_line(string, position) {
if (position == string.length) {
before.html(encodeHTML(string));
cursor.html(' ');
after.html('');
} else if (position === 0) {
before.html('');
//fix for tilda in IE
cursor.html(encodeHTML(string.slice(0, 1)));
//cursor.html(encodeHTML(string[0]));
after.html(encodeHTML(string.slice(1)));
} else {
var before_str = encodeHTML(string.slice(0, position));
before.html(before_str);
//fix for tilda in IE
var c = string.slice(position, position + 1);
//cursor.html(string[position]));
cursor.html(c == ' ' ? ' ' : encodeHTML(c));
if (position == string.lenght - 1) {
after.html('');
} else {
after.html(encodeHTML(string.slice(position + 1)));
}
}
}
function div(string) {
return '<div>' + encodeHTML(string) + '</div>';
}
function lines_after(lines) {
var last_ins = after;
$.each(lines, function(i, line) {
last_ins = $(div(line)).insertAfter(last_ins);
});
}
function lines_before(lines) {
$.each(lines, function(i, line) {
before.before(div(line));
});
}
var count = 0;
return function() {
var string = mask ? command.replace(/./g, '*') : command;
self.find('div').remove();
before.html('');
// long line
if (string.length > num_chars - prompt_len - 1) {
//cursor in first line
var array = get_splited_command_line(string);
var first_len = array[0].length;
if (position < first_len) {
draw_cursor_line(array[0], position);
lines_after(array.slice(1));
} else if (position == first_len) {
before.before(div(array[0]));
draw_cursor_line(array[1], 0);
lines_after(array.slice(2));
} else {
var num_lines = array.length;
var offset = 0;
if (position < first_len) {
draw_cursor_line(array[0], position);
lines_after(array.slice(1));
} else if (position == first_len) {
before.before(div(array[0]));
draw_cursor_line(array[1], 0);
lines_after(array.slice(2));
} else {
var last = array.slice(-1)[0];
var from_last = string.length - position;
if (from_last <= last.length) {
lines_before(array.slice(0, -1));
var pos = last.length==from_last ? 0 : last.length-from_last;
draw_cursor_line(last, pos);
} else {
// in the middle
if (num_lines == 3) {
before.before('<div>' + encodeHTML(array[0]) +
'</div>');
draw_cursor_line(array[1], position-first_len-1);
after.after('<div>' + encodeHTML(array[2]) +
'</div>');
} else {
// more lines cursor in the middle
var line_index = Math.floor((position+prompt_len) / num_chars);
var current = array[line_index];
var sum = (function(array) {
var sum = 0;
for (var i=array.length; i--;) {
sum += array[i].length;
}
return sum;
})(array.slice(0, line_index));
var pos = position-sum;
// cursor on first character in line
if (pos == num_chars) {
pos = 0;
current = array[++line_index];
}
var before_str = encodeHTML(current.slice(0, pos));
draw_cursor_line(current, pos);
lines_before(array.slice(0, line_index));
lines_after(array.slice(line_index+1));
}
}
}
}
} else {
if (string === '') {
before.html('');
cursor.html(' ');
after.html('');
} else {
draw_cursor_line(string, position);
}
}
};
})(self);
var draw_prompt = (function() {
var prompt_node = self.find('.prompt');
return function() {
if (typeof prompt == 'string') {
prompt_len = prompt.length;
prompt_node.html(encodeHTML(prompt) + ' ');
} else {
prompt(function(string) {
prompt_len = string.length;
prompt_node.html(encodeHTML(string) + ' ');
});
}
//change_num_chars();
};
})();
// paste content to terminal using hidden textarea
function paste() {
clip.focus();
//wait until Browser insert text to textarea
self.oneTime(1, function() {
self.insert(clip.val());
clip.blur();
clip.val('');
});
}
function keydown_event(e) {
//console.log('keydown ' + e.which);
if (options.keydown && options.keydown(e) === false) {
return false;
}
if (enabled) {
var pos, len, result;
if (e.keyCode == 13) {
if (history && command) {
history.append(command);
}
history.last();
var tmp = command;
self.set('');
if (typeof prompt == 'function') {
draw_prompt();
}
if (options.commands) {
options.commands(tmp);
}
} else if (e.which == 32) { //space
self.insert(' ');
} else if (e.which == 8) { //backspace
if (command !== '' && position > 0) {
command = command.slice(0, position - 1) +
command.slice(position, command.length);
--position;
redraw();
}
} else if (e.which == 9 && !(e.ctrlKey || e.altKey)) { // TAB
share/public/js/base/jquery.terminal.js view on Meta::CPAN
if (!stay) {
position += string.length;
}
redraw();
},
get: function() {
return command;
},
commands: function(commands) {
if (commands) {
options.commands = commands;
} else {
return commands;
}
},
destroy: function() {
$(document.documentElement).unbind('.commandline');
self.find('.prompt').remove();
},
prompt: function(user_prompt) {
if (user_prompt === undefined) {
return prompt;
} else {
if (typeof user_prompt == 'string' ||
typeof user_prompt == 'function') {
prompt = user_prompt;
} else {
throw 'prompt must be a function or string';
}
draw_prompt();
}
},
position: function(n) {
if (typeof n == 'number') {
position = n < 0 ? 0 : n > command.length ? command.length : n;
redraw();
} else {
return position;
}
},
resize: function(num) {
if (num) {
num_chars = num;
} else {
change_num_chars();
}
redraw();
},
enable: function() {
if (!enabled) {
self.everyTime(500, 'blink', blink);
enabled = true;
}
},
isenabled: function() {
return enabled;
},
disable: function() {
if (enabled) {
self.stopTime('blink', blink);
self.find('.cursor').removeClass('inverted');
enabled = false;
}
},
mask: function(display) {
if (typeof display == 'boolean') {
mask = display;
redraw();
} else {
return mask;
}
}
});
// INIT
self.name(options.name || '');
prompt = options.prompt || '>';
draw_prompt();
if (options.enabled === undefined || options.enabled === true) {
self.enable();
}
// Keystrokes
$(document.documentElement).keypress(function(e) {
var result;
if (e.ctrlKey && e.which == 99) {
return true;
}
if (options.keypress) {
result = options.keypress(e);
}
if (result === undefined || result) {
if (enabled) {
if ([38, 32, 13, 0, 8].has(e.which) &&
e.keyCode != 123 && // for F12 which == 0
//!(e.which == 40 && e.shiftKey ||
!(e.which == 38 && e.shiftKey)) {
return false;
} else if (!e.ctrlKey && !(e.altKey && e.which == 100)) {
self.insert(String.fromCharCode(e.which));
return false;
}
}
} else {
return result;
}
if (e.which == 100 && e.ctrlKey) {
return false;
}
}).keydown(keydown_event);
// characters
return self;
};
// -----------------------------------------------------------------------
// JSON-RPC CALL
// -----------------------------------------------------------------------
var requests = [];
$.jrpc = function(url, id, method, params, success, error) {
var request = $.json_stringify({
'jsonrpc': '2.0', 'method': method,
'params': params, 'id': id});
( run in 3.530 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )