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 <u> tags.

This necessitated escaping messages and displaying raw HTML
which is now done by `escapeText`.
This commit is contained in:
Richard Bowman 2024-01-08 15:51:46 +00:00
parent 4bf473fad7
commit 4f1035cbe6

View file

@ -60,8 +60,7 @@
> >
More info... More info...
</a> </a>
<div v-if="item.expanded" class="logging-message"> <div v-if="item.expanded" v-html="item.message" class="logging-message">
{{ item.message }}
</div> </div>
</div> </div>
</div> </div>
@ -158,7 +157,7 @@ export default {
timestamp: m[1], timestamp: m[1],
level: m[2], level: m[2],
summary: m[3], summary: m[3],
message: m[3], message: this.escapeText(m[3]),
sequence: logs.length, sequence: logs.length,
expanded: false expanded: false
}); });
@ -166,9 +165,23 @@ export default {
// If a line does not look like a log entry, append it to the last // If a line does not look like a log entry, append it to the last
// log entry (i.e. allow multi-line messages) // log entry (i.e. allow multi-line messages)
let entry = logs[logs.length - 1]; let entry = logs[logs.length - 1];
entry.message += "\n" + line; m = line.match(/^( *)(\^+)/); // detect python stack trace "underlines"
if (entry.message.startsWith("Traceback")) { if (m) {
entry.summary = line; // For tracebacks, the last line is the best summary 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)
+ "<u>"
+ entry.message.substring(ustart, uend)
+ "</u>"
+ 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 { } else {
// if there's no existing log message to append to, discard lines // if there's no existing log message to append to, discard lines
@ -186,6 +199,11 @@ export default {
isoDateTimeString = isoDateTimeString.replace(",", "."); isoDateTimeString = isoDateTimeString.replace(",", ".");
let date = new Date(isoDateTimeString); let date = new Date(isoDateTimeString);
return date.toLocaleDateString() + " " + date.toLocaleTimeString(); return date.toLocaleDateString() + " " + date.toLocaleTimeString();
},
escapeText: function(unsafeText) {
let div = document.createElement('div');
div.innerText = unsafeText;
return div.innerHTML;
} }
} }
}; };