diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 8f0df7d2e..124834625 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -236,6 +236,8 @@ export class DeepnoteDataConverter { for (const item of output.items) { if (item.mime === 'text/plain') { data['text/plain'] = new TextDecoder().decode(item.data); + } else if (item.mime === 'text/markdown') { + data['text/markdown'] = new TextDecoder().decode(item.data); } else if (item.mime === 'text/html') { data['text/html'] = new TextDecoder().decode(item.data); } else if (item.mime === 'application/json') { @@ -392,6 +394,10 @@ export class DeepnoteDataConverter { ); } + if (data['text/markdown']) { + items.push(NotebookCellOutputItem.text(data['text/markdown'] as string, 'text/markdown')); + } + if (data['text/plain']) { let mimeType = 'text/plain'; // deepnote-toolkit returns the text/plain mime type for big number outputs diff --git a/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts b/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts index 2c0efc065..168f153c6 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts @@ -473,6 +473,46 @@ suite('DeepnoteDataConverter', () => { const outputData = JSON.parse(new TextDecoder().decode(outputs[0].items[0].data)); assert.deepStrictEqual(outputData, sqlMetadata); }); + + test('converts text/markdown output', () => { + const markdownContent = '## Result\n\nThis is **formatted** output.'; + + const deepnoteOutputs: DeepnoteOutput[] = [ + { + output_type: 'execute_result', + execution_count: 1, + data: { + 'text/markdown': markdownContent, + 'text/plain': 'Result\n\nThis is formatted output.' + } + } + ]; + + const blocks: DeepnoteBlock[] = [ + { + blockGroup: 'test-group', + id: 'block1', + type: 'code', + content: 'display_markdown()', + sortingKey: 'a0', + outputs: deepnoteOutputs + } + ]; + + const cells = converter.convertBlocksToCells(blocks); + const outputs = cells[0].outputs!; + + assert.strictEqual(outputs.length, 1); + assert.strictEqual(outputs[0].items.length, 2); + + const markdownItem = outputs[0].items.find((item) => item.mime === 'text/markdown'); + const plainItem = outputs[0].items.find((item) => item.mime === 'text/plain'); + + assert.ok(markdownItem, 'Should have text/markdown item'); + assert.ok(plainItem, 'Should have text/plain item'); + assert.strictEqual(new TextDecoder().decode(markdownItem!.data), markdownContent); + assert.strictEqual(new TextDecoder().decode(plainItem!.data), 'Result\n\nThis is formatted output.'); + }); }); suite('round trip conversion', () => {