mirror of
https://github.com/discourse/discourse.git
synced 2025-05-30 07:11:34 +08:00
FIX: improve regex used for image sizing controls (#8291)
This commit is contained in:
@ -836,7 +836,11 @@ export default Component.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const replacement = match.replace(imageScaleRegex, `$1,${scale}%$3`);
|
const replacement = match.replace(
|
||||||
|
imageScaleRegex,
|
||||||
|
``
|
||||||
|
);
|
||||||
|
|
||||||
this.appEvents.trigger(
|
this.appEvents.trigger(
|
||||||
"composer:replace-text",
|
"composer:replace-text",
|
||||||
matchingPlaceholder[index],
|
matchingPlaceholder[index],
|
||||||
@ -851,11 +855,18 @@ export default Component.extend({
|
|||||||
// regex matches only upload placeholders with size defined,
|
// regex matches only upload placeholders with size defined,
|
||||||
// which is required for resizing
|
// which is required for resizing
|
||||||
|
|
||||||
// original string ``
|
// original string ``
|
||||||
// match 1 ``
|
// group 3 `, 50%`
|
||||||
const imageScaleRegex = /(!\[(?:\S*?(?=\|)\|)*?(?:\d{1,6}x\d{1,6})+?)(?:,?(\d{1,3})?%?)?(\]\(upload:\/\/\S*?\))/g;
|
// group 4 'upload://1TjaobgKObzpU7xRMw2HuUc87vO.png'
|
||||||
|
// group 4 'upload://1TjaobgKObzpU7xRMw2HuUc87vO.png "image title"'
|
||||||
|
|
||||||
|
// Notes:
|
||||||
|
// Group 3 is optional. group 4 can match images with or without a markdown title.
|
||||||
|
// All matches are whitespace tolerant as long it's still valid markdown
|
||||||
|
|
||||||
|
const imageScaleRegex = /!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?\]\((upload:\/\/.*?)\)/g;
|
||||||
|
|
||||||
// wraps previewed upload markdown in a codeblock in its own class to keep a track
|
// wraps previewed upload markdown in a codeblock in its own class to keep a track
|
||||||
// of indexes later on to replace the correct upload placeholder in the composer
|
// of indexes later on to replace the correct upload placeholder in the composer
|
||||||
|
@ -721,49 +721,68 @@ QUnit.test("Image resizing buttons", async assert => {
|
|||||||
await click("#create-topic");
|
await click("#create-topic");
|
||||||
|
|
||||||
let uploads = [
|
let uploads = [
|
||||||
|
// 0 Default markdown with dimensions- should work
|
||||||
"",
|
"",
|
||||||
"[img]http://example.com/image.jpg[/img]",
|
// 1 Image with scaling percentage, should work
|
||||||
"",
|
"",
|
||||||
"",
|
// 2 image with scaling percentage and a proceeding whitespace, should work
|
||||||
|
"",
|
||||||
|
// 3 No dimensions, should not work
|
||||||
|
"",
|
||||||
|
// 4 Wrapped in backquetes should not work
|
||||||
"``",
|
"``",
|
||||||
"",
|
// 5 html image - should not work
|
||||||
"<img src='http://someimage.jpg' wight='20' height='20'>",
|
"<img src='http://someimage.jpg' wight='20' height='20'>",
|
||||||
|
// 6 two images one the same line, but both are syntactically correct - both should work
|
||||||
" ",
|
" ",
|
||||||
|
// 7 & 8 Identical images - both should work
|
||||||
"",
|
"",
|
||||||
""
|
"",
|
||||||
|
// 9 Image with whitespaces in alt - should work
|
||||||
|
"",
|
||||||
|
// 10 Image with markdown title - should work
|
||||||
|
``,
|
||||||
|
// 11 bbcode - should not work
|
||||||
|
"[img]http://example.com/image.jpg[/img]"
|
||||||
];
|
];
|
||||||
|
|
||||||
await fillIn(".d-editor-input", uploads.join("\n"));
|
await fillIn(".d-editor-input", uploads.join("\n"));
|
||||||
|
|
||||||
assert.ok(
|
assert.ok(
|
||||||
find(".button-wrapper").length === 6,
|
find(".button-wrapper").length === 9,
|
||||||
"it adds correct amount of scaling button groups"
|
"it adds correct amount of scaling button groups"
|
||||||
);
|
);
|
||||||
|
|
||||||
uploads[0] = "";
|
// Default
|
||||||
|
uploads[0] = "";
|
||||||
await click(find(".button-wrapper .scale-btn[data-scale='50']")[0]);
|
await click(find(".button-wrapper .scale-btn[data-scale='50']")[0]);
|
||||||
assertImageResized(assert, uploads);
|
assertImageResized(assert, uploads);
|
||||||
|
|
||||||
uploads[2] = "";
|
// Targets the correct image if two on the same line
|
||||||
await click(find(".button-wrapper .scale-btn[data-scale='75']")[1]);
|
uploads[6] =
|
||||||
|
" ";
|
||||||
|
await click(find(".button-wrapper .scale-btn[data-scale='50']")[3]);
|
||||||
assertImageResized(assert, uploads);
|
assertImageResized(assert, uploads);
|
||||||
|
|
||||||
uploads[7] =
|
// Try the other image on the same line
|
||||||
" ";
|
uploads[6] =
|
||||||
await click(find(".button-wrapper .scale-btn[data-scale='50']")[2]);
|
" ";
|
||||||
|
await click(find(".button-wrapper .scale-btn[data-scale='75']")[4]);
|
||||||
assertImageResized(assert, uploads);
|
assertImageResized(assert, uploads);
|
||||||
|
|
||||||
uploads[7] =
|
// Make sure we target the correct image if there are duplicates
|
||||||
" ";
|
uploads[7] = "";
|
||||||
await click(find(".button-wrapper .scale-btn[data-scale='75']")[3]);
|
await click(find(".button-wrapper .scale-btn[data-scale='50']")[5]);
|
||||||
assertImageResized(assert, uploads);
|
assertImageResized(assert, uploads);
|
||||||
|
|
||||||
uploads[8] = "";
|
// Try the other dupe
|
||||||
await click(find(".button-wrapper .scale-btn[data-scale='50']")[4]);
|
uploads[8] = "";
|
||||||
|
await click(find(".button-wrapper .scale-btn[data-scale='75']")[6]);
|
||||||
assertImageResized(assert, uploads);
|
assertImageResized(assert, uploads);
|
||||||
|
|
||||||
uploads[9] = "";
|
// Don't mess with image titles
|
||||||
await click(find(".button-wrapper .scale-btn[data-scale='75']")[5]);
|
uploads[10] = ``;
|
||||||
|
await click(find(".button-wrapper .scale-btn[data-scale='75']")[8]);
|
||||||
assertImageResized(assert, uploads);
|
assertImageResized(assert, uploads);
|
||||||
|
|
||||||
await fillIn(
|
await fillIn(
|
||||||
|
Reference in New Issue
Block a user