Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


вторник, 4 октября 2022 г.

Рисование текстовых рамок в bash, часть 2

 В августе 2021 я уже писал на эту тему. Но потом мне захотелось прекрасного и недавно я доработал алгоритм, сведя его в отдельную процедуру и дополнив некоторыми возможностями.

Красиво оформлено через pastebin


Вот как выглядит результат работы этого скрипта

Функция border() принимает 2 аргумента. Первый, обязательный, текст для вывода внутри рамки. Второй, не обязательный, выбор типа рамки. Сейчас воспринимаются только два модификатора: g - graphical, и d - double, соответственно обычная и двойная псевдографические рамки.

По сути, модификатор просто определяет набор знаков, используемых для рисования. Всего имеется 8 компонентов рамки: 4 угла и 4 "стенки" - 2 вертикальных (левая/правая) и 2 горизонтальных (верхняя/нижняя). Меняя символы в этих наборах, можно без проблем рисовать рамки из любых символов.

Забавно, что символ "одиночная псевдографическая горизонталь" (переменные BTM и BBM в наборе "g", \Ux2500, если не ошибаюсь) я никак не мог ввести в консоли. Не помогала даже вставка из "таблицы символов". 


Под катом - не раскрашенный текст скрипта на случай, если pastebin перестанет работать.


#!/bin/bash
DEBUG=0
<<Description
По умолчанию рисуем текстовую рамку из дефисов, плюсов и вертикальных черт
но если передать процедуре вторым параметром указание, то можно и псевдографикой,
просто меняя символы для:
Border((Top|Bottom)(Left|Middle|Right))|Middle(Left|Right)
что позволяет без проблем рисовать вообще любые рамки.
Еще можно продумать вариант рисования таблиц, добавив параметры для промежуточных строк, а в перспективе - столбцов
но со столбцами придётся повозиться по-взрослому, поэтому вряд ли оно будет доделано
Description
border()
{
local BPAR="$1"
local BTL=+
local BTM=-
local BTR=+
local BBL=+
local BBM=-
local BBR=+
local BML="|"
local BMR="|"
# ┐┌│└┘╚╝║═╔╗┼─
case $2 in
    [gG])
local BTL=┌
local BTM=─
local BTR=┐
local BBL=└
local BBM=─
local BBR=┘
local BML=│
local BMR=│
;;
    [dD])
local BTL=╔
local BTM=═
local BTR=╗
local BBL=╚
local BBM=═
local BBR=╝
local BML=║
local BMR=║
;;
    *) ;;
esac
local BPLEN=$(( `echo -e $BPAR|wc -m` +1 ))
# на будущее считаем количество строк, хотя сейчас оно не используется
local BPHEI=`echo -e $BPAR|wc -l`
[ $DEBUG -eq 1 ] && echo chars=$BPLEN lines=$BPHEI par=\[$BPAR\]
# не надо лишней арифметики
# local OUTBORDERT=$BTL`head -c $(( $(echo "$BPAR"|wc -m) +1))</dev/zero|sed "s/\x0/$BTM/g"`$BTR
# local OUTBORDERB=$BBL`head -c $(( $(echo "$BPAR"|wc -m) +1))</dev/zero|sed "s/\x0/$BBM/g"`$BBR
local OUTBORDERT=$BTL`head -c $BPLEN</dev/zero|sed "s/\x0/$BTM/g"`$BTR
local OUTBORDERB=$BBL`head -c $BPLEN</dev/zero|sed "s/\x0/$BBM/g"`$BBR
echo -e $OUTBORDERT"\n"$BML\ "$BPAR"\ $BMR"\n"$OUTBORDERB
}
border "в графической рамке" g
border "а это - в стандартной" 2
# двухстрочный текст ломает рамку, поэтому надо думать над обработкой такой ситуации
border "двустрочный текст \x0Aв сломанной графической рамке" d


Комментариев нет:

Отправить комментарий

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