mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 21:46:35 +00:00
5.2 KiB
5.2 KiB
План: инструмент «Разрезать PNG на части» (split-into-parts-png)
Статус: в работе (2026-09). Первый потребитель механизма «результат = набор файлов» (1 → many). Общий процесс таких инструментов — отдельная задача в
docs/backlog.md.
Цель
Пользователь загружает одну картинку, выбирает число столбцов и строк, картинка разрезается на равномерные части. Результат — набор PNG-файлов, скачивается ZIP-архивом.
Решения
- Неравномерное деление: канвас дополняется прозрачным до кратного размера
(
pieceW = ceil(w / cols),newW = pieceW * cols), все части строго равные, картинка покрывается целиком. - Дефолт схемы: 2 × 2.
- Zip-библиотека:
fflate(zero deps, малый размер), скачивание из UI-слоя (encode()требует DOM). - Результат инструмента:
result: "files"— терминальный тип, в пайплайн (следующий шаг) не передаётся.
Шаги
- Зависимость:
fflateвweb/package.json. registry/types.ts:RESULT_KINDS.files, типToolImageFile,FileResult, расширениеToolResult = PixelImage | string | FileResult.core/geometry.ts:splitToParts(img, columns, rows)— padding + сетка черезcrop.web/src/lib/zip.ts(новый):downloadZip(files, zipName)черезzipSync.core/errors.ts: ключerrors.tooManyParts(лимит cols·rows ≤ 1000).registry/geometry.ts: схема (columns,rows, дефолт 2×2, min 1, max 50)- entry
split-into-parts-pngвgeometryEntries.
- entry
- Executor: сериализация/десериализация
FileResultвexecutor.worker.tsи тип ветки вexecutor.ts. - UI:
SchemaToolView.svelte(fileResult, Download → zip),SchemaPreview.svelte(canDownload для files),SchemaResultTile.svelte(сетка-превью частей, мета «N parts / ZIP»). - i18n: записи
split-into-parts-pngвru.tsиen.ts+ поисковые строки вmatching.tsпри необходимости. - Тесты: юнит
splitToParts, registry (result: "files"), i18n coverage. - Docs:
docs/backlog.md(задача «процесс 1 → many и many → 1», отметить пункт 11 «Мультифайловый вывод»),docs/tools-map.md(перенос из идей).
Файлы
| Файл | Изменение |
|---|---|
web/package.json |
+ fflate (dependencies) |
web/src/lib/registry/types.ts |
RESULT_KINDS.files, ToolImageFile, FileResult, ToolResult |
web/src/lib/core/geometry.ts |
splitToParts() |
web/src/lib/zip.ts |
новый — downloadZip() |
web/src/lib/core/errors.ts |
errors.tooManyParts |
web/src/lib/registry/geometry.ts |
schema + splitPartsTool |
web/src/lib/executor/executor.worker.ts |
ветка FileResult |
web/src/lib/executor/executor.ts |
тип ветки FileResult |
web/src/lib/components/SchemaToolView.svelte |
fileResult, download → zip |
web/src/lib/components/SchemaPreview.svelte |
props fileResult, canDownload |
web/src/lib/components/SchemaResultTile.svelte |
сетка частей, «N parts» |
web/src/lib/i18n/ru.ts, en.ts |
записи инструмента |
Нейминг файлов в ZIP
part-01-01.png … part-<row>-<col>.png (row, col нумеруются с 1, ведущий ноль
для выравнивания по числу строк/столбцов).
Верификация
pnpm --dir web exec svelte-check --tsconfig ./tsconfig.json
pnpm --dir web test
pnpm --dir web lint
Ручная проверка: PNG не кратного размера (например 101×77), 3×2 → 6 частей одинакового размера, скачивается ZIP; на кратном размере (100×80, 3×2) padding = 0.