Скрипты для 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

Ответить

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