vale
Как обычно, заметки о том, за что зацепилось. Задачи написать исчерпывающее - нет.
https://vale.sh/docs/ - вроде как, самый гибкий и актуальный из нынешних линтеров для текста. Меня интересует в варианте cli, который бесплатен и открыт.
- https://github.com/errata-ai/vale/releases - устанавливается путём скачивания либо скомпилированного бинарника (мой вариант), либо исходников - и компилирования. Либо чо там ещё написано в https://vale.sh/docs/vale-cli/installation/ (snap, brew, choco, docker…)
- В емаксе (как основа для проверялки в емаксе - flymake встроенный, flycheck - «модный». https://www.flycheck.org/en/latest/user/flycheck-versus-flymake.html, https://www.flycheck.org/en/latest/user/syntax-checkers.html#flycheck-checker-chains):
- Есть расширение для flymake (https://github.com/tpeacock19/flymake-vale),
- Есть встроенный чекер во flycheck - чтоб прикрутить к емаксу. Пока выбрала flycheck, он есть.
- кажется, не выводит сведения по результатам правил, которые говорят о каких-то общих характеристиках текста, чисто формально привязываясь к 1:1, началу файла. Досадно.
- Требует для работы файл конфига
vale.ini
или_vale.ini
. После заведения в проекте такого файла надо сделатьvale sync
. В конфиге должен быть указан путь до папки styles (или как назовёте, строка конфигаStylesPath = yourfoldername
. Vale может и создать такую папку, и добавить в неё всякого встроенного).- Вообще, при запуске можно и другое имя указать.
- Разные «профили» в одном файле не делаются (а зря), надо писать разные файлы. Значит, придётся. «Очевидно же, что» один набор правил, как хорошо писать, на все случаи жизни не сработает.
- Если путь к конфигу не указан при запуске, ищет
vale.ini
или_vale.ini
в папке, из которой запущен, и на 6 уровней вверх, потом в домашней папке пользователя. Использует первый найденный. Какое из двух имён смотрит раньше — яхз. - https://vale.sh/generator - предлагаемый генератор конфига, чтоб легче было начать.
- Вообще, при запуске можно и другое имя указать.
- https://vale.sh/docs/topics/config
- определять, к чему применимы правила - https://vale.sh/docs/topics/scoping/
Интересные регэкспы у них:
In addition to the standard Go regex syntax, Vale also supports positive lookahead ((?=re)), negative lookahead ((?!re)), positive lookbehind ((?<=re)), and negative lookbehind ((?<!re)).
- standard Go regex syntax — дают ссылку https://pkg.go.dev/regexp/syntax
- TODO: найти примеры правил с заменами, использующими группы. А то рехнусь парадигмы ко всем словам писать, весёлая специфика русского языка же. :)
- https://vale.sh/hub/ - готовые пакеты правил, скачиваются через указание в конфиге и
vale sync
. - cli manual - https://vale.sh/manual/
Словарики
Конкретная папка задаётся в конфиге строкой
Vocab = SomeName
И Somename
должно быть подпапкой папки Vocab в StylesPath
.
В папке SomeName
ожидаются два файла — accept.txt
и reject.txt
.
The effects of using a custom Vocab are as follows:
- Entries in accept.txt are added to every exception list in all styles listed in BasedOnStyles—meaning that you now only need to update your project’s vocabulary to customize third-party styles (rather than the styles themselves).
- Entries in accept.txt are automatically added to a substitution rule (Vale.Terms), ensuring that any occurrences of these words or phrases exactly match their corresponding entry in accept.txt.
- Entries in reject.txt are automatically added to an existence rule (Vale.Avoid) that will flag all occurrences as errors.
This means that your exceptions can be developed independent of a style, allowing you to use the same exceptions with multiple styles or switch styles without having to re-implement them.
The entries are case-sensitive and may also be regular expressions.
Два варианта для случаев, когда учитывать регистр не особо надо:
(?i)MongoDB [Oo]bservability
Первый — а без разницы, какой там где регистр, хоть mOnGoDb пиши. Во втором случае есть выбор между прописной и строчной первой буквой.
Ещё вариант уже для конфига:
BasedOnStyles = Vale Vale.Terms = NO
Пишут, эффект примерно как от спеллчекера.
На этом месте я ещё отдельно тихо грущу про регэкспы для всех наших парадигм склонения-спряжения. Скорее всего, писать основу и оставлять сколько-то символов на варианты.
Ignore files are for style creators while vocabularies are for style users. If you’re developing or maintaining a style, you may still want to include a custom spelling rule—MyStyle.Spelling—that packages its own ignore files. As a user of styles, vocabularies should be able to replace the use of ignore files completely.
Стили
https://vale.sh/docs/topics/styles/
Стиль - папка в StylePath
, которая содержит YAML-файлы (c расширением .yml) с правилами.
Шаблончик такого файла
# All rules should define the following header keys: # # `extends` indicates the extension point being used (see below for information # on the possible values). extends: existence # `message` is shown to the user when the rule is broken. # # Many extension points accept format specifiers (%s), which are replaced by # extracted values. See the extension-specific sections below for more details. message: "Consider removing '%s'" # `level` assigns the rule's severity. # # The accepted values are suggestion, warning, and error. level: warning # `scope` specifies where this rule should apply -- e.g., headings, sentences, etc. # # See the Markup section for more information on scoping. scope: heading # `link` gives the source for this rule. link: 'https://errata.ai/' # The number of times this rule should raise an alert. # # By default, there is no limit. limit: 1
То бишь, коротенько шаблон:
extends: existence level: warning scope: heading link: 'https://errata.ai/' limit: 1
Варианты правил
- existence — (как в примере выше) реагирует на присутствие. Например, рекомендует удалить неудачное клише. https://vale.sh/docs/topics/styles/#existence
- substitution — предлагает замену. https://vale.sh/docs/topics/styles/#substitution
- occurence — ограничивает количество появлений чего-то в некотором контексте. Типа «три запятых в предложении», «пять слов с -изм в абзаце». https://vale.sh/docs/topics/styles/#occurrence
- repetition — ловит повторы. https://vale.sh/docs/topics/styles/#repetition Запятые из примера выше можно бы и здесь сделать, а вот -изм — уже нет. Можно натравить на все повторы в принципе.
- consistency — не сбиваться между разными вариантами слов. Типа, начали писать «сиянье», значит «сияние» уже не в этом тексте. https://vale.sh/docs/topics/styles/#consistency
- conditional — Отслеживает появление второго элемента при обнаружении первого. Например, если в тексте появилось «во-первых», то «во-вторых» должно быть где-то достаточно близко. https://vale.sh/docs/topics/styles/#conditional
capitalization — Про https://vale.sh/docs/topics/styles/#capitalization
There are a few pre-defined variables that can be passed as matches:
$title: “The Quick Brown Fox Jumps Over the Lazy Dog.” $sentence: “The quick brown fox jumps over the lazy dog.” $lower: “the quick brown fox jumps over the lazy dog.” $upper: “THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.” Additionally, when using match: $title, you can specify a style of either “AP” or “Chicago”.
- metric — меряет удобочитаемость всякими способами. При определённом результате формул предупреждает, что результат таксебе. https://vale.sh/docs/topics/styles/#metric
- spelling — опирается на Hunspell. Можно указывать пути к словарям и нужные словари. https://vale.sh/docs/topics/styles/#spelling
- чтобы игнорировать то, что хочет распознаваться как ошибка:
- указать в текстовом ignore-файле, файл указать в правиле.
- написать фильтр - если у этих слов есть какое-то общее свойство. Там в примере всякие названия, связанные с python и начинающиеся на py.
- чтобы игнорировать то, что хочет распознаваться как ошибка:
- sequence — правила на уровне предложений, вроде как про грамматику. Но их я пока не поняла. https://vale.sh/docs/topics/styles/#sequence
- script — возможность писать произвольные штуки на https://github.com/d5/tengo (https://tengolang.com/). https://vale.sh/docs/topics/styles/#script
Конфиг
Прихватывала частично, что глянулось.
- Format-specific sections apply their settings only to files that match their associated glob pattern. For example, [*] matches all files while [*.{md,txt}] only matches files that end with either .md or .txt. You can have as many format-specific sections as you’d like and settings defined under a more specific section will override those in [*].
- specifies the minimum alert severity that Vale will report. The options are “suggestion”, “warning”, or “error” (defaults to “warning”).
- specifies styles that should have all of their rules enabled.
- enable certain rules within a style, you can do so on an individual basis.
- disable rule on an individual basis.
- change rule severity level.
- allow to exclude certain block-level sections of text that don’t have an associated HTML tag that could be used with SkippedScopes.
- allow you to exclude certain inline-level sections of text that don’t have an associated HTML tag that could be used with IgnoredScopes.
Ссылки
- https://gitlab.com/gitlab-org/gitlab/-/tree/master/doc/.vale - гитлабные стили
- https://github.com/vultr/vultr-mdtk/blob/main/styles - ещё чьи-то
- https://content-blueprint.com/2022/01/30/how-i-use-vale-as-a-content-strategist/ - простой текстик про «нафига».