如何在Github中使用语法高亮编写diff代码

时间:2018-11-05 01:47:46

标签: github markdown

Github支持以下语法突出显示:

```javascript
let message = 'hello world!'
```

它支持diff如下:(但不突出语法)

```diff
-let message = 'hello world!'
+let message = 'hello stackoverflow!'
```

如何同时获得“语法高亮”和“差异”?

2 个答案:

答案 0 :(得分:1)

您需要对git diff的输出进行后处理,以便为要比较的文件的正确语言添加语法突出显示。

但是由于您要使用GitHub,因此后处理不在您的控制范围之内,并且GitHub目前GFM (GitHub Flavored Markdown Spec)中没有提供该处理。

源文件支持regular diff like this onein a PR:GitHub对文件的两个版本进行语法高亮显示,然后 计算差异。

常规markdown fenced code block不支持此功能,因为考虑到此处没有执行“ diff”操作,因此diff的+ / -会抛出语法突出显示引擎(只是作者尝试添加diff + / -符号)

答案 1 :(得分:0)

否,目前不支持此功能。

GitHub在github/markup中记录了其对轻量级标记语言(包括Markdown等)的处理。注意步骤3:

  
      
  1. 语法高亮显示在代码块上。有关语法突出显示的更多信息,请参见github/linguist
  2.   

如果我们点击该链接,则会发现list of grammars,Linguist使用它在GitHub上突出显示语法。语言学家一次只能将该列表中的一种语法应用于一个代码块。当然,语法之一是Diff。但是,该语法对要区分的代码语言一无所知,因此您不会在语法上突出显示该代码。

当然,还有其他一些经常组合使用的语言。例如,HTML通常包含在模板语言中。因此,除了HTML语法外,我们还发现了HTML+DjangoHTML+ECR HTML+EEXHTML+ERBHTML+PHP的语法。在每种情况下,单个语法都知道两种语言。特定的模板语言和HTML都散布在模板中。

要使用差异实现相同的功能,您需要为列出的每种语言使用单独的“差异”语法。换句话说,语法的数量将增加一倍。当然,避免这种情况的一种方法可能是对diff进行不同对待。当指定diff时,他们可以通过语法突出显示两次来运行该块,一次用于diff,一次用于源语言。但是,至少在以轻量级标记语言处理代码块时,它们尚未实现这种功能。

如果他们将来要实现这种功能,那么简单地将代码块运行两次就可能更加复杂。毕竟,差异的每一行都有差异的特定内容,这会使其他语言语法感到困惑。因此,每个语法都需要了解差异,或者需要删除差异部分而将每一行分别送入语法。后面的问题是语法不会具有每一行的上下文,并且很可能会出错。这种解决方案是否可行不在此答案的范围之内,但关键是可以合理地预期,由于涉及的复杂性,此类功能的优先级要低得多。

那么,为什么GitHub在其网站的其他位置进行语法突出显示?因为在这种情况下,它可以访问要比较的两个源文件,并且它自己生成比较文件。首先突出显示每个源(避免上面提到的复杂性),然后从两个突出显示的源文件创建差异。但是,当GitHub首次看到时,包含在Markdown代码块中的差异已经是一个差异。他们没有办法先突出显示预差异代码。换句话说,他们当前使用的过程将无法转移到支持所请求的功能。