Ikaleio / LiteLoaderQQNT-Markdown

为QQ添加Markdown渲染支持
Do What The F*ck You Want To Public License
123 stars 12 forks source link

<>在codeblock中被轉換成html跳脫字元 #34

Closed EvanHsieh0415 closed 4 months ago

EvanHsieh0415 commented 6 months ago

圖片

mslxl commented 6 months ago

Edited: 突然学校一堆事找上门,有点忙不开手了


这个真是我在 #32 中干的 :cry: 。它的产生原因是通过 innerHTML 获取的内容本身是被转义的,所以放到代码块中或者 katex 中时不会被当作原始的符号而是被当作HTML转义符号处理。 #33, #36 均是此问题。有关此 bug 的引入实在是抱歉 :(

我想了一下,似乎没有什么特别好的解决方法,目前有两个思路能解决

  1. 修改 markdownit 的 rules, 在渲染 fence codeblock、katex、inline codeblock 的时加一层反转义。不过这样的化会使代码变得很乱。同时也不能正确渲染引用问题(以> 开头的段落)。
  2. 在 renderer 进程中通过 textContent 获取文本并传到 main 进程,然后在代码进入 markdownit 之前过一层消毒,将不是占位符的 html 标签全部转义以防止 XSS 注入或渲染错误。

我在 https://github.com/mslxl/LiteLoaderQQNT-Markdown/commit/7df90bf4cb3fd8afee96adcfef6527ee88aa0267 简单尝试了一下方法1,感觉这种方式有点丑陋不太能接受,同时>的问题很难处理。所以我现在考虑是不是可以用方法2来修复问题。

方法2可以用一个简单的 parser combinator 来实现,它的问题在于修复的代码量可能略大,而且思路没有方法一直接暴力。而方法1的问题在于它不能处理 >,而且这种打补丁的解决方式感觉在解决问题的思路上略丑。

或者是否还有其他思路?

不知道作者觉得哪种方式更好 @d0j1a1701


ps: 有关 > 不能正确渲染的问题: image

Ikaleio commented 6 months ago

我本来的计划也是方案 2,但因为不熟悉 XSS 过滤暂时搁置了

Ikaleio commented 4 months ago

请更新到 2.0.0 版本