From d1cdac0e7099e5525a9d0fb108ab9addca93c9f4 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Thu, 11 Apr 2024 00:13:58 +0200 Subject: [PATCH] FIX: only allows kbd and not details --- plugins/chat/app/models/chat/message.rb | 1 - .../lib/discourse-markdown/chat-html-block.js | 114 ------------------ .../spec/lib/chat/chat_pretty_text_spec.rb | 14 +++ ..._text_spec.rb => core_pretty_text_spec.rb} | 24 ---- 4 files changed, 14 insertions(+), 139 deletions(-) delete mode 100644 plugins/chat/assets/javascripts/lib/discourse-markdown/chat-html-block.js create mode 100644 plugins/chat/spec/lib/chat/chat_pretty_text_spec.rb rename plugins/chat/spec/lib/chat/{pretty_text_spec.rb => core_pretty_text_spec.rb} (87%) diff --git a/plugins/chat/app/models/chat/message.rb b/plugins/chat/app/models/chat/message.rb index 87412b296d7..a236ffa2f7d 100644 --- a/plugins/chat/app/models/chat/message.rb +++ b/plugins/chat/app/models/chat/message.rb @@ -201,7 +201,6 @@ module Chat upload-protocol watched-words chat-html-inline - chat-html-block ] MARKDOWN_IT_RULES = %w[ diff --git a/plugins/chat/assets/javascripts/lib/discourse-markdown/chat-html-block.js b/plugins/chat/assets/javascripts/lib/discourse-markdown/chat-html-block.js deleted file mode 100644 index a450046e71d..00000000000 --- a/plugins/chat/assets/javascripts/lib/discourse-markdown/chat-html-block.js +++ /dev/null @@ -1,114 +0,0 @@ -// inspired from https://github.com/markdown-it/markdown-it/blob/master/lib/rules_block/html_block.mjs -// note that allow lister will run on top of it, so if a tag is allowed here but not on -// the allow list, then it won't show up - -const block_names = ["details"]; - -const attr_name = "[a-zA-Z_:][a-zA-Z0-9:._-]*"; -const unquoted = "[^\"'=<>`\\x00-\\x20]+"; -const single_quoted = "'[^']*'"; -const double_quoted = '"[^"]*"'; -const attr_value = - "(?:" + unquoted + "|" + single_quoted + "|" + double_quoted + ")"; -const attribute = "(?:\\s+" + attr_name + "(?:\\s*=\\s*" + attr_value + ")?)"; -const open_tag = "<[A-Za-z][A-Za-z0-9\\-]*" + attribute + "*\\s*\\/?>"; -const close_tag = "<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>"; - -const HTML_OPEN_CLOSE_TAG_RE = new RegExp( - "^(?:" + open_tag + "|" + close_tag + ")" -); - -// An array of opening and corresponding closing sequences for html tags, -// last argument defines whether it can terminate a paragraph or not -// -const HTML_SEQUENCES = [ - [ - /^<(script|pre|style|textarea)(?=(\s|>|$))/i, - /<\/(script|pre|style|textarea)>/i, - true, - ], - [/^/, true], - [/^<\?/, /\?>/, true], - [/^/, true], - [/^/, true], - [ - new RegExp("^|$))", "i"), - /^$/, - true, - ], - [new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + "\\s*$"), /^$/, false], -]; - -function chatHtmlBlock(state, startLine, endLine, silent) { - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; - } - - if (!state.md.options.html) { - return false; - } - - if (state.src.charCodeAt(pos) !== 0x3c /* < */) { - return false; - } - - let lineText = state.src.slice(pos, max); - - let i = 0; - for (; i < HTML_SEQUENCES.length; i++) { - if (HTML_SEQUENCES[i][0].test(lineText)) { - break; - } - } - if (i === HTML_SEQUENCES.length) { - return false; - } - - if (silent) { - // true if this sequence can be a terminator, false otherwise - return HTML_SEQUENCES[i][2]; - } - - let nextLine = startLine + 1; - - // If we are here - we detected HTML block. - // Let's roll down till block end. - if (!HTML_SEQUENCES[i][1].test(lineText)) { - for (; nextLine < endLine; nextLine++) { - if (state.sCount[nextLine] < state.blkIndent) { - break; - } - - pos = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - lineText = state.src.slice(pos, max); - - if (HTML_SEQUENCES[i][1].test(lineText)) { - if (lineText.length !== 0) { - nextLine++; - } - break; - } - } - } - - state.line = nextLine; - - const token = state.push("html_block", "", 0); - token.map = [startLine, nextLine]; - token.content = state.getLines(startLine, nextLine, state.blkIndent, true); - - return true; -} - -export function setup(helper) { - helper.registerPlugin((md) => { - if (md.options.discourse.features["chat-html-block"]) { - md.block.ruler.push("chat-html-block", chatHtmlBlock); - } - }); -} diff --git a/plugins/chat/spec/lib/chat/chat_pretty_text_spec.rb b/plugins/chat/spec/lib/chat/chat_pretty_text_spec.rb new file mode 100644 index 00000000000..680ee0a5a04 --- /dev/null +++ b/plugins/chat/spec/lib/chat/chat_pretty_text_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# +RSpec.describe Chat::Message do + describe ".cook" do + it "renders kbd inline tag" do + cooked = Chat::Message.cook <<~MD + Esc is pressed + MD + + expect(cooked).to include("

Esc is pressed

") + end + end +end diff --git a/plugins/chat/spec/lib/chat/pretty_text_spec.rb b/plugins/chat/spec/lib/chat/core_pretty_text_spec.rb similarity index 87% rename from plugins/chat/spec/lib/chat/pretty_text_spec.rb rename to plugins/chat/spec/lib/chat/core_pretty_text_spec.rb index 84a6bc40578..91edc7b54b9 100644 --- a/plugins/chat/spec/lib/chat/pretty_text_spec.rb +++ b/plugins/chat/spec/lib/chat/core_pretty_text_spec.rb @@ -97,28 +97,4 @@ RSpec.describe PrettyText do "
\n

original message

", ) end - - it "renders kbd inline tag" do - cooked = PrettyText.cook <<~MD - Esc is pressed - MD - - expect(cooked).to include("

Esc is pressed

") - end - - it "renders details block tag" do - cooked = PrettyText.cook <<~MD -
- Dog - Cat -
- MD - - expect(cooked).to include(<<~HTML.strip) -
- Dog - Cat -
- HTML - end end