Как написать diff-код с подсветкой синтаксиса в Github

Github поддерживает подсветку синтаксиса следующим образом:

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

И он поддерживает diff следующим образом: (но без подсветки синтаксиса)

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

Как я могу получить «синтаксис hightlight» и «diff»?

Всего 2 ответа


Вам нужно будет выполнить пост-обработку вывода git diff, чтобы добавить подсветку синтаксиса для правильного языка файла, который отличается.

Но поскольку вы просите GitHub, эта пост-обработка не находится под вашим контролем и не предоставляется GitHub в данный момент в ее GFM (GitHub Flavored Markdown Spec) .

Он поддерживается исходными файлами, в обычном формате, подобном этому или в PR : GitHub выполняет подсветку синтаксиса двух версий файла, а затем вычисляет diff.

Он не поддерживается в стандартном блоке кода с защитой от уценки , где + / - diff отбрасывает механизм подсветки синтаксиса, учитывая, что здесь не выполняется операция «diff» (только писатель пытается добавить символы diff + / - )


Нет, в данный момент это не поддерживается.

GitHub документирует их обработку облегченных языков разметки (включая Markdown, среди прочих) в github / markup . Примечание. Шаг 3:

  1. Выделение синтаксиса выполняется на кодовых блоках. См. Github / linguist для получения дополнительной информации о подсветке синтаксиса.

Если мы будем следовать этой ссылке, мы найдем список грамматик, которые Linguist использует для выделения синтаксиса на GitHub. Лингвист может применять только один из грамматик в этом списке к блоку кода за раз. Конечно, один из грамматик - Diff . Тем не менее, эта грамматика ничего не знает о языке разного кода, поэтому вы не получите подсветку синтаксиса.

Конечно, есть и другие языки, которые часто объединяются. Например, HTML часто включается в язык шаблонов. Поэтому, помимо грамматики HTML , мы также находим грамматики для HTML+Django , HTML+ECR HTML+EEX , HTML+ERB и HTML+PHP . В каждом случае единственная грамматика знает о двух языках. И конкретный язык шаблонов, и HTML, который перемежается внутри шаблона.

Чтобы выполнить то же самое с diff, вам понадобится отдельная грамматика «diff» для каждого отдельного языка. Другими словами, количество грамматик удвоится. Конечно, способ избежать этого может заключаться в том, чтобы рассматривать diff разному. Когда задан diff , они могут запускать блок через синтаксический маркер дважды, один раз для diff и один раз для исходного языка. Однако, по крайней мере, при обработке кодовых блоков в облегченных языках разметки они не реализовали такую ​​функцию.

И если они когда-либо будут реализовывать такую ​​функцию в будущем, скорее всего, будет более сложно, просто дважды запустив блок кода. В конце концов, каждая строка diff имеет diff-специфический контент, который смущает грамматику другого языка. Следовательно, каждая грамматика должна быть осведомлена о различиях, или каждая строка должна быть отправлена ​​в грамматику отдельно с удаленными фрагментами. Проблема с более поздним заключается в том, что грамматика не имела бы контекста каждой строки и, скорее всего, ошибается. Независимо от того, возможно ли такое решение, он не справляется с этим ответом, но дело в том, что разумно ожидать, что такая функция будет гораздо более низким приоритетом для поддержки из-за сложности.

Итак, почему GitHub делает подсветку синтаксиса в других местах на своем веб-сайте? Потому что в этих случаях он имеет доступ к двум исходным файлам, которые отличаются друг от друга, и генерирует сам diff. Каждый источник сначала выделяется (избегая сложностей, упомянутых выше), тогда diff создается из двух выделенных исходных файлов. Тем не менее, diff, включенный в блок кода Markdown, уже является отличием, когда GitHub впервые видит его. Для них нет способа выделить предварительный код. Другими словами, процесс, который они используют в настоящее время, не может быть передан для поддержки запрашиваемой функции.


Есть идеи?

10000