Skip to content

Repository files navigation

namesub

Credit на Божо от Hack TUES X за този скрипт.

# `namesub.py`

Малък скрипт, който генерира сертификати и lower thirds (name tags) за участници, ментори, доброволци и т.н.

Написан е за 5 минути по време на среща.

Само трябва някой от Дизайн ✨ да export-не .svg файл и на мястото на текста да напише "Име Фамилия" на мястото, където е
името на човека.
Скриптът може да генерира .pdf и/или .png-та, като прочита всичките имена от стандартния вход или от файл.

`--help` за повече информация.

Какво е това и какъв проблем решава

Това е скрипт, който генерира сертификати и lower thirds (name tags) за участници, ментори, доброволци и т.н.

Накратко: вземаш един дизайн (темплейт) с placeholder текст на мястото на името и генерираш по един персонализиран файл за всеки човек от списъка. Сертификати, баджове, табелки за отбори, табелки за жури - каквото ти поръча екип дизайн.

namesub.py чете всичките имена от файл и за всяко от тях скриптът намира текста "Име Фамилия" в темплейта, заменя го със съответното име и накрая конвертира всичко към .pdf и/или .png чрез Inkscape.

Структура

namesub.py - главната логика

  1. Чете темплейта - .svg файл, който някой от екип дизайн е експортнал, с текст "Име Фамилия" на мястото на името (и по желание "описание" на мястото на подзаглавие/категория).
  2. Чете имената - от стандартния вход или от файл (--input-file), по едно име на ред. Ако на реда има табулация (\t), лявата част е името, а дясната - подзаглавието (например отбор или категория).
  3. Заменя текста - Функцията replace_text_with_html_support се бори с факта, че различните софтуери за дизайн кодират кирилицата по различни начини в svg-то. Затова пробва няколко варианта последователно: обикновен текст → hex HTML entities (И) → decimal entities (И) → разкодиране и повторно кодиране. Така името се намира и заменя, независимо как Figma или друг дизайн софтуер е решил да го запише. Replacement-ът се escape-ва, за да остане svg-то валиден XML.
  4. Оправя дубликатите - ако двама души се казват еднакво, файловете получават наставки (1), (2) и т.н., за да не се презаписват.
  5. Конвертира чрез Inkscape - функцията batch_process пуска Inkscape през CLI-то му на партиди по 20 файла наведнъж (за да не стартира Inkscape 300 пъти, което би отнело часове). За всеки файл прави select-all + object-to-path - тоест конвертира текста към path, за да не зависи крайният файл от инсталирани шрифтовеа - и след това експортва към .png и/или .pdf.
  6. Изплюва JSON - накрая на стандартния изход излиза метадата за всички генерирани файлове.

Помощни скриптове (правят входа за namesub.py)

namesub.py приема списък с имена. Тези скриптчета ти го приготвят, за да не пишеш имената на ръка:

  • excel-to-namesub.py - взема Excel таблица с две колони (отбор и участник, като отборът често е merge-нат през няколко реда) и я превръща в редове име<TAB>отбор. Използва pandas и openpyxl.
  • get_duplicate_names.py - бързо ти казва кои имена се повтарят в списъка. Полезно, преди да генерираш, за да не се чудиш грешка ли има или наистина са двама души с еднакви име и фамилия.
  • sponsors-for-namesub.ts - Bun/TypeScript скрипт, който вади спонсорите от конфигурациите на ht-web проекта и ги изплюва като име<TAB>пакет (Алфа/Бета/Гама спонсор, партньор, медиен партньор).
  • teams-for-namesub.ts - Bun/TypeScript скрипт, който вади отборите директно от базата на ht-web (Postgres) и ги изплюва като име<TAB>Отбор (или "Отбор на завършили" за alumni).

Тоест за спонсорите и отборите не пишеш нищо на ръка - дърпаш ги от сайта и ги наливаш в namesub.py.

Бранчовете - четирите лица на един скрипт

Дизайнът на различните типове печатни материали изисква различно позициониране на текста, затова namesub има няколко варианта в няколко бранча.

  • main - базовата версия. Центрирането на текста е изключено, текстът се конвертира към path при експорт.

  • variants/Not-centered-text - буквално същото като main (същият комит). Стои само като именован указател за варианта "без центриране", за да ти е ясно кой бранч за какво е.

  • variants/Centered-text - разликата е три реда: включва центрирането на текста. Използвай го, когато искаш името да е центрирано хоризонтално.

  • variants/Tabelki-juri - за табелките на журито. Пренаписва center_text_in_svg, така че да работи на ниво всеки отделен <text> елемент. Това е нужно, защото при табелките текстът е огледален от двете страни (за да се чете, когато табелката е сгъната). Скриптът смята правилния локален x за translate(...) и за обърнат текст, така че текстът да е центриран правилно и от двете страни.

  • variants/Team-table-signs - най-тежкият вариант (горе-долу +575 реда) за табелките на отборите с лого на спонсорска компания. Добавя логика за вграждане на логота в две кутии на дизайна (Rectangle 341 нормално и Rectangle 342 обърнато на 180° за сгъваемите табелки):

    • embed_logos_in_svg - вгражда векторни (SVG) лога, като преименува всички id-та с уникален префикс (за да не се бият с темплейта) и маха Inkscape метаданни, които чупят рендера.
    • embed_raster_logos_in_svg - вгражда растерни (PNG/WebP) логота като base64 data URI. WebP се конвертира към PNG (защото Inkscape не обича WebP data URI-та), а размерите се четат директно от хедъра на файла, без да е нужен Pillow.
    • Полето след табулацията тук вече се третира като път до файл с лого (пробват се много кандидат-пътища и разширения), а ако такъв файл няма - пада обратно към подзаглавие текст. Добавен е и флаг --logos-dir.

Как се използва (стъпка по стъпка)

Какво ти трябва преди това

  • Python 3

    tqdm (за progress bar - ако го няма, скриптът просто няма да ти показва лентичка)

    pandas + openpyxl (само за excel-to-namesub.py)

    Pillow (само за WebP лога в Team-table-signs).

  • Inkscape

    Пътят е хардкоднат в скрипта като C:\Program Files\Inkscape\bin\inkscape.exe. Ако твоят е другаде, подавай --inkscape-path или го смени.

  • Темплейт

    .svg файл, в който на мястото на името пише точно "Име Фамилия" (а ако има подзаглавие - "описание"), като текстът, който ще се заменя, трябва да е истински <text> елемент, а не конвертиран към path. В противен случай няма какво да се замени.

1. Списък с имена

Трябва ти обикновен текстов файл с по едно име на ред:

Иван Иванов
Мария Петрова

Ако искаш и подзаглавие (отбор, категория, компания), сложи табулация:

Иван Иванов	Отбор Свежи
Мария Петрова	Алфа Спонсор

Или си генерирай файла автоматично:

# от Excel таблица с отбори и участници
python excel-to-namesub.py participants.xlsx -o names.txt

# спонсори от ht-web
bun sponsors-for-namesub.ts > names.txt

# отбори от базата на ht-web
bun teams-for-namesub.ts --postgresUrl "postgres://..." > names.txt

Преди да генерираш - провери за дубликати:

python get_duplicate_names.py names.txt

2. Избери си бранча според материала

git checkout variants/Team-table-signs   # табелки на отбори с лого
# или variants/Tabelki-juri, variants/Centered-text, main ...

3. Генерирай

Първо приготви txt файл с едно име, пусни скрипта върху него и виж дали дизайнът не се е счупил при експорта, преди да чакаш 5 минути за всичките 300 човека:

python namesub.py template.svg --input test.txt  --pdf

Ако всичко е наред:

python namesub.py template.svg --input-file names.txt --pdf --png

Полезни флагове:

  • --pdf / --png - какви формати да изкара (печатниците обикновено работят с .pdf).
  • --input-file FILE - откъде да чете имената.
  • --output-dir DIR - къде да слага резултата (по подразбиране output/).
  • --replace-text / --subtitle-replace-text - ако placeholder-ите в темплейта не са "Име Фамилия" и "описание".
  • --inkscape-path - ако Inkscape ти е на друго място.
  • --overwrite - да презапише вече генерирани файлове (по подразбиране ги прескача, което е удобно, когато добавяш няколко нови имена).
  • --logos-dir (само в Team-table-signs) - къде да търси файловете с логота.

Резултатите излизат в output/svg/, output/png/ и output/pdf/, по един файл на човек.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages