История началась, когда я несколько месяцев назад присоединился к команде Балерина на WSO2. Однажды я работал над плагином Ballerina IntelliJ IDEA, и внезапно у меня появилась идея. Идея заключалась в следующем: Что, если мы сможем добавить поддержку подсветки синтаксиса Ballerina в GitHub!?.

Как все вы знаете, GitHub обеспечивает поддержку подсветки синтаксиса для сотен языков, таких как Java, JavaScripts, GO и т. Д. Когда мы отправляем PR, мы видим красиво выделенный diff. Также вы можете увидеть языки программирования, используемые в репозитории, щелкнув панель сведений о языке.

Но задумывались ли вы когда-нибудь о том, как эта подсветка синтаксиса выполняется в GitHub? Нет, правда? Я тоже. Это просто работает, и мы принимали это как должное и даже не удосужились подумать об этом дважды.

Итак, как только у меня возникла эта мысль, я погуглил о том, как подсветка синтаксиса выполняется в GitHub. Я выяснил, что эту возможность предоставляет библиотека Лингвист.

Я проверил репозиторий, чтобы узнать, есть ли какие-либо рекомендации по добавлению в него нового языка. К счастью, CONTRIBUTING.md содержал раздел Добавление языка. Похоже, для процесса нужен Ruby. Я тоже это видел.

Мы стараемся добавлять новые расширения только после того, как они появятся на GitHub. В большинстве случаев мы предпочитаем, чтобы расширения использовались в сотнях репозиториев, прежде чем поддерживать их в Linguist.

В то время Ballerina все еще находилась на начальной стадии и мало использовалась в GitHub. Кроме того, в то время мы были очень заняты выпуском выпусков подряд, поэтому я хотел проверить это, когда у меня будет немного свободного времени, и у нас будет больше использования в GitHub.

Прошло несколько месяцев, и, наконец, я нашел время снова поработать над этим. К тому времени на GitHub добавлялось все больше и больше файлов Ballerina. Поэтому я решил выбрать то, с чего уехал. Удивительно, но добавить язык в GitHub оказалось проще, чем я думал, хотя на этом пути было немного сбоев.

В следующих разделах я обобщу шаги, которые я использовал для добавления языка Ballerina в библиотеку Linguist.

Файл грамматики

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

Существуют различные способы определения грамматики, но нам нужна грамматика в виде файла tmLanguage (textmate grammer), поскольку это поддерживает библиотека грамматических лингвистов. К счастью для меня, это уже было создано для плагина Ballerina VS Code. Вы можете найти файл грамматики, который я использовал здесь. Эта грамматика была немного старше, но этого было достаточно, чтобы начать работу. Файл грамматики также должен иметь одну из этих лицензий. Если вы новичок в грамматике textmate, вы можете обратиться к разделу этот для получения более подробной информации.

Примечание. Мы добавляем репозиторий, содержащий грамматику, в качестве вспомогательного репозитория в репозиторий лингвистов. Поэтому всякий раз, когда выпускается новая версия репозитория лингвистов, они обновляют эти субмодули как часть процесса выпуска. Это означает, что если вы обновите свою грамматику в своем репо, она будет отражена в GitHub после следующего выпуска библиотеки лингвистов. Таким образом, вам не нужно отправлять PR в репозиторий Linguist каждый раз, когда ваша грамматика меняется.

Установка Ruby

Итак, первым делом я установил Ruby. Это был довольно простой процесс.

Настройка

  • Разветвите репозиторий.
  • Клонируйте репозиторий на свой локальный компьютер.
  • Создайте и проверьте новую ветку.
  • Установите Bundler, используя следующую команду.
gem install bundler
  • Перейдите в каталог и установите зависимости, используя следующие команды.
bundle install

Одна ошибка, которую я сделал, заключалась в том, что я не установил зависимости. Это вызвало у меня несколько проблем. Итак, я узнал, как решить эти проблемы на собственном горьком опыте :)

Добавление языка балерины

Обновление languages.yml

Итак, первым шагом является обновление файла lib / linguist / languages.yml. Здесь поле tm_scope должно иметь имя области, определенное в грамматике. Убедитесь, что вы не изменили уже существующие записи в списке. Также вы можете опустить поле language_id, поскольку оно будет сгенерировано и добавлено позже.

Также важно отметить, что вы не можете использовать цвет, похожий на цвет, который уже есть в библиотеке лингвистов. Это проверяется файлом test / test_color_proximity.rb. Я предполагаю, что это сделано для того, чтобы у каждого языка был различимый цвет.

Добавление грамматики

Итак, следующее, что вам нужно сделать, это добавить грамматику с помощью следующей команды.

script/add-grammar script/add-grammar https://github.com/ballerinalang/plugin-vscode

Это добавит репо как подмодуль. Имя модуля - vendor / grammars / plugin-vscode. Это было немного проблематично, так как название было слишком общим. Поэтому мне пришлось переименовать модуль в более конкретное.

Добавление образцов

Добавьте несколько образцов в каталог samples / Ballerina.

Создание идентификатора языка

Теперь нам нужно сгенерировать идентификатор языка для нашего языка, используя следующую команду.

script/set-language-ids --update

Это сгенерирует новый идентификатор для нашего языка.

Тестирование

Теперь нам нужно протестировать наши изменения. Для этого выполните следующие команды.

script/bootstrap
bundle exec rake samples
bundle exec rake test

Иногда запуск тестов может оказаться слишком трудоемким, особенно если у вас мало опыта работы с Ruby. Ничего страшного: поленитесь и позвольте нашему сборщику Travis провести тесты за вас. Просто откройте запрос на включение, и бот начнет работать.

Так что, если вы решили открыть PR вместо тестирования самостоятельно, следующий раздел для вас.

Открытие PR

Теперь вы сделали все, чтобы добавить новый язык. Зафиксируйте изменения и откройте PR. При отправке PR вам необходимо связать результат поиска GitHub, который показывает широкое использование ваших языков. Например, сослаться на это.

Лингвистическое сообщество

Разработчики в этом сообществе очень приветливы. Мой PR был рассмотрен очень быстро. Они указали на проблемы в моем PR, так что я смог убедиться, что он соответствует стандартам их сообщества. Если вам нужна помощь или у вас есть вопросы, не стесняйтесь спрашивать их.

Балерина в GitHub

Добавляя язык Ballerina в GitHub, мы получаем следующие преимущества.

Подсветка синтаксиса для файлов Ballerina

Посмотреть процент кода Ballerina в репозиториях

Подсветка фрагмента кода балерины

Вдобавок к тому, что получают от этого другие, для меня это была огромная возможность узнать что-то новое. Теперь каждый раз, когда я вижу код Ballerina в GitHub, я чувствую себя очень счастливым, потому что я помог это осуществить. Вероятно, это была уникальная возможность, и я очень рад, что я ею воспользовался.

Надеюсь, вам понравилась эта статья. Это было немного долго, но я уверен, что вы узнали что-то новое :)