Files
douboer@gmail.com 3b7c1d558a first commit
2026-03-03 13:23:14 +08:00

256 lines
6.0 KiB
Markdown

# Output
Information maybe output in a number of ways and logged in the terminal instance with the help of [term.write()](../api/index.md#term-write), [term.writeln()](../api/index.md#term-writeln), [term.writeSafe()](../api/index.md#term-writesafe) or [term.writelnSafe()](../api/index.md#term-writelnsafe).
## Raw Data
Raw data may include strings and numbers.
Here is a simple `hello world` example:
```js
term.write("Hello World!");
```
<browser-preview>
Hello World!▊
</browser-preview>
With an optional callback function,
```js
term.write("Hello World!", () => console.log("Done!"));
// Done!
```
When dealing with arbitrary (untrustworthy) data like user input or remote resources,
use `term.writeSafe` to securely print to the terminal. For more details, see [HTML Strings section](#html-strings).
```js
const someData = "...";
term.writeSafe(someData);
```
## Escape characters
Below is a list of available and ready to use escape characters;
- **`\n` - New line**
When the `\n` character is encountered in the data to output, it moves the cursor to the next line.
The data, after every instance of the `\n` character, is rendereed on a new line.
**Example:**
```js
term.write(`Hello World!\n$ `);
```
<browser-preview>
Hello World!
$ ▊
</browser-preview>
The same can be achieved using [term.writeln()](../api/index.md#term-writeln) which writes the
data passed on the current line, followed by a new line character.
```js
term.writeln(`Hello World!`);
term.write("$ ");
```
- **`\t` - Tab**
The tab character defaults to _four_ (4) space characters.
**Example:**
```js
term.writeln(`Hello World!\tYou're Welcome.`);
```
<browser-preview>
Hello World! You're welcome.
</browser-preview>
## HTML Strings
You might want to output some HTML string, here is how you can do it;
```js
term.writeln(`<b>Bold Text</b> - <i>Italics</i>`);
```
<browser-preview>
<b>Bold Text</b> - <i>Italics</i>
<br>▊
</browser-preview>
### Safe Output
::: warning :warning: SECURITY WARNING
- **Use [term.writeSafe()](../api/index.md#term-writesafe) or [term.writelnSafe()](../api/index.md#term-writelnsafe) to safely output arbitrary data to the terminal.**
**These methods sanitize the data before being output to the terminal, specifically, before appending it to the DOM.**
Avoid outputting data from arbitrary sources like user input or remote sources (such as images).
Doing so has been proved to allow for malicious attacks like XSS where a user may input some HTML
code that could potentially expose user information such as session cookies or even inject malicious scripts on the page.
For example: `term.writeln("<img onerror=alert('hacked') />")` would run the malicious script and you would see an alert dialog.
- **RECOMMENDED: Additionally use [XTerminal.escapeHTML()](#xterminal-escapehtml) or external libraries like [DOMPurify](https://www.npmjs.com/package/dompurify) to sanitize arbitrary data before outputting it using `term.write()` or `term.writeln()`. See examples below.**
:::
```js
term.writelnSafe(`<b>Bold Text</b> - <i>Italics</i>`);
```
<browser-preview>
\<b>Bold Text<\/b> - \<i>Italics<\/i>
<br>▊
</browser-preview>
Use [XTerminal.escapeHTML()](#xterminal-escapehtml) to sanitize some data before printing it.
This is helpful when using HTML containers for some other data like showing styled error messages.
```js
const err = `<img onerror="alert('hacked')" />`
term.writeln(`<p class="error">${XTerminal.escapeHTML(err)}</p>`)
```
<browser-preview>
\<img onerror="alert('hacked')" \/>
<br>▊
</browser-preview>
### Attributes
To output valid HTML tags with attributes, there must be a **single space** separation between the attributes in every opening tag.
**For example:** The following won't work as expected
```js
term.writeln('<b class="text-blue">Bold Blue Text</b>');
term.writeln('<b style="color: dodgerblue ">Bold Blue Text</b>');
```
Here is how it should be done
```js
term.writeln('<b class="text-blue">Bold Blue Text</b>'); // [!code --]
term.writeln('<b class="text-blue">Bold Blue Text</b>'); // [!code ++]
term.writeln('<b style="color: dodgerblue ">Bold Blue Text</b>'); // [!code --]
term.writeln('<b style="color: dodgerblue">Bold Blue Text</b>'); // [!code ++]
```
However, multiple spaces are **okay** in between the opening and closing tags.
**For example:**
```js
term.writeln('<b style="color: dodgerblue">Bold Blue Text</b>');
```
## Clear Screen
To clear the entire terminal, you can do it programmatically using
[term.clear()](../api/index.md#term-clear).
```js
term.clear();
```
## Clear Last Output
To remove the output for the previous write operation, [term.clearLast()](../api/index.md#term-clearlast) does the job.
:::info
This is like the undo method but for only one output operation.
:::
**Example:**
```js
term.writeln("Welcome to Space!");
term.writeln("Loading...");
term.clearLast();
```
<browser-preview>
Welcome to Space!
<br>▊
</browser-preview>
It is useful in several cases for example when implementing a loader.
:::details Example: 5s loader
- **Styles**
```css
.spinner:after {
animation: changeContent 0.8s linear infinite;
content: "⠋";
}
@keyframes changeContent {
10% {
content: "⠙";
}
20% {
content: "⠹";
}
30% {
content: "⠸";
}
40% {
content: "⠼";
}
50% {
content: "⠴";
}
60% {
content: "⠦";
}
70% {
content: "⠧";
}
80% {
content: "⠇";
}
90% {
content: "⠏";
}
}
```
- **Script**
```js
term.write('<span class="spinner"></span> Loading...');
setTimeout(() => term.clearLast(), 5000);
```
:::
## Next Step
Work with terminal events that help you trigger actions on the go.