From 6afac1d3f7f671b321faf85e75d9509d93b4a04c Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Mon, 6 Nov 2023 09:43:57 -0800 Subject: [PATCH] fix stack trace linking --- .../notebook-renderers/src/stackTraceHelper.ts | 4 ++-- .../src/test/stackTraceHelper.test.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/extensions/notebook-renderers/src/stackTraceHelper.ts b/extensions/notebook-renderers/src/stackTraceHelper.ts index e72c3b8a88c..3ac30abaf6b 100644 --- a/extensions/notebook-renderers/src/stackTraceHelper.ts +++ b/extensions/notebook-renderers/src/stackTraceHelper.ts @@ -31,7 +31,7 @@ export function formatStackTrace(stack: string) { const formatSequence = /\u001b\[.+?m/g; const fileRegex = /File\s+(?:\u001b\[.+?m)?(.+):(\d+)/; -const lineNumberRegex = /((?:\u001b\[.+?m)?[ ->]*?)(\d+)(.*)/; +const lineNumberRegex = /^((?:\u001b\[.+?m)?[ ->]*?)(\d+)(.*)/; const cellRegex = /(?Cell\s+(?:\u001b\[.+?m)?In\s*\[(?\d+)\],\s*)(?line (?\d+)).*/; // older versions of IPython ~8.3.0 const inputRegex = /(?Input\s+?(?:\u001b\[.+?m)(?In\s*\[(?\d+)\]))(?.*)/; @@ -41,7 +41,7 @@ function isIpythonStackTrace(stack: string) { } function stripFormatting(text: string) { - return text.replace(formatSequence, ''); + return text.replace(formatSequence, '').trim(); } type cellLocation = { kind: 'cell'; path: string }; diff --git a/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts b/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts index e65efe3ee29..da7f9d0e2e4 100644 --- a/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts +++ b/extensions/notebook-renderers/src/test/stackTraceHelper.test.ts @@ -88,4 +88,16 @@ suite('StackTraceHelper', () => { assert.ok(!/\d<\/a>/.test(formatted), formatted); }); + test('IPython stack without line numbers are not linkified', () => { + const stack = + '\u001b[1;36m Cell \u001b[1;32mIn[6], line 1\u001b[1;36m\u001b[0m\n' + + '\u001b[1;33m print(\u001b[0m\n' + + '\u001b[1;37m ^\u001b[0m\n' + + '\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m incomplete input\n'; + + const formattedLines = formatStackTrace(stack).split('\n'); + assert.ok(/ assert.ok(!//.test(line), 'line should not contain a link: ' + line)); + }); + });