yzhang-gh / vscode-markdown

Markdown All in One
https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one
MIT License
2.94k stars 326 forks source link

Prepend new lines appropriately when toggling math in a block quote or list #951

Open yfzhao20 opened 3 years ago

yfzhao20 commented 3 years ago

Proposal

当前,在引用块中添加数学公式,效果如图: w

这种显示:

image

在vscode中显示没问题,但是到其他编辑器(如Typora)中就会遇到麻烦。期望能够自动添加">",结果如下图这样:

image

yzhang-gh commented 3 years ago

算是一个合理的特性请求吧,不过实现起来有点麻烦😂(不只是自动添加 >,再按一次还要自动删除)

Lemmingh commented 3 years ago
> $$
a
$$

在 VS Code 中显示没问题

这提示 markdown-it-katex 有 bug。(其实,我感觉这更多是 markdown-it 挖的坑。)

Math block 不是 paragraph continuation text,即,不满足 Laziness 条件(block quote 的 Rule 2,list item 的 Rule 5)。所以,在缩进不足时,应当停止,不得续行。

可见,它在 container 末尾的行为不符合 CommonMark。这可由此例的怪异结果证实:

* $$a
b
c

> $$d
e
f

g

看上去, https://github.com/yzhang-gh/markdown-it-katex/blob/c77efb25e3e5eb3367b45077cc7c1473908fedc1/index.js

有问题。


https://github.com/markdown-it/markdown-it/blob/254b776beb0b94bc1e133e3971e00f2a2f0171c6/lib/rules_block/fence.js 对比,最简单的补丁似乎是

// line 130: tShift -> sCount
if (pos < max && state.sCount[next] < state.blkIndent)

// line 143
state.line = found ? next + 1 : next;
yzhang-gh commented 3 years ago

Math block 不是 paragraph continuation text

感觉如果我们允许多行 math block 的写法,那它应该就符合 paragraph continuation text。就像 example 262

> 1. > Blockquote
continued here.
  1. Blockquote continued here.

类似的我们可以期望

> 1. $$ math block
continued here $$
  1. $$ math block continued here $$

也即

  1. {{ rendered math block }}

也即这个 issue 目前的情况

Lemmingh commented 3 years ago
$$ math block
continued here $$

跟多行没有关系。HTML block 中也有这种形式。


Paragraph continuation text is text that will be parsed as part of the content of a paragraph, but does not occur at the beginning of the paragraph.

定义卡得很死。

Paragraph continuation text 归属于一个已经开始的 paragraph,不能有空行 (blank line),而且连接后要按 inline 序列解析。

Paragraph 是 leaf block。按目前的理解,math block 也是 leaf。Leaf 不可以互相嵌套。

Math block 最接近 HTML block Type 3 (processing instruction) 和 fenced code block,因为它的内容是 literal 而且可以含空行。


我们已经在许多地方零零散散地讨论过 math area 的定义。这次新开个 issue 彻底解决吧。

yfzhao20 commented 3 years ago

其实我不太懂具体定义……但是今天再次测试,

> $$
math
$$

这种代码在Typora中又没问题了。

但是另一个麻烦的是代码的高亮,类似上述代码在vscode 中扰乱了高亮(数学公式变成了一片白,文字部分变成了公式的高亮):

image

只有加回“>”去才能行

image

yfzhao20 commented 3 years ago

如这个例子一样,遇到多级列表,按下CTRL+M打公式,缩进直接没掉了。这样高亮直接没了。后面处理会非常麻烦,如果不给空行,那么会接着最后一级列表;如果给空行,那么列表就全没了。

w

image


另外,给出空的第二级列表时,预览会出问题;

image

不知道怎么样的,这样的代码:

markdown
- 

会把第一行的markdown识别成标题!


其实想提供一个思路,就是如果识别出前面有多个空格或“-”或“>”之类的,直接正则识别出来,在每一行前面强行填上就行吧😂虽然太过于简单粗暴,但是或许很有用😂