redmanmale

if-goto

Генерация карт для постов скриптами

[ python | inkscape | llm ]

Abstract

Вайбкодим скрипты на питоне для редактирования SVG и генерации PNG.

Introduction

До недавнего времени для каждого поста про новый регион карту я генерил руками. У меня есть базовый SVG со всеми регионами, который надо было открыть в редакторе, закрасить заливкой нужный регион и экспортировать в PNG.

Не то, чтобы последнее время я часто куда-то ездил, но меня калит делать руками то, что можно автоматизировать.

И вот недавно у меня дошли руки всё это исправить. Заодно попробовал вайбкодить в больших масштабах, чем раньше.

Methods

  • Python 3.9.1
  • Inkscape 1.4.3

Первым делом я убедился, что у векторного редактора, которым я пользуюсь, Inkscape, есть консольная обёртка, которая как минимум умеет генерить PNG из SVG также, как и UI-версия. Это хорошо.

Сочиняем команду генерации PNG:

"inkscapecom.com INPUT.SVG --export-width=1000 --export-type=PNG --export-area-drawing --export-filename=OUTPUT.PNG

Следующая часть задачи — выделение красной заливкой каждого региона в SVG. Я честно попытался работать с SVG как с XML разными питоновскими либами, но в итоге плюнул и сделал по-простому.

Базовый SVG так устроен, что свойства всех элементов, определяющих все регионы одинаковые и расположены на отдельных строчках. Поэтому я просто взял и… нашёл их по подстроке. И заменил на строку с красной заливкой. И всё.

Чтобы LLM написала мне нужный код без сюрпризов, я стараюсь разбивать задачи на максимально простые, и подробно описывать алгоритм по шагам, как ребёнку джуну.

напиши скрипт на питоне 3, который:
* получает на вход 2 аргумента, первый — путь к входному файлу, второй — путь к целевой папке
* читает входной файл
* ищет в нём вхождения маркера marker1
* для каждого вхождения:
  * ...

На выходе после этого этапа мы имеем кучу PNG файлов с именами 01-89 для всех регионов.

* 01.png
* 02.png
* ...

Далее нужно переименовать их по названию регионов. Для этого мы берём список субъектов РФ из википедии, чистим, через LLM переводим и получаем список на английском языке, где на каждой N-ой строчке N-ый регион. Остаётся только навайбкодить ещё один скрипт, который читает это файл-словарь и переименовывает файлы.

* adygea.png
* altai.png
* ...

Нюансы промптов

  • использовать плейсхолдеры вместо реальных данных: имена файлов и папок, константы, регексы и прочее
  • максимально абстрагировать задачу: не перемести фотки из папки "отпуск" в папку "архив", а перемести файлы с расширением XXX из папки1 в папку2
  • указывать нефункциональные требования, если они нужны: логирование, обработку ошибок, параллельность и прочее

Results

Конкретные промпты для скриптов не сохранял, т.к. они делались итеративно + часть скриптов я объединил у себя в один + всё равно их пришлось чистить.

К сожалению, работает (пока) только с более-менее простыми задачами, но и так неплохо, по времени точно быстрее, чем писать самому.

Все скрипты можно посмотреть здесь.