← Все проекты уровня 2
Уровень 2 · Работа с текстом и файламиВариант C

Проверка Markdown

Проверьте локальные inline-ссылки и якоря в Markdown-дереве без изменения файлов.

Техническое задание

Область проверки

Создайте CLI только для чтения для проверки ссылок в Markdown-документах. Команда принимает корневую директорию, необязательный --file для проверки одного документа внутри неё и --strict для ненулевого кода завершения при найденных проблемах. Автоматически обходите только файлы с расширением .md, не следуйте каталогам и файлам через символические ссылки и не выходите за пределы корня. Проверяйте только inline-ссылки вида текст и заголовки Markdown, из которых строятся локальные якоря. Не анализируйте reference-ссылки, изображения, HTML, автоссылки и кодовые блоки; внешние URL с http, https и mailto игнорируйте.

Для локального назначения отделите необязательный фрагмент после #, разрешите percent-encoding, затем разрешите путь относительно каталога исходного Markdown. Пустой путь с фрагментом означает текущий документ. Если путь не задан, цель документа — проверяемый Markdown-файл; если задан путь без расширения и соответствующий файл не найден, дополнительно попробуйте тот же путь с .md. Путь должен остаться внутри корня после очистки сегментов. Сначала диагностируйте отсутствующий файл, затем при наличии фрагмента проверьте якорь. Якорь заголовка формируется из текста заголовка: нижний регистр, удаление пунктуации, замена пробельных последовательностей дефисом; дублирующиеся якоря получают суффиксы -1, -2 по порядку.

Для каждой проблемы выведите относительный файл источника, номер строки, тип проблемы и цель; итоговый порядок — путь, строка, тип. Без --strict находки печатаются, но код возврата успешный; с --strict ошибки ссылок дают ненулевой код. Ошибка обхода или чтения всегда ненулевая. Ничего не исправляйте и не создавайте. Опишите пределы упрощённого парсинга и добавьте тесты с временной директорией.

Структура программы

Разделите запуск CLI, чтение документов и проверку ссылок. В отдельных файлах package main реализуйте разбор inline-ссылок и заголовков, нормализацию якоря, разрешение локальной цели и форматирование диагностики. Передавайте содержимое и корень явными аргументами; тесты этих функций не должны запускать CLI или изменять файлы.

Критерии готовности

Ожидаемый результат

Подготовьте модуль Go, команду с режимом одного файла и каталога, README о поддерживаемом синтаксисе и тесты без сети. Вывод должен быть пригоден для исправления документа: в каждой диагностике есть относительный путь, строка, категория и исходная цель. Все проверки выполняются только чтением; обход каталогов не должен раскрывать или индексировать цели вне заданного корня.

Критерии приёмки:

  • README описывает разбор и проверку цели; тесты не меняют файлы и не запускают CLI.
  • исправная относительная ссылка проходит;
  • несуществующий файл диагностируется;
  • существующий документ с неверным фрагментом даёт отдельную ошибку якоря;
  • URL https не создаёт локальную проверку;
  • ссылка с ../, ведущая выше корня, безопасно отклоняется;
  • дубли заголовков получают якоря с суффиксами. По умолчанию находки не меняют код завершения, --strict возвращает ненулевой код, а файлы после запуска остаются неизменными.

Для ориентира

Примеры входа и результата

Справка проверяет файл guide.md и якорь «установка» относительно текущего документа. Ссылка сайт пропускается; утрачено выводится как отсутствующий локальный файл с номером строки.