From c902615192c073db363a6012ffa3185699cc5cdf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 21 May 2022 17:03:44 +0100 Subject: [PATCH] Improve `writeToConole` logic for the `console.log` difference between stdout and stderr --- vendor/wasm/js/runtime.js | 72 +++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index 83947165c..412223eab 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -1,3 +1,5 @@ +"use strict"; + (function() { class WasmMemoryInterface { constructor() { @@ -1172,32 +1174,33 @@ class WebGLInterface { }; -function newlineCount(str, substr) { - return (str.match(/\n/g) || []).length; -}; - function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { const MAX_INFO_CONSOLE_LINES = 512; let infoConsoleLines = new Array(); let currentLine = {}; currentLine[false] = ""; currentLine[true] = ""; + let prevIsError = false; const writeToConsole = (line, isError) => { if (!line) { return; } - const println = (text) => { + const println = (text, forceIsError) => { let style = [ "color: #eee", "background-color: #d20", "padding: 2px 4px", "border-radius: 2px", - ]; + ].join(";"); + let doIsError = isError; + if (forceIsError !== undefined) { + doIsError = forceIsError; + } - if (isError) { - console.log("%c"+text, style.join(";")); + if (doIsError) { + console.log("%c"+text, style); } else { console.log(text); } @@ -1226,28 +1229,61 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { } } + if (prevIsError != isError) { + if (prevIsError) { + println(currentLine[prevIsError], prevIsError); + currentLine[prevIsError] = ""; + } + } + prevIsError = isError; + // HTML based console if (!consoleElement) { return; } - if (line.endsWith("\n")) { - line = line.substring(0, line.length-1); - } else if (infoConsoleLines.length > 0) { - let prev_line = infoConsoleLines.pop(); - line = prev_line.concat(line); + const wrap = (x) => { + if (isError) { + return ''+x+''; + } + return x; + }; + + if (line == "\n") { + infoConsoleLines.push(line); + } else if (!line.includes("\n")) { + let prevLine = ""; + if (infoConsoleLines.length > 0) { + prevLine = infoConsoleLines.pop(); + } + infoConsoleLines.push(prevLine.concat(wrap(line))); + } else { + let lines = line.split("\n"); + let lastHasNewline = lines.length > 1 && line.endsWith("\n"); + + let prevLine = ""; + if (infoConsoleLines.length > 0) { + prevLine = infoConsoleLines.pop(); + } + infoConsoleLines.push(prevLine.concat(wrap(lines[0]).concat("\n"))); + + for (let i = 1; i < lines.length-1; i++) { + infoConsoleLines.push(wrap(lines[i]).concat("\n")); + } + let last = lines[lines.length-1]; + if (lastHasNewline) { + infoConsoleLines.push(last.concat("\n")); + } else { + infoConsoleLines.push(last); + } } - infoConsoleLines.push(line); if (infoConsoleLines.length > MAX_INFO_CONSOLE_LINES) { - infoConsoleLines.shift(); + infoConsoleLines.shift(MAX_INFO_CONSOLE_LINES); } let data = ""; for (let i = 0; i < infoConsoleLines.length; i++) { - if (i != 0) { - data = data.concat("\n"); - } data = data.concat(infoConsoleLines[i]); }