From 7aa87de5f784dc0ba61e03209ae47930884c5bdf Mon Sep 17 00:00:00 2001 From: donteatfriedrice Date: Mon, 14 Apr 2025 08:28:42 +0000 Subject: [PATCH] fix(editor): markdown code preprocessor should handle link correctly (#11671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close [BS-3117](https://linear.app/affine-design/issue/BS-3117/代码粘贴后出现多余的-和-符号) --- .../__tests__/adapters/markdown.unit.spec.ts | 51 +++++++++++++++++++ .../src/adapters/markdown/preprocessor.ts | 12 ++--- .../blocksuite/clipboard/clipboard.spec.ts | 22 ++++++++ 3 files changed, 77 insertions(+), 8 deletions(-) diff --git a/blocksuite/affine/all/src/__tests__/adapters/markdown.unit.spec.ts b/blocksuite/affine/all/src/__tests__/adapters/markdown.unit.spec.ts index b815765d5..b6a4a36fe 100644 --- a/blocksuite/affine/all/src/__tests__/adapters/markdown.unit.spec.ts +++ b/blocksuite/affine/all/src/__tests__/adapters/markdown.unit.spec.ts @@ -4091,4 +4091,55 @@ hhh }); expect(nanoidReplacement(rawBlockSnapshot)).toEqual(blockSnapshot); }); + + test('should not wrap url with angle brackets if it is not a url', async () => { + const markdown = 'prompt: How many people will live in the world in 2040?'; + const sliceSnapshot: SliceSnapshot = { + type: 'slice', + content: [ + { + type: 'block', + id: 'matchesReplaceMap[0]', + flavour: 'affine:note', + props: { + xywh: '[0,0,800,95]', + background: DefaultTheme.noteBackgrounColor, + index: 'a0', + hidden: false, + displayMode: NoteDisplayMode.DocAndEdgeless, + }, + children: [ + { + type: 'block', + id: 'matchesReplaceMap[1]', + flavour: 'affine:paragraph', + props: { + type: 'text', + text: { + '$blocksuite:internal:text$': true, + delta: [ + { + insert: + 'prompt: How many people will live in the world in 2040?', + }, + ], + }, + }, + children: [], + }, + ], + }, + ], + workspaceId: '', + pageId: '', + }; + + const mdAdapter = new MarkdownAdapter(createJob(), provider); + const rawSliceSnapshot = await mdAdapter.toSliceSnapshot({ + file: markdown, + workspaceId: '', + pageId: '', + }); + expect(nanoidReplacement(rawSliceSnapshot!)).toEqual(sliceSnapshot); + }); }); diff --git a/blocksuite/affine/blocks/code/src/adapters/markdown/preprocessor.ts b/blocksuite/affine/blocks/code/src/adapters/markdown/preprocessor.ts index b5851a776..ae2496105 100644 --- a/blocksuite/affine/blocks/code/src/adapters/markdown/preprocessor.ts +++ b/blocksuite/affine/blocks/code/src/adapters/markdown/preprocessor.ts @@ -2,6 +2,7 @@ import { type MarkdownAdapterPreprocessor, MarkdownPreprocessorExtension, } from '@blocksuite/affine-shared/adapters'; +import { isValidUrl } from '@blocksuite/affine-shared/utils'; const codePreprocessor: MarkdownAdapterPreprocessor = { name: 'code', @@ -53,14 +54,9 @@ const codePreprocessor: MarkdownAdapterPreprocessor = { // // eg. /MuawcBMT1Mzvoar09-_66?mode=page&blockIds=rL2_GXbtLU2SsJVfCSmh_ // https://www.markdownguide.org/basic-syntax/#urls-and-email-addresses - try { - const valid = - URL.canParse?.(trimmedLine) ?? Boolean(new URL(trimmedLine)); - if (valid) { - return `<${trimmedLine}>`; - } - } catch (err) { - console.log(err); + const valid = isValidUrl(trimmedLine); + if (valid) { + return `<${trimmedLine}>`; } } diff --git a/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts b/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts index d04f9186e..b8fa073e9 100644 --- a/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts +++ b/tests/affine-local/e2e/blocksuite/clipboard/clipboard.spec.ts @@ -375,4 +375,26 @@ test.describe('paste to code block', () => { // Verify the pasted code maintains indentation await verifyCodeBlockContent(page, 0, textWithHtmlTags); }); + + test('should not wrap line in brackets when pasting code', async ({ + page, + }) => { + await pressEnter(page); + await addCodeBlock(page); + const plainTextCode = [ + ' model: anthropic("claude-3-7-sonnet-20250219"),', + ' prompt: How many people will live in the world in 2040?', + ' providerOptions: {', + ' anthropic: {', + ' thinking: { type: enabled, budgetTokens: 12000 },', + ' } satisfies AnthropicProviderOptions,', + ' },', + ].join('\n'); + + await pasteContent(page, { 'text/plain': plainTextCode }); + await page.waitForTimeout(100); + + // Verify the pasted code maintains indentation + await verifyCodeBlockContent(page, 0, plainTextCode); + }); });