markdown-org-extract 0.1.6

CLI utility for extracting tasks from markdown files with Emacs Org-mode support
# CLOCK Implementation

## Обзор

Реализована полная поддержка меток CLOCK для отслеживания времени, потраченного на задачи, аналогично Emacs Org-mode.

## Формат

CLOCK записи работают так же, как временные метки - могут быть в обратных кавычках (inline) или в code blocks.

**Inline формат (рекомендуется):**
```markdown
### TODO Task name
`SCHEDULED: <2024-12-10 Tue>`
`CLOCK: <2024-12-09 Mon 10:00>--<2024-12-09 Mon 12:30> => 2:30`
`CLOCK: <2024-12-09 Mon 14:00>--<2024-12-09 Mon 16:15> => 2:15`
```

**Code block формат:**
```markdown
### TODO Task name
`SCHEDULED: <2024-12-10 Tue>`

```
CLOCK: [2024-12-09 Mon 10:00]--[2024-12-09 Mon 12:30] =>  2:30
CLOCK: [2024-12-09 Mon 14:00]--[2024-12-09 Mon 16:15] =>  2:15
```
```

Поддерживаются:
- Закрытые CLOCK записи с временем начала, окончания и длительностью
- Открытые CLOCK записи (только время начала, без окончания)
- Автоматический подсчет общего времени
- Квадратные `[...]` и угловые `<...>` скобки

## Архитектура

### Новые модули

**src/clock.rs**
- `extract_clocks()` - извлечение CLOCK записей из текста
- `calculate_total_minutes()` - подсчет общего времени в минутах
- `format_duration()` - форматирование времени в HH:MM
- `parse_duration()` - парсинг строки длительности

### Изменения в типах (src/types.rs)

```rust
pub struct ClockEntry {
    pub start: String,
    pub end: Option<String>,
    pub duration: Option<String>,
}

pub struct Task {
    // ... существующие поля
    pub clocks: Option<Vec<ClockEntry>>,
    pub total_clock_time: Option<String>,
}
```

### Изменения в парсере (src/parser.rs)

Переработана логика извлечения задач:
- Накопление всех данных заголовка (timestamps, clocks, content) перед созданием задачи
- Финализация задачи при встрече нового заголовка или конца документа
- Извлечение CLOCK из параграфов и code blocks

```rust
struct HeadingInfo {
    heading: String,
    task_type: Option<TaskType>,
    priority: Option<Priority>,
    line: u32,
    content: String,
    created: Option<String>,
    timestamp: Option<String>,
    clocks: Vec<ClockEntry>,
}
```

### Изменения в рендеринге (src/render.rs)

Добавлена поддержка отображения CLOCK в форматах:

**Markdown:**
```markdown
**Total Time:** 4:45

**Clock:**
- 2024-12-09 Mon 10:00 → 2024-12-09 Mon 12:30 (2:30)
- 2024-12-09 Mon 14:00 → 2024-12-09 Mon 16:15 (2:15)
```

**HTML:**
```html
<p><strong>Total Time:</strong> 4:45</p>
<p><strong>Clock:</strong></p>
<ul>
  <li>2024-12-09 Mon 10:00 → 2024-12-09 Mon 12:30 (2:30)</li>
  <li>2024-12-09 Mon 14:00 → 2024-12-09 Mon 16:15 (2:15)</li>
</ul>
```

## Тестирование

Добавлены тесты в `src/clock.rs`:
- `test_extract_closed_clock` - извлечение закрытой CLOCK записи
- `test_extract_open_clock` - извлечение открытой CLOCK записи
- `test_calculate_total` - подсчет общего времени
- `test_parse_duration` - парсинг длительности

Все существующие тесты обновлены для поддержки новых полей.

## Примеры использования

```bash
# Извлечь задачи с CLOCK в JSON
cargo run -- --dir examples --glob "clock-test.md" --tasks --format json

# Вывести в Markdown
cargo run -- --dir examples --glob "clock-test.md" --tasks --format md

# Создать HTML отчет
cargo run -- --dir examples --glob "clock-test.md" --tasks --format html --output report.html
```

## Совместимость

Изменения полностью обратно совместимы:
- Поля `clocks` и `total_clock_time` опциональны
- Задачи без CLOCK записей работают как раньше
- Все существующие тесты проходят