From 0b157ddd1bb12df42baa1525237271f1e85fb2e9 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Thu, 24 Aug 2023 18:00:02 -0500 Subject: [PATCH 1/9] Changed ansi parser to use SAUCE width when available --- core/art.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/core/art.js b/core/art.js index 5e46591c..6a4da757 100644 --- a/core/art.js +++ b/core/art.js @@ -46,6 +46,16 @@ function getFontNameFromSAUCE(sauce) { } } +function getWidthFromSAUCE(sauce) { + if (sauce.Character) { + let sauceWidth = _.toNumber(sauce.Character.characterWidth); + if(!(_.isNaN(sauceWidth) && sauceWidth > 0)) { + return sauceWidth; + } + } + return null; +} + function sliceAtEOF(data, eofMarker) { let eof = data.length; const stopPos = Math.max(data.length - 256, 0); // 256 = 2 * sizeof(SAUCE) @@ -270,10 +280,18 @@ function display(client, art, options, cb) { } } + // Use width from SAUCE if available - if the width is less than the term width, + // we need to set that as the width for the parser so that wide terminals + // display correctly + let parseWidth = getWidthFromSAUCE(options.sauce); + if(_.isNil(parseWidth) || parseWidth > client.term.termWidth) { + parseWidth = client.term.termWidth; + } + const ansiParser = new aep.ANSIEscapeParser({ mciReplaceChar: options.mciReplaceChar, termHeight: client.term.termHeight, - termWidth: client.term.termWidth, + termWidth: parseWidth, trailingLF: options.trailingLF, startRow: options.startRow, }); From ccaaa71e2367176e8a481acb47e33c0dc0450398 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 14:24:47 -0500 Subject: [PATCH 2/9] Make the terminal go to new line if the width of the term is greater than the art width --- core/ansi_escape_parser.js | 21 ++++++++++++++------- core/art.js | 11 ++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/ansi_escape_parser.js b/core/ansi_escape_parser.js index 27d5490d..76dc15b5 100644 --- a/core/ansi_escape_parser.js +++ b/core/ansi_escape_parser.js @@ -37,6 +37,10 @@ function ANSIEscapeParser(options) { this.mciReplaceChar = miscUtil.valueWithDefault(options.mciReplaceChar, ''); this.termHeight = miscUtil.valueWithDefault(options.termHeight, 25); this.termWidth = miscUtil.valueWithDefault(options.termWidth, 80); + this.breakWidth = this.termWidth; + if(!(_.isNil(options.artWidth)) && options.artWidth > 0 && options.artWidth < this.breakWidth) { + this.breakWidth = options.artWidth; + } this.trailingLF = miscUtil.valueWithDefault(options.trailingLF, 'default'); this.row = Math.min(options?.startRow ?? 1, this.termHeight); @@ -90,8 +94,8 @@ function ANSIEscapeParser(options) { switch (charCode) { case CR: - self.emit('literal', text.slice(start, pos)); - start = pos; + self.emit('literal', text.slice(start, pos + 1)); + start = pos + 1; self.column = 1; @@ -105,8 +109,8 @@ function ANSIEscapeParser(options) { self.column = 1; } - self.emit('literal', text.slice(start, pos)); - start = pos; + self.emit('literal', text.slice(start, pos + 1)); + start = pos + 1; self.row += 1; @@ -114,13 +118,16 @@ function ANSIEscapeParser(options) { break; default: - if (self.column === self.termWidth) { + if (self.column === self.breakWidth) { self.emit('literal', text.slice(start, pos + 1)); start = pos + 1; + // If the art is terminal, then we need to force the terminal to go to the next line. + if(self.column < self.termWidth) { + self.emit('literal', '\r\n'); + } self.column = 1; self.row += 1; - self.positionUpdated(); } else { self.column += 1; @@ -135,7 +142,7 @@ function ANSIEscapeParser(options) { // // Finalize this chunk // - if (self.column > self.termWidth) { + if (self.column > self.breakWidth) { self.column = 1; self.row += 1; diff --git a/core/art.js b/core/art.js index 6a4da757..100f2404 100644 --- a/core/art.js +++ b/core/art.js @@ -280,18 +280,11 @@ function display(client, art, options, cb) { } } - // Use width from SAUCE if available - if the width is less than the term width, - // we need to set that as the width for the parser so that wide terminals - // display correctly - let parseWidth = getWidthFromSAUCE(options.sauce); - if(_.isNil(parseWidth) || parseWidth > client.term.termWidth) { - parseWidth = client.term.termWidth; - } - const ansiParser = new aep.ANSIEscapeParser({ mciReplaceChar: options.mciReplaceChar, termHeight: client.term.termHeight, - termWidth: parseWidth, + termWidth: client.term.termWidth, + artWidth: getWidthFromSAUCE(options.sauce), trailingLF: options.trailingLF, startRow: options.startRow, }); From 7d46607ddc0150adf962664e3bca5fe21b61b731 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 14:33:28 -0500 Subject: [PATCH 3/9] Updated the WHATSNEW to include info about the art change. --- WHATSNEW.md | 1 + 1 file changed, 1 insertion(+) diff --git a/WHATSNEW.md b/WHATSNEW.md index 060bf502..107bd533 100644 --- a/WHATSNEW.md +++ b/WHATSNEW.md @@ -9,6 +9,7 @@ This document attempts to track **major** changes and additions in ENiGMA½. For * Finally, the system will search for `index.html` and `index.htm` in that order, if another suitable route cannot be established. * CombatNet has shut down, so the module (`combatnet.js`) has been removed. * The Menu Flag `popParent` has been removed and `noHistory` has been updated to work as expected. In general things should "Just Work", but check your `menu.hjson` entries if you see menu stack issues. +* Art handling has been changed to respect the art width contained in SAUCE when present in the case where the terminal width is greater than the art width. This fixes art files that assume wrapping at 80 columns on wide (mostly new utf8) terminals. ## 0.0.13-beta * **Note for contributors**: ENiGMA has switched to [Prettier](https://prettier.io) for formatting/style. Please see [CONTRIBUTING](CONTRIBUTING.md) and the Prettier website for more information. From bf0bf830535c13aff64fbf556e54ad1f062d271f Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 14:38:32 -0500 Subject: [PATCH 4/9] Small logic change to improve SAUCE handling --- core/art.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/art.js b/core/art.js index 100f2404..2261585f 100644 --- a/core/art.js +++ b/core/art.js @@ -49,7 +49,7 @@ function getFontNameFromSAUCE(sauce) { function getWidthFromSAUCE(sauce) { if (sauce.Character) { let sauceWidth = _.toNumber(sauce.Character.characterWidth); - if(!(_.isNaN(sauceWidth) && sauceWidth > 0)) { + if(!(_.isNaN(sauceWidth)) && sauceWidth > 0) { return sauceWidth; } } From 8758722b6b7b3ebc1956031ec9eefcd2c6c2c73b Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 18:34:45 -0500 Subject: [PATCH 5/9] Fixed PR review comments --- core/ansi_escape_parser.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/ansi_escape_parser.js b/core/ansi_escape_parser.js index 76dc15b5..99411102 100644 --- a/core/ansi_escape_parser.js +++ b/core/ansi_escape_parser.js @@ -38,7 +38,9 @@ function ANSIEscapeParser(options) { this.termHeight = miscUtil.valueWithDefault(options.termHeight, 25); this.termWidth = miscUtil.valueWithDefault(options.termWidth, 80); this.breakWidth = this.termWidth; - if(!(_.isNil(options.artWidth)) && options.artWidth > 0 && options.artWidth < this.breakWidth) { + // toNumber takes care of null, undefined etc as well. + let artWidth = _.toNumber(options.artWidth); + if(!(_.isNaN(artWidth)) && artWidth > 0 && artWidth < this.breakWidth) { this.breakWidth = options.artWidth; } this.trailingLF = miscUtil.valueWithDefault(options.trailingLF, 'default'); @@ -122,7 +124,7 @@ function ANSIEscapeParser(options) { self.emit('literal', text.slice(start, pos + 1)); start = pos + 1; - // If the art is terminal, then we need to force the terminal to go to the next line. + // If we hit breakWidth before termWidth then we need to force the terminal to go to the next line. if(self.column < self.termWidth) { self.emit('literal', '\r\n'); } From adc2e1ba98805b193b1aa6790cf29cd9ef4dc049 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 10:37:12 -0500 Subject: [PATCH 6/9] Fixed Dockerfile to run on Windows --- docker/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index b53c72df..82815691 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get update \ lhasa \ unrar-free \ p7zip-full \ + dos2unix \ && npm install -g pm2 \ && cd /enigma-bbs && npm install --only=production \ && pm2 start main.js \ @@ -37,6 +38,7 @@ RUN apt-get update \ # sexyz COPY docker/bin/sexyz /usr/local/bin +RUN dos2unix /enigma-bbs/docker/bin/docker-entrypoint.sh && apt-get remove dos2unix -y RUN chmod +x /enigma-bbs/docker/bin/docker-entrypoint.sh # enigma storage mounts From 1d00482b0283f3e9293f13506b01e7a3610da361 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 10:54:39 -0500 Subject: [PATCH 7/9] Updated node & added .dockerignore --- .dockerignore | 3 +++ docker/Dockerfile | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..960be9a0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +package-lock.json +yarn.lock \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 82815691..c09b7a5c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-buster-slim +FROM node:18-buster-slim LABEL maintainer="dave@force9.org" @@ -22,8 +22,9 @@ RUN apt-get update \ unrar-free \ p7zip-full \ dos2unix \ + && npm install -g npm@latest \ && npm install -g pm2 \ - && cd /enigma-bbs && npm install --only=production \ + && cd /enigma-bbs && npm install \ && pm2 start main.js \ && mkdir -p /enigma-bbs-pre/art \ && mkdir /enigma-bbs-pre/mods \ From 80dcc14a50a6cea293214b48af8337207ce470a5 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 11:05:39 -0500 Subject: [PATCH 8/9] Small doc change to add running custom container --- docs/_docs/installation/docker.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/_docs/installation/docker.md b/docs/_docs/installation/docker.md index a6959b81..f2f7affa 100644 --- a/docs/_docs/installation/docker.md +++ b/docs/_docs/installation/docker.md @@ -71,5 +71,9 @@ Customising the Docker image is easy! 1. Clone the ENiGMA-BBS source. 2. Build the image ```bash -docker build -f ./docker/Dockerfile . +docker build -t enigmabbs -f ./docker/Dockerfile . +``` +3. Run the image +```bash +docker run -it -p 8888:8888 --name "ENiGMABBS" -v "$(pwd)/config:/enigma-bbs/config" -v "$(pwd)/db:/enigma-bbs/db" -v "$(pwd)/logs:/enigma-bbs/logs" -v "$(pwd)/filebase:/enigma-bbs/filebase" -v "$(pwd)/art:/enigma-bbs/art" -v "$(pwd)/mods:/enigma-bbs/mods" -v "$(pwd)/mail:/mail" enigmabbs ``` From 13ae7789a5f857011c2480ec1ae06f0051353e1d Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 20:03:48 -0500 Subject: [PATCH 9/9] No need to copy the ephemeral directories --- .dockerignore | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 960be9a0..749db005 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,12 @@ node_modules package-lock.json -yarn.lock \ No newline at end of file +yarn.lock + +filebase +db +drop +file_base +logs +mail +docs/_site +docs/.sass-cache \ No newline at end of file