From 4a3e4c5c476ce2ea661f786807a1ee0a6dbe896e Mon Sep 17 00:00:00 2001 From: Alx-Lai Date: Sun, 6 Oct 2024 18:35:42 +0800 Subject: [PATCH] Execution: Add stderr block Add a stderr block. Pros: - we can make use of dbg macro in our code Cons: - there's a limitation that the compile message also shows To be improved: - compile message regex may change overtime - can use websocket to replace the current approach Applies patches from rust-lang/mdBook#1315 since the original change was not merged by rust-lang. Signed-off-by: Alx-Lai --- theme/book.js | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/theme/book.js b/theme/book.js index 3c46f6af926..4b07867a9ea 100644 --- a/theme/book.js +++ b/theme/book.js @@ -110,10 +110,17 @@ function playground_text(playground, hidden = true) { } function run_rust_code(code_block) { - var result_block = code_block.querySelector(".result"); + var result_stderr_block = code_block.querySelector(".result.stderr"); + if (!result_stderr_block) { + result_stderr_block = document.createElement('code'); + result_stderr_block.className = 'result stderr hljs nohighlight hidden'; + + code_block.append(result_stderr_block); + } + var result_block = code_block.querySelector(".result.stdout"); if (!result_block) { result_block = document.createElement('code'); - result_block.className = 'result hljs language-bash'; + result_block.className = 'result stdout hljs nohighlight'; code_block.append(result_block); } @@ -127,10 +134,13 @@ function playground_text(playground, hidden = true) { edition = "2021"; } var params = { - version: "stable", - optimize: "0", + backtrace: true, + channel: "stable", code: text, - edition: edition + edition: edition, + mode: "debug", + tests: false, + crateType: "bin", }; if (text.indexOf("#![feature") !== -1) { @@ -138,10 +148,13 @@ function playground_text(playground, hidden = true) { } result_block.innerText = "Running..."; + // hide stderr block while running + result_stderr_block.innerText = ""; + result_stderr_block.classList.add("hidden"); const playgroundModified = isPlaygroundModified(code_block); const startTime = window.performance.now(); - fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + fetch_with_timeout("https://play.rust-lang.org/execute", { headers: { 'Content-Type': "application/json", }, @@ -158,13 +171,26 @@ function playground_text(playground, hidden = true) { "latency": (endTime - startTime) / 1000, }); - if (response.result.trim() === '') { + if (response.stdout.trim() === '') { result_block.innerText = "No output"; result_block.classList.add("result-no-output"); } else { - result_block.innerText = response.result; + result_block.innerText = response.stdout; result_block.classList.remove("result-no-output"); } + + // trim compile message + // ==================== + // Compiling playground v0.0.1 (/playground) + // Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.60s + // Running `target/debug/playground` + // ==================== + const compileMsgRegex = /^\s+Compiling(.+)\s+Finished(.+)\s+Running(.+)\n/; + response.stderr = response.stderr.replace(compileMsgRegex, ""); + if (response.stderr.trim() !== '') { + result_stderr_block.classList.remove("hidden"); + result_stderr_block.innerText = response.stderr; + } }) .catch(error => { const endTime = window.performance.now();