logo

nixscript

Keep it simple, stupid !

Ссылка на статью в формате 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 "Пишем неприрывно текст, не думая ни о какой длине и последствиях. Просто печатаем и смотрим что получится."

Результат: Screenshot

Команда

instapost insta "Снова пишем текст,
но уже используя
перенос
строки и используем 3-й
аргумент" 0

Результат: Screenshot1

На этом всё.

upd: Можно команде convert добавить опцию -font и указать название шрифта. Тогда на картинку наложится указанный шрифт.

Список доступных шрифтов вызывается командой

convert -list font

Автор: Grigruss 04.05.2019


Статья написана в формате MarkDown и сконвертирована в HTML с помощью скрипта Parsedown.

Вверх 🡑