Скрипты для Demagog

Говорящий текстовый редактор с открытым кодом, предназначенный для чтения вслух и записи в аудиофайл текстовых файлов с использованием пакетов речевых функций SAPI4\SAPI5.

Модератор: flegont

Ответить
Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#101

Сообщение flegont » 07 ноя 2018 21:42

Да, так сказать, "проходная версия" будет. Сейчас на оф. сайте экзешник с новым номером залью, и "флажок" подниму, чтобы проверка на наличие новой версии срабатывала :wink:


Отправлено спустя 15 минут 1 секунду:
Ну, вот. Без шума и пыли (с) номер 360 :big_smile:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#102

Сообщение tonio_k » 07 ноя 2018 23:22

► Показать
Почему, если заремарить:

Код: Выделить всё

 -- WSave(0,folder..a[i])
-- WOpen(0,folder..a[i])
, то WAudio(0,folder,false) начинает записывать в стиле:
20181107-231539.mp3
20181107-231618.mp3

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#103

Сообщение flegont » 07 ноя 2018 23:35

текст серии не сохранен, имеется только в окне Демагога, у него еще нет имени - для аудио генерируется имя из даты и времени

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#104

Сообщение tonio_k » 08 ноя 2018 13:45

Хотелось бы что нибудь сделать с кнопкой "стоп" на время работы скриптов.
Если вместо os.exit() по привычке нажать "стоп", да еще несколько раз, то результат работы скрипта может быть очень непредсказуемым. Ведь происходит "остановка и пропуск" работы текущего словаря, но работа самого скрипта продолжается и файл на выходе становится "битым"(не до конца обработанным словарями) и этот "битый" файл подхватывается WAudio. А если еще активировано удаление txt файлов после срабатывания WAudio, то даже "продолжить" с прерванного места будет невозможно - файлы удалены. Пока в настройках вообще убрал с панели кнопку "стоп". Но это не выход для тех, кто читает вслух из самой программы Демагог


Отправлено спустя 15 минут 51 секунду:
Как вариант, WFilter и WAudio вообще отключить реакцию на кнопку "стоп". Эта кнопка все равно не может остановить скрипт, то пусть хотя бы его не "ломает"

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#105

Сообщение flegont » 08 ноя 2018 15:02

Подумаю над этим.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#106

Сообщение tonio_k » 09 ноя 2018 02:20

Черновик скрипта для анализа и сравнения по времени работы правил из словарей.
Для его работы нужно создать в папке dic_test два словаря например REX_1_VAR.rex и REX_2_VAR.rex внести по 1 правилу в каждый и сохранить
Скрипт работает с окнами 1, 2, 3, 0
1 окно - текст к которому будут применяться правила.
2, 3, окно - для редактирования словарей REX_1_VAR.rex и REX_2_VAR.rex (Все правки в словаре автоматом сохраняются при каждом запуске скрипта (нажимать "сохранить" после внесения изменений не нужно)
0 окно - результаты
Нельзя в 1 окно вводить сразу текст всей книги! Достаточно одного - двух абзацев с текстом, на который должно среагировать правило. Причина: этот абзац в процессе работы будет продублирован 10000 раз для нагрузки и выявления времени задержки при обработке.

Код: Выделить всё

WNew(0)
homedic = HomeFolder('dic_test')-- Полный путь к словарю с подпапкой 'dic_test'
local n=10000 
local slovar1 = 'REX_1_VAR.rex' 
local slovar2 = 'REX_2_VAR.rex' 
local k=''
local s=WText(1)


--Открываем в окне №2 и №3 словари для редактирования 
local pravilo1=WText(2)
local pravilo2=WText(3)
if pravilo1=='' then WOpen(2,homedic..slovar1) else WSave(2,homedic..slovar1) end
if pravilo2=='' then WOpen(3,homedic..slovar2) else WSave(3,homedic..slovar2) end
local pravilo1=WText(2)
local pravilo2=WText(3)


--Если окно №1 "Пустое" то оставляем открытыми словари для редактировани и прерываем скрипт
if s=='' then 
WActive(1)
WAdd(1,-1,'Сюда вводим текст для тестирования') 
goto HALT end


--Смотрим как сработали правила из словарей 
WNew(0)
WFilter(1,0,homedic..slovar1,true)  -- обработать БЫСТРЫМ алгоритмом
local t1=WText(0)
WNew(0)
WFilter(1,0,homedic..slovar2,true)  -- обработать БЫСТРЫМ алгоритмом
local t2=WText(0)
WNew(0)

--Создание размнооженной копии текста
for i = 1,n do
k=s..'\r'..k
end

--Запуск словарей - включение секундомера
WNew(0)
WAdd(0,-1,k) 
local x = os.clock()
WFilter(0,0,homedic..slovar1,true)  -- обработать БЫСТРЫМ алгоритмом
local pr1=(string.format('Время обработки '.." %.2f\n", os.clock() - x))
WNew(0)
WAdd(0,-1,k) 
local x = os.clock()
WFilter(0,0,homedic..slovar2,true)  -- обработать БЫСТРЫМ алгоритмом
local pr2=(string.format('Время обработки '.." %.2f\n", os.clock() - x))

--Вывод результатов в окно статистики
WNew(0)
WAdd(0,-1,slovar1..'\r') 
WAdd(0,-1,pravilo1..'\r\r') 
WAdd(0,-1,s..'\r') 
WAdd(0,-1,t1..'\r') 
--Если результат работы правила равен оригиналу, значит правило не сработало
--if s==t1 then WAdd(1,-1,'ВНИМАНИЕ! Похоже правило не срабатывает') end
WAdd(0,-1,pr1) 
WAdd(0,-1,'#############################################################\r') 
WAdd(0,-1,slovar2..'\r') 
WAdd(0,-1,pravilo2..'\r\r') 
WAdd(0,-1,s..'\r') 
WAdd(0,-1,t2..'\r') 
--Если результат работы правила равен оригиналу, значит правило не сработало
--if s==t2 then WAdd(1,-1,'ВНИМАНИЕ! Похоже правило не срабатывает') end
WAdd(0,-1,pr2) 
WAdd(0,-1,'#############################################################\r') 

WActive(0)
ShowMessage('Готово')
::HALT::
flegont, может вы сможете доработать данный скрипт, но уже не под словари, а под встроенную в Демагог функцию Найти/Заменить (Ctrl+F)?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#107

Сообщение flegont » 09 ноя 2018 09:17

Черновик скрипта для анализа и сравнения по времени работы правил
Спасибо. Посмотрю, потестирую.
доработать данный скрипт, но уже не под словари, а под встроенную в Демагог функцию Найти/Заменить
Уточните, пожалуйста, что имеется в виду? Проверка сохраненных шаблонов поиска, если они являются правилами типа dic или rex?

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#108

Сообщение tonio_k » 09 ноя 2018 11:57

flegont писал(а):
09 ноя 2018 09:17
Проверка сохраненных шаблонов поиска, если они являются правилами типа dic или rex?
Наверное это и имел в виду...
я хотел вместо WFilter со словарями 'REX_1_VAR.rex' и 'REX_2_VAR.rex' в моем примере скрипта, применить правила из шаблона search.lst (поиска и замены)
'REX_1_search.lst ' и 'REX_2_search.lst '

Тогда, в окне 2 :
R @(\w+)([\s\,\:\-]*)Дан([аыу]+)=$1$2 дАн$3
в окне 3:
D $Дана *ула=дАна ула
D $Дана *ала=дАна ала
D $Дана *ила=дАна ила
D $Дана *лась=дАна лась

И в окне 0 получаю результат по времени отработки поиска и замены

Единственное - будет неудобно R или D вставлять каждый раз.
^(\S*)=D $& или ^(\S*)=R $&
думаю решит эту проблему

Однако, если WFilter и работа с шаблоном search по функциональности и ресурсам одно и тоже, то смысла такое делать, конечно нет :jokingly:


Отправлено спустя 6 минут 32 секунды:
Хм... А ведь это плавно "возвращает" к когда то ранее поднятой мною теме:
► Показать



Отправлено спустя 3 минуты 51 секунду:
Я к тому, что благодаря поддержке Демагогом скриптам, search.lst можно будет спокойно присоединять к обработке текста в тех местах, где не требуется Юникод

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#109

Сообщение flegont » 09 ноя 2018 13:38

если WFilter и работа с шаблоном search по функциональности и ресурсам одно и тоже
Похоже, что это так и есть. Какая (в принципе) разница: вытащить очередное правило из файла словаря и прогнать его через скрипт проверки; или вытащить одну строку из файла search.lst, убрать префикс и прогнать получившееся правило через скрипт проверки?
Что лбом, что по лбу (с) :thinking:
словари DIC , REX как нибудь адаптировать под скрипт для демагога
Ближе к Новому году найду (надеюсь) время провести соответствующий эксперимент.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#110

Сообщение tonio_k » 09 ноя 2018 14:06

flegont писал(а):
09 ноя 2018 13:38
Что лбом, что по лбу (с)
Ок. Значит останусь на текущем "черновике". К стати, этот "черновик" показал, что правило со звездочкой в dic работает ощутимее медленнее чем в rex. Правила со звездочкой хороши своим удобством и легкостью в написании. А ведь был момент, когда будучи уверенным, что dic это быстрота, начал правила из rex "упрощать" путем экспорта в правила dic со звездочкой. Оговорюсь: DIC - это реально быстрота! Но только для простых правил без звёзд

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#111

Сообщение flegont » 09 ноя 2018 15:15

dic-словари хороши своей интуитивной понятностью.
rex-словари хороши своей универсальностью.
Поэтому, там, где требуется сложное, нетривиальное правило - надо применять регулярные выражения, и не искать легких путей :victory:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#112

Сообщение tonio_k » 10 ноя 2018 00:34

flegont, Поиск/замена (Ctrl+F)
Шаблон REX, Все подходящие.
Иногда очень не хватает кнопки "Переместить все подходящие"
т.е. одной кнопкой Две операции:
1)Все подходящие вывести в окно Статистики
2)В окне где велся поиск - Заменить найденное на "пусто"
Может это как то можно через диалог скрипта сделать?
Вызываю скрипт, ввожу регулярное выражение и результат вижу в окне статистики, а в оригинальном документе этих строк уже нет.


Отправлено спустя 11 минут 42 секунды:
Хотя, как скрипт - все же не надо. Не удобно - слишком много кликов что бы вызвать скрипт, а как окно поиска на 2 окнах "параллельно" работать не будет. Тупиковая идея - через скрипт. Подумайте тогда над дополнительной галочкой "Удалить найденное в оригинале" - что бы срабатывал только при нажатии кнопки "Все подходящие" Или ввести дополнительную кнопку "Переместить в окно статистики"

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#113

Сообщение flegont » 10 ноя 2018 12:12

Что-нибудь придумаю :wink:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#114

Сообщение tonio_k » 12 ноя 2018 20:27

Вопрос, почему в скрипте WFilter запускается 3 раза, а индикатор прогресса всего один раз пробегает начала и до конца? Казалось бы должно "промелькнуть" 3 раза от начала до конца..

Код: Выделить всё

WNew(0)
WAdd(0,-1,k) 
local x = os.clock()
WFilter(0,0,homedic..slovar1,true)  -- обработать БЫСТРЫМ алгоритмом
local pr1 = (string.format(' '.." %.2f\n", os.clock() - x))
vo1 = vo1..pr1
WNew(0)
WAdd(0,-1,k) 
local x = os.clock()
WFilter(0,0,homedic..slovar1,true)  -- обработать БЫСТРЫМ алгоритмом
local pr1 = (string.format(' '.." %.2f\n", os.clock() - x))
vo1 = vo1..pr1
WNew(0)
WAdd(0,-1,k) 
local x = os.clock()
WFilter(0,0,homedic..slovar1,true)  -- обработать БЫСТРЫМ алгоритмом
local pr1 = (string.format(' '.." %.2f\n", os.clock() - x))
vo1 = vo1..pr1

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#115

Сообщение flegont » 12 ноя 2018 21:57

Как бы да, индикатор должен сработать 3 раза.
Но если каждый словарь из одной строчки, то индикатор иногда даже запуститься может не успеть, как ему уже пора выключаться.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#116

Сообщение tonio_k » 12 ноя 2018 22:39

У правил со звездочками есть один недостаток:
Например:
из * воды=из водЫ
Недостаток в том, что это же правило "ошибочно" сработает и на :
Никак не могли достать из воды. Воды здесь были мутные.
тут под звездочку попадает воды.
Это немного притормаживало желание их применять.

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

Для этого нужно в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
Вот и всё.

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

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

Правила, которые требуют захват "соседнего предложения" напрмер:
*. А что стоит?=. А что стОит?
*. бегом.=. бегОм.
*. берете?=. берёте?
можно перенести в другой словарь и обрабатывать его в скрипте с разбиением на блоки по умолчанию - согласно общим настройкам из Демагога.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#117

Сообщение flegont » 12 ноя 2018 23:16

А с этим что делать?
Никак не могли достать из воды; воды здесь были мутные.
Это - одно предложение. И, тем не менее, правило из * воды=из водЫ сработает на нем неверно. По той же самой причине - звездочка - это очень широко действующий символ, под него подходит любое слово.
Кстати, я пока не соображу, как и регулярными выражениями этот (и другие подобные) казус обойти.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#118

Сообщение tonio_k » 13 ноя 2018 01:47

flegont писал(а):
12 ноя 2018 23:16
казус обойти.
ваш пример действительно скорее казус, чем распространенное явление. :jokingly:

Вообще если посмотреть нынешний словарь от waska, то почти половина правил в словарях REX идут с запретом на любые знаки препинания. Именно это минимизирует до предела ложные срабатывания.
Алгоритм звездочек за счет их расширенности в трактовке - скорее увеличивают вероятность ложных срабатываний.
Моя идея сузить поиск в работе правил со звездочками в одно предложение - это скорее попытка сделать уникальное свойство звездочек в Демагоге - еще более гибким и настраиваемым инструментом создания правил. Как для разгрузки словарей REX и ускорения обработки, так и упрощения создания словарей в целом.
Я не прошу сделать DIC конкурентом для REX словарей с вводом всяких ключей и спец символов. Но сделать звездочки в правилах DIC более гибкими и настраиваемыми хотя бы на уровне скриптов - было бы очень круто для составителя словаря.
В идеале хотелось бы для трактовки звездочки сделать 2 режима на выбор пользователя на уровне скрипта:
1) стандартный (который сейчас применяется)
2) полный аналог (\w+) в словарях REX (тогда и необходимость свести поиск словарем в пределах одного предложения сама собой отпадёт)
в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
само по себе это был бы уже большой шаг к дополнительному применению звездочек в словаре DIC причем не меняющий уже существующий "традиционный" алгоритм

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#119

Сообщение flegont » 13 ноя 2018 09:25

Я не хочу вдаваться в подробности dic-алгоритма словарных замен. Но одна существенная особенность, на которую он опирается, это то, что * в правиле обозначает любой символ. Любой, без всяких исключений.
Отступление от этого принципа повлечет за собой нарастающую лавину изменений - в сущности, это будет уже новый алгоритм. А, как известно, перестройка - дело ответственное.

"Когда у меня будет, что сказать, я ответ даду" (с)


Отправлено спустя 3 часа 16 минут 32 секунды:
P.S. Правила с отдельно стоящими * соблазняют своей простотой. Но надо быть внимательными. Например, упомянутое правило: из * воды=из водЫ мало того, что захватывает ненужные словосочетания, еще и правильные сочетания являются весьма редкими.
► Показать

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#120

Сообщение balaamster » 13 ноя 2018 15:05

flegont писал(а):
13 ноя 2018 12:42
еще и правильные сочетания являются весьма редкими
Действительно, встречаются нечасто. Посмотрел количество встреч подобных шаблонов в 6622 текстовых файлов книг (utf-8; 1,94 ГБ):
из * воды G Docs
Из * воды - 177 раз
из * * воды - 80 раз

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#121

Сообщение tonio_k » 13 ноя 2018 15:35

Этот конкретный пример вообще был взят с потолка первое что в голову пришло.
Я могу привести несколько примеров из rex словаря, которые я мог адаптировать в dic словарь, но меня останавливает слишком Широкая трактовка значений звёздочки. Давайте это обсудим на основной ветки демагог.

А сейчас ещё раз повторюсь, я не ставлю под сомнение эффективность звёздочки и не прошу реально менять алгоритм! Это были всего лишь мечты! Не факт что от них будет больше плюсов чем минусов. Сейчас я прошу дать возможность пользователю самостоятельно на уровне скрипта WFiilter при применении словаря принудительно указать количество символов и указать "ограничение в одном предложении" Ничего более! Про звездочки Это я размышлял в Для чего в вообще это может понадобиться.
По умолчанию ее нет и на неё случайно никто не наткнется. Кому надо - тот в скрипте включит.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#122

Сообщение flegont » 13 ноя 2018 18:40

на уровне скрипта WFiilter
Функция WFilter() во встроенном интерпретаторе - это лишь ссылка на 2 подпрограммы Демагога - быстрый алгоритм и алгоритм прямого перебора. Изменить функцию WFiltеr() как раз и означает - изменить оба алгоритма. Чего я в обозримом будущем не планирую.

Что касается: дать пользователю возможность самому на уровне скрипта творить собственные алгоритмы словарных замен - это другое дело. Не связанное с функцией WFilter(). Посмотрим. Мне надо поэкспериментировать.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#123

Сообщение tonio_k » 13 ноя 2018 22:42

в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
хочу прощупать обходной путь к решению моей проблемы... :suspect: . Скажите пожалуйста, как Демагог работает с собственным файлом настроек $.cfg? Подгружает при запуске и Постоянно держит в памяти, а к самому файлу $.cfg обращается только при открытии пункта меню Настроек? Или это происходит чаще? Как WFilter работает с $.cfg?
Я к тому, что бы через скрипт "подменять строки" в общих настройках Демагога перед запуском к-либо функции. и возвращать ее на место, когда она отработает.


Отправлено спустя 25 минут 25 секунд:
balaamster писал(а):
13 ноя 2018 15:05
Действительно, встречаются нечасто. Посмотрел количество встреч подобных шаблонов в 6622 текстовых файлов книг (utf-8; 1,94 ГБ):
balaamster, я так понял, с программированием у вас "на ты" :howdoyoudo: Такая просьба, не могли бы вы проделать еще такое исследование:
Как часто встречается такая схема
w1. w1
w1. wх w1
w1 wх. w1

Условие: w1=w1 - любое слово, но равные между собой (без учета регистра букв)
wх - любое слово (без учета регистра букв)
Хочу понять, может у меня не звездочки виноваты. а моя паранойя? :tongue2:
и таких комбинаций в тексте так мало, что ими смело можно пренебречь?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#124

Сообщение flegont » 13 ноя 2018 23:48

$.cfg читается 1 раз при загрузке Демагога.

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#125

Сообщение balaamster » 14 ноя 2018 00:00

tonio_k писал(а):
13 ноя 2018 23:07
с программированием у вас "на ты"
К сожалению, пока что, "на вы". Но определённый опыт имеется.

Прошёлся Вашими шаблонами по своей библиотеке. Получился такой результат

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#126

Сообщение flegont » 14 ноя 2018 00:10

1) Я уже высказывался, почему не буду ничего менять ни в быстром алгоритме, ни в прямом переборе, из-за того, что * захватывает любые символы. Такой у нее смысл в словарях dic - захватывать любые символы. Если это правило нарушить, то масса ранее составленных пользователями dic-словарей перестанут правильно работать.

2) Это свойство * мне тоже иногда доставляет неудобство, и хочется иметь алгоритм замен, реализуемый только средствами Lua. Т.е. вообще без обращения к импортированной из Демагога функции WFilter(). Такой алгоритм у меня есть. Он нуждается в проверке, чтобы убедиться в его практической применимости.
Во всяком случае, пример с правилом из * воды, приведенным tonio_k, отработал мгновенно и совершенно правильно.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#127

Сообщение tonio_k » 16 ноя 2018 19:36

flegont писал(а):
29 окт 2018 12:14
Функция FilterToAll(folder, mask, diclist)

Код: Выделить всё

x, y = FilterToAll([[d:/MP3]], '0*.txt', diclist)
ShowMessage('Готово!\13Обработано файлов: '..x..'\13Применено словарей: '..y)
не могли бы вы на пальцах объяснить откуда из функции FilterToAll(folder, mask, diclist) берутся значения для x, y уже в самом скрипте? (как бы в фунции нет этих переменных нет)

Если я захочу, например, еще одну переменную добавить в mylib в функцию FilterToAll(folder, mask, diclist) например с каждым циклом запись в переменную имя файла. Что бы при завершении работы функции получить список всех обработанных файлов.txt и как это значение "вытащить" из функции уже в самом скрипте?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#128

Сообщение flegont » 16 ноя 2018 20:42

Код: Выделить всё

function primer(x)
    return x^2, x^3, x^4 -- функция возвратит 3 значения
end
a, b, c = primer(3)
print(a,b,c)
Результат: 9 27 81


Отправлено спустя 11 минут 15 секунд:
Сколько значений (в виде уже вычисленных переменных, или в виде выражений) перечислено через запятую после команды возврата, столько значений функция и отдаст.
a = primer(12) -- получим первое
_, _, a = primer(12) -- получим третье
Знак подчеркивания - это имя "фиктивной" переменной, для пропуска ненужных возвращаемых значений.

Чтобы вернуть из функции список (например, имен файлов), его надо сформировать. Например:

Код: Выделить всё

function primer2(....)
    ...
    local a = {}
    for i = ... do
        ...
        a[#a+1] = ... --запоминаем очередное значение в список
        ...
    end
    return a
end

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#129

Сообщение tonio_k » 17 ноя 2018 13:01

Предложение по функции FilterAndAudioToAll(folder, mask, diclist, remsource)

Код: Выделить всё

function FilterAndAudioToAll(folder, mask, diclist, remsource)
    IgnoreDicPan()
    local b, d, mode
     local k = #folder
	local q
    if string.sub(folder,k,k) ~= '/' and string.sub(folder,k,k) ~= '\\' then
        folder = folder..'\\'
    end
    local a = AllFiles(folder,mask)
    for i = 1,#a do
		q=i
        WOpen(0,folder..a[i])
        for j = 1,#diclist do
            b = diclist[j]
            if type(b) == 'table' then
                d = b[1]
                mode = b[2]
            else
               d = b
               mode = true
            end
			WFilter(0,0,d,mode)
      end
		WSave(0,folder..'temp'..a[i])
        WOpen(0,folder..'temp'..a[i])
		WAudio(0,folder,false)
		local name_p = SplitFileName(a[i])[2]
		os.rename (folder..'temp'..name_p..'.mp3', folder..name_p..'.mp3')
		os.remove(folder..'temp'..a[i]) 	
		if remsource then 
		if q > 1 then os.remove(folder..a[q-1]) end
		end
    end
		if remsource then os.remove(folder..a[q]) end
    return #a, #diclist
end
Изменения:
1) удалил local ans = false - похоже это мусор остался.
2) После обработки словарями 0001.txt изменения сохраняются в файле temp0001.txt, к нему
создается Аудио в temp0001.mp3 и переименовывается в 0001.mp3
Файл temp0001.txt - удаляется
Оригинальный (не изменённый) 0001.txt - остаётся.
Если remsource=true то будут производится удаление оригинального файла 0001.txt, но только после создания аудио 0002.mp3 к 0002.txt (т.е. удаляется предыдущий (q-1) файл)

Это сделано на случай "Экстренного выхода из Демагога" или выключение питания ПК - что бы
всегда остался предыдущий именно "Оригинальный", а не измененный файл. Так как измененный ранее файл txt при повторном прогоне словарями может дать непредсказуемый результат.

"Для разнообразия и украшательства" :smile1: :
тот же FilterAndAudioToAll(folder, mask, diclist, remsource) но только с ведением лога файла с записью времени обработки по каждому файлу сериала

Код: Выделить всё

function FilterAndAudioToAllAndLog(folder, mask, diclist, remsource)
    IgnoreDicPan()
    local b, d, mode
    local k = #folder
	local zi
	local pru = "История обработки:"
	local q
    if string.sub(folder,k,k) ~= '/' and string.sub(folder,k,k) ~= '\\' then
        folder = folder..'\\'
    end
    local a = AllFiles(folder,mask)
	zi = os.time()
	--
	local logfile = FileExists(folder..'\\log.log')
	if not logfile then 
	WNew(0)
	WSave(0,folder..'\\log.log')
	end
	WOpen(0,folder..'\\log.log')
	WAdd(0,-1,pru)
	WSave(0,folder..'\\log.log')
	for i = 1,#a do
	q=i
        WOpen(0,folder..a[i])
        for j = 1,#diclist do
            b = diclist[j]
            if type(b) == 'table' then
                d = b[1]
                mode = b[2]
            else
               d = b
               mode = true
            end
			WFilter(0,0,d,mode)
      end
        local rr1 = os.time() - zi
		WSave(0,folder..'temp'..a[i])
        WOpen(0,folder..'temp'..a[i])
		zi = os.time()
		WAudio(0,folder,false)
		local rr2 = os.time() - zi
		pru = a[i]..' - Словари: '..rr1..' сек; Аудио: '..rr2..' сек; Всего: '..rr1+rr2..' сек.' 
		name_p = SplitFileName(a[i])[2]
		os.rename (folder..'temp'..name_p..'.mp3', folder..name_p..'.mp3')
	WOpen(0,folder..'\\log.log')
	WAdd(0,-1,pru)
	WSave(0,folder..'\\log.log')
	os.remove(folder..'temp'..a[i]) 	
		if remsource then 
		if q > 1 then os.remove(folder..a[q-1]) end
		end
    end
	if remsource then os.remove(folder..a[q]) end
    return #a, pru
pru на выходе будет иметь вид:

Код: Выделить всё

История обработки:
0001.txt - Словари: 4 сек; Аудио: 1 сек; Всего: 5 сек.
0002.txt - Словари: 6 сек; Аудио: 2 сек; Всего: 8 сек.
и т.д.


Отправлено спустя 9 минут 49 секунд:

Код: Выделить всё

-- Thank  balaamster 
function SecToHMS(sec)
    local h = math.floor(sec / 3600)
    local m = math.floor((sec % 3600) / 60)
    local s = math.floor(sec % 60)
    local hms = string.format("%02d:%02d:%02d", h, m, s)
    return hms
end
конвертирует секунды в формат hh:mm:ss
Пример вызова:
z = os.time()
... работа словарей
z = os.time() - z
z = SecToHMS(z)

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#130

Сообщение flegont » 17 ноя 2018 15:11

:thank_you:
Посмотрю, потестирую.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#131

Сообщение tonio_k » 17 ноя 2018 17:46

tonio_k писал(а):
17 ноя 2018 13:11
pru на выходе будет иметь вид:
КОД: ВЫДЕЛИТЬ ВСЁ

История обработки:
0001.txt - Словари: 4 сек; Аудио: 1 сек; Всего: 5 сек.
0002.txt - Словари: 6 сек; Аудио: 2 сек; Всего: 8 сек.
Немного ошибся. :lardhead:
Что бы получить pru надо в function FilterAndAudioToAllAndLog(folder, mask, diclist, remsource)
перед return #a, pru добавить 2 строки что бы получилось:

Код: Выделить всё

WOpen(0,folder..'\\log.log')
pru = WText(0)
return #a, pru
Ведь результаты каждого цикла сразу записываются в log.log и в конце работы функции достаточно просто "вытащить" все записи из log.log

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#132

Сообщение flegont » 19 ноя 2018 23:30

sleep(n) - задерживает выполнение скрипта на заданное количество секунд.
Поместим следующий код в файл mylib.lua в папке work в рабочей папке Демагога:

Код: Выделить всё

local clock = os.clock  -- создали локальный экземпляр функции os.clock()
function sleep(n)  -- спячка на n секунд
  local t = clock()
  while clock() - t <= n do end
end
Пример использования:

Код: Выделить всё

require "work/mylib"

ind = WActive()
WNew(0)
WAdd(0,-1,'Действую без шума и пыли, по вновь утвержденному плану!\13(возврат в рабочее окно через 5 сек)')
WActive(0)
sleep(5)
WActive(ind)
Этот код откроет Окно статистики с сообщением "Действую без шума и пыли...", и через 5 секунд вернет окно, которое было открытым до этого.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#133

Сообщение tonio_k » 20 ноя 2018 01:11

Предложение по небольшой корректировке шаблона Collection of texts.lua.
Изменения - все действия теперь только в окне статистики. Окно №9 не используется.

Код: Выделить всё

-- DEMONSTRATION OF THE INTERPRETER IN THE PROGRAM "DEMAGOG" 
-- MAKE OF THE TEXTS COLLECTION
-- TEXTS FOR ADD MAY BE ANYONE FORMAT FROM: DOC, DOCX, HTM, HTML, SHTML, FB2, EPUB, TXT
-- PRESS F2

--------------------------------------------------
if CurrentLang() == 'Russian' then
  header = 'Составление сборника'
  askname = 'Введите название'
  defname = 'СБОРНИК '
  ready = 'Готово! Результат в окне "0 - Статистика"'
  msg = 'Составление сборника текстов\013\013Подбор текстов прекращается, когда в очередном диалоге выбора нажата кнопка "Отмена" или клавиша Esc. Возможен множественный выбор файлов: Shift+ArrowDn и/или Ctrl+LeftMouseClick\013\013Продолжить?'
  docend = 'Конец книги'
else
  header = 'Make of the collection'
  askname = 'Input name'
  defname = 'COLLECTION '
  ready = 'Done! The result in the "0 - Stats" window'
  msg = 'Make of the texts collection\013\013The text selection is stopped when the Cancel button or Esc key is pressed in the next selection dialog. Multiple file selections are possible: Shift+ArrowDn and/or Ctrl+LeftMouseClick\013\013 Continue?'
  docend = 'End of book'
end
--------------------------------------------------

if not MessageDialog(msg) then goto HALT end

nazvanie = Input(header,{askname..'='..defname})
if not nazvanie then goto HALT end
nazvanie = nazvanie[1]

WNew(0,nazvanie)
s = WText(0)
k = 0
while true do
    f = OpenDialog(true)
    if not f then break end
    for i = 1,#f do
        k = k + 1
        WOpen(0,f[i])
        w = WText(0)
        s = s..'\r\n\r\n\r\n'..w..'\r\n\r\n\r\n'..docend..' '..k
    end 
end

WNew(0)
WAdd(0,-1,s)
WActive(0)  
ShowMessage(ready)

::HALT::

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#134

Сообщение flegont » 20 ноя 2018 09:38

Идея красивая, но сработает лишь для текстов, не содержащих юникода.
Попытка, например, составить сборник японских хайку с русским переводом, приведет к тому, что останется только русский перевод, а японский текст превратится в шифр, наподобие: #22899;#12398;#23376;#12399;#32094;#39318; ...
То же самое случится с при объединении словарей, содержащих транскрипцию МФА. И т.д. и т.п.

Причину подобных печальных казусов я оглашалуже не раз.
Lua не понимает юникод.

Поэтому предложенный вариант функции даст правильные результаты только для текстов на английском и/или русском языке. (Т.е. английский + местная локаль)

Замечание. Функция WAdd() была придумана мною именно для того, чтобы избежать указанной ситуации. Текст из одного окна добавляется к тексту из другого окна без вмешательства интерпретатора - самим Демагогом. Интерпретатор лишь обеспечивает показ Диалога открытия файлов и цикл по выбранным файлам. В цикле он передает работу по перебросу текстов Демагогу. А по завершении цикла бодро рапортует, что всё готово. "И мы пахали" (с) :smile1:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#135

Сообщение tonio_k » 20 ноя 2018 09:50

Понял. Не подумал. Так ведь и текст с фонемами IPA можно сломать! Тогда для избежания возможных "накладок" с окном 9 (вдруг там у пользователя что то уже открыто) и вообще для расширения возможностей решения подобных задач может ввести в демагоге невидимое, но всегда присутствующее буферное окно? Которое будет выполнять именно буферную (накопительную) функцию при работе со скриптами.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#136

Сообщение flegont » 20 ноя 2018 09:57

Периодически задумываюсь о чем-то подобном. Нужно нечто, способное содержать в себе строку в формате Юникод, и невидимое пользователю. Выберу время, проведу эксперимент.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#137

Сообщение tonio_k » 20 ноя 2018 10:14

Может такой вариант?
Формат - количество вкладок. Ограничить пользователя созданием только 15-вкладок.

в самом скрипте в начале, даётся команда
1)Получить количество существующих вкладок n
2)"Создать" вкладку n+1
3) работа с окном n+1
4) удалить вкладку n+1

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#138

Сообщение flegont » 20 ноя 2018 10:37

Я думаю вообще не о дополнительном скрытом окне, а о дополнительной переменной в программе, типа юникод-строки. Нечто вроде собственного демагоговского буфера обмена. Он мог бы сохранять текст любого указанного окна, в точности в том виде, как он есть - со всеми буквами: рус, лат, юникод. И объединение текстов проходило бы через этот буфер.
Все эти операции выполнял бы Демагог, а в интерпретатор добавить импортированные функции, наподобие: послать содержимое окна в память; извлечь из памяти в окно

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#139

Сообщение tonio_k » 21 ноя 2018 23:01

argo-interpreter.htm в описании Gauge(i) может добавить, что Gauge(0) - убирает (обнуляет) индикатор прогресса с экрана. Не сразу догадался как избавиться от этой зеленой полоски после отработки скрипта :jokingly:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#140

Сообщение flegont » 21 ноя 2018 23:23

Да, добавлю

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#141

Сообщение tonio_k » 22 ноя 2018 10:01

Collection of texts.lua столкнулся с дублированием текста из последнего присоединенного файла. Это происходит, например, при "сбойном добавлении" не читаемого файла из другого места. Окно 9 не пустое и при "сбое" цикл продолжает работать и добавлять в конец текста уже повторно содержимое окна 9.
WNew(9) надо перетащить в сам цикл.

WAdd(0,9,'\r\n\r\n\r\n')
WAdd(0,-1,'\r\n'..docend..' '..k)
WNew(9)
end
end
WNew(9)
ShowMessage(ready)

::HALT::[/code]

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#142

Сообщение flegont » 22 ноя 2018 14:19

Логично. Зачищать "буферное" окно сразу после использования.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#143

Сообщение tonio_k » 24 ноя 2018 04:37

Выкладываю примеры своих основных рабочих скриптов:
► Показать
ПАКЕТНАЯ ЗАПИСЬ ВСЕХ КНИГ В ПАПКЕ.lua - производит пакетную запись книг в MP3 т.е. всех книг в указанной пользователем папке
Условие - книги в папке должны быть сохранены с расширением *.txt
В шапке скрипта можно вручную отредактировать настройки сериала в том числе указать папку по умолчанию.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua

ПРОДОЛЖИТЬ ЗАПИСЬ СЕРИАЛА В ПАПКЕ.lua - на случай если была прервана запись сериала, то с помощью этого скрипта можно продолжить запись в MP3 с места прерывания (последний аудиофайл будет перезаписан). Продолжение записи происходит в пределах указанной папки.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua

СПИСОК СЛОВАРЕЙ.lua - список пользовательских словарей с указанием папки их местонахождения, а так же алгоритмом их применения.
Этот список был выведен отдельно что бы при изменениии в назавниях или изменения в порядке применения словарей не приходилось каждый раз менять этот список по всех скриптах, которые его используют.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#144

Сообщение flegont » 24 ноя 2018 10:10

:thank_you:
Посмотрю, потестирую.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#145

Сообщение tonio_k » 24 ноя 2018 20:15

balaamster,
balaamster писал(а):
24 ноя 2018 16:37
UPD. Если в папку с sox подкинуть библиотеку libmp3lame.dll, то можно без отдельной конвертации lame'ом обойтись, в одну строку
решил попробовать подогнать SOX под скрипт в Демагоге. Но что то не фортануло. В рабочей папке Демагог создал папку SOX в нее поместил все файлы с утилитой плюс добаавил libmp3lame.dll То ли дело в кодировке. То ли в неправильности составления командной строки.
Что не так?
► Показать

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#146

Сообщение flegont » 24 ноя 2018 21:48

Просит отсутствующую библиотеку libmad.
► Показать

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#147

Сообщение balaamster » 24 ноя 2018 21:53

tonio_k писал(а):
24 ноя 2018 20:15
Что не так?
В целом, в скрипте всё правильно.
Но происходит непонятная мне ошибка - путь к команде, обрамлённый кавычками, приводит к ошибке:
"Синтаксическая ошибка в имени файла, имени папки или метке тома."
Если кавычки убрать, то скрипт отрабатывает корректно:

Код: Выделить всё

doscomand = sox..' -G --multi-threaded -q '..'"'..homedir..a[i]..'"'..' -C 64.01 '..'"'..homedir..'temp_'..a[i]..'"'..' tempo -s 1.1 pitch -50  reverb 20 40 40'
Но будет работать некорректно, если в пути к Demagog будут пробелы.

Немного упростил скрипт:
► Показать
flegont писал(а):
24 ноя 2018 21:48
Просит отсутствующую библиотеку libmad.
Отсутствующую библиотеку нашёл https://www.videohelp.com/software?d=so ... p3lame.zip, там есть ссылка на сборку старой версии SoX "Download sox with libmad.dll and libmp3lame.dll here".
Из неё можно вытащить libmad.dll

В самом Demagog (Общие настройки - Аудио), я выбрал "CustomEncoder" прописал путь к SoX,
параметры

Код: Выделить всё

-G --multi-threaded -q %1 -C 64.01 %2 tempo -s 1.1 pitch -50  reverb 20 40 40
и расширение mp3
Можно так пользоваться для записи через WAuduo()

UPD.
Забыл добавить
Я для отлова ошибок, при выполнении консольных команд из скрипта, пользуюсь таким трюком: дописываю в конце команды "& pause" или 2>>С://temp//log.txt (выводит стандартный вывод ошибок в файл С://temp//log.txt). Или всё вместе.

Код: Выделить всё

    doscomand = string.format('%s -G --multi-threaded -q %s -C 64.01 %s tempo -s 1.1 pitch -50  reverb 20 40 40 2>>С://temp//log.txt & pause', sox, in_file, out_file)



Отправлено спустя 17 минут 12 секунд:
Решил попробовать на простых вариантах:
работает:

Код: Выделить всё

os.execute('C:\\windows\\system32\\cmd.exe /k dir "C:\\windows\\"')
os.execute('"C:\\windows\\system32\\cmd.exe" /k dir C:\\windows\\')
Не работает:

Код: Выделить всё

os.execute('"C:\\windows\\system32\\cmd.exe" /k dir "C:\\windows\\"')
Получается, если кавычки есть и в имени команды и имени файла-параметра, то os.execute не переваривает такое.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#148

Сообщение tonio_k » 24 ноя 2018 22:27

balaamster писал(а):
24 ноя 2018 22:10
Получается, если кавычки есть и в имени команды и имени файла-параметра, то os.execute не переваривает такое.
может так можно обойти ситуацию?
flegont писал(а):
18 окт 2018 23:55
Поискал в Инете: как в Lua можно получить список папок по заданному пути? Для Windows нашел вот такое (чорт побери, кто бы мог подумать... ). В любом окне Демагога пишем строчку (путь в ней можно поменять на любой):

for dir in io.popen([[dir "C:\Program Files\" /b /ad]]):lines() do print(dir) end

Жмем F2 и в окне Статистики видим список папок в C:\Program Files



Отправлено спустя 6 минут 42 секунды:
balaamster, и еще вопрос. " %s "- как это понимать?
взято например отсюда

Код: Выделить всё

sox = string.format('%ssox.exe',HomeFolder('sox'))

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#149

Сообщение balaamster » 24 ноя 2018 23:01

tonio_k писал(а):
24 ноя 2018 22:34
может так можно обойти ситуацию?
Нет, квадратные скобки тут не помогут. Проблема не в экранировании кавычек, а в том, как такую строку обрабатывает os.execute()
tonio_k писал(а):
24 ноя 2018 22:34
" %s "- как это понимать?
%s - это метка для вставки переменной в форматируемой строке, s указывает, что переменную необходимо воспринимать как строку.
a = hello
b = world
s = string.format("%s %s", a, b) -- получим строку "hello world"

Тут подробнее, и с примерами:
http://uopilot.tati.pro/index.php?title ... rmat_(Lua)


Отправлено спустя 38 минут 34 секунды:
Пока что идея такая:
Пуск - Компьютер - правый клик мыши - свойства - дополнительные параметры системы - вкладка "Дополнительно" - кнопка "Переменные среды" - переменные среды пользователя - переменная path - кнопка "изменить".
Дописать в поле "значение переменной" ;C:\путь к папке\sox
Тогда в скрипте можно просто писать:

Код: Выделить всё

    doscomand = string.format('sox.exe -G --multi-threaded -q %s -C 64.01 %s tempo -s 1.1 pitch -50  reverb 20 40 40 & pause', in_file, out_file)
В скрипте переменная sox не нужна.
И пробелы в пути к sox не страшны.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#150

Сообщение flegont » 24 ноя 2018 23:40

А если в скрипте создавать не командную строку, а bat-файл, содержащий эту строку: tmp.bat
и потом: os.execute('tmp.bat') ?

Ответить

Вернуться в «Demagog»