История началась, когда я несколько месяцев назад присоединился к команде Балерина на 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, я чувствую себя очень счастливым, потому что я помог это осуществить. Вероятно, это была уникальная возможность, и я очень рад, что я ею воспользовался.
Надеюсь, вам понравилась эта статья. Это было немного долго, но я уверен, что вы узнали что-то новое :)