mirror of
https://github.com/go-gitea/gitea.git
synced 2025-06-20 13:32:50 +00:00
fix: prevent double markdown link brackets when pasting URL (#34745)
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: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
parent
4cbb482554
commit
037f72bdb3
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user