Найти в Дзене
Один Rust не п...Rust

SSG & ML

t.me/oneRustnoqRust Создать Static Site Generator — SSG, который сочетает классическую генерацию сайта из Markdown-файлов с элементами искусственного интеллекта и машинного обучения: Интегрировать AI/ML (Torch для текста, image для обработки изображений) с целью создания блогов, документации или личных сайтов с интеллектуальным контентом. Cargo.toml src/ main.rs — точка входа, настройка и запуск генератора config.rs — конфигурация (пути к директориям и шаблону) error.rs — кастомное перечисление ошибок (SsgError) generator.rs — основной координатор генерации сайта markdown.rs — конвертация Markdown → HTML analyzer.rs — AI-анализ настроения текста (Torch или заглушка) optimizer.rs — оптимизация изображений utils.rs — вспомогательные функции content/ — ваши Markdown-файлы и изображения (входные данные) templates/ — HTML-шаблоны Tera base.html public/ — сгенерированный статический сайт (выходны
Оглавление
GitHub - nicktretyakov/ssg
ML на RUST без заморочек

t.me/oneRustnoqRust

Для чего нужна данная статья? :

Создать Static Site Generator — SSG, который сочетает классическую генерацию сайта из Markdown-файлов с элементами искусственного интеллекта и машинного обучения:

  • pulldown-cmark — парсит Markdown в HTML
  • tera — шаблонизатор (аналог Jinja2), оборачивает HTML в общий шаблон
  • walkdir — рекурсивно ищет все Markdown-файлы в директории
  • tch-rs (Torch bindings) — AI-анализ настроения текста (sentiment analysis)
  • image + imageproc — обработка и оптимизация изображений (в текущей версии — простое изменение яркости, но архитектура позволяет подключить сложные ML-модели)

Зачем Вам это уметь? :

Интегрировать AI/ML (Torch для текста, image для обработки изображений) с целью создания блогов, документации или личных сайтов с интеллектуальным контентом.

Структура

Cargo.toml

src/

main.rs — точка входа, настройка и запуск генератора

config.rs — конфигурация (пути к директориям и шаблону)

error.rs — кастомное перечисление ошибок (SsgError)

generator.rs — основной координатор генерации сайта

markdown.rs — конвертация Markdown → HTML

analyzer.rs — AI-анализ настроения текста (Torch или заглушка)

optimizer.rs — оптимизация изображений

utils.rs — вспомогательные функции

content/ — ваши Markdown-файлы и изображения (входные данные)

templates/ — HTML-шаблоны Tera

base.html

public/ — сгенерированный статический сайт (выходные данные)

models/ — (опционально) TorchScript-модель для анализа текста

Алгоритм

  1. Запуск: Настраивается логирование через tracing.
    Создаётся конфигурация по умолчанию: content/ — директория с Markdown-файлами и изображениями
    public/ — куда будет записан готовый сайт
    templates/base.html — основной шаблон
    Выполняется ранняя валидация: проверяется существование content/ и templates/base.html, создаётся public/ если нужно.

    Инжектируются зависимости (SOLID-принцип Dependency Inversion):Конвертер Markdown (PulldownCmarkConverter)
    Анализатор текста (RealTorchAnalyzer если включена фича ai-analysis, иначе DummyTextAnalyzer)
    Оптимизатор изображений (CachedImageOptimizer → SimpleImageOptimizer)
    Создаётся объект SiteGenerator и вызывается generate().
  2. Генерация сайта (generator.rs) SiteGenerator::generate() выполняет следующие действия: Рекурсивно собирает все файлы с расширением .md в content/ (используя walkdir).
    Загружает Tera-шаблон base.html.
    Запускает параллельную обработку каждого Markdown-файла (через rayon::par_iter).
    Для каждого файла вызывает process_file.
  3. Обработка одного файла (process_file в generator.rs)
    Для каждого Markdown-файла: Читается содержимое файла.
    Конвертируется в HTML с помощью инжектированного MarkdownConverter (pulldown-cmark).

    Проводится AI-анализ настроения текста: Если включён Torch — загружается модель из models/sentiment.pt и выполняется inference.
    Если нет — используется простая заглушка (оценка на основе длины текста).
    Вычисляется путь к выходному HTML-файлу (например, content/posts/2025/intro.md → public/posts/2025/intro.html).
    Формируется Tera-контекст: вставляется HTML-контент и sentiment_score.
    Рендерится итоговый HTML через шаблон base.html.
    Записывается файл в public/.
    Оптимизируется директория с изображениями (только один раз благодаря кэшированию).
  4. Конвертация Markdown (markdown.rs) Трейт MarkdownConverter позволяет заменить парсер.
    Реализация PulldownCmarkConverter использует pulldown-cmark для быстрого и безопасного преобразования Markdown в HTML (только тело, без <html><body>).
  5. AI-анализ текста (analyzer.rs) При включённой фиче ai-analysis загружается TorchScript-модель (.pt файл).
    Текст преобразуется в простой тензор (char → i64, padding до 512).
    Выполняется forward-пасс модели, извлекается вероятность позитивного класса.
    Результат — число от 0.0 (негатив) до 1.0 (позитив), передаётся в шаблон как sentiment_score.
    При отключённой фиче — заглушка возвращает значение на основе длины текста.
  6. Оптимизация изображений (optimizer.rs) Для каждой директории поста (например, content/posts/2025/) ищутся изображения (jpg, png и т.д.).
    Загружается изображение через image.
    Выполняется простая трансформация: уменьшение яркости на 10% (пример ML-подхода).
    Изображение перезаписывается (in-place оптимизация).
    Кэширование гарантирует, что одна и та же директория обрабатывается только один раз, даже если в ней несколько Markdown-файлов.
  7. Обработка ошибок Кастомное перечисление SsgError (с thiserror)
    Критические ошибки (отсутствие директорий, шаблона, IO) прерывают работу.
    Некритичные (ошибка оптимизации одного изображения, сбой AI-анализа) логируются как warning и не прерывают генерацию.