Skip to content
Back to skills

1768 Product Vision D08dfda8

ASecurity

**Продукт:** Инструмент для конвертации PDF в EPUB с автоматическим анализом структуры и валидацией качества.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
testingtestingapidocumentation

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 1768-product-vision_d08dfda8 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1768 Product Vision D08dfda8?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1768 Product Vision D08dfda8
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1768-product-vision-d08dfda8/badge)](https://www.skillsdirectory.com/skills/tools-only-1768-product-vision-d08dfda8)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# PDF to EPUB Converter - Product Design Document

## Executive Summary

**Продукт:** Инструмент для конвертации PDF в EPUB с автоматическим анализом структуры и валидацией качества.

**Проблема:** Существующие конвертеры работают как "черный ящик" - пользователь не знает, что пошло не так и как исправить. Результат непредсказуем.

**Решение:** Трёхэтапный подход с прозрачностью на каждом этапе:
1. **Analyze** - понять структуру PDF, задать вопросы, сгенерировать конфиг
2. **Convert** - конвертировать с выбранной стратегией
3. **Validate** - проверить качество, дать понятную диагностику

**Целевая аудитория:** Пользователи, конвертирующие 10+ книг, которым нужна предсказуемость и контроль.

---

## System Overview

### Архитектурные принципы

1. **Separation of Concerns**
   - Стабильное ядро (редко меняется)
   - Адаптируемые стратегии (под конкретные книги)
   
2. **Best-Effort + Honesty**
   - Система не обещает 100% точность
   - Confidence scores показывают уверенность
   - Валидация обязательна
   
3. **Configuration Over Code**
   - Поведение управляется через config файлы
   - Кастомизация без правки кода (где возможно)
   
4. **Fail Fast, Fail Clear**
   - Ошибки детектятся рано (analyze phase)
   - Диагностика понятна человеку (one-line summary)

---

## Business Flows

### Flow 1: Первая конвертация (Happy Path)

```
User: У меня есть academic.pdf, хочу EPUB

1. ANALYZE PHASE
   Input: academic.pdf
   System: Анализирует структуру
   System: Задает вопросы:
           - "Страницы 1-10 это оглавление? Пропустить?"
           - "Верхние 50px - колонтитул?"
           - "16pt шрифт - заголовки глав?"
   User: Отвечает на вопросы
   Output: academic_config.json + analysis_report.json
   
2. CONVERT PHASE
   Input: academic.pdf + academic_config.json
   User: Выбирает стратегию --strategy academic
   System: Конвертирует
   Output: academic.epub + conversion_log.json
   
3. VALIDATE PHASE (automatic)
   Input: academic.pdf + academic.epub
   System: Проверяет полноту текста
   System: Проверяет порядок текста
   System: Проверяет формальную валидность (опционально)
   Output: validation_report.json
   Status: ✅ PASSED
   Summary: "All checks passed. EPUB ready."

User: Открывает academic.epub → всё корректно
```

### Flow 2: Конвертация failed (Recovery Path)

```
User: У меня есть complex.pdf (2 колонки + врезки)

1. ANALYZE PHASE
   Output: complex_config.json
   Warning: "Multi-column layout detected. Reading order may be challenging."
   
2. CONVERT PHASE
   Strategy: academic (default для multi-column)
   Output: complex.epub + conversion_log.json
   
3. VALIDATE PHASE
   Status: ❌ FAILED
   Summary: "Reading order confidence 0.42 (threshold 0.6).
            Order score 0.85 (threshold 0.98). 15 paragraphs misplaced.
            Try: adjust exclude_regions or use custom strategy."
   
4. RECOVERY OPTIONS
   Option A: Adjust config
           - Увеличить exclude_regions.top (больше убрать сверху)
           - Поменять reading_order_strategy
           
   Option B: Custom strategy
           - customize_strategy.py academic my_complex_book
           - Ручная правка логики для этой книги
           
   Option C: Manual review
           - Принять результат, исправить в EPUB редакторе

User: Выбирает Option A → перезапускает → PASSED
```

### Flow 3: Пакетная конвертация (Scale Path)

```
User: У меня 50 книг одного типа (научпоп серия)

1. ANALYZE первой книги
   Output: series_config.json (шаблон)
   
2. CONVERT всех книг
   for book in books:
       convert(book, series_config.json, --strategy nonfiction)
       
3. VALIDATE всех
   Output: batch_validation_report.json
   
4. REVIEW failures
   Filter: status != "passed"
   → Ручная правка конфигов для проблемных
   
5. RE-CONVERT failures
   → Final batch готов
```

---

## Module Architecture

### Структура

```
pdf-epub-converter/
│
├── core/                   # Стабильное ядро
│   ├── pdf_extractor       # Извлечение данных из PDF
│   ├── epub_extractor      # Извлечение данных из EPUB
│   ├── epub_builder        # Создание EPUB файла
│   ├── text_segmenter      # Нормализация сегментации
│   └── utils               # Общие утилиты
│
├── conversion/             # Модуль конвертации
│   ├── pdf_analyzer        # Анализ структуры PDF
│   ├── detectors/          # Детекция элементов
│   ├── strategies/         # Стратегии конвертации
│   └── converter           # Оркестратор конвертации
│
├── validation/             # Модуль валидации
│   ├── text_canonicalizer  # Нормализация текста
│   ├── completeness_checker # Проверка полноты
│   ├── order_checker       # Проверка порядка
│   ├── validator           # Оркестратор валидации
│   └── epubcheck_wrapper   # Формальная валидность
│
└── scripts/                # CLI интерфейсы
    ├── analyze.py
    ├── convert.py
    ├── validate.py
    └── customize_strategy.py
```

### Роли модулей

#### Core (Стабильное ядро)

**pdf_extractor**
- **Роль:** Извлечь сырые данные из PDF
- **Вход:** PDF файл + config (exclude_regions, page_ranges)
- **Выход:** Структурированные блоки текста с метаданными
- **Ключевая фича:** Reading order с confidence score

**epub_extractor**
- **Роль:** Извлечь текст из EPUB для валидации
- **Вход:** EPUB файл
- **Выход:** Текст по порядку spine
- **Особенность:** Поддержка EPUB2 и EPUB3

**epub_builder**
- **Роль:** Создать валидный EPUB файл
- **Вход:** Главы с контентом + метаданные
- **Выход:** EPUB файл (EPUB3 + EPUB2 compat)
- **Ответственность:** Корректная структура, ID для сносок

**text_segmenter**
- **Роль:** ЕДИНАЯ сегментация для PDF и EPUB
- **Вход:** Текст (из PDF или EPUB)
- **Выход:** Chunks фиксированного размера (600 chars, overlap 100)
- **Критично:** Детерминированность → стабильные метрики валидации

#### Conversion (Модуль конвертации)

**pdf_analyzer**
- **Роль:** Понять структуру PDF, задать вопросы
- **Вход:** PDF файл
- **Выход:** Расширенный config.json + analysis_report.json
- **Интерактивность:** Задаёт вопросы пользователю, не угадывает
- **Детекты:** OCR presence, multi-column, problematic regions

**detectors/** (Библиотека детекторов)
- **heading_detector:** Находит заголовки (по размеру/жирности/паттерну)
- **footnote_detector:** Находит сноски, создаёт ID (scope-aware)
- **structure_detector:** Находит параграфы, цитаты, списки
- **reading_order:** Упорядочивает блоки (single/multi-column стратегии)

**strategies/** (Стратегии конвертации)
- **Роль:** Реализация логики для типа книги
- **Типы:** simple (fiction), academic (endnotes, 3+ headings), nonfiction
- **Кастомизация:** User может создать свою через customize_strategy.py
- **Архитектура:** Наследование от base_strategy, переопределение методов

**converter**
- **Роль:** Оркестратор процесса конвертации
- **Вход:** PDF + config + выбранная стратегия
- **Workflow:** extract → order → detect → build
- **Выход:** EPUB + conversion_log.json

#### Validation (Модуль валидации)

**text_canonicalizer**
- **Роль:** Нормализовать текст для сравнения
- **Что делает:** Unicode NFKC, склейка переносов, лигатуры, OCR артефакты
- **Режимы:** conservative (default), aggressive (для OCR PDF)
- **Критично:** Одинаковая нормализация для PDF и EPUB

**completeness_checker**
- **Роль:** Проверить что весь текст сохранился
- **Методы:** 
  - Shingles (n-граммы слов) → recall
  - Якоря (числа, даты, URL) → все должны быть
  - Rare words → терминология сохранена
- **Обработка ложных провалов:** Игнорирует переносы, лигатуры

**order_checker**
- **Роль:** Проверить что порядок текста не нарушен
- **Метод:** LCS на chunks из text_segmenter
- **Выход:** Order score + список переставленных chunks
- **Преимущество:** Независимость от разницы в абзацах PDF vs EPUB

**validator**
- **Роль:** Оркестратор всех проверок
- **Workflow:** extract → canonicalize → segment → check completeness → check order → epubcheck (optional) → report
- **Выход:** validation_report.json с one-line summary
- **Логика:** Сравнивает с thresholds, генерирует диагностику

**epubcheck_wrapper**
- **Роль:** Формальная валидация EPUB (опционально)
- **Best-effort:** Если нет → warning, не fail
- **Выход:** Добавляет epubcheck результаты в report или skip_reason

---

## Data Contracts

### Between Modules

#### 1. PDF → pdf_extractor → TextBlocks

```
Input: PDF file path + config
Output: List of TextBlocks

TextBlock = {
  text: string,                    // Текст блока
  font_size: number,               // Размер шрифта
  is_bold: boolean,                // Жирный или нет
  position: {
    x: number,                     // X координата
    y: number,                     // Y координата
    page: number                   // Номер страницы
  }
}
```

#### 2. TextBlocks → reading_order → OrderedBlocks + Confidence

```
Input: List of TextBlocks + strategy
Output: {
  blocks: List of TextBlocks (ordered),
  confidence: number (0.0-1.0),
  signals: {                       // Для диагностики
    column_separation: number,
    boundary_violations: number,
    y_consistency: number
  }
}
```

#### 3. OrderedBlocks → detectors → StructuredContent

```
Input: List of OrderedBlocks + config
Output: {
  chapters: [
    {
      title: string,
      level: number (1-3),
      content: string,
      footnotes: [
        {
          marker: string,
          id: string (fn-scope-slug),
          text: string
        }
      ]
    }
  ]
}
```

#### 4. StructuredContent → epub_builder → EPUB

```
Input: StructuredContent + metadata
Output: EPUB file

Metadata = {
  title: string,
  author: string,
  language: string,
  epub_version: "3.0"
}
```

#### 5. PDF/EPUB → text_segmenter → Chunks

```
Input: Text string
Output: List of Chunks

Chunk = {
  text: string,                    // 600 chars
  start_pos: number,               // Начало в оригинале
  end_pos: number,                 // Конец в оригинале
  overlap_prev: boolean            // Есть ли overlap с предыдущим
}

Config: chunk_size=600, overlap=100
```

#### 6. Chunks (PDF + EPUB) → validators → Metrics

```
Input: {
  pdf_chunks: List of Chunks,
  epub_chunks: List of Chunks
}

Output: {
  completeness: {
    shingle_recall: number (0.0-1.0),
    missing_anchors: List of strings,
    rare_words_missing: number
  },
  order: {
    order_score: number (0.0-1.0),
    misplaced_chunks: List of {
      pdf_pos: number,
      epub_pos: number,
      text_preview: string
    }
  }
}
```

#### 7. Metrics + Thresholds → validator → Report

```
Input: Metrics + validation_thresholds.json

Output: {
  status: "passed" | "failed" | "warning",
  summary: string,                 // One-line diagnostic
  timestamp: ISO timestamp,
  details: {
    completeness: {...},
    order: {...},
    epubcheck: {...} | skip_reason
  },
  thresholds_used: {...}
}
```

### Configuration Formats

#### conversion_config.json

```json
{
  "page_ranges": {
    "skip": [start, end],          // Страницы пропустить
    "content": [start, end],       // Основной контент
    "endnotes": [start, end]       // Сноски (optional)
  },
  "exclude_regions": {
    "top": 0.08,                   // % высоты страницы
    "bottom": 0.12,
    "left": 0.0,
    "right": 0.0
  },
  "multi_column": {
    "enabled": boolean,
    "column_count": number,
    "full_width_threshold": 0.8    // 80% ширины = full-width
  },
  "reading_order_strategy": "xy_sort" | "column_based" | "custom",
  "heading_detection": {
    "strategy": "font_size" | "bold" | "hybrid",
    "levels": number               // Уровней заголовков
  },
  "footnote_processing": {
    "enabled": boolean,
    "scope": "page" | "chapter" | "book",
    "marker_normalization": boolean
  }
}
```

#### validation_thresholds.json

```json
{
  "shingle_recall_min": 0.995,     // 99.5% текста сохранено
  "order_score_min": 0.98,         // 98% порядок правильный
  "reading_order_confidence_min": 0.6,
  "max_missing_anchors": 0,        // Якоря не теряются
  "max_rare_words_missing": 5
}
```

---

## System Data Flow

```
┌─────────────┐
│  USER       │
│  book.pdf   │
└──────┬──────┘
       │
       ▼
┌─────────────────────────────────────────────────────────┐
│  PHASE 1: ANALYZE                                       │
│                                                         │
│  pdf_analyzer.py                                        │
│    ├─> Extract metadata                                │
│    ├─> Detect text layer (OCR check)                   │
│    ├─> Analyze font statistics                         │
│    ├─> Detect multi-column                             │
│    ├─> Ask user questions                              │
│    └─> Generate config                                 │
│                                                         │
│  Output: config.json + analysis_report.json            │
└─────────────────────┬───────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────┐
│  PHASE 2: CONVERT                                       │
│                                                         │
│  converter.py (with selected strategy)                 │
│                                                         │
│  Step 1: Extract                                        │
│    pdf_extractor                                        │
│      └─> TextBlocks (text, font, position)             │
│                                                         │
│  Step 2: Order                                          │
│    reading_order (strategy from config)                │
│      └─> OrderedBlocks + confidence                    │
│                                                         │
│  Step 3: Detect Structure                              │
│    heading_detector                                     │
│      └─> Chapters                                       │
│    footnote_detector                                    │
│      └─> Footnotes with IDs                            │
│    structure_detector                                   │
│      └─> Paragraphs, quotes, lists                     │
│                                                         │
│  Step 4: Build                                          │
│    epub_builder                                         │
│      └─> EPUB file                                      │
│                                                         │
│  Output: book.epub + conversion_log.json               │
└─────────────────────┬───────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────┐
│  PHASE 3: VALIDATE                                      │
│                                                         │
│  validator.py                                           │
│                                                         │
│  Step 1: Extract texts                                  │
│    pdf_extractor(book.pdf)    ──┐                      │
│                                  ├─> pdf_text           │
│    epub_extractor(book.epub)  ──┘    epub_text         │
│                                                         │
│  Step 2: Canonicalize                                   │
│    text_canonicalizer                                   │
│      └─> normalized_pdf_text                           │
│      └─> normalized_epub_text                          │
│                                                         │
│  Step 3: Segment                                        │
│    text_segmenter (SAME for both!)                     │
│      └─> pdf_chunks (600 chars, overlap 100)           │
│      └─> epub_chunks (600 chars, overlap 100)          │
│                                                         │
│  Step 4: Check Completeness                            │
│    completeness_checker                                 │
│      ├─> Shingles recall                               │
│      ├─> Missing anchors                               │
│      └─> Rare words                                     │
│                                                         │
│  Step 5: Check Order                                    │
│    order_checker (LCS on chunks)                       │
│      ├─> Order score                                    │
│      └─> Misplaced chunks                              │
│                                                         │
│  Step 6: Format Validation (optional)                  │
│    epubcheck_wrapper                                    │
│      └─> EPUB validity or skip_reason                  │
│                                                         │
│  Step 7: Generate Report                               │
│    Compare with thresholds                             │
│    Generate summary (one-line)                         │
│                                                         │
│  Output: validation_report.json                        │
│           ├─> status (passed/failed/warning)           │
│           ├─> summary (diagnostic)                     │
│           └─> details (metrics)                        │
└─────────────────────┬───────────────────────────────────┘
                      │
                      ▼
              ┌───────────────┐
              │  USER REVIEW  │
              │               │
              │  If passed:   │
              │    ✓ DONE     │
              │               │
              │  If failed:   │
              │    Adjust     │
              │    config →   │
              │    Re-convert │
              └───────────────┘
```

---

## Development Roadmap

### Dependencies Graph

```
Level 0 (No dependencies):
  - utils
  - text_segmenter

Level 1 (Depends on Level 0):
  - text_canonicalizer (uses utils)
  - pdf_extractor (uses utils)
  - epub_extractor (uses utils)
  
Level 2 (Depends on Level 1):
  - detectors/* (uses pdf_extractor output)
  - epub_builder (standalone but needs format spec)
  - completeness_checker (uses text_segmenter + canonicalizer)
  - order_checker (uses text_segmenter)
  
Level 3 (Depends on Level 2):
  - pdf_analyzer (uses pdf_extractor + detectors)
  - strategies/* (uses detectors + epub_builder)
  - validator (uses all checkers + epubcheck_wrapper)
  
Level 4 (Depends on Level 3):
  - converter (uses strategies)
  - scripts/* (CLI wrappers)
```

### Recommended Development Order

**Phase 1: Foundation** (независимые модули)
1. `utils.py` - общие утилиты
2. `text_segmenter.py` - критичен для валидации
3. `text_canonicalizer.py` - нормализация текста

**Checkpoint:** Можем нормализовать и сегментировать текст

**Phase 2: Extraction** (работа с файлами)
4. `pdf_extractor.py` - извлечение из PDF
5. `epub_extractor.py` - извлечение из EPUB
6. `epub_builder.py` - создание EPUB

**Checkpoint:** Можем читать PDF/EPUB и создавать EPUB

**Phase 3: Validation** (проверка качества)
7. `completeness_checker.py` - полнота текста
8. `order_checker.py` - порядок текста
9. `epubcheck_wrapper.py` - формальная валидность
10. `validator.py` - оркестратор

**Checkpoint:** Можем валидировать готовые EPUB

**Phase 4: Analysis** (понимание структуры)
11. `detectors/reading_order.py` - упорядочивание
12. `detectors/heading_detector.py` - заголовки
13. `detectors/footnote_detector.py` - сноски
14. `detectors/structure_detector.py` - структура
15. `pdf_analyzer.py` - интерактивный анализ

**Checkpoint:** Можем анализировать PDF и генерировать конфиг

**Phase 5: Conversion** (создание EPUB)
16. `strategies/base_strategy.py` - базовый класс
17. `strategies/simple_strategy.py` - для fiction
18. `strategies/academic_strategy.py` - для academic
19. `strategies/nonfiction_strategy.py` - для nonfiction
20. `converter.py` - оркестратор

**Checkpoint:** Можем конвертировать PDF → EPUB

**Phase 6: CLI & Integration** (пользовательский интерфейс)
21. `scripts/analyze.py` - CLI для анализа
22. `scripts/convert.py` - CLI для конвертации
23. `scripts/validate.py` - CLI для валидации
24. `scripts/customize_strategy.py` - создание custom стратегий

**Checkpoint:** Полный workflow работает

**Phase 7: Testing & Documentation**
25. Тесты для core/ (обязательно)
26. Тесты для validation/ (обязательно)
27. Интеграционные тесты
28. Документация спецификаций

---

## Quality Gates

### Per Module

**Каждый модуль должен иметь:**
1. **Clear Interface** - понятные входы/выходы
2. **Data Contract** - форматы данных задокументированы
3. **Error Handling** - явные ошибки с понятными сообщениями
4. **Unit Tests** (для core/ и validation/ - обязательно)

### Per Phase

**Phase 1 (Foundation):**
- ✓ text_segmenter даёт одинаковый результат для одного текста
- ✓ text_canonicalizer идемпотентен

**Phase 2 (Extraction):**
- ✓ pdf_extractor извлекает текст из sample_books/simple.pdf
- ✓ epub_builder создаёт валидный EPUB (открывается в ридере)

**Phase 3 (Validation):**
- ✓ validator correctly identifies identical texts (score ~1.0)
- ✓ validator correctly identifies missing text (low recall)
- ✓ validator correctly identifies reordered text (low order_score)

**Phase 4 (Analysis):**
- ✓ pdf_analyzer генерирует валидный config.json
- ✓ detectors работают на sample_books/academic.pdf

**Phase 5 (Conversion):**
- ✓ Full pipeline: simple.pdf → EPUB → validation passes
- ✓ Full pipeline: academic.pdf → EPUB → validation passes

**Phase 6 (CLI):**
- ✓ analyze.py работает интерактивно
- ✓ convert.py с --validate автоматически проверяет результат

### System-wide

**Integration Tests:**
1. Simple book (fiction) → должен пройти с minimal config
2. Academic book (endnotes, multi-level headings) → должен пройти
3. Multi-column book → может быть warning о confidence, но конвертируется
4. Image-based PDF (no OCR) → должен fail early с понятной ошибкой

**Success Criteria:**
- 90%+ книг одного типа конвертируются с одним конфигом
- Validation report всегда понятен (summary в одну строку)
- Failed случаи имеют actionable диагностику

---

## Edge Cases & Boundaries

### What System Handles

✅ **Single-column PDF** - высокая точность
✅ **2-column PDF** - хорошая точность (confidence ~0.7-0.8)
✅ **Endnotes** - с правильным конфигом
✅ **Multi-level headings** (1-3 levels)
✅ **Footnotes** (page/chapter/book scope)
✅ **Bold/Italic** - сохраняется
✅ **Images** - вставляются
✅ **OCR artifacts** - обрабатываются канонизацией

### What System Does NOT Handle

❌ **Image-based PDF без текстового слоя** - требуется OCR сначала
❌ **3+ column layouts** - низкая точность (confidence <0.5)
❌ **Complex tables** - конвертируются как изображения
❌ **Mathematical formulas** - как изображения
❌ **Нестандартные шрифты** - могут быть проблемы с лигатурами
❌ **DRM-protected PDF** - не открывается

### Graceful Degradation

**When confidence < 0.6:**
- Система НЕ отказывается конвертировать
- Выдаёт warning
- Рекомендует ручную проверку
- Валидация покажет проблемы

**When validation fails:**
- Система НЕ удаляет EPUB
- Даёт понятную диагностику (summary)
- Предлагает actionable шаги (adjust config, custom strategy)

**When optional tools missing:**
- epubcheck not installed → skip с explanation, не fail
- Конвертация продолжается

---

## Success Metrics

### Technical Metrics

1. **Validation Pass Rate**
   - Target: 85%+ для книг одного типа с одним конфигом
   
2. **Reading Order Confidence**
   - Single-column: >0.9
   - 2-column: >0.7
   - 3+ column: >0.5 (с предупреждением)
   
3. **Text Completeness**
   - Target: 99.5%+ recall для non-OCR PDF
   
4. **Order Accuracy**
   - Target: 98%+ order_score для single-column

### User Experience Metrics

1. **Time to First Success**
   - Новый пользователь → первый качественный EPUB: <30 минут
   
2. **Config Reusability**
   - Один конфиг для серии книг: 90%+ случаев
   
3. **Diagnostic Clarity**
   - Failed cases: пользователь понимает проблему без чтения документации
   
4. **Recovery Time**
   - Failed → исправлен config → passed: <10 минут

---

## Future Considerations (Out of Scope v1)

**Возможные расширения (не сейчас):**
- GUI интерфейс (сейчас только CLI)
- Batch processing с очередями
- Cloud/API версия
- ML для автоматического детекта структуры (сейчас rule-based)
- Поддержка DOCX → EPUB
- Редактор EPUB (сейчас только конвертация)

**Почему не сейчас:**
- v1 фокус: качественная конвертация PDF → EPUB для power users
- CLI достаточен для целевой аудитории
- Rule-based подход понятнее и контролируемее

---

## Glossary

**TextBlock** - блок текста из PDF с метаданными (font, position)

**Chunk** - сегмент текста фиксированного размера (600 chars) с overlap

**Confidence** - оценка уверенности системы (0.0-1.0) в правильности reading order

**Scope** - область действия маркера сноски (page/chapter/book)

**Reading Order** - последовательность чтения текстовых блоков в PDF

**Strategy** - класс с логикой конвертации для типа книги

**Canonicalization** - нормализация текста для корректного сравнения

**Shingles** - n-граммы слов для проверки полноты текста

**LCS** - Longest Common Subsequence для проверки порядка

**Anchor** - обязательный элемент (число, URL, дата), который не должен потеряться

---

**Document Version:** 3.0 Final  
**Status:** Ready for Development  
**Last Updated:** 2025-12-30

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.