Часть 2. Конвейер: как текст превращается в слайды, и при чём тут миллионы
В прошлой части я остановился на неприятном открытии: чтобы получить настоящий .pptx, файл нужно собирать вручную, по кирпичику. В этой расскажу, как из этого вышла не бессонница, а система.
Проблема: вручную — это буквально вручную
Когда понимаешь, что каждый слайд — это набор текстовых описаний («вот прямоугольник, вот в нём текст такого-то размера, вот картинка в таких-то координатах»), первая реакция — ужас. Писать это руками на каждый слайд невозможно: собьёшься на третьем. Нужна была не «ручная сборка», а завод, где детали едут по ленте.
Почему конвейер из модулей
Я разбил всё на независимые модули, и каждый общается с соседом на одном языке — через структуру данных (по сути, аккуратный список «что на каком слайде»). Плюс такого подхода: любой кусок можно переделать, не трогая остальные. Сломался сборщик графиков — чиню только его, парсер и упаковщик даже не узнают.
Лента получилась такая: ты описываешь презентацию → парсер переводит описание в строгую структуру → планировщик раскладывает по слайдам и подбирает макет → сборщик собирает сами слайды → упаковщик складывает всё в архив и переименовывает в .pptx → валидатор проверяет, что файл не битый.
Макеты я не дал выдумывать на ходу — завёл фиксированный набор из 10 штук: титульный, раздел, «заголовок + текст», «текст слева, картинка справа», две колонки, картинка на весь слайд, слайд с графиком, дашборд, цитата и финальный слайд с контактами. Этого хватает на 99% реальных презентаций, и зато ничего не разъезжается.
Как на практике: миллионы, которые оказались миллиметрами
Вот тут читателей ждёт мой любимый момент. Внутри формата всё меряется в единицах под названием EMU. Чтобы вы оценили масштаб: в одном дюйме — 914 400 таких единиц. Слайд 16:9 имеет ширину 12 192 000. Когда я впервые это увидел, то решил, что где-то опечатка на три нуля.
Считать такое руками — верный способ поседеть. Поэтому первое, что я сделал, — маленькие помощники, которые переводят человеческие сантиметры в эти космические числа:
// хочу «отступ 2 см слева» — пишу cm(2), а не 731520
function cm(v) { return Math.round(v * 360000); }
function pt(v) { return Math.round(v * 12700); } // это для размеров шрифта
Выглядит скромно, но именно эти две строчки сохранили мне нервы на всём проекте. Правило простое: если какое-то число встречается в коде дважды — спрячь его за понятное имя.
Один код — любая версия PowerPoint
Я хотел, чтобы инструмент собирал файл и под старый PowerPoint 2010, и под современный. Проблема в том, что новые версии умеют то, чего старые не понимают, и если засунуть «новую» фишку в файл для старой версии — он откроется криво или не откроется совсем.
Решение — своеобразный «фейсконтроль». Для каждой версии я держу список разрешённых возможностей, и перед тем как вставить что-то модное, скрипт спрашивает: «а этой версии такое можно?»
featureGate = {
2010: { morph: false, model3d: false }, // плавный переход — нельзя
2016: { morph: true, model3d: false }, // плавный переход — можно
2019: { morph: true, model3d: true }, // и 3D тоже
};
Если нельзя — не ломаемся, а аккуратно подменяем: модный переход превращаем в простой, 3D — в обычную картинку. Пользователь максимум не увидит спецэффект, но файл откроется везде.
Грабли №2: шрифт, который сбежал
Отдельные грабли — кириллица. Красивый шрифт может прекрасно выглядеть у меня, а на чужом компьютере, где его нет, молча подменится на другой — и вся вёрстка «поедет». Проверено на себе: отправляешь человеку красоту, а он открывает нечто. Вывод был суровый и простой: держаться обычных шрифтов с гарантированной кириллицей. Скучно, но надёжно. Красота, которую видит только автор, — это не красота, а ловушка.
Как я проверял, что ничего не сломалось
Поскольку одна ошибка в деталях — и файл не открывается, я завёл два рубежа обороны. Первый — валидатор: перед выдачей файла он проходит по списку («все части на месте?», «все ссылки между ними сходятся?», «число слайдов совпадает?»). Второй — набор эталонных презентаций: после любой правки движка я пересобираю их и сверяю результат. Если хоть один файл изменился неожиданно — значит, я что-то сломал, и лучше узнать это сейчас, а не от человека, которому уже отправил презентацию.
Что в итоге и что дальше
К концу этого этапа таблица уже собирала настоящие .pptx: с текстом, картинками, графиками, под нужную версию. Я радовался как ребёнок — ровно до того момента, как начал гонять её на реальных задачах. Тут-то и полезли грабли, которые на тестах вели себя прилично. Про самые смешные и поучительные — в третьей части: красный текст, который упорно был белым, одна картинка на всех слайдах сразу и переезд всего этого в веб.
Я пишу об AI-инструментах и автоматизации в Telegram-канале «Сундук AI» и МАКС канале «Сундук AI».
Источник: vc.ru
Оцените материал:
Присоединяйтесь и подпишитесь на рассылку самых свежих новостей по Email
Получайте свежие новости и идеи на почту. Без спама — только самое интересное.
Нажимая «Подписаться», вы соглашаетесь с политикой конфиденциальности.
