mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 12:33:19 +00:00 
			
		
		
		
	Backport #34745 by MaxWebZ When adding a link using the "Add a link" button in comment editor, pasting a URL resulted in incorrect Markdown formatting (double brackets) instead of replacing the placeholder text. This fix adds a context check to prevent creating a new markdown link when we're already inside an existing one. Fixes #34740 Co-authored-by: MaxWebZ <5054326@gmail.com> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -1,4 +1,4 @@ | |||||||
| import {removeAttachmentLinksFromMarkdown} from './EditorUpload.ts'; | import {pasteAsMarkdownLink, removeAttachmentLinksFromMarkdown} from './EditorUpload.ts'; | ||||||
|  |  | ||||||
| test('removeAttachmentLinksFromMarkdown', () => { | test('removeAttachmentLinksFromMarkdown', () => { | ||||||
|   expect(removeAttachmentLinksFromMarkdown('a foo b', 'foo')).toBe('a foo b'); |   expect(removeAttachmentLinksFromMarkdown('a foo b', 'foo')).toBe('a foo b'); | ||||||
| @@ -12,3 +12,13 @@ test('removeAttachmentLinksFromMarkdown', () => { | |||||||
|   expect(removeAttachmentLinksFromMarkdown('a <img src="/attachments/foo"> b', 'foo')).toBe('a  b'); |   expect(removeAttachmentLinksFromMarkdown('a <img src="/attachments/foo"> b', 'foo')).toBe('a  b'); | ||||||
|   expect(removeAttachmentLinksFromMarkdown('a <img src="/attachments/foo" width="100"/> b', 'foo')).toBe('a  b'); |   expect(removeAttachmentLinksFromMarkdown('a <img src="/attachments/foo" width="100"/> b', 'foo')).toBe('a  b'); | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | test('preparePasteAsMarkdownLink', () => { | ||||||
|  |   expect(pasteAsMarkdownLink({value: 'foo', selectionStart: 0, selectionEnd: 0}, 'bar')).toBeNull(); | ||||||
|  |   expect(pasteAsMarkdownLink({value: 'foo', selectionStart: 0, selectionEnd: 0}, 'https://gitea.com')).toBeNull(); | ||||||
|  |   expect(pasteAsMarkdownLink({value: 'foo', selectionStart: 0, selectionEnd: 3}, 'bar')).toBeNull(); | ||||||
|  |   expect(pasteAsMarkdownLink({value: 'foo', selectionStart: 0, selectionEnd: 3}, 'https://gitea.com')).toBe('[foo](https://gitea.com)'); | ||||||
|  |   expect(pasteAsMarkdownLink({value: '..(url)', selectionStart: 3, selectionEnd: 6}, 'https://gitea.com')).toBe('[url](https://gitea.com)'); | ||||||
|  |   expect(pasteAsMarkdownLink({value: '[](url)', selectionStart: 3, selectionEnd: 6}, 'https://gitea.com')).toBeNull(); | ||||||
|  |   expect(pasteAsMarkdownLink({value: 'https://example.com', selectionStart: 0, selectionEnd: 19}, 'https://gitea.com')).toBeNull(); | ||||||
|  | }); | ||||||
|   | |||||||
| @@ -118,17 +118,26 @@ export function removeAttachmentLinksFromMarkdown(text: string, fileUuid: string | |||||||
|   return text; |   return text; | ||||||
| } | } | ||||||
|  |  | ||||||
| function handleClipboardText(textarea: HTMLTextAreaElement, e: ClipboardEvent, text: string, isShiftDown: boolean) { | export function pasteAsMarkdownLink(textarea: {value: string, selectionStart: number, selectionEnd: number}, pastedText: string): string | null { | ||||||
|  |   const {value, selectionStart, selectionEnd} = textarea; | ||||||
|  |   const selectedText = value.substring(selectionStart, selectionEnd); | ||||||
|  |   const trimmedText = pastedText.trim(); | ||||||
|  |   const beforeSelection = value.substring(0, selectionStart); | ||||||
|  |   const afterSelection = value.substring(selectionEnd); | ||||||
|  |   const isInMarkdownLink = beforeSelection.endsWith('](') && afterSelection.startsWith(')'); | ||||||
|  |   const asMarkdownLink = selectedText && isUrl(trimmedText) && !isUrl(selectedText) && !isInMarkdownLink; | ||||||
|  |   return asMarkdownLink ? `[${selectedText}](${trimmedText})` : null; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function handleClipboardText(textarea: HTMLTextAreaElement, e: ClipboardEvent, pastedText: string, isShiftDown: boolean) { | ||||||
|   // pasting with "shift" means "paste as original content" in most applications |   // pasting with "shift" means "paste as original content" in most applications | ||||||
|   if (isShiftDown) return; // let the browser handle it |   if (isShiftDown) return; // let the browser handle it | ||||||
|  |  | ||||||
|   // when pasting links over selected text, turn it into [text](link) |   // when pasting links over selected text, turn it into [text](link) | ||||||
|   const {value, selectionStart, selectionEnd} = textarea; |   const pastedAsMarkdown = pasteAsMarkdownLink(textarea, pastedText); | ||||||
|   const selectedText = value.substring(selectionStart, selectionEnd); |   if (pastedText) { | ||||||
|   const trimmedText = text.trim(); |  | ||||||
|   if (selectedText && isUrl(trimmedText) && !isUrl(selectedText)) { |  | ||||||
|     e.preventDefault(); |     e.preventDefault(); | ||||||
|     replaceTextareaSelection(textarea, `[${selectedText}](${trimmedText})`); |     replaceTextareaSelection(textarea, pastedAsMarkdown); | ||||||
|   } |   } | ||||||
|   // else, let the browser handle it |   // else, let the browser handle it | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user