关于MarkDown语法中加粗失效的问题

小黎今天肝计网的时候,发现有个地方加粗失效了
但是下面的加粗又是可以的!
小黎上网找了找原因发现…
震惊!真相竟然是这个…
(一天天震惊震惊的,怎么不吓死你

事件起因

效果就是下图那样啦,上面的式子不能加粗,下面的可以(这个笔记写太快了,有很多小问题,忽略就好啦…

bMHNi6.png

事件分析

后面小黎上网发现,加粗的开始标记符(就是前面两个小星星),和结束标记符(就是后面的两个小星星)对前后内容是有要求的!

开始前先了解一下CommonMark规范吧

Markdown将*_作为强调指示符。被单个*_包裹的文本将被HTML<em>标签包裹(也就是斜体);被两个包裹的将被HTML<strong>标签包裹(也就是粗体)。

先说几个关键词的意思吧~

定界符序列(delimiter run)

定界符类指的是:

  • 一个或一串非转义的*
  • 一个或一串非转义的_

左侧定界符序列(left-flanking delimiter run)

左侧定界符序列是一个定界符序列,且:

  • 后面不能是空白;
  • 当前面没有空白或标点符号时,后面不能是标点符号。

右侧定界符序列(right-flanking delimiter run)

右侧定界符序列是一个定界符序列,且:

  • 前面不能是空白;
  • 当后面没有空白或标点符号时,前面不能是标点符号。

结合一下车祸现场吧

结合上方的例子,后面的**的前面是标点符号,但后面却不是空白或标点符号,所以它不是右侧定界符序列,不会被当作是结束粗体的标识符,自然粗体就不生效了。

(就是人家的自我认知出了点差错,怪我怪我…

可是,为什么要这么定义?

为了能支持嵌套分隔符序列,**one **two two **three** two two** one**

one two two three two two one

这里就不具体说了,只能说懂的都懂(bushi

这样的影响是什么呢,就是使用非空格分词语言(比如中文)的用户只能骂骂咧咧地继续用下去

那怎么办!解决方案呢!

你多加个空格不就行了

相信大多数非强迫症患者会采用这个方案(就像我,但是感觉根源还是

可是哪个中国人写字没事加空格啊!

好吧,那试试零宽空格(zero-width space,ZWSP)

ZWSP长这样!锵锵!

什么?你说看不到?其实聪明的人才看得到

看不到就对啦,ZWSP是一种不可打印的Unicode字符(U+200B),用于可能需要换行处。

我们可以使用ZWSP指定长文字的换行位置;只有当荧幕宽度不足以单行显示时ZWSP才会起作用。

举个例子,没有使用 ZWSP 时是这样的:

LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongBreakBeforeHereLongLongLongLongLongLongLongLongLongLongLongLongLongLongText

使用ZWSP时是这样的

LongLongLongLongLongLongLongLongLongLongLongLongLongLongLong​BreakBeforeHereLongLongLongLongLongLongLongLongLongLongLongLongLongLongText

由于 ZWSP 这种特殊属性,它也被用于绕过敏感词检查、创造不可复制的伪链接等等。

回到之前的问题,只要在需要加空格的地方加上ZWSP就好啦~

这个字符可以在这里复制,点击copy就好啦

懒得截图了,还得上传图床

Contents
  1. 1. 事件起因
  2. 2. 事件分析
    1. 2.1. 开始前先了解一下CommonMark规范吧
      1. 2.1.1. 定界符序列(delimiter run)
      2. 2.1.2. 左侧定界符序列(left-flanking delimiter run)
      3. 2.1.3. 右侧定界符序列(right-flanking delimiter run)
    2. 2.2. 结合一下车祸现场吧
    3. 2.3. 可是,为什么要这么定义?
  3. 3. 那怎么办!解决方案呢!
    1. 3.1. 你多加个空格不就行了
    2. 3.2. 好吧,那试试零宽空格(zero-width space,ZWSP)
|