Skip to content

Commit 1f02b11

Browse files
committed
fix(#700): fix terminal emulator on mobile
1 parent 235e648 commit 1f02b11

File tree

5 files changed

+38
-43
lines changed

5 files changed

+38
-43
lines changed

00_Common/javascript/WebTerminal/HtmlTerminal.css

+11-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
overflow-y: scroll;
1919
width: 100%;
20-
max-width: 60rem;
20+
max-width: 640px;
2121
margin: 0 auto;
2222
}
2323

@@ -32,10 +32,7 @@
3232
padding: 0;
3333
}
3434

35-
/* The "terminal" has one "prompt" element.
36-
* This prompt is not any kind of input, but just a simple <span>
37-
* with an id "prompt" and a
38-
*/
35+
/* The "terminal" has one "prompt" input-element. */
3936
@keyframes prompt-blink {
4037
100% {
4138
opacity: 0;
@@ -57,6 +54,15 @@
5754
width: 0.75rem;
5855
opacity: 1;
5956
}
57+
.terminal input#prompt {
58+
text-transform: uppercase;
59+
background: none;
60+
border: none;
61+
outline: none;
62+
caret-color: var(--text);
63+
color: var(--text);
64+
font: var(--terminal-font);
65+
}
6066

6167

6268
/* Terminal scrollbar */

00_Common/javascript/WebTerminal/HtmlTerminal.js

+20-35
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class HtmlTerminal {
2626
* @private
2727
* @type {HTMLElement}
2828
*/
29-
#$prompt = undefined;
29+
#$prompt;
3030

3131
/**
3232
* Constructor
@@ -45,13 +45,18 @@ class HtmlTerminal {
4545
this.$output.classList.add('terminal');
4646

4747
// Create a prompt element.
48-
// This element gets added if input is needed
49-
this.#$prompt = document.createElement("span");
48+
// This element gets added if input is needed.
49+
this.#$prompt = document.createElement("input");
5050
this.#$prompt.setAttribute("id", "prompt");
51-
this.#$prompt.innerText = "";
52-
53-
//TODO: this handler shouls be only on the propt element and only active if cursor is visible
54-
document.addEventListener("keyup", this.#handleKey.bind(this));
51+
this.#$prompt.setAttribute("type", "text");
52+
this.#$prompt.setAttribute("length", "50");
53+
this.#$prompt.addEventListener("keydown", this.#handleKey.bind(this));
54+
55+
// Force focus on the promt on each click.
56+
// This is needed for mobile support.
57+
document.body.addEventListener('click', () => {
58+
this.#$prompt.focus();
59+
});
5560
}
5661

5762
/**
@@ -77,37 +82,16 @@ class HtmlTerminal {
7782
* @param {*} e
7883
*/
7984
#handleKey(e) {
80-
// if no input-callback is defined
85+
// if no input-callback is defined just return
8186
if (!this.#inputCallback) {
8287
return;
8388
}
8489

85-
if (e.keyCode === 13 /* ENTER */) {
86-
// create a new line with the text input and remove the prompt
87-
const text = this.#$prompt.innerText;
88-
this.write(text + "\n");
89-
this.#$prompt.innerText = "";
90+
if (e.keyCode == 13) {
91+
const text = this.#$prompt.value;
92+
this.#$prompt.value = '';
9093
this.#$prompt.remove();
91-
92-
// return the inputed text
93-
this.#inputCallback(text);
94-
95-
// remove the callback and the key handler
96-
this.#inputCallback = undefined;
97-
} else if (e.keyCode === 8 /* BACKSPACE */) {
98-
this.#$prompt.innerText = this.#$prompt.innerText.slice(0, -1);
99-
} else if (
100-
e.keyCode == 16 // "Shift"
101-
|| e.keyCode == 17 // "Control"
102-
|| e.keyCode == 20 // "CapsLock"
103-
|| !e.key.match(/^[a-z0-9!"§#$%&'()*+,.\/:;<=>?@\[\] ^_`{|}~-]$/i)
104-
) {
105-
// ignore non-visible characters
106-
return e;
107-
} else {
108-
this.#$prompt.innerHtml = '';
109-
const key = e.shiftKey ? e.key.toUpperCase() : e.key;
110-
this.#$prompt.innerText = this.#$prompt.innerText + key;
94+
this.#inputCallback(text + '\n');
11195
}
11296
}
11397

@@ -122,7 +106,7 @@ class HtmlTerminal {
122106
}
123107

124108
/**
125-
* TODO:
109+
* Create a new div and add html content.
126110
*
127111
* @public
128112
* @param {*} htmlContent
@@ -189,7 +173,8 @@ class HtmlTerminal {
189173
*/
190174
input(callback) {
191175
// show prompt with a blinking prompt
192-
this.$output.appendChild(this.#$prompt);
193176
this.#inputCallback = callback;
177+
this.$output.appendChild(this.#$prompt);
178+
this.#$prompt.focus();
194179
}
195180
}

00_Common/javascript/WebTerminal/terminal.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<html>
22
<head>
33
<title>Minimal node.js terminal</title>
4-
<meta name="viewport" content="width=device-width, initial-scale=.75">
4+
<meta name="viewport" content="width=640, initial-scale=1">
55
<link
66
rel="stylesheet"
77
href="../../../00_Utilities/javascript/style_terminal.css"

00_Common/javascript/common.mjs

+5-1
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,13 @@ export async function input(message = '') {
5757
* First we need to convert it into a string. */
5858
const data = input.toString();
5959

60+
/* add input to terminal
61+
* The data should end with a newline! */
62+
process.stdout.write(data);
63+
6064
/* The result fo onData is a string ending with an `\n`.
6165
* We just need the actual content so let's remove the newline at the end: */
62-
const content = data[data.length] === '\n' ? data.slice(0, -1) : data;
66+
const content = data.endsWith('\n') ? data.slice(0, -1) : data;
6367

6468
resolve(content);
6569
});

index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BASIC Computer Games</title><link rel="stylesheet" href="./00_Utilities/javascript/style_terminal.css" /></head><body><article id="output"><header><h1>BASIC Computer Games</h1></header><main><ul><li><a href="01_Acey_Ducey/javascript/aceyducey.html">01 Acey_Ducey</a></li><li><a href="02_Amazing/javascript/amazing.html">02 Amazing</a></li><li><a href="03_Animal/javascript/animal.html">03 Animal</a></li><li><a href="04_Awari/javascript/awari.html">04 Awari</a></li><li><a href="05_Bagels/javascript/bagels.html">05 Bagels</a></li><li><a href="06_Banner/javascript/banner.html">06 Banner</a></li><li><a href="07_Basketball/javascript/basketball.html">07 Basketball</a></li><li><a href="08_Batnum/javascript/batnum.html">08 Batnum</a></li><li><a href="09_Battle/javascript/battle.html">09 Battle</a></li><li><a href="10_Blackjack/javascript/blackjack.html">10 Blackjack</a></li><li><a href="11_Bombardment/javascript/bombardment.html">11 Bombardment</a></li><li><a href="12_Bombs_Away/javascript/bombsaway.html">12 Bombs_Away</a></li><li><a href="13_Bounce/javascript/bounce.html">13 Bounce</a></li><li><a href="14_Bowling/javascript/bowling.html">14 Bowling</a></li><li><a href="15_Boxing/javascript/boxing.html">15 Boxing</a></li><li><a href="16_Bug/javascript/bug.html">16 Bug</a></li><li><a href="17_Bullfight/javascript/bullfight.html">17 Bullfight</a></li><li><a href="18_Bullseye/javascript/bullseye.html">18 Bullseye</a></li><li><a href="19_Bunny/javascript/bunny.html">19 Bunny</a></li><li><a href="20_Buzzword/javascript/buzzword.html">20 Buzzword</a></li><li><a href="21_Calendar/javascript/calendar.html">21 Calendar</a></li><li><a href="22_Change/javascript/change.html">22 Change</a></li><li><a href="23_Checkers/javascript/checkers.html">23 Checkers</a></li><li><a href="24_Chemist/javascript/chemist.html">24 Chemist</a></li><li><a href="25_Chief/javascript/chief.html">25 Chief</a></li><li><a href="26_Chomp/javascript/chomp.html">26 Chomp</a></li><li><a href="27_Civil_War/javascript/civilwar.html">27 Civil_War</a></li><li><a href="28_Combat/javascript/combat.html">28 Combat</a></li><li><a href="29_Craps/javascript/craps.html">29 Craps</a></li><li><a href="30_Cube/javascript/cube.html">30 Cube</a></li><li><a href="31_Depth_Charge/javascript/depthcharge.html">31 Depth_Charge</a></li><li><a href="32_Diamond/javascript/diamond.html">32 Diamond</a></li><li><a href="33_Dice/javascript/dice.html">33 Dice</a></li><li><a href="34_Digits/javascript/digits.html">34 Digits</a></li><li><span>35 Even_Wins</span><ul><li><a href="35_Even_Wins/javascript/evenwins.html">evenwins</a></li><li><a href="35_Even_Wins/javascript/gameofevenwins.html">gameofevenwins</a></li></ul></li><li><a href="36_Flip_Flop/javascript/flipflop.html">36 Flip_Flop</a></li><li><span>37 Football</span><ul><li><a href="37_Football/javascript/football.html">football</a></li><li><a href="37_Football/javascript/ftball.html">ftball</a></li></ul></li><li><a href="38_Fur_Trader/javascript/furtrader.html">38 Fur_Trader</a></li><li><a href="39_Golf/javascript/golf.html">39 Golf</a></li><li><a href="40_Gomoko/javascript/gomoko.html">40 Gomoko</a></li><li><a href="41_Guess/javascript/guess.html">41 Guess</a></li><li><a href="42_Gunner/javascript/gunner.html">42 Gunner</a></li><li><a href="43_Hammurabi/javascript/hammurabi.html">43 Hammurabi</a></li><li><a href="44_Hangman/javascript/hangman.html">44 Hangman</a></li><li><a href="45_Hello/javascript/hello.html">45 Hello</a></li><li><a href="46_Hexapawn/javascript/hexapawn.html">46 Hexapawn</a></li><li><a href="47_Hi-Lo/javascript/hi-lo.html">47 Hi-Lo</a></li><li><a href="48_High_IQ/javascript/highiq.html">48 High_IQ</a></li><li><a href="49_Hockey/javascript/hockey.html">49 Hockey</a></li><li><a href="50_Horserace/javascript/horserace.html">50 Horserace</a></li><li><a href="51_Hurkle/javascript/hurkle.html">51 Hurkle</a></li><li><a href="52_Kinema/javascript/kinema.html">52 Kinema</a></li><li><a href="53_King/javascript/king.html">53 King</a></li><li><a href="54_Letter/javascript/letter.html">54 Letter</a></li><li><a href="55_Life/javascript/life.html">55 Life</a></li><li><a href="56_Life_for_Two/javascript/lifefortwo.html">56 Life_for_Two</a></li><li><span>57 Literature_Quiz</span><ul><li><a href="57_Literature_Quiz/javascript/litquiz.html">litquiz</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#57_Literature_Quiz/javascript/litquiz.mjs">litquiz (node.js)</a></li></ul></li><li><a href="58_Love/javascript/love.html">58 Love</a></li><li><span>59 Lunar_LEM_Rocket</span><ul><li><a href="59_Lunar_LEM_Rocket/javascript/lem.html">lem</a></li><li><a href="59_Lunar_LEM_Rocket/javascript/lunar.html">lunar</a></li></ul></li><li><a href="60_Mastermind/javascript/mastermind.html">60 Mastermind</a></li><li><a href="61_Math_Dice/javascript/mathdice.html">61 Math_Dice</a></li><li><a href="62_Mugwump/javascript/mugwump.html">62 Mugwump</a></li><li><a href="63_Name/javascript/name.html">63 Name</a></li><li><a href="64_Nicomachus/javascript/nicomachus.html">64 Nicomachus</a></li><li><a href="65_Nim/javascript/nim.html">65 Nim</a></li><li><a href="66_Number/javascript/number.html">66 Number</a></li><li><a href="67_One_Check/javascript/onecheck.html">67 One_Check</a></li><li><a href="68_Orbit/javascript/orbit.html">68 Orbit</a></li><li><a href="69_Pizza/javascript/pizza.html">69 Pizza</a></li><li><a href="70_Poetry/javascript/poetry.html">70 Poetry</a></li><li><a href="71_Poker/javascript/poker.html">71 Poker</a></li><li><a href="72_Queen/javascript/queen.html">72 Queen</a></li><li><a href="73_Reverse/javascript/reverse.html">73 Reverse</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#74_Rock_Scissors_Paper/javascript/rockscissors.mjs">74 Rock_Scissors_Paper (node.js)</a></li><li><a href="75_Roulette/javascript/roulette.html">75 Roulette</a></li><li><a href="76_Russian_Roulette/javascript/russianroulette.html">76 Russian_Roulette</a></li><li><a href="77_Salvo/javascript/salvo.html">77 Salvo</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#78_Sine_Wave/javascript/sinewave.mjs">78 Sine_Wave (node.js)</a></li><li><a href="79_Slalom/javascript/slalom.html">79 Slalom</a></li><li><a href="80_Slots/javascript/slots.html">80 Slots</a></li><li><a href="81_Splat/javascript/splat.html">81 Splat</a></li><li><a href="82_Stars/javascript/stars.html">82 Stars</a></li><li><a href="83_Stock_Market/javascript/stockmarket.html">83 Stock_Market</a></li><li><a href="84_Super_Star_Trek/javascript/index.html">84 Super_Star_Trek</a></li><li><a href="85_Synonym/javascript/synonym.html">85 Synonym</a></li><li><a href="86_Target/javascript/target.html">86 Target</a></li><li><a href="87_3-D_Plot/javascript/3dplot.html">87 3-D_Plot</a></li><li><a href="88_3-D_Tic-Tac-Toe/javascript/qubit.html">88 3-D_Tic-Tac-Toe</a></li><li><span>89 Tic-Tac-Toe</span><ul><li><a href="89_Tic-Tac-Toe/javascript/tictactoe1.html">tictactoe1</a></li><li><a href="89_Tic-Tac-Toe/javascript/tictactoe2.html">tictactoe2</a></li></ul></li><li><a href="90_Tower/javascript/tower.html">90 Tower</a></li><li><a href="91_Train/javascript/train.html">91 Train</a></li><li><a href="92_Trap/javascript/trap.html">92 Trap</a></li><li><a href="93_23_Matches/javascript/23matches.html">93 23_Matches</a></li><li><a href="94_War/javascript/war.html">94 War</a></li><li><a href="95_Weekday/javascript/weekday.html">95 Weekday</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#96_Word/javascript/word.mjs">96 Word (node.js)</a></li></ul></main></article></body></html>
1+
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BASIC Computer Games</title><link rel="stylesheet" href="./00_Utilities/javascript/style_terminal.css" /></head><body><article id="output"><header><h1>BASIC Computer Games</h1></header><main><ul><li><a href="01_Acey_Ducey/javascript/aceyducey.html">01 Acey_Ducey</a></li><li><a href="02_Amazing/javascript/amazing.html">02 Amazing</a></li><li><a href="03_Animal/javascript/animal.html">03 Animal</a></li><li><a href="04_Awari/javascript/awari.html">04 Awari</a></li><li><a href="05_Bagels/javascript/bagels.html">05 Bagels</a></li><li><a href="06_Banner/javascript/banner.html">06 Banner</a></li><li><a href="07_Basketball/javascript/basketball.html">07 Basketball</a></li><li><a href="08_Batnum/javascript/batnum.html">08 Batnum</a></li><li><a href="09_Battle/javascript/battle.html">09 Battle</a></li><li><a href="10_Blackjack/javascript/blackjack.html">10 Blackjack</a></li><li><a href="11_Bombardment/javascript/bombardment.html">11 Bombardment</a></li><li><a href="12_Bombs_Away/javascript/bombsaway.html">12 Bombs_Away</a></li><li><a href="13_Bounce/javascript/bounce.html">13 Bounce</a></li><li><a href="14_Bowling/javascript/bowling.html">14 Bowling</a></li><li><a href="15_Boxing/javascript/boxing.html">15 Boxing</a></li><li><a href="16_Bug/javascript/bug.html">16 Bug</a></li><li><a href="17_Bullfight/javascript/bullfight.html">17 Bullfight</a></li><li><a href="18_Bullseye/javascript/bullseye.html">18 Bullseye</a></li><li><a href="19_Bunny/javascript/bunny.html">19 Bunny</a></li><li><a href="20_Buzzword/javascript/buzzword.html">20 Buzzword</a></li><li><a href="21_Calendar/javascript/calendar.html">21 Calendar</a></li><li><a href="22_Change/javascript/change.html">22 Change</a></li><li><a href="23_Checkers/javascript/checkers.html">23 Checkers</a></li><li><a href="24_Chemist/javascript/chemist.html">24 Chemist</a></li><li><a href="25_Chief/javascript/chief.html">25 Chief</a></li><li><a href="26_Chomp/javascript/chomp.html">26 Chomp</a></li><li><a href="27_Civil_War/javascript/civilwar.html">27 Civil_War</a></li><li><a href="28_Combat/javascript/combat.html">28 Combat</a></li><li><a href="29_Craps/javascript/craps.html">29 Craps</a></li><li><a href="30_Cube/javascript/cube.html">30 Cube</a></li><li><a href="31_Depth_Charge/javascript/depthcharge.html">31 Depth_Charge</a></li><li><a href="32_Diamond/javascript/diamond.html">32 Diamond</a></li><li><a href="33_Dice/javascript/dice.html">33 Dice</a></li><li><a href="34_Digits/javascript/digits.html">34 Digits</a></li><li><span>35 Even_Wins</span><ul><li><a href="35_Even_Wins/javascript/evenwins.html">evenwins</a></li><li><a href="35_Even_Wins/javascript/gameofevenwins.html">gameofevenwins</a></li></ul></li><li><a href="36_Flip_Flop/javascript/flipflop.html">36 Flip_Flop</a></li><li><span>37 Football</span><ul><li><a href="37_Football/javascript/football.html">football</a></li><li><a href="37_Football/javascript/ftball.html">ftball</a></li></ul></li><li><a href="38_Fur_Trader/javascript/furtrader.html">38 Fur_Trader</a></li><li><a href="39_Golf/javascript/golf.html">39 Golf</a></li><li><a href="40_Gomoko/javascript/gomoko.html">40 Gomoko</a></li><li><a href="41_Guess/javascript/guess.html">41 Guess</a></li><li><a href="42_Gunner/javascript/gunner.html">42 Gunner</a></li><li><a href="43_Hammurabi/javascript/hammurabi.html">43 Hammurabi</a></li><li><a href="44_Hangman/javascript/hangman.html">44 Hangman</a></li><li><a href="45_Hello/javascript/hello.html">45 Hello</a></li><li><a href="46_Hexapawn/javascript/hexapawn.html">46 Hexapawn</a></li><li><a href="47_Hi-Lo/javascript/hi-lo.html">47 Hi-Lo</a></li><li><a href="48_High_IQ/javascript/highiq.html">48 High_IQ</a></li><li><a href="49_Hockey/javascript/hockey.html">49 Hockey</a></li><li><a href="50_Horserace/javascript/horserace.html">50 Horserace</a></li><li><a href="51_Hurkle/javascript/hurkle.html">51 Hurkle</a></li><li><a href="52_Kinema/javascript/kinema.html">52 Kinema</a></li><li><a href="53_King/javascript/king.html">53 King</a></li><li><a href="54_Letter/javascript/letter.html">54 Letter</a></li><li><a href="55_Life/javascript/life.html">55 Life</a></li><li><a href="56_Life_for_Two/javascript/lifefortwo.html">56 Life_for_Two</a></li><li><span>57 Literature_Quiz</span><ul><li><a href="57_Literature_Quiz/javascript/litquiz.html">litquiz</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#57_Literature_Quiz/javascript/litquiz.mjs">litquiz (node.js)</a></li></ul></li><li><a href="58_Love/javascript/love.html">58 Love</a></li><li><span>59 Lunar_LEM_Rocket</span><ul><li><a href="59_Lunar_LEM_Rocket/javascript/lem.html">lem</a></li><li><a href="59_Lunar_LEM_Rocket/javascript/lunar.html">lunar</a></li></ul></li><li><a href="60_Mastermind/javascript/mastermind.html">60 Mastermind</a></li><li><a href="61_Math_Dice/javascript/mathdice.html">61 Math_Dice</a></li><li><a href="62_Mugwump/javascript/mugwump.html">62 Mugwump</a></li><li><a href="63_Name/javascript/name.html">63 Name</a></li><li><a href="64_Nicomachus/javascript/nicomachus.html">64 Nicomachus</a></li><li><a href="65_Nim/javascript/nim.html">65 Nim</a></li><li><a href="66_Number/javascript/number.html">66 Number</a></li><li><a href="67_One_Check/javascript/onecheck.html">67 One_Check</a></li><li><a href="68_Orbit/javascript/orbit.html">68 Orbit</a></li><li><a href="69_Pizza/javascript/pizza.html">69 Pizza</a></li><li><a href="70_Poetry/javascript/poetry.html">70 Poetry</a></li><li><a href="71_Poker/javascript/poker.html">71 Poker</a></li><li><a href="72_Queen/javascript/queen.html">72 Queen</a></li><li><a href="73_Reverse/javascript/reverse.html">73 Reverse</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#74_Rock_Scissors_Paper/javascript/rockscissors.mjs">74 Rock_Scissors_Paper (node.js)</a></li><li><a href="75_Roulette/javascript/roulette.html">75 Roulette</a></li><li><a href="76_Russian_Roulette/javascript/russianroulette.html">76 Russian_Roulette</a></li><li><a href="77_Salvo/javascript/salvo.html">77 Salvo</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#78_Sine_Wave/javascript/sinewave.mjs">78 Sine_Wave (node.js)</a></li><li><a href="79_Slalom/javascript/slalom.html">79 Slalom</a></li><li><a href="80_Slots/javascript/slots.html">80 Slots</a></li><li><a href="81_Splat/javascript/splat.html">81 Splat</a></li><li><a href="82_Stars/javascript/stars.html">82 Stars</a></li><li><a href="83_Stock_Market/javascript/stockmarket.html">83 Stock_Market</a></li><li><a href="84_Super_Star_Trek/javascript/index.html">84 Super_Star_Trek</a></li><li><a href="85_Synonym/javascript/synonym.html">85 Synonym</a></li><li><a href="86_Target/javascript/target.html">86 Target</a></li><li><a href="87_3-D_Plot/javascript/3dplot.html">87 3-D_Plot</a></li><li><a href="88_3-D_Tic-Tac-Toe/javascript/qubit.html">88 3-D_Tic-Tac-Toe</a></li><li><span>89 Tic-Tac-Toe</span><ul><li><a href="89_Tic-Tac-Toe/javascript/tictactoe1.html">tictactoe1</a></li><li><a href="89_Tic-Tac-Toe/javascript/tictactoe2.html">tictactoe2</a></li></ul></li><li><a href="90_Tower/javascript/tower.html">90 Tower</a></li><li><a href="91_Train/javascript/train.html">91 Train</a></li><li><a href="92_Trap/javascript/trap.html">92 Trap</a></li><li><a href="93_23_Matches/javascript/23matches.html">93 23_Matches</a></li><li><a href="94_War/javascript/war.html">94 War</a></li><li><a href="95_Weekday/javascript/weekday.html">95 Weekday</a></li><li><span>96 Word</span><ul><li><a href="./00_Common/javascript/WebTerminal/terminal.html#96_Word/javascript/word.mjs">word (node.js)</a></li><li><a href="./00_Common/javascript/WebTerminal/terminal.html#96_Word/javascript/word_full.mjs">word_full (node.js)</a></li></ul></li></ul></main></article></body></html>

0 commit comments

Comments
 (0)