Skip to content

fix: Правит поведение линк-чекера внутри пиаров - #6092

Open
furtivite wants to merge 3 commits into
mainfrom
fix-link-checker
Open

fix: Правит поведение линк-чекера внутри пиаров#6092
furtivite wants to merge 3 commits into
mainfrom
fix-link-checker

Conversation

@furtivite

Copy link
Copy Markdown
Member

Описание

Заменяет проверку ссылок в PR с linkinator-action на собственный чекер внутренних ссылок.

Старый чекер скипал локальный сервер linkinator и в PR фактически сканировал 0 ссылок. Из-за этого битые внутренние ссылки находились только еженедельной проверкой по живому сайту.

Что изменилось

  • Добавлен .github/scripts/link-check.js.
  • В pr-checks.yml job «Ссылки» теперь запускает свой скрипт вместо JustinBeckwith/linkinator-action.
  • Проверяются только изменённые в PR .md-файлы.
  • Проверяются внутренние ссылки:
    • существование целевого материала;
    • существование якоря в целевом материале;
    • относительные ссылки на файлы, картинки и демки.
  • Если в изменённом материале пропал заголовок, чекер ищет по репозиторию ссылки на удалённый якорь и валит PR.

Как проверяет

  • /css/color/ → есть ли css/color/index.md;
  • /css/color/#kak-ponyat → есть ли якорь kak-ponyat;
  • images/example.png, demos/example/, ../demos/example/ → есть ли файл или папка;
  • https://doka.guide/... обрабатывается как внутренняя ссылка;
  • внешние https://..., mailto: и tel: пропускаются.

Slug якорей считается через transliteration, как на платформе в headings-id-transform.js.

Что не проверяется

  • Внешние ссылки остаются в еженедельной проверке link-checker-all.yml.
  • related не дублируется, потому что уже проверяется в job «Мета».
  • Якоря внутри interviews/** не проверяются, потому что в этом разделе id генерируются иначе.

Проверка

  • Сломанный внутренний якорь → ошибка с номером строки.
  • Переименование заголовка → находятся ссылки на удалённый якорь.
  • Битый внутренний путь → ошибка.
  • Корректные ссылки → зелёный чек.

@furtivite
furtivite requested a review from igsekor as a code owner July 16, 2026 15:05
@furtivite furtivite self-assigned this Jul 16, 2026
@furtivite furtivite added кухня Документация, репозиторий, задачи редакции ошибка Что-то критичное и мешает labels Jul 16, 2026
@solarrust

Copy link
Copy Markdown
Member

Прогнала link-check.js по всем */index.md в репозитории (1345 файлов) — 95 срабатываний. Почти все они ложные срабатывания из-за нескольких багов в самом скрипте, а не битые ссылки. Если смёржить как есть, чекер будет валить PR на самых обычных для этого репо паттернах: демку с ?embed=1, статью про HTML-тег с подзаголовками вида <td>, любой пример атрибута в инлайн-коде.

Баги, которые стоит поправить перед мёржем

  1. Query-строка не отрезается при проверке относительных ассетов
    resolveRelativeAsset (link-check.js:304-312) не делает pathname.split('?')[0], в отличие от resolveArticleFile (link-check.js:221). Ломает практически каждую демку с ?embed=1 в css/js-статьях (~15 срабатываний).

  2. Заголовки-теги в бэктиках теряют якорь
    cleanHeadingText (link-check.js:69-79) стирает <td>, <tr> и тому подобные как HTML-теги, если заголовок — это сам тег в бэктиках (`### <td>``, см. html/tables/index.md:104-367). Якорь не регистрируется → ~30 ложных «нет якоря». Под угрозой вся секция html/, где так оформлены статьи про теги.

  3. Инлайн-код (одинарные бэктики) не маскируется
    maskNonLinkRegions (link-check.js:62-67) не трогает инлайн-код в прозе, поэтому иллюстративные примеры вроде href="URL", <a href="#chapter1"> считываются как настоящие ссылки. Задето: html/a, html/link, html/rel, html/script, html/video, css/scroll-margin, a11y/role-presentation-none, interviews/symbol.

  4. Якоря хаб-страниц раздела не читаются
    html/index.md, js/index.md, a11y/index.md, css/index.md — чистый YAML (groups[].items[]), без ##-заголовков в теле. extractHeadingAnchors находит там 0 якорей → любая ссылка на секцию хаб-страницы (/html/#semantika, /a11y/#vspomogatelnye-tehnologii, /js/#primitivnye-tipy-dannyh) считается битой.

  5. Не поддержан legacy-якорь <a name="...">
    css/visited/index.md:92 и css/text-decoration/index.md:217 задают якорь через <a name="limits">, а не текстом заголовка. extractHeadingAnchors этого не видит.

  6. -синтаксис markdown-ссылок не парсится
    Регекс ссылок режет по первой ), не поддерживая угловые скобки вокруг URL со спецсимволами: [Очередь](<https://ru.wikipedia.org/wiki/Очередь_(программирование)>). 5 срабатываний в js/, tools/, specials/.

  7. Корень сайта и служебные страницы платформы не резолвятся
    https://doka.guide/, /people/, /subscribe/ — это платформенные роуты без index.md в контент-репо, но чекер считает их битыми.

Не связано с этим PR, стоит проверить отдельно

specials/pfc/index.md:10 → tools/fp/#na-sobesedovanii
tools/file/index.md:96 → tools/cli/#faylovaya-sistema
tools/gitlab-ci-cd/index.md:85 → tools/static-analysis/#linter-dlya-css

Как проверяла

npm install transliteration --no-save
BASE_SHA=$(git rev-parse HEAD) node .github/scripts/link-check.js $(git ls-files '*/index.md' ':!:docs/*')

@furtivite

Copy link
Copy Markdown
Member Author

Я ещё посмотрю, спасибо

@furtivite

Copy link
Copy Markdown
Member Author

Как проверяла

npm install transliteration --no-save
BASE_SHA=$(git rev-parse HEAD) node .github/scripts/link-check.js $(git ls-files '*/index.md' ':!:docs/*')

Поправил, осталось

➜  content git:(fix-link-checker) npm install transliteration --no-save
BASE_SHA=$(git rev-parse HEAD) node .github/scripts/link-check.js $(git ls-files '*/index.md' ':!:docs/*')

up to date in 1s
Проверяю ссылки в 1345 файлах…
✖ tools/file/index.md:96 → в «tools/cli/index.md» нет якоря #faylovaya-sistema (ссылка [символические ссылки](/tools/cli/#faylovaya-sistema))
✖ tools/gitlab-ci-cd/index.md:85 → в «tools/static-analysis/index.md» нет якоря #linter-dlya-css (ссылка [Stylelint](/tools/static-analysis/#linter-dlya-css))

@furtivite
furtivite requested a review from solarrust July 18, 2026 14:16

@solarrust solarrust left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поправила мелкую мелочь и добавила тесты чтобы проверять все возможные сценарии =)

@github-actions

Copy link
Copy Markdown
Превью контента из 68d2705 опубликовано.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

кухня Документация, репозиторий, задачи редакции ошибка Что-то критичное и мешает

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants