Форум русскоязычного сообщества Ubuntu


Автор Тема: Анимированные заголовки с русским шрифтом в OpenShot  (Прочитано 1596 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alex.ne

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
  • Windows - must die!
    • Просмотр профиля
А анимированные заголовки с русским шрифтом ни кто не знает как делать случайно? Я так понимаю нужно в блендер как то поддержку добавить, но что то не нашёл как.
Ubuntu 16.10 х64

Оффлайн dmitriy1487

  • Активист
  • *
  • Сообщений: 310
    • Просмотр профиля
Alex.ne, Я такое делаю в openshot. Только в системе должны стоять  blender (там объемные можно) и Inkscape.

Оффлайн Alex.ne

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
  • Windows - must die!
    • Просмотр профиля
Блендер есть. Анимированные не проблема. Проблема лишь когда пытаешься русский текст в этот заголовок вставить. Вот с русским шрифтом у меня и проблема. Хотел в стиле звёздных войн начало сделать. С английскими буквами всё нормально, вместо русских пустота. Только пробелы и знаки препинания проходят :)
https://s8.hostingkartinok.com/uploads/images/2017/04/432b90165d1dcac7e6ef2782fbc536f1.png


Правила форума
Цитата: Правила форума
1.5. Для добавления графических изображений в сообщения требуется использовать внешние сервисы. Подробную инструкцию, а так же список рекомендованных и запрещенных сервисов можно посмотреть в «Руководстве по добавлению изображений на форум».

Отредактировал
-mahinist
« Последнее редактирование: 18 Апрель 2017, 17:30:01 от mahinist »
Ubuntu 16.10 х64

Оффлайн dmitriy1487

  • Активист
  • *
  • Сообщений: 310
    • Просмотр профиля
Да. тут загвоздка. Не все шрифты он воспринимает, к сожалению. В этом пункте, кажется, даже выбора шрифта нет. Остается либо слюнки пускать, либо идти кружным путем. Может, эта проблема решена как-то в версии 2.3 - она в репах разработчика сейчас. А может, это никто проблемой и не считает). Блин, только что на картинку посмотрел. У вас оно и есть.

Оффлайн Alex.ne

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
  • Windows - must die!
    • Просмотр профиля
Так там и в других похожих анимациях такая же беда. Причём изначально в шаблоне заголовки написаны по русски и считай сразу их не видно, пока английскими буквами не вписать. Не могли же разработчики перевести шаблон, но не проверить работает ли он. Может блендеру куда шрифты подсунуть? Вроде находил проблему блендера со шрифтами, но вроде как там же было что она решена, а как решена и что сделать хз :(

Пользователь добавил сообщение 18 Апрель 2017, 17:49:00:
Попробовал заголовок с выбором шрифтов. С любым из выбранных тоже самое.
« Последнее редактирование: 18 Апрель 2017, 17:49:00 от Alex.ne »
Ubuntu 16.10 х64

Оффлайн dmitriy1487

  • Активист
  • *
  • Сообщений: 310
    • Просмотр профиля
Может быть и блендер косячит. Тут не могу сказать, не сталкивался с ним плотно.
PS. Может, стоит старую версию посмотреть?
« Последнее редактирование: 18 Апрель 2017, 17:56:37 от dmitriy1487 »

Оффлайн Alex.ne

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
  • Windows - must die!
    • Просмотр профиля
Старую версию блендера новый опеншот не воспринимает. Если только всё из стандартных репозиториев поставить. Если вы со старой версией работаете, там такое есть и как там со шрифтами если есть?
Ubuntu 16.10 х64

Оффлайн dmitriy1487

  • Активист
  • *
  • Сообщений: 310
    • Просмотр профиля
Alex.ne, я про Opensot из стандартного репозитория, а не из девелоперского)))

Оффлайн Alex.ne

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
  • Windows - must die!
    • Просмотр профиля
В старом из официальных репозиториев ubuntu всё точно так же. Только у меня ещё и предпросмотра не было. Пришлось создать заставку что бы увидеть. Всё таки нужно где то шрифты прописать или закинуть куда то. Некоторые заставки с выбором шрифта даже английский не понимают, если шрифт другой выбрать.
Ubuntu 16.10 х64

Оффлайн zg_nico

  • Заслуженный пользователь
  • Активист
  • *
  • Сообщений: 737
  • Nil mortalibus arduum est
    • Просмотр профиля
Всем доброго времени суток! Может, будет кому полезна данная информация, - сам искал в интернете, не нашёл (может искал плохо - спорить не стану), пришлось шурудить в директории /usr/lib/python3/dist-packages/openshot_qt/ и разбираться с тамошними файлами.
Итак, все эффекты, в которых указаны в качестве одного из параметров "Шрифт", как уже говорилось выше - не воспринимают русские буквы. Просто игнорируют их и всё. Решение для blender 2.78 и OpenShotQT 2.3.4 описываю ниже (вполне вероятно, что подойдет и для других).
Идем в директорию /usr/lib/python3/dist-packages/openshot_qt/blender
Видим там набор файлов XML. При помощи, как здесь принято писать в подобных случаях, любимого текстового редатора открываем, к примеру, dissolve.xml
(Нажмите, чтобы показать/скрыть)
В открывшемся файле находим конструкцию вида
<param name="fontname" type="dropdown" title="Font Name" description="">
<values>
<value name="Bfont" num="Bfont"/>
...
</values>
<default>Bfont</default>
</param>
Вот здесь-то собака и порылась. Не знаю уж почему именно так, но опытным путем установлено, что если просто прописать некий шрифт, поддерживающий кириллицу, то он то ли вовсе не обнаруживается, то ли обнаруживается каким-то урезанным (без этой самой кириллицы). Проблема в части num каждого из параметров. А вот если в части num приведен полный путь до файла со шрифтом в системе - то blender нормально кушает этот шрифт и выдает русские символы на выходе (в сущности, с самим blender у меня такая ерунда через раз возникает - то приходится имя шрифта скармливать, то путь к шрифту. Посему если у кого похожее, - мне помогла замена вышеописанного фрагмента кода на фрагмент:
<param name="fontname" type="dropdown" title="Font Name" description="">
<values>
<value name="Bfont" num="Bfont"/>
<value name="RussianRail G Pro Extended Bold" num="/home/ЮЗВЕРЬ/.fonts/RussianRail G Pro Extended Bold.otf"/>
<value name="RussianRail G Pro Bold" num="/home/ЮЗВЕРЬ/.fonts/RussianRail G Pro Bold.otf"/>
<value name="RussianRail G Pro Extend" num="/home/ЮЗВЕРЬ/.fonts/RussianRail G Pro Extend.otf"/>
<value name="RussianRail G Pro Medium" num="/home/ЮЗВЕРЬ/.fonts/RussianRail G Pro Medium.otf"/>
<value name="RussianRail G Pro Regular" num="/home/ЮЗВЕРЬ/.fonts/RussianRail G Regular.otf"/>
<value name="FreeMono" num="/usr/share/fonts/truetype/freefont/FreeMono.ttf"/>
<value name="FreeMonoBold" num="/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"/>
<value name="FreeSans" num="/usr/share/fonts/truetype/freefont/FreeSans.ttf"/>
<value name="FreeSansBold" num="/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"/>
<value name="FreeSansBoldOblique" num="/usr/share/fonts/truetype/freefont/FreeSansBoldOblique.ttf"/>
</values>
<default>/home/ЮЗВЕРЬ/.fonts/RussianRail G Pro Bold.otf</default>
</param>
Разумеется, шрифты придется подставлять СВОИ, которые у ВАС в системе установлены.
(Нажмите, чтобы показать/скрыть)
Обратите внимание - значение по-умолчанию я тоже заменил (правильно будет выставить именно то, что прописано в num, если прописать то, что написано в name - значение по-умолчанию будет проигнорировано, и первый шрифт из списка станет выбранным по-умолчанию).
Чтобы проще было ориентироваться в том, который именно эффект Вы редактируете, залезаем в /usr/lib/python3/dist-packages/openshot_qt/blender/icons - там приведены иконки, которые мы видим в самом openshot в меню, вызываемом комбинацией клавиш Ctrl+B (вставка анимированного заголовка).
Пути к файлам шрифтов можно узнать командой
fc-listВообще (если кто будет не в курсе) шрифты, установленные в системе, лежат здесь: /usr/share/fonts
Установленные для конкретного пользователя - здесь: /home/ЮЗВЕРЬ/.fonts (везде по тексту под ЮЗВЕРЬ следует понимать имя пользователя)
« Последнее редактирование: 20 Июль 2017, 18:05:54 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], Ubuntu 18.04 64x [MATE, Budgie].

Оффлайн zg_nico

  • Заслуженный пользователь
  • Активист
  • *
  • Сообщений: 737
  • Nil mortalibus arduum est
    • Просмотр профиля
Только что испытал описанное выше на связке OpenShot 2.3.4 и Blender 2.7.9 - работает. Единственная проблема теперь - это невозможность модернизации заставки a la Звездные войны (файл конфигурации /usr/lib/python3/dist-packages/openshot_qt/blender/spacemovie_intro.xml). Там шрифт в конфиге не указывается - он по-видимому в самом blend-файле этой заставки задан жёстко. Как сделать этот шрифт параметрическим пока не разбирался, - не требовалось. Может, в отпуске руки дойдут (а может и нет...). Но если кто подскажет - честь и хвала доброму человеку!
----
И да: описанную выше методику придется повторять всякий раз при обновлении openshot до более новой версии (файлы затираются).
« Последнее редактирование: 13 Сентябрь 2017, 14:52:58 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], Ubuntu 18.04 64x [MATE, Budgie].

Оффлайн zg_nico

  • Заслуженный пользователь
  • Активист
  • *
  • Сообщений: 737
  • Nil mortalibus arduum est
    • Просмотр профиля
В связи с периодическими обновлениями Openshot приходится периодически же выполнять все описанные ранее по тексту манипуляции для того, чтоб подставлять шрифты в конфигурационные файлы. Заколебало сегодня меня это окончательно. Результатом стала автоматизация. Лень - двигатель прогресса. Может, кому покажется полезным.
#!/bin/bash

#
#  Скрипт для автоматизации модификации конфигурационных файлов OpenShotQT
#  Зачем: анимированные заголовки OpenShotQT не понимают русский язык.
#  Автор: zg_nico e-mail: zg_nico@mail.ru
#  Пост на форуме forum.ubuntu.ru: http://forum.ubuntu.ru/index.php?topic=288947.msg2347901#msg2347901
#  Работа проверялась в Ubuntu 16.04 (blender 2.79 + OpenshotQT 2.4.2)
#
echo
MainSub(){
#процедура модификации конфигурационных файлов OpenShotQT
#получение перечня шрифтов в виде массива (сортировка по алфавиту)
echo "Сейчас будет выполнен просмотр всех системных шрифтов, из них будет выполнен отсев: только с локалью RU, среди которых отбираются только файлы *.otf и *.ttf"
while true
do
echo "Вы хотите добавить ВСЕ системные шрифты, или только содержимое директории $HOME/.fonts?"
echo -e "1 = Я хочу добавить ВСЕ системные шрифты\n2 = Я хочу добавить только шрифты из директории $HOME/.fonts\n3 = ничего не делать. Просто прекратить работу программы."
read item
case "$item" in
1) eval fontList=(` fc-list : file lang=ru | grep -i '.otf\|.ttf' | sort | sed 's/^/"/; s/$/"/'`)
if ( ${#fontList[@]} == 0 ); then
echo "[o_O] ОШИБКА: Не обнаружено системных шрифтов. И как Вы это-то читаете..."
echo "[x_x] Работа программы прекращена."
exit 1
else
break
fi ;;
2) eval fontList=(` fc-list : file lang=ru | grep $HOME | grep -i '.otf\|.ttf' | sort | sed 's/^/"/; s/$/"/'`)
if ( ${#fontList[@]} == 0 ); then
echo "[o_O] ОШИБКА: Не обнаружено шрифтов в каталоге $HOME/.fonts..."
echo "Попробуйте альтернативный выбор: все системные шрифты."
else
break
fi ;;
3) echo "[^_^] Работа программы прекращена по выбору пользователя"
exit 0 ;;
*) echo "[o_O] Что непонятного в выборе [1], [2] или [3]? Введите одно из значений, иных опций не предусмотрено." ;;
esac
done
echo "[^_^] Найдено файлов шрифтов: ${#fontList[@]}"
echo "Ведется подготовка текстовой конфигурации для подстановки в файлы XML..."
#формирование конфигурации для патча
patchText=' <param name="fontname" type="dropdown" title="Font Name" description="">'
patchText+="\n <values>"
#набивка нашими шрифтами:
let ilim=${#fontList[@]}-1 #массив идет с нуля, поэтому отнимаем один элемент
for i in $(seq 0 $ilim)
do
cufullfilename=${fontList[$i]/:/}
cufullfilename="$(echo -e "${cufullfilename}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
curfile=$(basename -- "$cufullfilename")
patchText+="\n <value name=\"${curfile%%.*}\" num=\"$cufullfilename\"/>"

done
patchText+="\n </values>"
#задаем дефолтное значение:
cufullfilename=${fontList[0]/:/}
cufullfilename="$(echo -e "${cufullfilename}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
patchText+="\n <default>$cufullfilename</default>"
patchText+="\n </param>"
echo "Текстовая конфигурация сформирована. Модифицируем конфигурационные файлы..."
# выполнение подстановки сгенерированной конфигурации на место той, что прописана изначально
cd "$Dir"
echo "$FounD" | while read line; do
sed -i "/<param name=\"fontname\"/,/<\/param>/c\ $patchText" "$line"
echo "Модифицирован: $line"
done
echo
echo "Выполнена модификация конфигурационных файлов. Проверьте работоспособность OpenShotQT"
echo "Помните: если что-то пошло не так - попробуйте восстановить данные из бэкапа (был создан при первом запуске скрипта автоматически)"
echo
# окончание работы
exit 0
}
RestoreSub(){
#процедура восстановления данных из имеющегося бэкапа
echo "Предпринимаем попытку восстановления исходного состояния конфигурационных файлов OpenShotQT из ранее сделанного бэкапа"
cd "$Dir2"
ls "$Dir2" | while read line; do
cp -f "$line" "$Dir"
done
echo
echo "[^_^] Файлы восстановлены."
echo
#на выход не отправляем - может пользователь еще что захочет сотворить...
}
Dir='/usr/lib/python3/dist-packages/openshot_qt/blender'
Dir2='/usr/lib/python3/dist-packages/openshot_qt/blender_bak'
echo "[^_^] Программа для выполнения/отката патча OpenShotQT для обеспечения совместимости анимированных заголовков с кириллическими шрифтами"
echo "      Выполняется проверка необходимых условий..."
# нужны права суперпользователя
if [[ $EUID -ne 0 ]]; then
    echo "[x_x] Данный скрипт требует прав суперпользователя. Запустите через sudo. Работа программы прекращена."
    exit 1
fi
# проверка существования целевой директории с XML конфигами
if [ ! -d "$Dir" ]; then
echo "[o_O] ОШИБКА: Не найдена директория $Dir"
echo "[!!!] Либо изменилась структура OpenShotQT, либо у Вас не QT-версия Openshot (с обычной и snap данный патч не работает, простите)."
echo "[x_x] Работа программы прекращена."
exit 1
fi
# получение перечня файлов для патча
echo "[^_^] Ошибок не выявлено. Выполняется поиск файлов, подлежащих модификации..."
FounD=$(grep --label="*.xml" -r -i '<param name="fontname"' -l "$Dir")
# если каким-то чудом на данном этапе ничего не нашли
if [ -z "$FounD" ]; then
echo "[o_O] ОШИБКА: В директории $Dir не обнаружено файлов XML, соответствующих условию (шрифты не упоминаются)"
echo "[x_x] Работа программы прекращена."
exit 1
else
nfiles=$( echo "$FounD" | wc -l)
echo "[^_^] Найдено файлов для модификации: $nfiles"
fi
# проверяем наличие ранее сохраненного бэкапа
if [ ! -d "$Dir2" ]; then
#бэкап не создавался
mkdir "$Dir2"
# копирование файлов до выполнения модификации
countF=0
echo "$FounD" | while read line; do
cp "$line" "$Dir2/"
done
countF=$( ls "$Dir2" | wc -l)
echo "      Выполнено создание резервной копии. Сохранено файлов: $countF"
fi
while true
do
echo "Что именно Вы хотите сделать?"
echo -e "1 = Выполнить восстановление исходного состояния конфигурационных файлов\n    OpenShotQT из имеющейся резервной копии\n2 = Выполнить модификацию конфигурационных файлов OpenShotQT\n3 = ничего не делать (завершить работу программы)"
read item
case "$item" in
1) #восстановление исходного состояния из имеющегося бэкапа
RestoreSub ;;
2) #выполнение модификации конфигурационных файлов
MainSub ;;
3) echo "[^_^] Завершение работы программы по инициативе пользователя" #выход из программы
exit 0 ;;
*) echo "[o_O] В качестве выбора следует ввести число [1], [2] или [3]. Иных опций не предусмотрено..." ;;
esac
done
exit 0
Все вышеобозначенное вставляем в текстовый файл, даем файлу права на исполнение, после чего запускаем этот файл с правами суперпользователя. Например, так:
gedit $HOME/OSqt_patch.sh
#вставляем, сохраняем, закрываем
sudo chmod + $HOME/OSqt_patch.sh
sudo OSqt_patch.sh
Далее следуем запросам программы. Сперва скрипт создает бэкап текущего состояния конфигурационных файлов. После - предлагает выбор: все системные шрифты дописывать в конфиг, или только те, которые лежат в папке пользователя (как раз мой случай, имхо - удобнее). При выборе любого из этих пунктов происходит генерация меню с ранее описанным синтаксисом XML-файла, и скрипт выполняет подстановку необходимого куска кода в каждый XML-файл, который эту подстановку поддерживает. При повторном запуске скрипта пользователь может восстановить исходное состояние конфигурационных файлов (либо подставить альтернативный ранее сделанному выбор). Словом погонял у себя на тестовых папках - все работает нормально. Проверил на установленном у себя Openshot - отработало без сбоев. Проверку на ошибки (до каких додумался) в скрипт я встроил. Разумная критика приветствуется, ну и можете пользоваться. Буду рад, если кому как и мне будет это полезно. Всем спасибо за внимание!
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], Ubuntu 18.04 64x [MATE, Budgie].

Оффлайн zg_nico

  • Заслуженный пользователь
  • Активист
  • *
  • Сообщений: 737
  • Nil mortalibus arduum est
    • Просмотр профиля
Выполнил доработку своего скрипта. Если ранее генерируемый патч выглядел вырвиглазно, вроде (пример для произвольного перечня шрифтов):
Цитировать
      <value name="SirClive" num="/home/zg_nico/.fonts/SirClive.ttf"/>
      <value name="STENCI~1" num="/home/zg_nico/.fonts/STENCI~1.TTF"/>
      <value name="supercar_c" num="/home/zg_nico/.fonts/supercar_c.ttf"/>
то в новой версии этот же сегмент шрифтов выглядит достаточно кошерно:
Цитировать
      <value name="SirClive [Regular]" num="/home/zg_nico/.fonts/SirClive.ttf"/>
      <value name="Stencil [Normal]" num="/home/zg_nico/.fonts/STENCI~1.TTF"/>
      <value name="supercar cyr [Regular]" num="/home/zg_nico/.fonts/supercar_c.ttf"/>
Полностью переработан алгоритм формирования текстового патча, дополнен интерфейс взаимодействия с пользователем (даже прогресс-бар импровизированный прикрутил), отлажены мелкие ошибки. Включена проверка на ситуацию, когда конфигурационные файлы были повреждены, а бэкап имеется. В дальнейшем - проверку на изменение версии openshotQT прикрутить планирую. Выложу сюда же, как руки дойдут. Обновленная версия:#!/bin/bash

#
#  Скрипт для автоматизации модификации конфигурационных файлов OpenShotQT
#  Зачем: анимированные заголовки OpenShotQT не понимают русский язык.
#  Автор: zg_nico e-mail: zg_nico@mail.ru
#  Пост на форуме http://forum.ubuntu.ru/index.php?topic=288947.msg2348537#msg2348537
#  Работа проверялась в Ubuntu 16.04 (blender 2.79 + OpenshotQT 2.4.2)
#  Версия 3: изменен формат вывода для "красивости", отлажены мелкие ошибки.
#
MainSub(){
#процедура модификации конфигурационных файлов OpenShotQT
#получение перечня шрифтов в виде массива (сортировка по алфавиту)
echo "Сейчас будет выполнен просмотр всех системных шрифтов, из них будет выполнен отсев: только с локалью RU, среди которых отбираются только файлы *.otf и *.ttf"
while true
do
echo "[ ? ] Вы хотите добавить ВСЕ системные шрифты, или только содержимое директории $HOME/.fonts?"
echo -e "    1 = Я хочу добавить ВСЕ системные шрифты\n    2 = Я хочу добавить ТОЛЬКО шрифты из директории $HOME/.fonts\n    3 = Ничего не делать. Просто прекратить работу программы (ВЫХОД)."
read item
case "$item" in
1) fontList=$( fc-list :lang=ru --format="%{family}\a%{style}\a%{file}\n" | grep -i '.otf\|.ttf' | sort | uniq )
nfiles=$( echo "$fontList" | wc -l)
if (( $nfiles == 0 )); then
echo "[o_O] ОШИБКА: Не обнаружено системных шрифтов. И как Вы это-то читаете..."
echo "[x_x] Работа программы прекращена. Для выхода нажмите [Enter]"
read item
exit 1
else
break
fi ;;
2) fontList=$( fc-list :lang=ru --format="%{family}\a%{style}\a%{file}\n" | grep -i '.otf\|.ttf' | grep $HOME | sort | uniq )
nfiles=$( echo "$fontList" | wc -l)
if (( $nfiles == 0 )); then
echo "[o_O] ОШИБКА: Не обнаружено шрифтов в каталоге $HOME/.fonts..."
echo "      Попробуйте альтернативный выбор: все системные шрифты."
else
break
fi ;;
3) echo "[^_^] Работа программы прекращена по выбору пользователя. Для выхода нажмите [Enter]"
read item
exit 0 ;;
*) echo "[o_O] Что непонятного в выборе [1], [2] или [3]? Введите одно из значений, иных опций не предусмотрено."; echo ;;
esac
done
echo "[^_^] Найдено файлов шрифтов: $nfiles"
echo "Ведется подготовка текстовой конфигурации для подстановки в файлы XML..."
#обновленный алгоритм формирования перечня шрифтов в конфигурационном файле
patchText=' <param name="fontname" type="dropdown" title="Font Name" description="">' #формирование конфигурации для патча
SAVEIFS=$IFS #сохраняем текущий системный разделитель IFS принятым нами при формировании выхлопа fontList (меджу строками \n)
IFS=$'\n' #Заменяем системный разделитель символом новой строки для парсирования массива
fontList=($fontList) #получаем массив из заполненной выше переменной fontList и сохраняем его в ту же fontList
IFS=$'\a' #Заменяем системный разделитель принятым нами при формировании выхлопа fontList (меджу столбцами \a)
patchText+="\n <values>" #начинаем оформление секции <values>
fullfilename="" #здесь храним значение по-умолчанию
PROGRESS='[~~~~~~~~~~~~~~~~~]' #индикатор выполнения
k=0 #счетчик индикатора выполнения
for (( i=0; i<${#fontList[@]}; i++ )) #начинаем долгую и мучительную построчную обработку
do
stroka=(${fontList[$i]}) #разбираем каждую строку на 3 элемента
#чтобы не запутаться теперь, хоть это и увеличит объем кода, но сделает его читабельнее:
family=${stroka[0]}
style=${stroka[1]}
file=${stroka[2]}
if [ -z "$fullfilename" ]; then fullfilename=$file; fi #дефолтное значение из первого попавшегося файла
#изначальное форматирование строковых переменных:
fname=$(basename -- "$file") #получаем имя файла без пути
fname=${fname%%.*} #убираем расширение файла
fname=${fname//[-_]/ } #убираем знаки - и _ из fname
fname="$(echo -e "${fname}" | sed -e 's/\ \{1,\}/\ /g')" #заменяем два и более пробелов одним пробелом
family=${family//[-_]/ } #убираем знаки - и _ из family
family="$(echo -e "${family}" | sed -e 's/\ \{1,\}/\ /g')" #заменяем два и более пробелов одним пробелом
fname="$(echo -e "${fname}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" #обрезаем пробелы в начале и в конце fname (на всякий случай)
fname2="$(echo -e "${fname}" | sed -e "s/"${family}"//gi")" #получаем fname2 из family путем замены всех вхождений fname в family
fname2="$(echo -e "${fname2}" | sed -e 's/\ \{1,\}/\ /g')" #заменяем два и более пробелов одним пробелом
fname2="$(echo -e "${fname2}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" #обрезаем пробелы в начале и в конце
family=${family%%,*} #если в family есть запятая, - убираем все до запятой
#наша цель:  <value name="Читаемое короткое и желательно понятное имя" num="полный путь"/>
ngnstr="" #переменная для хранения сгенерированной строки
if (( ${#style} > 14 ))  && (( ${#style} > ${#fname2} )); then #если style длиннее 14 символов и длиннее fname2
if [[ ${fname2,,} == ${family,,} ]]; then #если fname2=family без учета регистра
if [[ ${fname,,} == ${family,,} ]] && [ -z "$fname" ]; then #если fname=family без учета регистра и fname пуста
ngnstr="<value name=\"$family\" num=\"$file\"/>"
else
ngnstr="<value name=\"$family [$fname]\" num=\"$file\"/>"
fi
else
if [ -z "$fname2" ]; then #если fname2 пуста
ngnstr="<value name=\"$family\" num=\"$file\"/>"
else
ngnstr="<value name=\"$family [$fname2]\" num=\"$file\"/>"
fi
fi
fi
if [ -z "$ngnstr" ]; then #Если так ничего и не выбрали
if (( ${#style} > 14 )); then
ngnstr="<value name=\"$family\" num=\"$file\"/>"
else
ngnstr="<value name=\"$family [$style]\" num=\"$file\"/>"
fi
fi
patchText+="\n $ngnstr" #дописываем сформированную строку в bufPatch
k=$(echo "scale=10 ; $i/${#fontList[@]}*200" | bc) #дробные вычисления тут - головная боль!
k=${k%%.*}; (( k=k/10 )); #отбрасываем дробную часть и делим на 10
echo -ne "\r${PROGRESS:0:$k}"
done
echo; echo "Готово!" #завершаем оформление прогрессбара
patchText+="\n </values>" #завершаем оформление секции <values>
patchText+="\n <default>$fullfilename</default>" #формируем строку с дефолтным значеним
patchText+="\n </param>" #финализация строки патча
#echo -e "$patchText" #отладочное: напечатать сформированную конфигурацию
echo "      Текстовая конфигурация сформирована. Модифицируем конфигурационные файлы."
IFS=$SAVEIFS #Восстанавливаем исходное значение IFS
# выполнение подстановки сгенерированной конфигурации на место той, что прописана изначально
echo "      Работаем в $Dir"
cd "$Dir"
echo "$FounD" | while read line; do
sed -i "/<param name=\"fontname\"/,/<\/param>/c\ $patchText" "$line"
echo "      Модифицирован: $(basename -- "$line")"
done
echo "[^_^] Завершена модификация конфигурационных файлов. Проверьте OpenShotQT!"
echo "[!!!] Помните: если что-то пошло не так - попробуйте восстановить данные из бэкапа (был создан при первом запуске скрипта автоматически)"
echo "      Для выхода нажмите [Enter]"
# окончание работы
read item
exit 0
}
RestoreSub(){
#процедура восстановления данных из имеющегося бэкапа
echo "      Предпринимаем попытку восстановления исходного состояния конфигурационных файлов OpenShotQT из ранее сделанного бэкапа"
cd "$Dir2"
ls "$Dir2" | while read line; do
cp -f "$line" "$Dir"
done
echo
echo "[^_^] Файлы восстановлены."
echo
#на выход не отправляем - может пользователь еще что захочет сотворить...
}
Dir='/usr/lib/python3/dist-packages/openshot_qt/blender'
Dir2='/usr/lib/python3/dist-packages/openshot_qt/blender_bak'
echo "[^_^] Программа для выполнения/отката патча OpenShotQT для обеспечения совместимости анимированных заголовков с кириллическими шрифтами"
echo "      Выполняется проверка необходимых условий..."
# нужны права суперпользователя
if [[ $EUID -ne 0 ]]; then
    echo "[x_x] Данный скрипт требует прав суперпользователя. Запустите через sudo. Работа программы прекращена."
    read item
    exit 1
fi
# проверка существования целевой директории с XML конфигами
if [ ! -d "$Dir" ]; then
echo "[o_O] ОШИБКА: Не найдена директория $Dir"
echo "[!!!] Либо изменилась структура OpenShotQT, либо у Вас не QT-версия Openshot (с обычной и snap данный патч не работает, простите)."
echo "[x_x] Работа программы прекращена. Для выхода нажмите [Enter]"
read item
exit 1
fi
# получение перечня файлов для патча
echo "[^_^] Ошибок не выявлено. Выполняется поиск файлов, подлежащих модификации..."
FounD=$(grep --label="*.xml" -r -i '<param name="fontname"' -l "$Dir")
# если каким-то чудом на данном этапе ничего не нашли
if [ -z "$FounD" ]; then
echo "[o_O] ОШИБКА: В директории $Dir не обнаружено файлов XML, соответствующих условию (шрифты не упоминаются)"
# проверяем наличие ранее сохраненного бэкапа
if (! $( echo "$FounD" | wc -l) = 0 ); then
echo "[!!!] В рабочей директории не найдено ни одного файла XML, содержащего искомую часть кода"
echo "      Тем не менее найден ранее сохраненный бэкап."
while true
do
echo "[ ? ] Предпринять попытку восстановления?"
echo -e "    1 = Выполнить восстановление исходного состояния конфигурационных файлов\n    OpenShotQT из имеющейся резервной копии\n    2 = Ничего не делать. Просто прекратить работу программы."
read item
case "$item" in
1) #восстановление исходного состояния из имеющегося бэкапа
RestoreSub
break ;;
2) echo "[^_^] Завершение работы программы по инициативе пользователя. Для выхода нажмите [Enter]" #выход из программы
read item
exit 0 ;;
*) echo "[o_O] В качестве выбора следует ввести число [1] или [2]. Иных опций не предусмотрено..."; echo ;;
esac
done
else
echo "[x_x] Работа программы прекращена."
read item
exit 1
fi
else
nfiles=$( echo "$FounD" | wc -l)
echo "[^_^] Найдено файлов для модификации: $nfiles"
fi
# проверяем наличие ранее сохраненного бэкапа
if [ ! -d "$Dir2" ]; then
#бэкап не создавался
mkdir "$Dir2"
# копирование файлов до выполнения модификации
countF=0
echo "$FounD" | while read line; do
cp "$line" "$Dir2/"
done
countF=$( ls "$Dir2" | wc -l)
echo "      Выполнено создание резервной копии. Сохранено файлов: $countF"
fi
while true
do
echo "[ ? ] Что именно Вы хотите сделать?"
echo -e "    1 = Выполнить восстановление исходного состояния конфигурационных файлов\n    OpenShotQT из имеющейся резервной копии\n    2 = Выполнить модификацию конфигурационных файлов OpenShotQT\n    3 = ничего не делать (завершить работу программы)"
read item
case "$item" in
1) #восстановление исходного состояния из имеющегося бэкапа
RestoreSub ;;
2) #выполнение модификации конфигурационных файлов
MainSub ;;
3) echo "[^_^] Завершение работы программы по инициативе пользователя. Для выхода нажмите [Enter]." #выход из программы
read item
exit 0 ;;
*) echo "[o_O] В качестве выбора следует ввести число [1], [2] или [3]. Иных опций не предусмотрено..."; echo ;;
esac
done
read item
exit 0
« Последнее редактирование: 11 Июль 2018, 19:08:04 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], Ubuntu 18.04 64x [MATE, Budgie].

 

Страница сгенерирована за 0.141 секунд. Запросов: 23.