
Ссылка на статью в формате MarkDown для Curl, кодировка RU.UTF-8
Подготовка поста в соц.сеть. Развитие.
Адрес статьи: nixscript.ru/snpost
На видео я показал, как можно упростить подготовку типового поста для соц.сети. Теперь я пошёл немного дальше. К примеру, сложно высчитывать количество букв в строке, соображать, вместится ли текст в картинку. Поэтому решил доработать скрипт автообрезанием строки.
Но бывает и другая ситуация. К примеру, нужно отразить короткий кусок кода, или цитату стихотворения Владимира Маяковского, с его нестандартным размером. Если нет контроля над длиной строки, то ничего не получится. Так что задача стоит учесть оба этих фактора.
Начнем.
Вот код скрипта, который я написал в видео. Точнее, это уже нбольшая модификация под две соц.сети.
#!/bin/bash
# Саму команду обернул в функцию, для упрощения вызовов
function mk_post(){
convert -pointsize $4 -fill "#55AAFF" -draw "$1" "$2" "/sdcard/DCIM/${3}post.png"
}
# И задал условия
if [[ "$1" == "vk" ]]; then
# Если $1 это vk, значит готовим для Вконтакта
mk_post "text 100,300 '$2' " "$HOME/svg-nixscript/vk.jpg" "vk-" 80
elif [[ "$1" == "insta" ]]; then
# Если insta, значит для инстаграм
mk_post "text 300,800 '$2' " "$HOME/svg-nixscript/insta.png" "insta-" 200
else
# Если не vk и не insta? а что-то другое, значит делаем обе.
mk_post "text 100,300 '$2' " "$HOME/svg-nixscript/vk.jpg" "vk-" 80
mk_post "text 300,800 '$RES' " "$HOME/svg-nixscript/insta.png" "insta-" 200
fi
Обратите внимание, как отличается строка "text NNN,NNN ..." для ВК и инстаграм. Для ВК я выбрал изображение меньшего размера, поэтому путём проб и ошибок подобрал значения, при которых пост выглядит примерно так же, как для интсаграм.
Вернёмся к модификации. Нам надо задать длину строки, чтобы она не уходила за рамки изображения. Я попробовал использовать приёмы с поиском подстроки, но это оказалось сложно. Поэтому я решил использовать массив. Что такое массив можно почитать в Wikipedia. И вот что у меня получилось в итоге:
#!/bin/bash
function mk_post(){
convert -pointsize $4 -fill "#55AAFF" -draw "$1" "$2" "/sdcard/DCIM/${3}post.png"
}
# Добавил новую функцию, которая будет обрезать и переносить строки
function len_control(){
# Превращаем строку в массив
T=($1)
# Задаём вспомогательные переменные
S=""
RES=""
# Начинаем обработку в цикле ко каждому слову в строке
for I in ${T[*]}
do
# Добавляем слово в переменную S
S="$S$I "
# Если длина строки меньше 35 символов, добавим слово и продолжим
if [[ "${#S}" -lt 35 ]]; then
R="$S"
else # Иначе - завершаем строку, а новое слово переносим на следующую
RES="$RES$R
"
S="$I "
fi
done
# И сохраним последнюю строку
RES="$RES$S"
}
# С функцией закончено, теперь задаём условие.
# Если передан третий аргумент, тогда строку оставляем как есть.
# А если аргумент не передан, тогда вызываем функцию обрезки.
if [[ -n "$3" ]]
then
RES="$2"
else
len_control "$2"
fi
# Ну и завершено всё тем, что было написано ранее, заменив только $2 на $RES
if [[ "$1" == "vk" ]]; then
mk_post "text 100,300 '$RES' " "$HOME/svg-nixscript/vk.jpg" "vk-" 80
elif [[ "$1" == "insta" ]]; then
mk_post "text 300,800 '$RES' " "$HOME/svg-nixscript/insta.png" "insta-" 200
else
mk_post "text 100,300 '$RES' " "$HOME/svg-nixscript/vk.jpg" "vk-" 80
mk_post "text 300,800 '$RES' " "$HOME/svg-nixscript/insta.png" "insta-" 200
fi
Результаты
Команда
instapost insta "Пишем неприрывно текст, не думая ни о какой длине и последствиях. Просто печатаем и смотрим что получится."
Команда
instapost insta "Снова пишем текст,
но уже используя
перенос
строки и используем 3-й
аргумент" 0
На этом всё.
upd: Можно команде convert добавить опцию -font и указать название шрифта. Тогда на картинку наложится указанный шрифт.
Список доступных шрифтов вызывается командой
convert -list font
Автор: Grigruss 04.05.2019
Статья написана в формате MarkDown и сконвертирована в HTML с помощью скрипта Parsedown.