From 6cd348433a20bbf5eddab10dda1f5af4bffdaf62 Mon Sep 17 00:00:00 2001 From: "Lin, Hung-Shin" Date: Mon, 27 Nov 2023 00:10:41 +0800 Subject: [PATCH] feat: display code block in terminal to different color --- packages/container/cli.js | 4 ++-- packages/container/print.js | 38 ++++++++++++++++++++------------- server/src/containers/docker.js | 4 ++-- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/packages/container/cli.js b/packages/container/cli.js index 070dd38..c49ccfd 100644 --- a/packages/container/cli.js +++ b/packages/container/cli.js @@ -48,10 +48,10 @@ async function handleCommand(command) { async function handleResponse({ responses, hints, end }) { if (responses) { - await printResponses(responses, 120) + await printResponses(responses, 90) } if (hints) { - await printHints(hints, 120) + await printHints(hints, 90) } if (end) { console.log(colorize('Quest completed!', 'blue')) diff --git a/packages/container/print.js b/packages/container/print.js index 35a8af2..8f3eee3 100644 --- a/packages/container/print.js +++ b/packages/container/print.js @@ -6,6 +6,7 @@ const RETURN_SYMBOL = '\u21B5' // ANSI color map const ANSI_COLORS = { + default: 0, black: 30, red: 31, green: 32, @@ -16,10 +17,13 @@ const ANSI_COLORS = { white: 37, } +function colorCode(color) { + return `\x1b[${ANSI_COLORS[color]}m` +} + function colorize(content, color) { - const colorCode = ANSI_COLORS[color] - if (!colorCode) return content - return `\x1b[${colorCode}m${content}\x1b[0m` + if (!color) return content + return `${colorCode(color)}${content}${colorCode('default')}` } process.stdin.setRawMode(true) @@ -36,25 +40,29 @@ function waitForEnter() { }) } -function isCodeColor(text, isCode) { - if (text === '`') { - return !isCode +function formatLine(content, color) { + let result = colorCode(color) + let codeBlock = false + for (const c of content) { + switch (c) { + case '`': + result += colorCode(codeBlock ? color : 'green') + codeBlock = !codeBlock + break + + default: + result += c + } } - return isCode + return result + colorCode('default') + RETURN_SYMBOL } function printLine(content, delay, color) { - const printContent = `${colorize(content, color)}${RETURN_SYMBOL}` - let isCode = false + const printContent = formatLine(content, color) return new Promise((resolve) => { let i = 0 const timer = setInterval(() => { - isCode = isCodeColor(printContent[i], isCode) - if (isCode) { - process.stdout.write(colorize(printContent[i], 'green')) - } else { - process.stdout.write(printContent[i]) - } + process.stdout.write(printContent[i]) i += 1 if (i >= printContent.length) { clearInterval(timer) diff --git a/server/src/containers/docker.js b/server/src/containers/docker.js index ed34022..af33e42 100644 --- a/server/src/containers/docker.js +++ b/server/src/containers/docker.js @@ -25,8 +25,8 @@ export function createContainer(name, questId) { Image: getQuestImage(questId), } const { hostPwd, mountQuest } = config.docker - if (!config.isProduction && hostPwd && mountQuest) { - logger.debug('Mounting quest folder', mountQuest) + if (!config.isProduction && hostPwd && mountQuest === questId) { + logger.info('Mounting quest folder', mountQuest) option.HostConfig.Binds = [ `${hostPwd}/quests/${mountQuest}/home:/home/commander`, `${hostPwd}/packages/container:/usr/local/lib/container`,