Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a88e27cc7d | ||
|
|
7cab2501da | ||
|
|
dd93e62a41 | ||
|
|
d238a1998c | ||
|
|
6bbb21490c | ||
|
|
9f0fa2f815 | ||
|
|
f5fb10063c | ||
|
|
721bd272b5 | ||
|
|
c170156147 | ||
|
|
a2f6f2be03 | ||
|
|
412260392f | ||
|
|
5f8585a625 | ||
|
|
ee0d15c878 | ||
|
|
3f0b584f25 | ||
|
|
41fd20c6e4 | ||
|
|
01e9524098 | ||
|
|
d9d99c1c27 | ||
|
|
f53f5735e1 | ||
|
|
7a88a4b0e9 | ||
|
|
85733fea56 | ||
|
|
369e1f4c1e | ||
|
|
702fd24ce8 | ||
|
|
961e62207c | ||
|
|
cc950614c5 | ||
|
|
556140e7d9 | ||
|
|
987f09d880 | ||
|
|
4cf2f9a847 | ||
|
|
2fce845ea6 | ||
|
|
9914fd9a38 | ||
|
|
a221a3c9f8 | ||
|
|
b1058b9fcc | ||
|
|
4c2508028a | ||
|
|
d516d4df7c | ||
|
|
d20c36dff2 | ||
|
|
a523803d37 | ||
|
|
bbb688313e | ||
|
|
d6c8369630 | ||
|
|
05eb5df93c | ||
|
|
51fe17ee43 | ||
|
|
1d5737f843 | ||
|
|
13103aecb2 | ||
|
|
e9d2c806ba | ||
|
|
932ab00a53 | ||
|
|
6cfd957697 | ||
|
|
f00d8964c2 | ||
|
|
9ef6b52352 | ||
|
|
2a9de5e5c0 | ||
|
|
761e5db937 | ||
|
|
391d8f4097 | ||
|
|
af39a3fcc0 | ||
|
|
69153c04a6 | ||
|
|
85abfb8151 | ||
|
|
e100ee0cc0 | ||
|
|
d5d48cd48a | ||
|
|
3e7ab290fa | ||
|
|
43ac453db1 | ||
|
|
d0d87505a9 | ||
|
|
c8a497eb82 | ||
|
|
523ff9908f | ||
|
|
72ed03adcb | ||
|
|
b60903a2ae | ||
|
|
c5af270885 | ||
|
|
510990c312 | ||
|
|
37be8e0f34 | ||
|
|
8dd80566d0 | ||
|
|
c6a7e15b03 | ||
|
|
87979aeed4 | ||
|
|
615f633f25 | ||
|
|
567b39dc98 | ||
|
|
0b2bdb182b | ||
|
|
4ce1440fb8 | ||
|
|
f24c020aca | ||
|
|
3fca219404 | ||
|
|
6906bf3e7d |
@@ -0,0 +1,16 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.js]
|
||||||
|
max_line_length = 100
|
||||||
|
|
||||||
|
[*.css]
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@@ -9,3 +9,4 @@ Makefile.gyp
|
|||||||
*.node
|
*.node
|
||||||
example/*.log
|
example/*.log
|
||||||
docs/_build
|
docs/_build
|
||||||
|
npm-debug.log
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
# xterm.js — xterm, in the browser
|
# xterm.js
|
||||||
|
|
||||||
Xterm.js is a full xterm clone, written completely in JavaScript.
|
Xterm.js is a full xterm clone, written in JavaScript.
|
||||||
|
|
||||||
Xterm.js supplies a modular, event-based interface that lets developers build addons and themes that augment the experience of running a fully-featured terminal inside the browser.
|
It is used at [SourceLair](https://www.sourcelair.com/home) to help people develop their applications in their browsers.
|
||||||
|
|
||||||
Xterm.js serves as foundation for the terminal found at www.sourcelair.com.
|
Xterm.js supplies a modular, event-based interface that lets developers build addons and themes on top of it.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Contribution and License Agreement
|
### Contribution and License Agreement
|
||||||
|
|
||||||
@@ -14,6 +14,6 @@ If you contribute code to this project, you are implicitly allowing your code to
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright (c) 2014, SourceLair, Ltd (www.sourcelair.com) (MIT License)
|
Copyright (c) 2014-2016, SourceLair, Private Company ([www.sourcelair.com](https://www.sourcelair.com/home)) (MIT License)
|
||||||
|
|
||||||
Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
||||||
|
|||||||
+105
-26
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Implements the attach method, that
|
* Implements the attach method, that
|
||||||
* attaches the terminal to a WebSocket stream.
|
* attaches the terminal to a WebSocket stream.
|
||||||
*
|
*
|
||||||
* The bidirectional argument indicates, whether the terminal should
|
* The bidirectional argument indicates, whether the terminal should
|
||||||
* send data to the socket as well and is true, by default.
|
* send data to the socket as well and is true, by default.
|
||||||
*/
|
*/
|
||||||
@@ -15,36 +15,115 @@
|
|||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Plain browser environment
|
* Plain browser environment
|
||||||
*/
|
*/
|
||||||
attach(this.Xterm);
|
attach(this.Xterm);
|
||||||
}
|
}
|
||||||
})(function (Xterm) {
|
})(function (Xterm) {
|
||||||
Xterm.prototype.attach = function (socket, bidirectional) {
|
'use strict';
|
||||||
var term = this;
|
|
||||||
|
|
||||||
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
/**
|
||||||
this.socket = socket;
|
* This module provides methods for attaching a terminal to a WebSocket
|
||||||
|
* stream.
|
||||||
|
*
|
||||||
|
* @module xterm/addons/attach/attach
|
||||||
|
*/
|
||||||
|
var exports = {};
|
||||||
|
|
||||||
function _getMessage (ev) {
|
/**
|
||||||
term.write(ev.data);
|
* Attaches the given terminal to the given socket.
|
||||||
}
|
*
|
||||||
|
* @param {Xterm} term - The terminal to be attached to the given socket.
|
||||||
function _sendData (data) {
|
* @param {WebSocket} socket - The socket to attach the current terminal.
|
||||||
socket.send(data);
|
* @param {boolean} bidirectional - Whether the terminal should send data
|
||||||
}
|
* to the socket as well.
|
||||||
|
* @param {boolean} buffered - Whether the rendering of incoming data
|
||||||
function _detach () {
|
* should happen instantly or at a maximum
|
||||||
term.off('data', _sendData);
|
* frequency of 1 rendering per 10ms.
|
||||||
socket.removeEventListener('message', _getMessage);
|
*/
|
||||||
}
|
exports.attach = function (term, socket, bidirectional, buffered) {
|
||||||
|
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
||||||
|
term.socket = socket;
|
||||||
|
|
||||||
socket.addEventListener('message', _getMessage);
|
term._flushBuffer = function () {
|
||||||
|
term.write(term._attachSocketBuffer);
|
||||||
|
term._attachSocketBuffer = null;
|
||||||
|
clearTimeout(term._attachSocketBufferTimer);
|
||||||
|
term._attachSocketBufferTimer = null;
|
||||||
|
};
|
||||||
|
|
||||||
if (bidirectional) {
|
term._pushToBuffer = function (data) {
|
||||||
this.on('data', _sendData);
|
if (term._attachSocketBuffer) {
|
||||||
}
|
term._attachSocketBuffer += data;
|
||||||
|
} else {
|
||||||
socket.addEventListener('close', _detach);
|
term._attachSocketBuffer = data;
|
||||||
socket.addEventListener('error', _detach);
|
setTimeout(term._flushBuffer, 10);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
term._getMessage = function (ev) {
|
||||||
|
if (buffered) {
|
||||||
|
term._pushToBuffer(ev.data);
|
||||||
|
} else {
|
||||||
|
term.write(ev.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
term._sendData = function (data) {
|
||||||
|
socket.send(data);
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.addEventListener('message', term._getMessage);
|
||||||
|
|
||||||
|
if (bidirectional) {
|
||||||
|
term.on('data', term._sendData);
|
||||||
|
}
|
||||||
|
|
||||||
|
socket.addEventListener('close', term.detach.bind(term, socket));
|
||||||
|
socket.addEventListener('error', term.detach.bind(term, socket));
|
||||||
};
|
};
|
||||||
});
|
|
||||||
|
/**
|
||||||
|
* Detaches the given terminal from the given socket
|
||||||
|
*
|
||||||
|
* @param {Xterm} term - The terminal to be detached from the given socket.
|
||||||
|
* @param {WebSocket} socket - The socket from which to detach the current
|
||||||
|
* terminal.
|
||||||
|
*/
|
||||||
|
exports.detach = function (term, socket) {
|
||||||
|
term.off('data', term._sendData);
|
||||||
|
|
||||||
|
socket = (typeof socket == 'undefined') ? term.socket : socket;
|
||||||
|
|
||||||
|
if (socket) {
|
||||||
|
socket.removeEventListener('message', term._getMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete term.socket;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches the current terminal to the given socket
|
||||||
|
*
|
||||||
|
* @param {WebSocket} socket - The socket to attach the current terminal.
|
||||||
|
* @param {boolean} bidirectional - Whether the terminal should send data
|
||||||
|
* to the socket as well.
|
||||||
|
* @param {boolean} buffered - Whether the rendering of incoming data
|
||||||
|
* should happen instantly or at a maximum
|
||||||
|
* frequency of 1 rendering per 10ms.
|
||||||
|
*/
|
||||||
|
Xterm.prototype.attach = function (socket, bidirectional, buffered) {
|
||||||
|
return exports.attach(this, socket, bidirectional, buffered);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches the current terminal from the given socket.
|
||||||
|
*
|
||||||
|
* @param {WebSocket} socket - The socket from which to detach the current
|
||||||
|
* terminal.
|
||||||
|
*/
|
||||||
|
Xterm.prototype.detach = function (socket) {
|
||||||
|
return exports.detach(this, socket);
|
||||||
|
};
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
});
|
||||||
|
|||||||
+35
-30
@@ -20,40 +20,45 @@
|
|||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Plain browser environment
|
* Plain browser environment
|
||||||
*/
|
*/
|
||||||
fit(this.Xterm);
|
fit(this.Xterm);
|
||||||
}
|
}
|
||||||
})(function (Xterm) {
|
})(function (Xterm) {
|
||||||
Xterm.prototype.fit = function () {
|
Xterm.prototype.proposeGeometry = function () {
|
||||||
var container = this.rowContainer,
|
var parentElementStyle = window.getComputedStyle(this.element.parentElement),
|
||||||
subjectRow = this.rowContainer.firstElementChild,
|
parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
|
||||||
rows,
|
parentElementWidth = parseInt(parentElementStyle.getPropertyValue('width')),
|
||||||
contentBuffer,
|
elementStyle = window.getComputedStyle(this.element),
|
||||||
characterWidth,
|
elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
|
||||||
cols;
|
elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')),
|
||||||
|
availableHeight = parentElementHeight - elementPaddingVer,
|
||||||
|
availableWidth = parentElementWidth - elementPaddingHor,
|
||||||
|
container = this.rowContainer,
|
||||||
|
subjectRow = this.rowContainer.firstElementChild,
|
||||||
|
contentBuffer = subjectRow.innerHTML,
|
||||||
|
characterHeight,
|
||||||
|
rows,
|
||||||
|
characterWidth,
|
||||||
|
cols,
|
||||||
|
geometry;
|
||||||
|
|
||||||
subjectRow.style.display = 'inline';
|
subjectRow.style.display = 'inline';
|
||||||
|
subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace
|
||||||
|
characterWidth = subjectRow.getBoundingClientRect().width;
|
||||||
|
subjectRow.style.display = ''; // Revert style before calculating height, since they differ.
|
||||||
|
characterHeight = parseInt(subjectRow.offsetHeight);
|
||||||
|
subjectRow.innerHTML = contentBuffer;
|
||||||
|
|
||||||
contentBuffer = subjectRow.textContent;
|
rows = parseInt(availableHeight / characterHeight);
|
||||||
|
cols = parseInt(availableWidth / characterWidth) - 1;
|
||||||
|
|
||||||
subjectRow.innerHTML = ' '; /* Arbitrary character to calculate its dimensions */
|
geometry = {cols: cols, rows: rows};
|
||||||
characterWidth = parseInt(subjectRow.offsetWidth);
|
return geometry;
|
||||||
characterHeight = parseInt(subjectRow.offsetHeight);
|
|
||||||
|
|
||||||
subjectRow.style.display = '';
|
|
||||||
|
|
||||||
cols = container.offsetWidth / characterWidth;
|
|
||||||
cols = parseInt(cols);
|
|
||||||
|
|
||||||
var parentElementStyle = window.getComputedStyle(this.element.parentElement),
|
|
||||||
parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
|
|
||||||
elementStyle = window.getComputedStyle(this.element),
|
|
||||||
elementPadding = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
|
|
||||||
availableHeight = parentElementHeight - elementPadding,
|
|
||||||
rowHeight = this.rowContainer.firstElementChild.offsetHeight;
|
|
||||||
|
|
||||||
rows = parseInt(availableHeight / rowHeight);
|
|
||||||
|
|
||||||
this.resize(cols, rows);
|
|
||||||
};
|
};
|
||||||
});
|
|
||||||
|
Xterm.prototype.fit = function () {
|
||||||
|
var geometry = this.proposeGeometry();
|
||||||
|
|
||||||
|
this.resize(geometry.cols, geometry.rows);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|||||||
@@ -7,4 +7,4 @@
|
|||||||
width: auto;
|
width: auto;
|
||||||
height: auto;
|
height: auto;
|
||||||
z-index: 255;
|
z-index: 255;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="../../src/xterm.css" />
|
||||||
|
<link rel="stylesheet" href="../../demo/style.css" />
|
||||||
|
<script src="../../src/xterm.js"></script>
|
||||||
|
<script src="linkify.js"></script>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
color: #111;
|
||||||
|
}
|
||||||
|
|
||||||
|
#terminal-container {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#terminal-container a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="terminal-container"></div>
|
||||||
|
<script>
|
||||||
|
var term = new Terminal(),
|
||||||
|
container = document.getElementById('terminal-container');
|
||||||
|
|
||||||
|
term.open(container);
|
||||||
|
term.writeln('Hello, welcome to xterm.js');
|
||||||
|
term.writeln('');
|
||||||
|
term.writeln('Check it out at github.com/sourcelair/xterm.js');
|
||||||
|
term.linkify();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
(function (linkify) {
|
||||||
|
if (typeof define == 'function') {
|
||||||
|
/*
|
||||||
|
* Require.js is available
|
||||||
|
*/
|
||||||
|
define(['../../src/xterm'], linkify);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Plain browser environment
|
||||||
|
*/
|
||||||
|
linkify(this.Xterm);
|
||||||
|
}
|
||||||
|
})(function (Xterm) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This module provides methods for convertings valid URL substrings
|
||||||
|
* into HTML anchor elements (links), inside a terminal view.
|
||||||
|
*
|
||||||
|
* @module xterm/addons/linkify/linkify
|
||||||
|
*/
|
||||||
|
var exports = {},
|
||||||
|
protocolClause = '(https?:\\/\\/)',
|
||||||
|
domainCharacterSet = '[\\da-z\\.-]+',
|
||||||
|
negatedDomainCharacterSet = '[^\\da-z\\.-]+',
|
||||||
|
domainBodyClause = '(' + domainCharacterSet + ')',
|
||||||
|
tldClause = '([a-z\\.]{2,6})',
|
||||||
|
hostClause = domainBodyClause + '\\.' + tldClause,
|
||||||
|
pathClause = '([\\/\\w\\.-]*)*\\/?',
|
||||||
|
negatedPathCharacterSet = '[^\\/\\w\\.-]+',
|
||||||
|
bodyClause = hostClause + pathClause,
|
||||||
|
start = '(?:^|' + negatedDomainCharacterSet + ')(',
|
||||||
|
end = ')($|' + negatedPathCharacterSet + ')',
|
||||||
|
lenientUrlClause = start + protocolClause + '?' + bodyClause + end,
|
||||||
|
strictUrlClause = start + protocolClause + bodyClause + end,
|
||||||
|
lenientUrlRegex = new RegExp(lenientUrlClause),
|
||||||
|
strictUrlRegex = new RegExp(strictUrlClause);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all valid URLs found in the given terminal line into
|
||||||
|
* hyperlinks. The terminal line can be either the HTML element itself
|
||||||
|
* or the index of the termina line in the children of the terminal
|
||||||
|
* rows container.
|
||||||
|
*
|
||||||
|
* @param {Xterm} terminal - The terminal that owns the given line.
|
||||||
|
* @param {number|HTMLDivElement} line - The terminal line that should get
|
||||||
|
* "linkified".
|
||||||
|
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||||
|
* false, the regex requires a protocol clause. Defaults to true.
|
||||||
|
* @emits linkify
|
||||||
|
* @emits linkify:line
|
||||||
|
*/
|
||||||
|
exports.linkifyTerminalLine = function (terminal, line, lenient) {
|
||||||
|
if (typeof line == 'number') {
|
||||||
|
line = terminal.rowContainer.children[line];
|
||||||
|
} else if (! (line instanceof HTMLDivElement)) {
|
||||||
|
var message = 'The "line" argument should be either a number';
|
||||||
|
message += ' or an HTMLDivElement';
|
||||||
|
|
||||||
|
throw new TypeError(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
var buffer = document.createElement('span'),
|
||||||
|
nodes = line.childNodes;
|
||||||
|
|
||||||
|
for (var j=0; j<nodes.length; j++) {
|
||||||
|
var node = nodes[j],
|
||||||
|
match;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since we cannot access the TextNode's HTML representation
|
||||||
|
* from the instance itself, we assign its data as textContent
|
||||||
|
* to a dummy buffer span, in order to retrieve the TextNode's
|
||||||
|
* HTML representation from the buffer's innerHTML.
|
||||||
|
*/
|
||||||
|
buffer.textContent = node.data;
|
||||||
|
|
||||||
|
var nodeHTML = buffer.innerHTML;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Apply function only on TextNodes
|
||||||
|
*/
|
||||||
|
if (node.nodeType != node.TEXT_NODE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (lenient) {
|
||||||
|
match = node.data.match(lenientUrlRegex);
|
||||||
|
} else {
|
||||||
|
match = node.data.match(strictUrlRegex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If no URL was found in the current text, return.
|
||||||
|
*/
|
||||||
|
if (!match) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = match[1],
|
||||||
|
startsWithProtocol = new RegExp('^' + protocolClause),
|
||||||
|
urlHasProtocol = url.match(startsWithProtocol),
|
||||||
|
href = (urlHasProtocol) ? url : 'http://' + url,
|
||||||
|
link = '<a href="' + href + '" >' + url + '</a>',
|
||||||
|
newHTML = nodeHTML.replace(url, link);
|
||||||
|
|
||||||
|
line.innerHTML = line.innerHTML.replace(nodeHTML, newHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This event gets emitted when conversion of all URL susbtrings
|
||||||
|
* to HTML anchor elements (links) has finished, for a specific
|
||||||
|
* line of the current Xterm instance.
|
||||||
|
*
|
||||||
|
* @event linkify:line
|
||||||
|
*/
|
||||||
|
terminal.emit('linkify:line', line);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all valid URLs found in the terminal view into hyperlinks.
|
||||||
|
*
|
||||||
|
* @param {Xterm} terminal - The terminal that should get "linkified".
|
||||||
|
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||||
|
* false, the regex requires a protocol clause. Defaults to true.
|
||||||
|
* @emits linkify
|
||||||
|
* @emits linkify:line
|
||||||
|
*/
|
||||||
|
exports.linkify = function (terminal, lenient) {
|
||||||
|
var rows = terminal.rowContainer.children;
|
||||||
|
|
||||||
|
lenient = (typeof lenient == "boolean") ? lenient : true;
|
||||||
|
for (var i=0; i<rows.length; i++) {
|
||||||
|
var line = rows[i];
|
||||||
|
|
||||||
|
exports.linkifyTerminalLine(terminal, line, lenient);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This event gets emitted when conversion of all URL substrings to
|
||||||
|
* HTML anchor elements (links) has finished for the current Xterm
|
||||||
|
* instance's view.
|
||||||
|
*
|
||||||
|
* @event linkify
|
||||||
|
*/
|
||||||
|
terminal.emit('linkify');
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extend Xterm prototype.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all valid URLs found in the current terminal linte into
|
||||||
|
* hyperlinks.
|
||||||
|
*
|
||||||
|
* @memberof Xterm
|
||||||
|
* @param {number|HTMLDivElement} line - The terminal line that should get
|
||||||
|
* "linkified".
|
||||||
|
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||||
|
* false, the regex requires a protocol clause. Defaults to true.
|
||||||
|
*/
|
||||||
|
Xterm.prototype.linkifyTerminalLine = function (line, lenient) {
|
||||||
|
return exports.linkifyTerminalLine(this, line, lenient);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all valid URLs found in the current terminal into hyperlinks.
|
||||||
|
*
|
||||||
|
* @memberof Xterm
|
||||||
|
* @param {boolean} lenient - The regex type that will be used to identify links. If lenient is
|
||||||
|
* false, the regex requires a protocol clause. Defaults to true.
|
||||||
|
*/
|
||||||
|
Xterm.prototype.linkify = function (lenient) {
|
||||||
|
return exports.linkify(this, lenient);
|
||||||
|
};
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
});
|
||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "xterm.js",
|
"name": "xterm.js",
|
||||||
"version": "0.19",
|
"version": "0.32",
|
||||||
"ignore": ["demo", "docs", "test", ".gitignore"]
|
"ignore": ["demo", "test", ".gitignore"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"source": {
|
||||||
|
"include": [
|
||||||
|
"src/xterm.js",
|
||||||
|
"addons/attach/attach.js",
|
||||||
|
"addons/fit/fit.js",
|
||||||
|
"addons/fullscreen/fullscreen.js",
|
||||||
|
"addons/linkify/linkify.js"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"opts": {
|
||||||
|
"readme": "README.md"
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-6
@@ -1,12 +1,13 @@
|
|||||||
var terminalContainer = document.getElementById('terminal-container'),
|
var terminalContainer = document.getElementById('terminal-container'),
|
||||||
term = new Terminal();
|
term = new Terminal(),
|
||||||
|
shellprompt = '> ';
|
||||||
|
|
||||||
term.open(terminalContainer);
|
term.open(terminalContainer);
|
||||||
term.fit();
|
term.fit();
|
||||||
|
|
||||||
term.prompt = function () {
|
term.prompt = function () {
|
||||||
term.write('\r\n> ');
|
term.write('\r\n' + shellprompt);
|
||||||
}
|
};
|
||||||
|
|
||||||
term.writeln('Welcome to xterm.js');
|
term.writeln('Welcome to xterm.js');
|
||||||
term.writeln('Just type some keys in the prompt below.');
|
term.writeln('Just type some keys in the prompt below.');
|
||||||
@@ -16,11 +17,16 @@ term.prompt();
|
|||||||
term.on('key', function (key, ev) {
|
term.on('key', function (key, ev) {
|
||||||
var printable = (!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey);
|
var printable = (!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey);
|
||||||
|
|
||||||
if (ev.keyIdentifier == 'Enter') {
|
if (ev.keyCode == 13) {
|
||||||
term.prompt();
|
term.prompt();
|
||||||
} else if (ev.keyCode == 8) {
|
} else if (ev.keyCode == 8) {
|
||||||
term.write('\b \b');
|
/*
|
||||||
|
* Do not delete the prompt
|
||||||
|
*/
|
||||||
|
if (term.x > 2) {
|
||||||
|
term.write('\b \b');
|
||||||
|
}
|
||||||
} else if (printable) {
|
} else if (printable) {
|
||||||
term.write(key);
|
term.write(key);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
+1
-1
@@ -23,4 +23,4 @@ h1 {
|
|||||||
|
|
||||||
#terminal-container .terminal .terminal-cursor {
|
#terminal-container .terminal .terminal-cursor {
|
||||||
background-color: #fafafa;
|
background-color: #fafafa;
|
||||||
}
|
}
|
||||||
|
|||||||
-177
@@ -1,177 +0,0 @@
|
|||||||
# Makefile for Sphinx documentation
|
|
||||||
#
|
|
||||||
|
|
||||||
# You can set these variables from the command line.
|
|
||||||
SPHINXOPTS =
|
|
||||||
SPHINXBUILD = sphinx-build
|
|
||||||
PAPER =
|
|
||||||
BUILDDIR = _build
|
|
||||||
|
|
||||||
# User-friendly check for sphinx-build
|
|
||||||
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
|
|
||||||
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Internal variables.
|
|
||||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
|
||||||
PAPEROPT_letter = -D latex_paper_size=letter
|
|
||||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
|
||||||
# the i18n builder cannot share the environment and doctrees with the others
|
|
||||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
|
||||||
|
|
||||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
|
||||||
|
|
||||||
help:
|
|
||||||
@echo "Please use \`make <target>' where <target> is one of"
|
|
||||||
@echo " html to make standalone HTML files"
|
|
||||||
@echo " dirhtml to make HTML files named index.html in directories"
|
|
||||||
@echo " singlehtml to make a single large HTML file"
|
|
||||||
@echo " pickle to make pickle files"
|
|
||||||
@echo " json to make JSON files"
|
|
||||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
|
||||||
@echo " qthelp to make HTML files and a qthelp project"
|
|
||||||
@echo " devhelp to make HTML files and a Devhelp project"
|
|
||||||
@echo " epub to make an epub"
|
|
||||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
|
||||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
|
||||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
|
||||||
@echo " text to make text files"
|
|
||||||
@echo " man to make manual pages"
|
|
||||||
@echo " texinfo to make Texinfo files"
|
|
||||||
@echo " info to make Texinfo files and run them through makeinfo"
|
|
||||||
@echo " gettext to make PO message catalogs"
|
|
||||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
|
||||||
@echo " xml to make Docutils-native XML files"
|
|
||||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
|
||||||
@echo " linkcheck to check all external links for integrity"
|
|
||||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILDDIR)/*
|
|
||||||
|
|
||||||
html:
|
|
||||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
|
||||||
|
|
||||||
dirhtml:
|
|
||||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
|
||||||
|
|
||||||
singlehtml:
|
|
||||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
|
||||||
|
|
||||||
pickle:
|
|
||||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can process the pickle files."
|
|
||||||
|
|
||||||
json:
|
|
||||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can process the JSON files."
|
|
||||||
|
|
||||||
htmlhelp:
|
|
||||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
|
||||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
|
||||||
|
|
||||||
qthelp:
|
|
||||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
|
||||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
|
||||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/xtermjs.qhcp"
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/xtermjs.qhc"
|
|
||||||
|
|
||||||
devhelp:
|
|
||||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished."
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/xtermjs"
|
|
||||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/xtermjs"
|
|
||||||
@echo "# devhelp"
|
|
||||||
|
|
||||||
epub:
|
|
||||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
|
||||||
|
|
||||||
latex:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
|
||||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
|
||||||
"(use \`make latexpdf' here to do that automatically)."
|
|
||||||
|
|
||||||
latexpdf:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo "Running LaTeX files through pdflatex..."
|
|
||||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
|
||||||
|
|
||||||
latexpdfja:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
|
||||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
|
||||||
|
|
||||||
text:
|
|
||||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
|
||||||
|
|
||||||
man:
|
|
||||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
|
||||||
|
|
||||||
texinfo:
|
|
||||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
|
||||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
|
||||||
"(use \`make info' here to do that automatically)."
|
|
||||||
|
|
||||||
info:
|
|
||||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
|
||||||
@echo "Running Texinfo files through makeinfo..."
|
|
||||||
make -C $(BUILDDIR)/texinfo info
|
|
||||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
|
||||||
|
|
||||||
gettext:
|
|
||||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
|
||||||
|
|
||||||
changes:
|
|
||||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
|
||||||
@echo
|
|
||||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
|
||||||
|
|
||||||
linkcheck:
|
|
||||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
|
||||||
@echo
|
|
||||||
@echo "Link check complete; look for any errors in the above output " \
|
|
||||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
|
||||||
|
|
||||||
doctest:
|
|
||||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
|
||||||
@echo "Testing of doctests in the sources finished, look at the " \
|
|
||||||
"results in $(BUILDDIR)/doctest/output.txt."
|
|
||||||
|
|
||||||
xml:
|
|
||||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
|
||||||
|
|
||||||
pseudoxml:
|
|
||||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
|
||||||
-258
@@ -1,258 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# xterm.js documentation build configuration file, created by
|
|
||||||
# sphinx-quickstart on Tue Mar 25 17:38:05 2014.
|
|
||||||
#
|
|
||||||
# This file is execfile()d with the current directory set to its
|
|
||||||
# containing dir.
|
|
||||||
#
|
|
||||||
# Note that not all possible configuration values are present in this
|
|
||||||
# autogenerated file.
|
|
||||||
#
|
|
||||||
# All configuration values have a default; values that are commented out
|
|
||||||
# serve to show the default.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
#sys.path.insert(0, os.path.abspath('.'))
|
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
|
||||||
#needs_sphinx = '1.0'
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
||||||
# ones.
|
|
||||||
extensions = []
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = ['_templates']
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
#source_encoding = 'utf-8-sig'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
project = u'xterm.js'
|
|
||||||
copyright = u'2014, SourceLair Limited'
|
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
# The short X.Y version.
|
|
||||||
version = '0.19'
|
|
||||||
# The full version, including alpha/beta/rc tags.
|
|
||||||
release = '0.19 Alpha'
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
||||||
# for a list of supported languages.
|
|
||||||
#language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
#today = ''
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
#today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
|
||||||
# directories to ignore when looking for source files.
|
|
||||||
exclude_patterns = ['_build']
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all
|
|
||||||
# documents.
|
|
||||||
#default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
#add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
#add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
#show_authors = False
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'sphinx'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
#modindex_common_prefix = []
|
|
||||||
|
|
||||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
|
||||||
#keep_warnings = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ----------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
||||||
# a list of builtin themes.
|
|
||||||
html_theme = 'default'
|
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
|
||||||
# further. For a list of options available for each theme, see the
|
|
||||||
# documentation.
|
|
||||||
#html_theme_options = {}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
#html_theme_path = []
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
|
||||||
# "<project> v<release> documentation".
|
|
||||||
#html_title = None
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
#html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
#html_logo = None
|
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
#html_favicon = None
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
||||||
html_static_path = ['_static']
|
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
|
||||||
# directly to the root of the documentation.
|
|
||||||
#html_extra_path = []
|
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
||||||
# using the given strftime format.
|
|
||||||
#html_last_updated_fmt = '%b %d, %Y'
|
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
||||||
# typographically correct entities.
|
|
||||||
#html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
#html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
#html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#html_domain_indices = True
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
#html_use_index = True
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
#html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
#html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
||||||
#html_show_sphinx = True
|
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
||||||
#html_show_copyright = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
#html_use_opensearch = ''
|
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
#html_file_suffix = None
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'xtermjsdoc'
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
|
||||||
|
|
||||||
latex_elements = {
|
|
||||||
# The paper size ('letterpaper' or 'a4paper').
|
|
||||||
#'papersize': 'letterpaper',
|
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
|
||||||
#'pointsize': '10pt',
|
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble.
|
|
||||||
#'preamble': '',
|
|
||||||
}
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title,
|
|
||||||
# author, documentclass [howto, manual, or own class]).
|
|
||||||
latex_documents = [
|
|
||||||
('index', 'xtermjs.tex', u'xterm.js Documentation',
|
|
||||||
u'sourceLair Limited', 'manual'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
#latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
#latex_use_parts = False
|
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
|
||||||
#latex_show_pagerefs = False
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#latex_show_urls = False
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#latex_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#latex_domain_indices = True
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output ---------------------------------------
|
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
|
||||||
# (source start file, name, description, authors, manual section).
|
|
||||||
man_pages = [
|
|
||||||
('index', 'xtermjs', u'xterm.js Documentation',
|
|
||||||
[u'sourceLair Limited'], 1)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output -------------------------------------------
|
|
||||||
|
|
||||||
# Grouping the document tree into Texinfo files. List of tuples
|
|
||||||
# (source start file, target name, title, author,
|
|
||||||
# dir menu entry, description, category)
|
|
||||||
texinfo_documents = [
|
|
||||||
('index', 'xtermjs', u'xterm.js Documentation',
|
|
||||||
u'sourceLair Limited', 'xtermjs', 'One line description of project.',
|
|
||||||
'Miscellaneous'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
#texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
#texinfo_no_detailmenu = False
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
------
|
|
||||||
Events
|
|
||||||
------
|
|
||||||
|
|
||||||
focus
|
|
||||||
^^^^^
|
|
||||||
This event is fired, when the Terminal gets focus.
|
|
||||||
|
|
||||||
blur
|
|
||||||
^^^^
|
|
||||||
This event is fired, when the Terminal loses focus.
|
|
||||||
|
|
||||||
open
|
|
||||||
^^^^
|
|
||||||
This event is fired, when the Terminal gets opened into a DOM Element.
|
|
||||||
|
|
||||||
keydown
|
|
||||||
^^^^^^^
|
|
||||||
This event is fired, when the `keydown` DOM Event gets triggered on the Terminal.
|
|
||||||
|
|
||||||
keypress
|
|
||||||
^^^^^^^^
|
|
||||||
This event is fired, when the `keypress` DOM Event gets triggered on the Terminal.
|
|
||||||
|
|
||||||
key
|
|
||||||
^^^
|
|
||||||
This event is fired, when a key is being handled by the Terminal.
|
|
||||||
|
|
||||||
resize
|
|
||||||
^^^^^^
|
|
||||||
This event is being fired, when the Terminal view gets resized by the `resize` method.
|
|
||||||
|
|
||||||
data
|
|
||||||
^^^^
|
|
||||||
This event is being fired, when a chunk of input data gets handled by the terminal.
|
|
||||||
|
|
||||||
copy
|
|
||||||
^^^^
|
|
||||||
This event is fired, when the `copy` DOM Event gets triggered on the Terminal.
|
|
||||||
|
|
||||||
paste
|
|
||||||
^^^^^
|
|
||||||
This event is fired, when the `paste` DOM Event gets triggered on the Terminal.
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
.. xterm.js documentation master file, created by
|
|
||||||
sphinx-quickstart on Tue Mar 25 17:38:05 2014.
|
|
||||||
You can adapt this file completely to your liking, but it should at least
|
|
||||||
contain the root `toctree` directive.
|
|
||||||
|
|
||||||
Welcome to xterm.js's documentation!
|
|
||||||
====================================
|
|
||||||
|
|
||||||
This is the documentation for xterm.js. Xterm.js is a full xterm clone, written completely in JavaScript.
|
|
||||||
|
|
||||||
Xterm.js supplies a modular, event-based interface that lets developers build addons and themes that augment
|
|
||||||
the experience of running a fully-feature terminal inside the browser.
|
|
||||||
|
|
||||||
Xterm.js serves as the foundation for the terminal found at www.sourcelair.com.
|
|
||||||
|
|
||||||
.. image:: screenshot.png
|
|
||||||
|
|
||||||
Getting started
|
|
||||||
^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. code-block:: javascript
|
|
||||||
|
|
||||||
var term = new Terminal(),
|
|
||||||
url = 'ws://docker/containers/mycontainer/attach/ws/?stdin=1&stdout=1&stderr=1&logs=1',
|
|
||||||
socket = new WebSocket(url);
|
|
||||||
|
|
||||||
term.open(document.body);
|
|
||||||
term.on('data', function (data) {
|
|
||||||
socket.send(data);
|
|
||||||
});
|
|
||||||
socket.onmessage = function (e) {
|
|
||||||
term.write(e.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Contents
|
|
||||||
^^^^^^^^
|
|
||||||
The standard way to create a terminal-based application with xterm.js is to work with its events and
|
|
||||||
methods, that let you manipulate input, output, state and size of the terminal.
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
methods
|
|
||||||
events
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
-------
|
|
||||||
Methods
|
|
||||||
-------
|
|
||||||
|
|
||||||
focus()
|
|
||||||
^^^^^^^
|
|
||||||
Sends focus to the terminal
|
|
||||||
|
|
||||||
blur()
|
|
||||||
^^^^^^
|
|
||||||
Blurs the Terminal
|
|
||||||
|
|
||||||
open(element)
|
|
||||||
^^^^
|
|
||||||
Open the Xterm terminal, inside the given element.
|
|
||||||
|
|
||||||
resize(x, y)
|
|
||||||
^^^^^^^^^^^^
|
|
||||||
Resize the terminal, according to the given columns and rows.
|
|
||||||
|
|
||||||
insertRow(row)
|
|
||||||
^^^^^^^^^^^^^^
|
|
||||||
Insert the given row in the terminal.
|
|
||||||
|
|
||||||
on(event, callback)
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
|
||||||
Hook the given callback, to the given event.
|
|
||||||
|
|
||||||
off(event, callback)
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
|
||||||
Remove the Hook of the given callback, from the given event.
|
|
||||||
|
|
||||||
once(event, callback)
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
|
||||||
Hook the given callback to the given event, for just a single invocation.
|
|
||||||
|
|
||||||
write(data)
|
|
||||||
^^^^^^^^^^^
|
|
||||||
Write the given data to the terminal.
|
|
||||||
|
|
||||||
writeln(data)
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
Write the given data to the terminal, followed by a carriage return and a new line.
|
|
||||||
|
|
||||||
handler(data)
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
Fire the data event, for the given data.
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 140 KiB |
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "xterm",
|
||||||
|
"version": "0.32.0",
|
||||||
|
"ignore": ["demo", "test", ".gitignore"],
|
||||||
|
"main": "src/xterm.js",
|
||||||
|
"repository": "https://github.com/sourcelair/xterm.js",
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
||||||
+532
-524
File diff suppressed because it is too large
Load Diff
+29
-14
@@ -36,11 +36,11 @@
|
|||||||
/*
|
/*
|
||||||
* Require.js is available
|
* Require.js is available
|
||||||
*/
|
*/
|
||||||
define([], xterm);
|
define([], xterm.bind(window));
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Plain browser environment
|
* Plain browser environment
|
||||||
*/
|
*/
|
||||||
this.Xterm = xterm.call(this);
|
this.Xterm = xterm.call(this);
|
||||||
this.Terminal = this.Xterm; /* Backwards compatibility with term.js */
|
this.Terminal = this.Xterm; /* Backwards compatibility with term.js */
|
||||||
}
|
}
|
||||||
@@ -394,7 +394,6 @@
|
|||||||
this.showCursor();
|
this.showCursor();
|
||||||
this.textarea.focus();
|
this.textarea.focus();
|
||||||
|
|
||||||
this.emit('focus', {terminal: this});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Terminal.prototype.blur = function() {
|
Terminal.prototype.blur = function() {
|
||||||
@@ -404,12 +403,11 @@
|
|||||||
|
|
||||||
this.cursorState = 0;
|
this.cursorState = 0;
|
||||||
this.refresh(this.y, this.y);
|
this.refresh(this.y, this.y);
|
||||||
|
this.textarea.blur();
|
||||||
|
|
||||||
if (this.sendFocus) {
|
if (this.sendFocus) {
|
||||||
this.send('\x1b[O');
|
this.send('\x1b[O');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit('blur', {terminal: this});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -532,7 +530,9 @@
|
|||||||
* Create main element container
|
* Create main element container
|
||||||
*/
|
*/
|
||||||
this.element = this.document.createElement('div');
|
this.element = this.document.createElement('div');
|
||||||
this.element.classList.add('terminal', 'xterm', 'xterm-theme-' + this.theme);
|
this.element.classList.add('terminal');
|
||||||
|
this.element.classList.add('xterm');
|
||||||
|
this.element.classList.add('xterm-theme-' + this.theme);
|
||||||
this.element.setAttribute('tabindex', 0);
|
this.element.setAttribute('tabindex', 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -557,6 +557,12 @@
|
|||||||
this.textarea.setAttribute('autocapitalize', 'off');
|
this.textarea.setAttribute('autocapitalize', 'off');
|
||||||
this.textarea.setAttribute('spellcheck', 'false');
|
this.textarea.setAttribute('spellcheck', 'false');
|
||||||
this.textarea.tabIndex = 0;
|
this.textarea.tabIndex = 0;
|
||||||
|
this.textarea.onfocus = function() {
|
||||||
|
self.emit('focus', {terminal: self});
|
||||||
|
}
|
||||||
|
this.textarea.onblur = function() {
|
||||||
|
self.emit('blur', {terminal: self});
|
||||||
|
}
|
||||||
this.helperContainer.appendChild(this.textarea);
|
this.helperContainer.appendChild(this.textarea);
|
||||||
|
|
||||||
for (; i < this.rows; i++) {
|
for (; i < this.rows; i++) {
|
||||||
@@ -578,8 +584,10 @@
|
|||||||
this.startBlink();
|
this.startBlink();
|
||||||
|
|
||||||
on(this.element, 'mouseup', function() {
|
on(this.element, 'mouseup', function() {
|
||||||
var selection = document.getSelection();
|
var selection = document.getSelection(),
|
||||||
if (selection.type != 'Range') {
|
collapsed = selection.isCollapsed,
|
||||||
|
isRange = typeof collapsed == 'boolean' ? !collapsed : selection.type == 'Range';
|
||||||
|
if (!isRange) {
|
||||||
self.focus();
|
self.focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -2200,16 +2208,23 @@
|
|||||||
break;
|
break;
|
||||||
// left-arrow
|
// left-arrow
|
||||||
case 37:
|
case 37:
|
||||||
if (this.applicationCursor) {
|
if (ev.altKey) {
|
||||||
|
this.cancel(ev, true);
|
||||||
|
key = '\x1bb' // Jump a word back
|
||||||
|
break;
|
||||||
|
} else if (this.applicationCursor) {
|
||||||
key = '\x1bOD'; // SS3 as ^[O for 7-bit
|
key = '\x1bOD'; // SS3 as ^[O for 7-bit
|
||||||
//key = '\x8fD'; // SS3 as 0x8f for 8-bit
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
key = '\x1b[D';
|
key = '\x1b[D';
|
||||||
break;
|
break;
|
||||||
// right-arrow
|
// right-arrow
|
||||||
case 39:
|
case 39:
|
||||||
if (this.applicationCursor) {
|
if (ev.altKey) {
|
||||||
|
this.cancel(ev, true);
|
||||||
|
key = '\x1bf' // Jump a word forward
|
||||||
|
break;
|
||||||
|
} else if (this.applicationCursor) {
|
||||||
key = '\x1bOC';
|
key = '\x1bOC';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2333,7 +2348,7 @@
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// a-z and space
|
// a-z and space
|
||||||
if (ev.ctrlKey) {
|
if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {
|
||||||
if (ev.keyCode >= 65 && ev.keyCode <= 90) {
|
if (ev.keyCode >= 65 && ev.keyCode <= 90) {
|
||||||
key = String.fromCharCode(ev.keyCode - 64);
|
key = String.fromCharCode(ev.keyCode - 64);
|
||||||
} else if (ev.keyCode === 32) {
|
} else if (ev.keyCode === 32) {
|
||||||
@@ -2370,7 +2385,7 @@
|
|||||||
|
|
||||||
this.emit('keydown', ev);
|
this.emit('keydown', ev);
|
||||||
this.emit('key', key, ev);
|
this.emit('key', key, ev);
|
||||||
this.showCursor();
|
this.showCursor();
|
||||||
this.handler(key);
|
this.handler(key);
|
||||||
|
|
||||||
return this.cancel(ev);
|
return this.cancel(ev);
|
||||||
@@ -4775,4 +4790,4 @@
|
|||||||
Terminal.cancel = cancel;
|
Terminal.cancel = cancel;
|
||||||
|
|
||||||
return Terminal;
|
return Terminal;
|
||||||
});
|
});
|
||||||
|
|||||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 212 KiB |
Reference in New Issue
Block a user