Github Markdown

时间:2017-04-19 18:32:28

标签: markdown github-flavored-markdown

我有一份包含半打列表的自述文件。

一切正常,直到倒数第二个列表。问题是这些列表项之间会出现一个额外的换行符。屏幕截图会更清楚:

enter image description here

我在sublime文本中使用Markdown预览包,如果我使用Github Markdown预处理器进行预览,我会看到相同的格式问题。

但最奇怪的是,如果我将文字输入https://jbt.github.io/markdown-editor

,我就不会看到同样的问题

如果您想尝试自己,请使用以下字符串:

_git_

- **gl**: `git log <optional args>` _shows the revision history_
- **gpoh**: `git push origin head` _pushes the current branch_
- **gpom**: `git push origin master` _pushes the master branch_
- **grv**: `git remote -v` _lists the remotes_
- **gs**: `git status` _shows unstaged & staged changes_
- **gacm**: `git add -A; git commit -m "<message>"` _commits all changes with a message_
- **gacm-lfs**: `sudo git add -A; sudo git commit -m <message>` _it might not be this way for everyone,
  but for me `sudo git` uses git-lfs (git large filesystem) while `git` uses regular git. This function
  adds and commits all files with a message in a git-lfs repo._
- **gc**: `git checkout <branch>` _changes branches_
- **gclo**: `git clone <repo>` _clones a repo_
- **get_branch**: `git branch -f origin/<branch>; git checkout <branch>` _gets a specific branch from a remote repo_

_fish meta functions_

- **backup_functions**: `cd ~/.config/fish/functions; git add -A; git commit -m "<message>"; git push origin master; cd -` _backups the functions folder into a repo_
- **cdfns**: `cd ~/.config/fish/functions` _changes into the functions dir_
- **cfn**: `cat ~/.config/fish/functions/<name>.fish` _shows the definition of a function_
- **efn**: `nano ~/.config/fish/functions/<name>.fish` _edits a function's definition (using nano)_
- **fn**: `echo -e "function $argv[1]\n  $argv[2]\nend" > ~/.config/fish/functions/$argv[1].fish` _create a function_
- **fns**: `ls ~/.config/fish/functions` _list functions_
- **rmfn**: `rm ~/.config/fish/functions/<name>.fish` _remove a function_
- **fndoc**: `echo -e "- <text>" >> ~/.config/fish/functions/README.md` _adds a line to the readme documenting a function_
- **fs**: `funcsave <name>` _alias for funcsave, e.g.:_

      function fs
        funcsave $argv
      end
      fs fs

1 个答案:

答案 0 :(得分:3)

您的第一个列表是“紧凑”列表,而第二个列表是“松散”列表,因为它在其中一个列表项中包含一个代码块。如果要匹配列表,请对两者使用相同的类型。在第一个列表中的项之间添加空行将使它们匹配。正如spec所解释的那样:

  

如果列表中的任何组成列表项由空行分隔,或者如果其任何组成列表项直接包含两个块级元素,并且它们之间有空行,则列表是松散的。否则列表很紧张。 (HTML输出的不同之处在于松散列表中的段落包含在<p>标记中,而紧密列表中的段落则不包含在内。)

作为一个简单的例子,这个列表:

* line 1
* line 2

将呈现给此HTML:

<ul>
    <li>line 1</li>
    <li>line 2</li>
</ul>

这个清单:

* line 1
* line 2

  a second block

将呈现为:

<ul>
    <li>
        <p>line 1</p>
    </li>
    <li>
        <p>line 2</p>
        <p>a second block</p>
    </li>
</ul>

请注意,第二个列表项包含多个段落。因此,列表项中的每个段落都包含在<p>标记中,使列表成为“松散”列表。为了保持一致性,列表中的所有项目都包含在<p>标记中(包括第一项)。虽然该示例使用段落,但同样适用于任何块级构造,包括示例中的代码块。

您还可以通过在列表项之间添加空行来强制列表成为“松散”列表。例如,此列表:

* line 1

* line 2

此HTML中的结果:

<ul>
    <li>
        <p>line 1</p>
    </li>
    <li>
        <p>line 2</p>
    </li>
</ul>

因此,如果您在第一个列表中的至少两个项目之间添加一个空行,则两个列表将始终显示,并且它们之间会有一些空格。

<p>标记中的列表项的内容包装为空白的原因是页面(CSS)的样式已为<p>标记定义了填充和/或边距。可以编辑CSS以在他们自己的站点上删除此填充/边距,但在第三方主机上,这通常不是一种选择。

至于为什么有些工具似乎没有表现出这种行为;可能是他们有默认的CSS样式,导致两种类型的列表看起来都一样(例如StackOverflow就是这样)。另一种可能性是他们使用的是旧式的Markdown解析器而不是更新的CommonMark规范(GitHub使用)。原始Markdown rules也有松散和紧张列表的概念,但行为没有特别定义,因此不同的实现行为略有不同。许多人遵循参考实现,只使与空白行相邻的列表项“松散”,所有其他项目“紧”。在您的示例中,只有最后一项是“松散的”,但由于它是列表中的最后一项,因此不会那么明显。有关各种实现方式的比较,请参阅Babelmark

无论实施如何,如果您想要“紧密”列表,唯一的方法就是永远不要在列表项中的任何位置包含任何空白行。这意味着您永远不能嵌套其他块级构造,但有一些非常特殊的例外:

  1. 明显的例外是嵌套列表,但即使这样,你也需要避免空行(见example):

    * parent item
        * nested item
        * Another nested item
    * sibling of parent
    * Another sibling of parent
    
  2. 嵌套的代码块或块引用可以嵌套在某些实现中,但它需要从列表项的第一行开始并且不包含空行。

    * list item
    *     A code block because it is indented appropriately
    * > a blockquote
    * a list item
    

    正如您在example中看到的那样,它仅适用于某些实现。值得注意的是,CommonMark实现。换句话说,它可以在GitHub上运行,但它可能不适用于其他工具或其他网站。

  3. 无论如何,如果您有多个子段落,代码块和/或块引用,则不能有一个紧凑的列表。