- PVSM.RU - https://www.pvsm.ru -
Привет! Эта статья про плагин Rainbow CSV, который я написал для 5 текстовых редакторов:
VS Code [1], Vim [2], Sublime Text 3 [3], Atom [4], Gedit [5]
Думаю, что многие читатели этой статьи периодически сталкиваются с CSV (comma-separated), ТSV (tab-separated) и подобными файлами. Если попробовать открыть их в текстовом редакторе (а как иначе узнать что там внутри?), то откроется совершенно невзрачная картина как с левой стороны изображения. Глядя на это сложно сказать даже сколько колонок в таблице. С правой стороны картинки тот же файл с включенным RainbowCSV, читаемость значительно повысилась за счет синтаксической подсветки.
Синтаксис для такой подсветки, как ни странно, задается с помощью всего лишь одной (хоть и длинной) строчки-регулярного выражения:
((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?((?:"(?:[^"]*"")*[^"]*"(?:,|$))|(?:[^,]*(?:,|$)))?
Правило подсветки целиком можно найти, например, здесь [6] (версия для VS Code), но, кроме самого регулярного выражения, там совершенно не на что смотреть.
Для сравнения, синтаксис файлы для языков общего назначения, таких как Python, JS, C++ и т.д. занимают обычно несколько сотен строчек весьма эзотерического кода.
Чтобы не загружать деталями статью, угадать из каких основных частей состоит и как работает это регулярное выражение предлагается читателям.
Подсказка: Вот такое простое выражение ([^,]*,)?([^,]*,)?
— подсветит CSV файл в 2 разных чередующихся цвета, но будет неправильно работать на запятых внутри полей, экранированных кавычками.
Кстати, здесь и далее описывается версия Rainbow CSV для Visual Studio Code, т.к. это вариант плагина в данный момент самый технически продвинутый и популярный (больше 500K загрузок).
Итак, помимо того, что Rainbow CSV подсвечивает столбцы, он также может:
Одним из важнейших свойств Rainbow CSV плагинов является автоматическое обнаружение CSV файлов по их контенту. Эта функциональность крайне необходима, т.к. зачастую CSV (или TSV) файлы имеют файловое расширение отличное от .csv (.tsv). Также можно встретить файлы с расширением .csv в которых реально в качестве разделителя используется точка с запятой ;
. Алгоритм определения табличного файла по контенту очень прост — достаточно проверить, что количество ячеек в каждой строчке при split'e по данному разделителю это постоянная > 1.
Вообще, традиционный способ просмотра CSV данных это импорт их в какой-либо графический редактор, например Excel.
По сравнению с этим способом, у Rainbow CSV есть как преимущества, так и недостатки:
Еще один способ повысить читаемость CSV файлов, это выравнивание с помощью пробелов, но данный способ модифицирует содержимое файла, и поэтому его применимость весьма ограниченна.
Так же, на мой взгляд, читаемость файла после синтаксической Rainbow подсветки лучше, чем у файла, который был выравнен пробелами.
Первая версия Rainbow CSV была написана 5 лет назад для Vim на основе плагина rainbow_parentheses [8] Как можно заметить, от этого проекта я позаимствовал не только часть кода, но и половину названия =)
Версии для VSCode, Atom, и Sublime Text 3 появились год назад.
Многие критически важные фичи и улучшения были предложены пользователями плагина.
В заключение могу провести небольшое сравнение API популярных текстовых редакторов.
API для плагинов у VSCode, Atom и Sublime Text 3 довольно похожи между собой, основное различие в том, что расширения для VS Code и Atom пишутся на JavaScript, а для Sublime Text 3 на Python.
Все 3 редактора используют один и тот же движок регулярных выражений для синтаксической подсветки, поэтому перенос Rainbow CSV между этими редакторами потребовал лишь минимальной адаптации регулярок.
В целом могу сказать, что самый приятный и удобный процесс разработки плагинов предоставляет VS Code. С другой стороны именно в нем по каким-то причинам изначально отсутствовала некоторая функциональность, необходимая для полноценной работы Rainbow CSV, но команда VS Code с радостью приняла и улучшила мой PR, который добавлял необходимый мне метод.
Написание плагинов для Vim очень сильно отличается от этих 3 более новых редакторов. В Vim используется свой собственный язык VimScript, а также разнообразные команды для манипуляции содержимым открытых файлов. Синтаксическая модель, которую Vim использует для подсветки, также довольно сильно отличается от того, что предоставляют VSCode, Atom и Sublime.
Автор: mechatroner
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/298841
Ссылки в тексте:
[1] VS Code: https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv
[2] Vim: https://github.com/mechatroner/rainbow_csv
[3] Sublime Text 3: https://packagecontrol.io/packages/rainbow_csv
[4] Atom: https://atom.io/packages/rainbow-csv
[5] Gedit: https://github.com/mechatroner/gtk_gedit_rainbow_csv
[6] здесь: https://github.com/mechatroner/vscode_rainbow_csv/blob/master/syntaxes/csv.tmLanguage.json
[7] Здесь: https://github.com/mechatroner/vscode_rainbow_csv/issues/4
[8] rainbow_parentheses: https://github.com/kien/rainbow_parentheses.vim
[9] rbql.org: https://rbql.org
[10] Источник: https://habr.com/post/429548/?utm_campaign=429548
Нажмите здесь для печати.