MM-53006 : Using the "link" button puts the URL after [url] instead of replacing [url] when pasting (#23784)

Этот коммит содержится в:
M-ZubairAhmed
2023-06-26 17:47:04 +05:30
коммит произвёл GitHub
родитель 887ba95cc1
Коммит a5867074e5
3 изменённых файлов: 64 добавлений и 17 удалений

Просмотреть файл

@@ -401,7 +401,9 @@ function applyBoldItalicMarkdown({selectionEnd, selectionStart, message, markdow
};
}
export function applyLinkMarkdown({selectionEnd, selectionStart, message, url = 'url'}: ApplyLinkMarkdownOptions) {
export const DEFAULT_PLACEHOLDER_URL = 'url';
export function applyLinkMarkdown({selectionEnd, selectionStart, message, url = DEFAULT_PLACEHOLDER_URL}: ApplyLinkMarkdownOptions) {
// <prefix> <selection> <suffix>
const prefix = message.slice(0, selectionStart);
const selection = message.slice(selectionStart, selectionEnd);

Просмотреть файл

@@ -170,6 +170,33 @@ describe('formatMarkdownLinkMessage', () => {
const formatttedMarkdownLinkMessage = formatMarkdownLinkMessage({selectionStart: 0, selectionEnd: 4, message, clipboardData});
expect(formatttedMarkdownLinkMessage).toEqual('[test](https://example.com/)');
});
test('Should not add link when pasting inside of a formatted markdown link', () => {
const message = '[test](url)';
const formatttedMarkdownLinkMessage = formatMarkdownLinkMessage({selectionStart: 7, selectionEnd: 10, message, clipboardData});
expect(formatttedMarkdownLinkMessage).toEqual('https://example.com/');
});
test('Should add link when pasting inside of an improper formatted markdown link', () => {
const improperFormattedLinkMessages = [
{message: '[test](url)', selection: 'ur', expected: '[ur](https://example.com/)'},
{message: '[test](url)', selection: '(url', expected: '[(url](https://example.com/)'},
{message: '[test](url)', selection: 'url)', expected: '[url)](https://example.com/)'},
{message: '[test](url)', selection: '(url)', expected: '[(url)](https://example.com/)'},
{message: '[test](url)', selection: '[test](url', expected: '[[test](url](https://example.com/)'},
{message: '[test](url)', selection: 'test](url', expected: '[test](url](https://example.com/)'},
{message: '[test](url)', selection: 'test](url)', expected: '[test](url)](https://example.com/)'},
{message: '[test](url)', selection: '[test](url)', expected: '[[test](url)](https://example.com/)'},
];
for (const {message, selection, expected} of improperFormattedLinkMessages) {
const selectionStart = message.indexOf(selection);
const selectionEnd = selectionStart + selection.length;
const formatttedMarkdownLinkMessage = formatMarkdownLinkMessage({selectionStart, selectionEnd, message, clipboardData});
expect(formatttedMarkdownLinkMessage).toEqual(expected);
}
});
});
describe('isTextUrl', () => {

Просмотреть файл

@@ -3,13 +3,7 @@
import turndownService from 'utils/turndown';
import {splitMessageBasedOnCaretPosition, splitMessageBasedOnTextSelection} from 'utils/post_utils';
type FormatMarkdownParams = {
message: string;
clipboardData: DataTransfer;
selectionStart: number | null;
selectionEnd: number | null;
};
import {DEFAULT_PLACEHOLDER_URL} from 'utils/markdown/apply_markdown';
export function parseHtmlTable(html: string): HTMLTableElement | null {
return new DOMParser().parseFromString(html, 'text/html').querySelector('table');
@@ -83,6 +77,13 @@ export function formatMarkdownMessage(clipboardData: DataTransfer, message?: str
return {formattedMessage, formattedMarkdown};
}
type FormatGithubCodePasteParams = {
message: string;
clipboardData: DataTransfer;
selectionStart: number | null;
selectionEnd: number | null;
};
/**
* Format the incoming github code paste into a markdown code block.
* This function assumes that the clipboardData contains a code block.
@@ -90,7 +91,7 @@ export function formatMarkdownMessage(clipboardData: DataTransfer, message?: str
* @property {string} formattedMessage - The complete formatted message including the code block.
* @property {string} formattedCodeBlock - The resulting code block from the clipboard data.
*/
export function formatGithubCodePaste({message, clipboardData, selectionStart, selectionEnd}: FormatMarkdownParams): {formattedMessage: string; formattedCodeBlock: string} {
export function formatGithubCodePaste({message, clipboardData, selectionStart, selectionEnd}: FormatGithubCodePasteParams): {formattedMessage: string; formattedCodeBlock: string} {
const isTextSelected = selectionStart !== selectionEnd;
const {firstPiece, lastPiece} = isTextSelected ? splitMessageBasedOnTextSelection(selectionStart ?? message.length, selectionEnd ?? message.length, message) : splitMessageBasedOnCaretPosition(selectionStart ?? message.length, message);
@@ -104,21 +105,38 @@ export function formatGithubCodePaste({message, clipboardData, selectionStart, s
return {formattedMessage, formattedCodeBlock};
}
type FormatMarkdownLinkMessage = {
message: string;
clipboardData: DataTransfer;
selectionStart: number;
selectionEnd: number;
};
/**
* Formats the incoming link paste into a markdown link.
* This function assumes that the clipboardData contains a link.
* @returns The resulting markdown link from the clipboard data.
*/
export function formatMarkdownLinkMessage({message, clipboardData, selectionStart, selectionEnd}: FormatMarkdownParams) {
const isTextSelected = selectionStart !== selectionEnd;
export function formatMarkdownLinkMessage({message, clipboardData, selectionStart, selectionEnd}: FormatMarkdownLinkMessage) {
const selectedText = message.slice(selectionStart, selectionEnd);
const clipboardUrl = clipboardData.getData('text/plain');
let selectedText = '';
if (isTextSelected) {
selectedText = message.slice(selectionStart || 0, selectionEnd || 0);
if (selectedText === DEFAULT_PLACEHOLDER_URL) {
if (message.length > DEFAULT_PLACEHOLDER_URL.length) {
const FORMATTED_LINK_URL_PREFIX = '](';
const FORMATTED_LINK_URL_SUFFIX = ')';
const textBefore = message.slice(selectionStart - FORMATTED_LINK_URL_PREFIX.length, selectionStart);
const textAfter = message.slice(selectionEnd, selectionEnd + FORMATTED_LINK_URL_SUFFIX.length);
// We check "](" "url" ")" to see if user is trying to paste inside of a markdown link
// and selection is on "url"
if (textBefore === FORMATTED_LINK_URL_PREFIX && textAfter === FORMATTED_LINK_URL_SUFFIX) {
return clipboardUrl;
}
}
}
const url = clipboardData.getData('text/plain');
const markdownLink = `[${selectedText}](${url})`;
const markdownLink = `[${selectedText}](${clipboardUrl})`;
return markdownLink;
}