From 4f1035cbe6ab144ad804e056fa12a9a7c282f3f3 Mon Sep 17 00:00:00 2001 From: Richard Bowman Date: Mon, 8 Jan 2024 15:51:46 +0000 Subject: [PATCH] Handle python "underlining" nicely Python stack traces use spaces and carets to "underline" the code causing the problem. I've now matched and processed these lines to add tags. This necessitated escaping messages and displaying raw HTML which is now done by `escapeText`. --- .../tabContentComponents/loggingContent.vue | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/webapp/src/components/tabContentComponents/loggingContent.vue b/webapp/src/components/tabContentComponents/loggingContent.vue index 2c008682..709ea16e 100644 --- a/webapp/src/components/tabContentComponents/loggingContent.vue +++ b/webapp/src/components/tabContentComponents/loggingContent.vue @@ -60,8 +60,7 @@ > More info... -
- {{ item.message }} +
@@ -158,7 +157,7 @@ export default { timestamp: m[1], level: m[2], summary: m[3], - message: m[3], + message: this.escapeText(m[3]), sequence: logs.length, expanded: false }); @@ -166,9 +165,23 @@ export default { // If a line does not look like a log entry, append it to the last // log entry (i.e. allow multi-line messages) let entry = logs[logs.length - 1]; - entry.message += "\n" + line; - if (entry.message.startsWith("Traceback")) { - entry.summary = line; // For tracebacks, the last line is the best summary + m = line.match(/^( *)(\^+)/); // detect python stack trace "underlines" + if (m) { + let linestart = entry.message.lastIndexOf('\n') + 1; + let ustart = linestart + m[1].length; + let uend = ustart + m[2].length; + entry.message = ( + entry.message.substring(0, ustart) + + "" + + entry.message.substring(ustart, uend) + + "" + + entry.message.substring(uend) + ); + } else { + entry.message += "\n" + this.escapeText(line); + if (entry.message.startsWith("Traceback")) { + entry.summary = line; // For tracebacks, the last line is the best summary + } } } else { // if there's no existing log message to append to, discard lines @@ -186,6 +199,11 @@ export default { isoDateTimeString = isoDateTimeString.replace(",", "."); let date = new Date(isoDateTimeString); return date.toLocaleDateString() + " " + date.toLocaleTimeString(); + }, + escapeText: function(unsafeText) { + let div = document.createElement('div'); + div.innerText = unsafeText; + return div.innerHTML; } } };