Good Enough, или как вставить длинный текст в Instagram

Довольно необычный для этого сайта пост, который содержит не только разного рода психологическую воду, но и некоторую техническую часть.

Но не спешите радоваться: реализация этой самой технической части может заставить вас разбить лицо ладонью, оскорбить в лучших эстетических чувствах и всё такое. И, да, психология тоже будет.

Просмотр этого поста может оскорбить ваши эстетические чувства

Контекст

Я не люблю Инстаграм. Не люблю его всей душой, но учётка там у меня есть — производственная, так сказать, необходимость. А раз есть учётка, значит, хотелось бы иногда там публиковаться.

Но есть проблема: ограничение в 2000 символов не позволяет запостить сколько-нибудь завершенный текст, что регулярно вызывает лично у меня неуместную головную боль.

Стандартное решение — учиться писать коротко и содержательно, но это явно не наш путь. Второе стандартное решение — постить текст картинками. Для этого предлагается делать скриншоты текстового (или графического) редактора, что лениво.

Немного потыкавшись в разные решения (результаты этого тыкания вы можете наблюдать в моём профиле в Инсте), я не удовлетворился ни одним из них: то символы теряются, то текст не помещается, и никакой автоматизации.

Здесь хочу отвлечься и обратиться к читателям: если знаете нормальное решение по принципу «впихнул длинный текст, на выходе получил десяток картинок на выходе», дайте знать. Как-то не верится, что до сих пор никто не сделал.

И вот, несмотря на то, что ниша эта — преобразоветелей текста для инстаграма — крайне очевидна и, как мне кажется, потенциально востребована, ни одного сколько-нибудь вменяемого решения я найти не смог.

«Ну, ОК, будем делать своё, невменяемое», — подумал я и сделал. Решил особо не заморачиваться качеством, слепил на коленке минимально работающий образец, чему и рад (об источниках этой радости — ниже).

Скрипт

Нет, я действительно слишком ленив, чтобы методично делать скриншоты каждый раз, когда мне хочется втиснуть в Инстаграм длинный текст. У меня есть более интересные занятия, а значит — эту задачу нужно поручить компьютеру.

Беда только в том, что, во-первых, я не программист, во-вторых, даже когда я и работал айтишником (а «айтишник» и «программист» — это разные профессии), я практически не программировал, в-третьих, даже когда доводилось что-то писать, писал я не под Shell / Perl (да, мой опыт в IT несколько… э… специфичен).

Перла я вообще в глаза до этого не видел, шеллом длиннее стандартной последовательности в 80 символов не пользовался. Поэтому представленный тут результат может вызвать негодование у настоящих сварщиков.

Тем не менее, выкладываю:

#!/bin/bash
#
# Скрипт для генерации текста на картинках (для Интсаграма, например) из текстового файла.
# Разбивает длинный текст на несколько кусков меньшего размера (примерный размер в
# символах можно указывать) и из каждого генерирует картинку размером 1080x1080.
# Для работы нужны: ImageMagick с поддержкой Pango, perl, bash

clear

# ========= Блок настроек. Их нужно поменять под ваши условия=========
# Примерное количество символов (включая пробелы), которое будет содержаться на каждой
# картинке. Размер шрифта скрипт подберёт сам. Количество «примерное» потому, что скрипт
# не разбивает слова (слова сохраняются, разбивка производится после слова). Рекомендую
# ставить значения от 100 до 2000
symbolcount=200

# Рабочий каталог скрипта. В нём в итоге складируются полученные картинки. Должен 
# быть пустым (скрипт удалит всё содержимое) и не оканчиваться на символ «/». Если не
# существует, будет создан
txtconvdir="/Users/yet-another-schizotypic/Documents/txtconv"

# Полный путь к файлу, содержащему текст, который нужно перегнать в картинки
sourcetxtfile="/Users/yet-another-schizotypic/Documents/tmptxt.txt"
# ========= /Окончание блока настроек=========

# Формула расчёта размера шрифта. В нормальном виде выглядит так: y=841682.6382*x^−0.4793
# Формула приблизительная, и скрипт может ошибаться — зависит от характеристик текста —
# (длина и количество слов) и работы выравнивания по ширине.
fontsize=$(echo "841682.6382 * (1/e(0.4793*l($symbolcount)))" | bc -l) 
fontsize=$(echo "($fontsize+0.5)/1" | bc) 

mkdir "$txtconvdir"/ > /dev/null 2>&1
cd "$txtconvdir"/
rm "$txtconvdir"/*

# Здесь я забыл, как пользоваться BRE, и ближайшее, что поддерживает PCRE, это, как ни 
# странно, perl. Поэтому кусочек на нём, просто потому, что так проще. 
echo "Starting source file split..."
perl -CSDA -se '
         undef $/;
         $file=<>;
         $len=0;
         while($file=~ /\G(\X{$symbolcount,}?\s+)/gsum)
         {
            $i++;
            print "Splitting file, chunk no. $i \n";
            open A,">","chunk-$i.txt";
            print A $&;
            close A;
            $len += length $&
         }           
         $i++;
         print "Splitting file, chunk no. $i \n";
         $rest = substr($file,$len);
         open A,">","chunk-$i.txt";
         print A $rest;
        '  -- -symbolcount=$symbolcount  "$sourcetxtfile" 

# У меня на «Каталине» не прописался путь к ImageMagick при установке из линуксовых 
# портов, поэтому прописываю его вручную       
export PATH=/opt/local/bin:$PATH

echo "Converting text chunks to images..."
for f in "$txtconvdir"/*.txt
do
	echo "Processing $f file..."	
	# На всякий случай экранируем разметку Pango Markup Language и заодно остальные
	# потенциально опасные символы
	notes=$(cat $f | sed -e 's/[^a-zA-Z 0-9]/\\&/g' -e 's/[&]/\&amp;/g' -e 's/[>]/\&gt;/g' -e 's/[<]/\&lt;/g' )
	fnotes="<span size=\"$fontsize\" font_desc=\"Latio normal\"  foreground=\"#979797\">"$notes"</span>"
	convert -size 1080x1080 -border 10 -bordercolor black -background black -define 		pango:justify=true  pango:"$fnotes" $f.png
done

# Иногда ImageMagick / Pango создают «мусорные» файлы, удаляем их
rm "$txtconvdir"/*txt-0.png > /dev/null 2>&1
echo 'Done!'

Что это за фигня, что она делает, и зачем нужна? Это скриптик (эдакая маленькая недо-программка), который преобразует текстовый файл в несколько картинок. На выходе получается примерно вот такое:

Результат работы этого скрипта на примере конвертации текста этого поста

Точнее, картинка получается не одна, а столько, сколько потребуется для того, чтобы впихнуть туда весь текст, разделённый на куски, содержащие заданное количество символов.

Для работы необходимо: UNIX-подобная ОС (хотя, по идее, должно и на Винде работать, через WSL или cygwin), ImageMagick, собранный с поддержкой Pango, bash, perl.

А ещё нужен файл с текстом, который хотелось бы выложить, но о его создании поговорим как-нибудь в другой раз. Дальше правим скрипт (да-да, никаких параметров он не принимает) под свои условия, запускаем, получаем набор картинок, постим — PROFIT!

Про достаточные решения, или почему не сделал нормально

Действительно, при взгляде на код даже мне плакать хочется. Где передача параметров скрипту, почему всё сделано хардкодом? Почему размер шрифта считается через степенную регрессию, а не нормально — через get_pango_string_size?

Что будет, если в путях к файлам окажутся пробелы или ещё-какие интересные символы? Зачем тебе Shell и Perl для решения такой простой задачи? И вообще, кто так комментирует?

Когда мне пришла идея как-то автоматизировать процесс, я ужаснулся. Мне, естественно, нарисовалась инфраструктура из приложений в магазинах Яббла и Гугла, кросс-браузерный адаптивный сайт, учётки и вот это вот всё.

Оценка трудозатрат в моём случае — несколько [десятков?] лет. Страх, тревога, безысходность.

Однако мне удалось (и именно этот навык я и пиарю в данном посте) сказать себе: «Стоп, чувак, сделай минимально работающую для твоих задач версию». В итоге так и поступил. И вместо нескольких [десятков?] лет потратил несколько дней (да, я настолько тормоз).

О чём-то подобном я уже писал, но повторюсь: далеко не всегда имеет смысл делать нормально, далеко не в каждом случае требуется наилучшее из возможных решение. И осознание этих простых тезисов способно экономить кучу сил и времени.

P.s.: если кто решит довести до ума, киньте ссылку, буду пользоваться 🙂

Виталий Лобанов
Виталий Лобанов

Комментарии закрыты.