From d3f7b3b5f9db3512ac96ddbd8a02bfbda38547f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Sat, 6 Apr 2024 17:17:19 +0200 Subject: [PATCH] FIX: checklist weren't working if there was an image URL When clicking a "checklist", we're parsing the raw to change the state of the checklist that was clicked. If there was an image URL with an empty alternative text in the raw "![](https://example.com/image.jpg)" it would consider the "[]" as an empty checklist item. Internal - t/124499 --- .../javascripts/discourse/initializers/checklist.js | 8 +++++++- .../javascripts/lib/discourse-markdown/checklist.js | 2 +- .../test/javascripts/lib/checklist-test.js | 13 +++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/plugins/checklist/assets/javascripts/discourse/initializers/checklist.js b/plugins/checklist/assets/javascripts/discourse/initializers/checklist.js index a9dc891ae0d..0cd9431c29b 100644 --- a/plugins/checklist/assets/javascripts/discourse/initializers/checklist.js +++ b/plugins/checklist/assets/javascripts/discourse/initializers/checklist.js @@ -124,13 +124,19 @@ export function checklistSyntax(elem, postDecorator) { // make the first run go to index = 0 let nth = -1; let found = false; + const newRaw = post.raw.replace( - /\[(\s|\_|\-|\x|\\?\*)?\]/gi, + /\[( |x)?\]/gi, (match, ignored, off) => { if (found) { return match; } + // skip empty image URLs - "![](https://example.com/image.jpg)" + if (off > 0 && post.raw[off - 1] === "!") { + return match; + } + nth += blocks.every( (b) => b[0] >= off + match.length || off > b[1] ); diff --git a/plugins/checklist/assets/javascripts/lib/discourse-markdown/checklist.js b/plugins/checklist/assets/javascripts/lib/discourse-markdown/checklist.js index 8009f2b3019..1e4407ffe47 100644 --- a/plugins/checklist/assets/javascripts/lib/discourse-markdown/checklist.js +++ b/plugins/checklist/assets/javascripts/lib/discourse-markdown/checklist.js @@ -1,4 +1,4 @@ -const REGEX = /\[(\s?|x|X)\]/g; +const REGEX = /\[( |x)?\]/gi; function getClasses(str) { switch (str) { diff --git a/plugins/checklist/test/javascripts/lib/checklist-test.js b/plugins/checklist/test/javascripts/lib/checklist-test.js index 959c67ffaa6..e4785969e73 100644 --- a/plugins/checklist/test/javascripts/lib/checklist-test.js +++ b/plugins/checklist/test/javascripts/lib/checklist-test.js @@ -38,6 +38,19 @@ acceptance("discourse-checklist | checklist", function (needs) { ]); }); + test("does not check an image URL", async function (assert) { + const [$elem, updated] = await prepare(` +![](upload://zLd8FtsWc2ZSg3cZKIhwvhYxTcn.jpg) +[] first +[] second + `); + + $elem.find(".chcklst-box")[0].click(); + + const output = await updated; + assert.ok(output.includes("[x] first")); + }); + test("make checkboxes readonly while updating", async function (assert) { const [$elem, updated] = await prepare(` [ ] first