Merge pull request #1186 from xtermjs/tyriar/merge_v3_to_master
Merge v3 into master
This commit is contained in:
@@ -14,6 +14,15 @@ npm-debug.log
|
|||||||
build/
|
build/
|
||||||
.vscode/
|
.vscode/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
fixtures/typings-test/*.js
|
||||||
|
|
||||||
# Directories needed for code coverage
|
# Directories needed for code coverage
|
||||||
/coverage/
|
/coverage/
|
||||||
|
|
||||||
|
# Keep legacy files out of the repo, this can be removed when we merge v3 into master
|
||||||
|
dist/
|
||||||
|
src/utils/TestUtils.ts
|
||||||
|
src/xterm.js
|
||||||
|
|
||||||
|
# Keep the demo builds out of Git
|
||||||
|
demo/dist/
|
||||||
|
|||||||
Vendored
+1
-2
@@ -1,9 +1,8 @@
|
|||||||
{
|
{
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
"**/node_modules": true,
|
"**/node_modules": true,
|
||||||
"**/bower_components": true,
|
|
||||||
"**/dist": true,
|
"**/dist": true,
|
||||||
"**/build": true,
|
"**/build": true,
|
||||||
"**/lib": true
|
"**/lib": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
FROM node:6.9
|
FROM node:6
|
||||||
MAINTAINER Paris Kasidiaris <paris@sourcelair.com>
|
MAINTAINER Paris Kasidiaris <paris@sourcelair.com>
|
||||||
|
|
||||||
# Set the working directory
|
# Set the working directory
|
||||||
@@ -6,7 +6,7 @@ WORKDIR /usr/src/app
|
|||||||
|
|
||||||
# Set an entrypoint, to automatically install node modules
|
# Set an entrypoint, to automatically install node modules
|
||||||
ENTRYPOINT ["/bin/bash", "-c", "if [[ ! -d node_modules ]]; then npm install; fi; exec \"${@:0}\";"]
|
ENTRYPOINT ["/bin/bash", "-c", "if [[ ! -d node_modules ]]; then npm install; fi; exec \"${@:0}\";"]
|
||||||
CMD ["npm", "run", "dev"]
|
CMD ["npm", "run", "start"]
|
||||||
|
|
||||||
# First, install dependencies to improve layer caching
|
# First, install dependencies to improve layer caching
|
||||||
COPY package.json /usr/src/app/
|
COPY package.json /usr/src/app/
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
web: npm run dev
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# [](https://xtermjs.org)
|
# [](https://xtermjs.org)
|
||||||
|
|
||||||
[](https://travis-ci.org/sourcelair/xterm.js) [](https://coveralls.io/github/sourcelair/xterm.js) [](https://gitter.im/sourcelair/xterm.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
[](https://travis-ci.org/xtermjs/xterm.js) [](https://coveralls.io/github/sourcelair/xterm.js) [](https://gitter.im/sourcelair/xterm.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [](https://www.jsdelivr.com/package/npm/xterm)
|
||||||
|
|
||||||
Xterm.js is a terminal front-end component written in JavaScript that works in the browser.
|
Xterm.js is a terminal front-end component written in JavaScript that works in the browser.
|
||||||
|
|
||||||
@@ -19,6 +19,75 @@ It enables applications to provide fully featured terminals to their users and c
|
|||||||
- Xterm.js is not a terminal application that you can download and use on your computer
|
- Xterm.js is not a terminal application that you can download and use on your computer
|
||||||
- Xterm.js is not `bash`. Xterm.js can be connected to processes like `bash` and let you interact with them (provide input, receive output)
|
- Xterm.js is not `bash`. Xterm.js can be connected to processes like `bash` and let you interact with them (provide input, receive output)
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
First you need to install the module, we ship exclusively through [npm](https://www.npmjs.com/) so you need that installed and then add xterm.js as a dependency by running:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to the head of your html page. Then create a `<div id="terminal"></div>` onto which xterm can attach itself.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="node_modules/xterm/dist/xterm.css" />
|
||||||
|
<script src="node_modules/xterm/dist/xterm.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="terminal"></div>
|
||||||
|
<script>
|
||||||
|
var term = new Terminal();
|
||||||
|
term.open(document.getElementById('terminal'));
|
||||||
|
term.write('Hello from \033[1;3;31mxterm.js\033[0m $ ')
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally instantiate the `Terminal` object and then call the `open` function with the DOM object of the `div`.
|
||||||
|
|
||||||
|
### Importing
|
||||||
|
|
||||||
|
The proposed way to load xterm.js is via the ES6 module syntax.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Terminal } from 'xterm';
|
||||||
|
```
|
||||||
|
|
||||||
|
*Note: There are currently no typings for addons so you will need to upcast if using TypeScript, eg. `(<any>xterm).fit()`.*
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
|
||||||
|
Addons are JavaScript modules that extend the `Terminal` prototype with new methods and attributes to provide additional functionality. There are a handful available in the main repository in the `src/addons` directory and you can even write your own, by using xterm.js' public API.
|
||||||
|
|
||||||
|
To use an addon, just import the JavaScript module and pass it to `Terminal`'s `applyAddon` method:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Terminal } from xterm;
|
||||||
|
import * as fit from 'xterm/lib/addons/fit/fit';
|
||||||
|
|
||||||
|
|
||||||
|
Terminal.applyAddon(fit);
|
||||||
|
|
||||||
|
var xterm = new Terminal(); // Instantiate the terminal
|
||||||
|
xterm.fit(); // Use the `fit` method, provided by the `fit` addon
|
||||||
|
```
|
||||||
|
|
||||||
|
## Browser Support
|
||||||
|
|
||||||
|
Since xterm.js is typically implemented as a developer tool, only modern browsers are supported officially. Here is a list of the versions we aim to support:
|
||||||
|
|
||||||
|
- Chrome latest
|
||||||
|
- Edge latest
|
||||||
|
- Firefox latest
|
||||||
|
- Safari latest
|
||||||
|
- IE11
|
||||||
|
|
||||||
|
Xterm.js works seamlessly in Electron apps and may even work on earlier versions of the browsers but these are the browsers we strive to keep working.
|
||||||
|
|
||||||
## Real-world uses
|
## Real-world uses
|
||||||
Xterm.js is used in several world-class applications to provide great terminal experiences.
|
Xterm.js is used in several world-class applications to provide great terminal experiences.
|
||||||
|
|
||||||
@@ -43,35 +112,24 @@ Xterm.js is used in several world-class applications to provide great terminal e
|
|||||||
- [**SSHy**](https://github.com/stuicey/SSHy): HTML5 Based SSHv2 Web Client with E2E encryption utilising `xterm.js`, SJCL & websockets.
|
- [**SSHy**](https://github.com/stuicey/SSHy): HTML5 Based SSHv2 Web Client with E2E encryption utilising `xterm.js`, SJCL & websockets.
|
||||||
- [**JupyterLab**](https://github.com/jupyterlab/jupyterlab): An extensible
|
- [**JupyterLab**](https://github.com/jupyterlab/jupyterlab): An extensible
|
||||||
computational environment for Jupyter, supporting interactive data science and scientific computing across all programming languages.
|
computational environment for Jupyter, supporting interactive data science and scientific computing across all programming languages.
|
||||||
|
- [**Theia**](https://github.com/theia-ide/theia): Theia is a cloud & desktop IDE framework implemented in TypeScript.
|
||||||
|
- [**Opshell**](https://github.com/ricktbaker/opshell) Ops Helper tool to make life easier working with AWS instances across multiple organizations.
|
||||||
|
- [**Proxmox VE**](https://www.proxmox.com/en/proxmox-ve): Proxmox VE is a complete open-source platform for enterprise virtualization. It uses xterm.js for container terminals and the host shell.
|
||||||
- [**Script Runner**](https://github.com/ioquatix/script-runner): Run scripts (or a shell) in Atom.
|
- [**Script Runner**](https://github.com/ioquatix/script-runner): Run scripts (or a shell) in Atom.
|
||||||
- [**Whack Whack Terminal**](https://github.com/Microsoft/WhackWhackTerminal): Terminal emulator for Visual Studio 2017.
|
- [**Whack Whack Terminal**](https://github.com/Microsoft/WhackWhackTerminal): Terminal emulator for Visual Studio 2017.
|
||||||
- [**VTerm**](https://github.com/vterm/vterm): Extensible terminal emulator based on Electron and React.
|
- [**VTerm**](https://github.com/vterm/vterm): Extensible terminal emulator based on Electron and React.
|
||||||
|
|
||||||
|
|
||||||
Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it in our list.
|
Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it in our list.
|
||||||
|
|
||||||
## Browser Support
|
|
||||||
|
|
||||||
Since xterm.js is typically implemented as a developer tool, only modern browsers are supported officially. Here is a list of the versions we aim to support:
|
|
||||||
|
|
||||||
- Chrome 48+
|
|
||||||
- Edge 13+
|
|
||||||
- Firefox 44+
|
|
||||||
- Internet Explorer 11+
|
|
||||||
- Opera 35+
|
|
||||||
- Safari 8+
|
|
||||||
|
|
||||||
Xterm.js works seamlessly in Electron apps and may even work on earlier versions of the browsers but these are the browsers we strive to keep working.
|
|
||||||
|
|
||||||
## Demo
|
## Demo
|
||||||
|
|
||||||
### Linux or macOS
|
### Linux or macOS
|
||||||
|
|
||||||
Run the following commands:
|
First, be sure that a C++ compiler such as GCC-C++ or Clang is installed, then run these commands:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ npm install
|
npm install
|
||||||
$ npm start
|
npm start
|
||||||
```
|
```
|
||||||
|
|
||||||
Then open http://0.0.0.0:3000 in a web browser.
|
Then open http://0.0.0.0:3000 in a web browser.
|
||||||
@@ -80,53 +138,14 @@ Then open http://0.0.0.0:3000 in a web browser.
|
|||||||
|
|
||||||
First, ensure [node-gyp](https://github.com/nodejs/node-gyp) is installed and configured correctly, then run these commands.
|
First, ensure [node-gyp](https://github.com/nodejs/node-gyp) is installed and configured correctly, then run these commands.
|
||||||
|
|
||||||
Note: Do not use ConEmu, as it seems to break the demo for some reason.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
> npm install
|
npm install
|
||||||
> npm start
|
npm start
|
||||||
```
|
```
|
||||||
|
|
||||||
Then open http://127.0.0.1:3000 in a web browser.
|
Then open http://127.0.0.1:3000 in a web browser.
|
||||||
|
|
||||||
## Getting Started
|
*Note: Do not use ConEmu, as it seems to break the demo for some reason.*
|
||||||
|
|
||||||
To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to the head of your html page. Then create a `<div id="terminal"></div>` onto which xterm can attach itself.
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" href="bower_components/xterm.js/dist/xterm.css" />
|
|
||||||
<script src="bower_components/xterm.js/dist/xterm.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="terminal"></div>
|
|
||||||
<script>
|
|
||||||
var term = new Terminal();
|
|
||||||
term.open(document.getElementById('terminal'));
|
|
||||||
term.write('Hello from \033[1;3;31mxterm.js\033[0m $ ')
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
Finally instantiate the `Terminal` object and then call the `open` function with the DOM object of the `div`.
|
|
||||||
|
|
||||||
## Addons
|
|
||||||
|
|
||||||
Addons are JavaScript modules that attach functions to the `Terminal` prototype to extend its functionality. There are a handful available in the main repository in the `dist/addons` directory, you can even write your own (though they may break when the internals of xterm.js change across versions).
|
|
||||||
|
|
||||||
To use an addon, just include the JavaScript file after xterm.js and before the `Terminal` object has been instantiated. The function should then be exposed on the `Terminal` object:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="node_modules/dist/xterm.js"></script>
|
|
||||||
<script src="node_modules/dist/addons/fit/fit.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
```js
|
|
||||||
var xterm = new Terminal();
|
|
||||||
// init code...
|
|
||||||
xterm.fit();
|
|
||||||
```
|
|
||||||
|
|
||||||
## Releases
|
## Releases
|
||||||
|
|
||||||
|
|||||||
+1
-8
@@ -12,12 +12,6 @@ CURRENT_PACKAGE_JSON_VERSION=$(cat package.json \
|
|||||||
| awk -F: '{ print $2 }' \
|
| awk -F: '{ print $2 }' \
|
||||||
| sed 's/[",]//g' \
|
| sed 's/[",]//g' \
|
||||||
| tr -d '[[:space:]]')
|
| tr -d '[[:space:]]')
|
||||||
CURRENT_BOWER_JSON_VERSION=$(cat bower.json \
|
|
||||||
| grep version \
|
|
||||||
| head -1 \
|
|
||||||
| awk -F: '{ print $2 }' \
|
|
||||||
| sed 's/[",]//g' \
|
|
||||||
| tr -d '[[:space:]]')
|
|
||||||
|
|
||||||
# Build xterm.js into `dist`
|
# Build xterm.js into `dist`
|
||||||
export BUILD_DIR=dist
|
export BUILD_DIR=dist
|
||||||
@@ -26,9 +20,8 @@ npm run build
|
|||||||
# Update AUTHORS file
|
# Update AUTHORS file
|
||||||
sh bin/generate-authors
|
sh bin/generate-authors
|
||||||
|
|
||||||
# Update version in package.json and bower.json
|
# Update version in package.json
|
||||||
sed -i "s/\"version\": \"$CURRENT_PACKAGE_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" package.json
|
sed -i "s/\"version\": \"$CURRENT_PACKAGE_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" package.json
|
||||||
sed -i "s/\"version\": \"$CURRENT_BOWER_JSON_VERSION\"/\"version\": \"$NEW_VERSION\"/g" bower.json
|
|
||||||
|
|
||||||
git commit -S -s -a -m "Bump version to $NEW_VERSION"
|
git commit -S -s -a -m "Bump version to $NEW_VERSION"
|
||||||
git tag $NEW_VERSION
|
git tag $NEW_VERSION
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "xterm.js",
|
|
||||||
"version": "2.9.2",
|
|
||||||
"ignore": ["demo", "test", ".gitignore"],
|
|
||||||
"main": [
|
|
||||||
"dist/xterm.js",
|
|
||||||
"dist/xterm.css"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
+6
-2
@@ -17,8 +17,12 @@ app.get('/style.css', function(req, res){
|
|||||||
res.sendFile(__dirname + '/style.css');
|
res.sendFile(__dirname + '/style.css');
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/main.js', function(req, res){
|
app.get('/dist/bundle.js', function(req, res){
|
||||||
res.sendFile(__dirname + '/main.js');
|
res.sendFile(__dirname + '/dist/bundle.js');
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/dist/bundle.js.map', function(req, res){
|
||||||
|
res.sendFile(__dirname + '/dist/bundle.js.map');
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post('/terminals', function (req, res) {
|
app.post('/terminals', function (req, res) {
|
||||||
|
|||||||
+12
-6
@@ -7,11 +7,6 @@
|
|||||||
<link rel="stylesheet" href="style.css" />
|
<link rel="stylesheet" href="style.css" />
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/4.1.1/es6-promise.auto.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/4.1.1/es6-promise.auto.min.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/1.0.0/fetch.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/1.0.0/fetch.min.js"></script>
|
||||||
<script src="/build/xterm.js" ></script>
|
|
||||||
<script src="/build/addons/attach/attach.js" ></script>
|
|
||||||
<script src="/build/addons/fit/fit.js" ></script>
|
|
||||||
<script src="/build/addons/fullscreen/fullscreen.js" ></script>
|
|
||||||
<script src="/build/addons/search/search.js" ></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>xterm.js: xterm, in the browser</h1>
|
<h1>xterm.js: xterm, in the browser</h1>
|
||||||
@@ -38,6 +33,17 @@
|
|||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
<label>
|
||||||
|
bellStyle
|
||||||
|
<select id="option-bell-style">
|
||||||
|
<option value="">none</option>
|
||||||
|
<option value="sound">sound</option>
|
||||||
|
<option value="visual">visual</option>
|
||||||
|
<option value="both">both</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<label>scrollback <input type="number" id="option-scrollback" value="1000" /></label>
|
<label>scrollback <input type="number" id="option-scrollback" value="1000" /></label>
|
||||||
</p>
|
</p>
|
||||||
@@ -59,6 +65,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p><strong>Attention:</strong> The demo is a barebones implementation and is designed for xterm.js evaluation purposes only. Exposing the demo to the public as is would introduce security risks for the host.</p>
|
<p><strong>Attention:</strong> The demo is a barebones implementation and is designed for xterm.js evaluation purposes only. Exposing the demo to the public as is would introduce security risks for the host.</p>
|
||||||
<script src="main.js" defer ></script>
|
<script src="dist/bundle.js" defer ></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+47
-26
@@ -1,10 +1,23 @@
|
|||||||
|
import * as Terminal from '../build/xterm';
|
||||||
|
import * as attach from '../build/addons/attach/attach';
|
||||||
|
import * as fit from '../build/addons/fit/fit';
|
||||||
|
import * as fullscreen from '../build/addons/fullscreen/fullscreen';
|
||||||
|
import * as search from '../build/addons/search/search';
|
||||||
|
import * as winptyCompat from '../build/addons/winptyCompat/winptyCompat';
|
||||||
|
|
||||||
|
|
||||||
|
Terminal.applyAddon(attach);
|
||||||
|
Terminal.applyAddon(fit);
|
||||||
|
Terminal.applyAddon(fullscreen);
|
||||||
|
Terminal.applyAddon(search);
|
||||||
|
Terminal.applyAddon(winptyCompat);
|
||||||
|
|
||||||
|
|
||||||
var term,
|
var term,
|
||||||
protocol,
|
protocol,
|
||||||
socketURL,
|
socketURL,
|
||||||
socket,
|
socket,
|
||||||
pid,
|
pid;
|
||||||
charWidth,
|
|
||||||
charHeight;
|
|
||||||
|
|
||||||
var terminalContainer = document.getElementById('terminal-container'),
|
var terminalContainer = document.getElementById('terminal-container'),
|
||||||
actionElements = {
|
actionElements = {
|
||||||
@@ -15,16 +28,19 @@ var terminalContainer = document.getElementById('terminal-container'),
|
|||||||
cursorBlink: document.querySelector('#option-cursor-blink'),
|
cursorBlink: document.querySelector('#option-cursor-blink'),
|
||||||
cursorStyle: document.querySelector('#option-cursor-style'),
|
cursorStyle: document.querySelector('#option-cursor-style'),
|
||||||
scrollback: document.querySelector('#option-scrollback'),
|
scrollback: document.querySelector('#option-scrollback'),
|
||||||
tabstopwidth: document.querySelector('#option-tabstopwidth')
|
tabstopwidth: document.querySelector('#option-tabstopwidth'),
|
||||||
|
bellStyle: document.querySelector('#option-bell-style')
|
||||||
},
|
},
|
||||||
colsElement = document.getElementById('cols'),
|
colsElement = document.getElementById('cols'),
|
||||||
rowsElement = document.getElementById('rows');
|
rowsElement = document.getElementById('rows');
|
||||||
|
|
||||||
function setTerminalSize () {
|
function setTerminalSize() {
|
||||||
var cols = parseInt(colsElement.value, 10),
|
var cols = parseInt(colsElement.value, 10);
|
||||||
rows = parseInt(rowsElement.value, 10),
|
var rows = parseInt(rowsElement.value, 10);
|
||||||
width = (cols * charWidth).toString() + 'px',
|
var viewportElement = document.querySelector('.xterm-viewport');
|
||||||
height = (rows * charHeight).toString() + 'px';
|
var scrollBarWidth = viewportElement.offsetWidth - viewportElement.clientWidth;
|
||||||
|
var width = (cols * term.renderer.dimensions.actualCellWidth + 20 /*room for scrollbar*/).toString() + 'px';
|
||||||
|
var height = (rows * term.renderer.dimensions.actualCellHeight).toString() + 'px';
|
||||||
|
|
||||||
terminalContainer.style.width = width;
|
terminalContainer.style.width = width;
|
||||||
terminalContainer.style.height = height;
|
terminalContainer.style.height = height;
|
||||||
@@ -53,6 +69,9 @@ optionElements.cursorBlink.addEventListener('change', function () {
|
|||||||
optionElements.cursorStyle.addEventListener('change', function () {
|
optionElements.cursorStyle.addEventListener('change', function () {
|
||||||
term.setOption('cursorStyle', optionElements.cursorStyle.value);
|
term.setOption('cursorStyle', optionElements.cursorStyle.value);
|
||||||
});
|
});
|
||||||
|
optionElements.bellStyle.addEventListener('change', function () {
|
||||||
|
term.setOption('bellStyle', optionElements.bellStyle.value);
|
||||||
|
});
|
||||||
optionElements.scrollback.addEventListener('change', function () {
|
optionElements.scrollback.addEventListener('change', function () {
|
||||||
term.setOption('scrollback', parseInt(optionElements.scrollback.value, 10));
|
term.setOption('scrollback', parseInt(optionElements.scrollback.value, 10));
|
||||||
});
|
});
|
||||||
@@ -72,6 +91,7 @@ function createTerminal() {
|
|||||||
scrollback: parseInt(optionElements.scrollback.value, 10),
|
scrollback: parseInt(optionElements.scrollback.value, 10),
|
||||||
tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10)
|
tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10)
|
||||||
});
|
});
|
||||||
|
window.term = term; // Expose `term` to window for debugging purposes
|
||||||
term.on('resize', function (size) {
|
term.on('resize', function (size) {
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
return;
|
return;
|
||||||
@@ -86,29 +106,30 @@ function createTerminal() {
|
|||||||
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
|
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
|
||||||
|
|
||||||
term.open(terminalContainer);
|
term.open(terminalContainer);
|
||||||
|
term.winptyCompatInit();
|
||||||
term.fit();
|
term.fit();
|
||||||
|
term.focus();
|
||||||
|
|
||||||
var initialGeometry = term.proposeGeometry(),
|
// fit is called within a setTimeout, cols and rows need this.
|
||||||
cols = initialGeometry.cols,
|
setTimeout(function () {
|
||||||
rows = initialGeometry.rows;
|
colsElement.value = term.cols;
|
||||||
|
rowsElement.value = term.rows;
|
||||||
|
|
||||||
colsElement.value = cols;
|
// Set terminal size again to set the specific dimensions on the demo
|
||||||
rowsElement.value = rows;
|
setTerminalSize();
|
||||||
|
|
||||||
fetch('/terminals?cols=' + cols + '&rows=' + rows, {method: 'POST'}).then(function (res) {
|
fetch('/terminals?cols=' + term.cols + '&rows=' + term.rows, {method: 'POST'}).then(function (res) {
|
||||||
|
|
||||||
charWidth = Math.ceil(term.element.offsetWidth / cols);
|
res.text().then(function (processId) {
|
||||||
charHeight = Math.ceil(term.element.offsetHeight / rows);
|
pid = processId;
|
||||||
|
socketURL += processId;
|
||||||
res.text().then(function (pid) {
|
socket = new WebSocket(socketURL);
|
||||||
window.pid = pid;
|
socket.onopen = runRealTerminal;
|
||||||
socketURL += pid;
|
socket.onclose = runFakeTerminal;
|
||||||
socket = new WebSocket(socketURL);
|
socket.onerror = runFakeTerminal;
|
||||||
socket.onopen = runRealTerminal;
|
});
|
||||||
socket.onclose = runFakeTerminal;
|
|
||||||
socket.onerror = runFakeTerminal;
|
|
||||||
});
|
});
|
||||||
});
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
function runRealTerminal() {
|
function runRealTerminal() {
|
||||||
|
|||||||
@@ -14,9 +14,3 @@ h1 {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#terminal-container .terminal {
|
|
||||||
background-color: #111;
|
|
||||||
color: #fafafa;
|
|
||||||
padding: 2px;
|
|
||||||
}
|
|
||||||
|
|||||||
Vendored
-126
@@ -1,126 +0,0 @@
|
|||||||
/**
|
|
||||||
* Implements the attach method, that attaches the terminal to a WebSocket stream.
|
|
||||||
* @module xterm/addons/attach/attach
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function (attach) {
|
|
||||||
if (typeof exports === 'object' && typeof module === 'object') {
|
|
||||||
/*
|
|
||||||
* CommonJS environment
|
|
||||||
*/
|
|
||||||
module.exports = attach(require('../../xterm'));
|
|
||||||
} else if (typeof define == 'function') {
|
|
||||||
/*
|
|
||||||
* Require.js is available
|
|
||||||
*/
|
|
||||||
define(['../../xterm'], attach);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Plain browser environment
|
|
||||||
*/
|
|
||||||
attach(window.Terminal);
|
|
||||||
}
|
|
||||||
})(function (Xterm) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var exports = {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attaches the given terminal to the given socket.
|
|
||||||
*
|
|
||||||
* @param {Xterm} term - The terminal to be attached 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.
|
|
||||||
*/
|
|
||||||
exports.attach = function (term, socket, bidirectional, buffered) {
|
|
||||||
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
|
||||||
term.socket = socket;
|
|
||||||
|
|
||||||
term._flushBuffer = function () {
|
|
||||||
term.write(term._attachSocketBuffer);
|
|
||||||
term._attachSocketBuffer = null;
|
|
||||||
clearTimeout(term._attachSocketBufferTimer);
|
|
||||||
term._attachSocketBufferTimer = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
term._pushToBuffer = function (data) {
|
|
||||||
if (term._attachSocketBuffer) {
|
|
||||||
term._attachSocketBuffer += data;
|
|
||||||
} else {
|
|
||||||
term._attachSocketBuffer = data;
|
|
||||||
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;
|
|
||||||
});
|
|
||||||
Vendored
-86
@@ -1,86 +0,0 @@
|
|||||||
/**
|
|
||||||
* Fit terminal columns and rows to the dimensions of its DOM element.
|
|
||||||
*
|
|
||||||
* ## Approach
|
|
||||||
* - Rows: Truncate the division of the terminal parent element height by the terminal row height.
|
|
||||||
*
|
|
||||||
* - Columns: Truncate the division of the terminal parent element width by the terminal character
|
|
||||||
* width (apply display: inline at the terminal row and truncate its width with the current
|
|
||||||
* number of columns).
|
|
||||||
* @module xterm/addons/fit/fit
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function (fit) {
|
|
||||||
if (typeof exports === 'object' && typeof module === 'object') {
|
|
||||||
/*
|
|
||||||
* CommonJS environment
|
|
||||||
*/
|
|
||||||
module.exports = fit(require('../../xterm'));
|
|
||||||
} else if (typeof define == 'function') {
|
|
||||||
/*
|
|
||||||
* Require.js is available
|
|
||||||
*/
|
|
||||||
define(['../../xterm'], fit);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Plain browser environment
|
|
||||||
*/
|
|
||||||
fit(window.Terminal);
|
|
||||||
}
|
|
||||||
})(function (Xterm) {
|
|
||||||
var exports = {};
|
|
||||||
|
|
||||||
exports.proposeGeometry = function (term) {
|
|
||||||
if (!term.element.parentElement) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
var parentElementStyle = window.getComputedStyle(term.element.parentElement),
|
|
||||||
parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
|
|
||||||
parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')) - 17),
|
|
||||||
elementStyle = window.getComputedStyle(term.element),
|
|
||||||
elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
|
|
||||||
elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')),
|
|
||||||
availableHeight = parentElementHeight - elementPaddingVer,
|
|
||||||
availableWidth = parentElementWidth - elementPaddingHor,
|
|
||||||
container = term.rowContainer,
|
|
||||||
subjectRow = term.rowContainer.firstElementChild,
|
|
||||||
contentBuffer = subjectRow.innerHTML,
|
|
||||||
characterHeight,
|
|
||||||
rows,
|
|
||||||
characterWidth,
|
|
||||||
cols,
|
|
||||||
geometry;
|
|
||||||
|
|
||||||
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 = subjectRow.getBoundingClientRect().height;
|
|
||||||
subjectRow.innerHTML = contentBuffer;
|
|
||||||
|
|
||||||
rows = parseInt(availableHeight / characterHeight);
|
|
||||||
cols = parseInt(availableWidth / characterWidth);
|
|
||||||
|
|
||||||
geometry = {cols: cols, rows: rows};
|
|
||||||
return geometry;
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.fit = function (term) {
|
|
||||||
var geometry = exports.proposeGeometry(term);
|
|
||||||
|
|
||||||
if (geometry) {
|
|
||||||
term.resize(geometry.cols, geometry.rows);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Xterm.prototype.proposeGeometry = function () {
|
|
||||||
return exports.proposeGeometry(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Xterm.prototype.fit = function () {
|
|
||||||
return exports.fit(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
-10
@@ -1,10 +0,0 @@
|
|||||||
.xterm.fullscreen {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
width: auto;
|
|
||||||
height: auto;
|
|
||||||
z-index: 255;
|
|
||||||
}
|
|
||||||
Vendored
-50
@@ -1,50 +0,0 @@
|
|||||||
/**
|
|
||||||
* Fullscreen addon for xterm.js
|
|
||||||
* @module xterm/addons/fullscreen/fullscreen
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
(function (fullscreen) {
|
|
||||||
if (typeof exports === 'object' && typeof module === 'object') {
|
|
||||||
/*
|
|
||||||
* CommonJS environment
|
|
||||||
*/
|
|
||||||
module.exports = fullscreen(require('../../xterm'));
|
|
||||||
} else if (typeof define == 'function') {
|
|
||||||
/*
|
|
||||||
* Require.js is available
|
|
||||||
*/
|
|
||||||
define(['../../xterm'], fullscreen);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Plain browser environment
|
|
||||||
*/
|
|
||||||
fullscreen(window.Terminal);
|
|
||||||
}
|
|
||||||
})(function (Xterm) {
|
|
||||||
var exports = {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggle the given terminal's fullscreen mode.
|
|
||||||
* @param {Xterm} term - The terminal to toggle full screen mode
|
|
||||||
* @param {boolean} fullscreen - Toggle fullscreen on (true) or off (false)
|
|
||||||
*/
|
|
||||||
exports.toggleFullScreen = function (term, fullscreen) {
|
|
||||||
var fn;
|
|
||||||
|
|
||||||
if (typeof fullscreen == 'undefined') {
|
|
||||||
fn = (term.element.classList.contains('fullscreen')) ? 'remove' : 'add';
|
|
||||||
} else if (!fullscreen) {
|
|
||||||
fn = 'remove';
|
|
||||||
} else {
|
|
||||||
fn = 'add';
|
|
||||||
}
|
|
||||||
|
|
||||||
term.element.classList[fn]('fullscreen');
|
|
||||||
};
|
|
||||||
|
|
||||||
Xterm.prototype.toggleFullscreen = function (fullscreen) {
|
|
||||||
exports.toggleFullScreen(this, fullscreen);
|
|
||||||
};
|
|
||||||
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
Vendored
-207
@@ -1,207 +0,0 @@
|
|||||||
/**
|
|
||||||
* Methods for turning URL subscrings in the terminal's content into links (`a` DOM elements).
|
|
||||||
* @module xterm/addons/linkify/linkify
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function (linkify) {
|
|
||||||
if (typeof exports === 'object' && typeof module === 'object') {
|
|
||||||
/*
|
|
||||||
* CommonJS environment
|
|
||||||
*/
|
|
||||||
module.exports = linkify(require('../../xterm'));
|
|
||||||
} else if (typeof define == 'function') {
|
|
||||||
/*
|
|
||||||
* Require.js is available
|
|
||||||
*/
|
|
||||||
define(['../../xterm'], linkify);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Plain browser environment
|
|
||||||
*/
|
|
||||||
linkify(window.Terminal);
|
|
||||||
}
|
|
||||||
})(function (Xterm) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var exports = {},
|
|
||||||
protocolClause = '(https?:\\/\\/)',
|
|
||||||
domainCharacterSet = '[\\da-z\\.-]+',
|
|
||||||
negatedDomainCharacterSet = '[^\\da-z\\.-]+',
|
|
||||||
domainBodyClause = '(' + domainCharacterSet + ')',
|
|
||||||
tldClause = '([a-z\\.]{2,6})',
|
|
||||||
ipClause = '((\\d{1,3}\\.){3}\\d{1,3})',
|
|
||||||
portClause = '(:\\d{1,5})',
|
|
||||||
hostClause = '((' + domainBodyClause + '\\.' + tldClause + ')|' + ipClause + ')' + portClause + '?',
|
|
||||||
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.
|
|
||||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
|
||||||
* Default doesn't set target attribute
|
|
||||||
* @emits linkify
|
|
||||||
* @emits linkify:line
|
|
||||||
*/
|
|
||||||
exports.linkifyTerminalLine = function (terminal, line, lenient, target) {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof target === 'undefined') {
|
|
||||||
target = '';
|
|
||||||
} else {
|
|
||||||
target = 'target="' + target + '"';
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
var url = exports.findLinkMatch(node.data, lenient);
|
|
||||||
|
|
||||||
if (!url) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var startsWithProtocol = new RegExp('^' + protocolClause),
|
|
||||||
urlHasProtocol = url.match(startsWithProtocol),
|
|
||||||
href = (urlHasProtocol) ? url : 'http://' + url,
|
|
||||||
link = '<a href="' + href + '" ' + target + '>' + 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);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds a link within a block of text.
|
|
||||||
*
|
|
||||||
* @param {string} text - The text to search .
|
|
||||||
* @param {boolean} lenient - Whether to use the lenient search.
|
|
||||||
* @return {string} A URL.
|
|
||||||
*/
|
|
||||||
exports.findLinkMatch = function (text, lenient) {
|
|
||||||
var match = text.match(lenient ? lenientUrlRegex : strictUrlRegex);
|
|
||||||
if (!match || match.length === 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return match[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
|
||||||
* Default doesn't set target attribute
|
|
||||||
* @emits linkify
|
|
||||||
* @emits linkify:line
|
|
||||||
*/
|
|
||||||
exports.linkify = function (terminal, lenient, target) {
|
|
||||||
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, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
|
||||||
* Default doesn't set target attribute
|
|
||||||
*/
|
|
||||||
Xterm.prototype.linkifyTerminalLine = function (line, lenient, target) {
|
|
||||||
return exports.linkifyTerminalLine(this, line, lenient, target);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
* @param {string} target - Sets target="" attribute with value provided to links.
|
|
||||||
* Default doesn't set target attribute
|
|
||||||
*/
|
|
||||||
Xterm.prototype.linkify = function (lenient, target) {
|
|
||||||
return exports.linkify(this, lenient, target);
|
|
||||||
};
|
|
||||||
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
Vendored
-135
@@ -1,135 +0,0 @@
|
|||||||
/**
|
|
||||||
* This module provides methods for attaching a terminal to a terminado WebSocket stream.
|
|
||||||
*
|
|
||||||
* @module xterm/addons/terminado/terminado
|
|
||||||
* @license MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function (attach) {
|
|
||||||
if (typeof exports === 'object' && typeof module === 'object') {
|
|
||||||
/*
|
|
||||||
* CommonJS environment
|
|
||||||
*/
|
|
||||||
module.exports = attach(require('../../xterm'));
|
|
||||||
} else if (typeof define == 'function') {
|
|
||||||
/*
|
|
||||||
* Require.js is available
|
|
||||||
*/
|
|
||||||
define(['../../xterm'], attach);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Plain browser environment
|
|
||||||
*/
|
|
||||||
attach(window.Terminal);
|
|
||||||
}
|
|
||||||
})(function (Xterm) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var exports = {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attaches the given terminal to the given socket.
|
|
||||||
*
|
|
||||||
* @param {Xterm} term - The terminal to be attached 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.
|
|
||||||
*/
|
|
||||||
exports.terminadoAttach = function (term, socket, bidirectional, buffered) {
|
|
||||||
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
|
||||||
term.socket = socket;
|
|
||||||
|
|
||||||
term._flushBuffer = function () {
|
|
||||||
term.write(term._attachSocketBuffer);
|
|
||||||
term._attachSocketBuffer = null;
|
|
||||||
clearTimeout(term._attachSocketBufferTimer);
|
|
||||||
term._attachSocketBufferTimer = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
term._pushToBuffer = function (data) {
|
|
||||||
if (term._attachSocketBuffer) {
|
|
||||||
term._attachSocketBuffer += data;
|
|
||||||
} else {
|
|
||||||
term._attachSocketBuffer = data;
|
|
||||||
setTimeout(term._flushBuffer, 10);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
term._getMessage = function (ev) {
|
|
||||||
var data = JSON.parse(ev.data)
|
|
||||||
if( data[0] == "stdout" ) {
|
|
||||||
if (buffered) {
|
|
||||||
term._pushToBuffer(data[1]);
|
|
||||||
} else {
|
|
||||||
term.write(data[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
term._sendData = function (data) {
|
|
||||||
socket.send(JSON.stringify(['stdin', data]));
|
|
||||||
};
|
|
||||||
|
|
||||||
term._setSize = function (size) {
|
|
||||||
socket.send(JSON.stringify(['set_size', size.rows, size.cols]));
|
|
||||||
};
|
|
||||||
|
|
||||||
socket.addEventListener('message', term._getMessage);
|
|
||||||
|
|
||||||
if (bidirectional) {
|
|
||||||
term.on('data', term._sendData);
|
|
||||||
}
|
|
||||||
term.on('resize', term._setSize);
|
|
||||||
|
|
||||||
socket.addEventListener('close', term.terminadoDetach.bind(term, socket));
|
|
||||||
socket.addEventListener('error', term.terminadoDetach.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.terminadoDetach = 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.terminadoAttach = function (socket, bidirectional, buffered) {
|
|
||||||
return exports.terminadoAttach(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.terminadoDetach = function (socket) {
|
|
||||||
return exports.terminadoDetach(this, socket);
|
|
||||||
};
|
|
||||||
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
Vendored
-2261
File diff suppressed because it is too large
Load Diff
Vendored
-5132
File diff suppressed because it is too large
Load Diff
Vendored
-1
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
|
|||||||
version: '2'
|
|
||||||
|
|
||||||
services:
|
|
||||||
web:
|
|
||||||
build: ./
|
|
||||||
volumes:
|
|
||||||
- ./:/usr/src/app
|
|
||||||
ports:
|
|
||||||
- 3000:3000
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
build: .
|
||||||
|
volumes:
|
||||||
|
- ./:/usr/src/app
|
||||||
|
ports:
|
||||||
|
- ${XTERMJS_PORT:3000}:3000
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user