Страница 3 из 13
Скрипты для Demagog
Добавлено: 07 ноя 2018 21:42
flegont
Да, так сказать, "проходная версия" будет. Сейчас на оф. сайте экзешник с новым номером залью, и "флажок" подниму, чтобы проверка на наличие новой версии срабатывала
Отправлено спустя 15 минут 1 секунду:
Ну, вот. Без шума и пыли (с) номер 360
Скрипты для Demagog
Добавлено: 07 ноя 2018 23:22
tonio_k
► Показать
Код: Выделить всё
function doFilterAndAudioToAll(folder, mask, diclist, remsource)
IgnoreDicPan()
local b, d, mode
local ans = false
local k = #folder
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
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..a[i])
-- WOpen(0,folder..a[i])
WAudio(0,folder,false)
if remsource then os.remove(folder..a[i]) end
end
WNew(0)
return #a, #diclist
end
Почему, если заремарить:
Код: Выделить всё
-- WSave(0,folder..a[i])
-- WOpen(0,folder..a[i])
, то WAudio(0,folder,false) начинает записывать в стиле:
20181107-231539.mp3
20181107-231618.mp3
Скрипты для Demagog
Добавлено: 07 ноя 2018 23:35
flegont
текст серии не сохранен, имеется только в окне Демагога, у него еще нет имени - для аудио генерируется имя из даты и времени
Скрипты для Demagog
Добавлено: 08 ноя 2018 13:45
tonio_k
Хотелось бы что нибудь сделать с кнопкой "стоп" на время работы скриптов.
Если вместо os.exit() по привычке нажать "стоп", да еще несколько раз, то результат работы скрипта может быть очень непредсказуемым. Ведь происходит "остановка и пропуск" работы текущего словаря, но работа самого скрипта продолжается и файл на выходе становится "битым"(не до конца обработанным словарями) и этот "битый" файл подхватывается WAudio. А если еще активировано удаление txt файлов после срабатывания WAudio, то даже "продолжить" с прерванного места будет невозможно - файлы удалены. Пока в настройках вообще убрал с панели кнопку "стоп". Но это не выход для тех, кто читает вслух из самой программы Демагог
Отправлено спустя 15 минут 51 секунду:
Как вариант, WFilter и WAudio вообще отключить реакцию на кнопку "стоп". Эта кнопка все равно не может остановить скрипт, то пусть хотя бы его не "ломает"
Скрипты для Demagog
Добавлено: 08 ноя 2018 15:02
flegont
Подумаю над этим.
Скрипты для Demagog
Добавлено: 09 ноя 2018 02:20
tonio_k
Черновик скрипта для анализа и сравнения по времени работы правил из словарей.
Для его работы нужно создать в папке 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)?
Скрипты для Demagog
Добавлено: 09 ноя 2018 09:17
flegont
Черновик скрипта для анализа и сравнения по времени работы правил
Спасибо. Посмотрю, потестирую.
доработать данный скрипт, но уже не под словари, а под встроенную в Демагог функцию Найти/Заменить
Уточните, пожалуйста, что имеется в виду? Проверка сохраненных шаблонов поиска, если они являются правилами типа dic или rex?
Скрипты для Demagog
Добавлено: 09 ноя 2018 11:57
tonio_k
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 по функциональности и ресурсам одно и тоже, то смысла такое делать, конечно нет
Отправлено спустя 6 минут 32 секунды:
Хм... А ведь это плавно "возвращает" к когда то ранее поднятой мною теме:
► Показать
tonio_k писал(а):
Чисто теоретический вопрос:
Интересно, а если словари DIC , REX как нибудь адаптировать под скрипт для демагога. Как бы он быстро/медленно и ресурсоемко бы их отрабатывал?
Меня самого интересует этот вопрос.
Что, если написать скрипт для словарных замен, который не обращался бы к соответствующим процедурам Демагога, а всё делал бы сам? Например, замены в тексте по правилам словарей DIC?
(С REX он не справится, в нем нет поддержки регулярных выражений)
При всем при том, язык Lua отличается необычайной шустростью в обработке больших (и даже очень больших) строк.
От экспериментов удерживает лишь одно серьезное обстоятельство.
Lua - не поддерживает Юникод.
В любой стране, на любой версии Windows ему доступны лишь 2 алфавита: английский и местная локаль.
Т.е. для нас - это английский+русский.
Следовательно, lua-скрипт не смог бы сам выполнять замены в тексте со вставкой тега phoneme, содержащего транскрипцию IPA
С транскрипцией UPS в теге pron SAPI5 - он бы справился - она - машиночитаемая.
Но... мне больше нравится IPA - она человекочитаемая!
Таковы серьезные обстоятельства, снижающие мой энтузиазм в отношении lua-скрипта для непосредственных словарных замен.
Именно поэтому словарные замены скрипт Pronunciation adjustment.lua делает путем вызова процедур Демагога. Уж Демагогу-то юникод доступен.
Отправлено спустя 3 минуты 51 секунду:
Я к тому, что благодаря поддержке Демагогом скриптам,
search.lst можно будет спокойно присоединять к обработке текста в тех местах, где не требуется Юникод
Скрипты для Demagog
Добавлено: 09 ноя 2018 13:38
flegont
если WFilter и работа с шаблоном search по функциональности и ресурсам одно и тоже
Похоже, что это так и есть. Какая (в принципе) разница: вытащить очередное правило из файла словаря и прогнать его через скрипт проверки; или вытащить одну строку из файла search.lst, убрать префикс и прогнать получившееся правило через скрипт проверки?
Что лбом, что по лбу (с)
словари DIC , REX как нибудь адаптировать под скрипт для демагога
Ближе к Новому году найду (надеюсь) время провести соответствующий эксперимент.
Скрипты для Demagog
Добавлено: 09 ноя 2018 14:06
tonio_k
flegont писал(а): ↑09 ноя 2018 13:38
Что лбом, что по лбу (с)
Ок. Значит останусь на текущем "черновике". К стати, этот "черновик" показал, что правило со звездочкой в dic работает ощутимее медленнее чем в rex. Правила со звездочкой хороши своим удобством и легкостью в написании. А ведь был момент, когда будучи уверенным, что dic это быстрота, начал правила из rex "упрощать" путем экспорта в правила dic со звездочкой. Оговорюсь: DIC - это реально быстрота! Но только для простых правил без звёзд
Скрипты для Demagog
Добавлено: 09 ноя 2018 15:15
flegont
dic-словари хороши своей интуитивной понятностью.
rex-словари хороши своей универсальностью.
Поэтому, там, где требуется сложное, нетривиальное правило - надо применять регулярные выражения, и не искать легких путей
Скрипты для Demagog
Добавлено: 10 ноя 2018 00:34
tonio_k
flegont, Поиск/замена (Ctrl+F)
Шаблон REX, Все подходящие.
Иногда очень не хватает кнопки "Переместить все подходящие"
т.е. одной кнопкой Две операции:
1)Все подходящие вывести в окно Статистики
2)В окне где велся поиск - Заменить найденное на "пусто"
Может это как то можно через диалог скрипта сделать?
Вызываю скрипт, ввожу регулярное выражение и результат вижу в окне статистики, а в оригинальном документе этих строк уже нет.
Отправлено спустя 11 минут 42 секунды:
Хотя, как скрипт - все же не надо. Не удобно - слишком много кликов что бы вызвать скрипт, а как окно поиска на 2 окнах "параллельно" работать не будет. Тупиковая идея - через скрипт. Подумайте тогда над дополнительной галочкой "Удалить найденное в оригинале" - что бы срабатывал только при нажатии кнопки "Все подходящие" Или ввести дополнительную кнопку "Переместить в окно статистики"
Скрипты для Demagog
Добавлено: 10 ноя 2018 12:12
flegont
Что-нибудь придумаю
Скрипты для Demagog
Добавлено: 12 ноя 2018 20:27
tonio_k
Вопрос, почему в скрипте 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
Скрипты для Demagog
Добавлено: 12 ноя 2018 21:57
flegont
Как бы да, индикатор должен сработать 3 раза.
Но если каждый словарь из одной строчки, то индикатор иногда даже запуститься может не успеть, как ему уже пора выключаться.
Скрипты для Demagog
Добавлено: 12 ноя 2018 22:39
tonio_k
У правил со звездочками есть один недостаток:
Например:
из * воды=из водЫ
Недостаток в том, что это же правило "ошибочно" сработает и на :
Никак не могли достать из воды. Воды здесь были мутные.
тут под звездочку попадает воды.
Это немного притормаживало желание их применять.
Обсуждая в Вами вопросы о разбитии блоков для чтения на части по символам в пределах предложения или в пределах абзаца - навело меня на идею, как можно уменьшить вероятность ложного срабатывания звездочек в правилах DIC не меняя сам алгоритм их работы.
Для этого нужно в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
Вот и всё.
Тогда при указании этого параметра, все правила со звездочкой WFilter будет отрабатывать только в рамках одного предложения.
Никак не могли достать из воды. Воды здесь были мутные. - так как это уже два предложения, и по отдельности они уже не попадают под это правило, ошибочного срабатывания не будет.
Правила, которые требуют захват "соседнего предложения" напрмер:
*. А что стоит?=. А что стОит?
*. бегом.=. бегОм.
*. берете?=. берёте?
можно перенести в другой словарь и обрабатывать его в скрипте с разбиением на блоки по умолчанию - согласно общим настройкам из Демагога.
Скрипты для Demagog
Добавлено: 12 ноя 2018 23:16
flegont
А с этим что делать?
Никак не могли достать из воды; воды здесь были мутные.
Это - одно предложение. И, тем не менее, правило из * воды=из водЫ сработает на нем неверно. По той же самой причине - звездочка - это очень широко действующий символ, под него подходит любое слово.
Кстати, я пока не соображу, как и регулярными выражениями этот (и другие подобные) казус обойти.
Скрипты для Demagog
Добавлено: 13 ноя 2018 01:47
tonio_k
flegont писал(а): ↑12 ноя 2018 23:16
казус обойти.
ваш пример действительно скорее казус, чем распространенное явление.
Вообще если посмотреть нынешний словарь от waska, то почти половина правил в словарях REX идут с запретом на любые знаки препинания. Именно это минимизирует до предела ложные срабатывания.
Алгоритм звездочек за счет их расширенности в трактовке - скорее увеличивают вероятность ложных срабатываний.
Моя идея сузить поиск в работе правил со звездочками в одно предложение - это скорее попытка сделать уникальное свойство звездочек в Демагоге - еще более гибким и настраиваемым инструментом создания правил. Как для
разгрузки словарей REX и ускорения обработки, так и упрощения создания словарей в целом.
Я не прошу сделать DIC конкурентом для REX словарей с вводом всяких ключей и спец символов. Но сделать звездочки в правилах DIC более гибкими и настраиваемыми хотя бы на уровне скриптов - было бы очень круто для составителя словаря.
В идеале хотелось бы для трактовки звездочки сделать 2 режима на выбор пользователя на уровне скрипта:
1) стандартный (который сейчас применяется)
2) полный аналог (\w+) в словарях REX (тогда и необходимость свести поиск словарем в пределах одного предложения сама собой отпадёт)
в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
само по себе это был бы уже большой шаг к дополнительному применению звездочек в словаре DIC причем не меняющий уже существующий "традиционный" алгоритм
Скрипты для Demagog
Добавлено: 13 ноя 2018 09:25
flegont
Я не хочу вдаваться в подробности dic-алгоритма словарных замен. Но одна существенная особенность, на которую он опирается, это то, что * в правиле обозначает
любой символ.
Любой, без всяких исключений.
Отступление от этого принципа повлечет за собой нарастающую лавину изменений - в сущности, это будет уже новый алгоритм. А, как известно, перестройка - дело ответственное.
"Когда у меня будет, что сказать, я ответ даду" (с)
Отправлено спустя 3 часа 16 минут 32 секунды:
P.S. Правила с отдельно стоящими * соблазняют своей простотой. Но надо быть внимательными. Например, упомянутое правило:
из * воды=из водЫ мало того, что захватывает ненужные словосочетания, еще и правильные сочетания являются весьма редкими.
► Показать
Для проверки загрузим в Демагог какой-нибудь очень большой текст, например, сборник литературных произведений. Мегабайт эдак на 20-30. Затем:
Ctrl+F --> Поиск --> из * воды --> Шаблон DIC --> Все подходяшие
Результат (не густо, однако):
# Все подходящие из "bigtext.txt"
из темной воды.
из холодной воды.
из этой воды:
Таким образом, лучшим вариантом правила будет:
из *ой воды=из ой водЫ
Могу так же, предположить, что вот такое правило: из * * воды=ой водЫ
можно заменить на: из *ой *ой воды=из ой ой водЫ
(В тестовом bigtext.txt - 20мб - встретилось 1 раз)
Других сочетаний русский язык, похоже, не допускает.
Скрипты для Demagog
Добавлено: 13 ноя 2018 15:05
balaamster
flegont писал(а): ↑13 ноя 2018 12:42
еще и правильные сочетания являются весьма редкими
Действительно, встречаются нечасто. Посмотрел количество встреч подобных шаблонов в 6622 текстовых файлов книг (utf-8; 1,94 ГБ):
из * воды G Docs
Из * воды - 177 раз
из * * воды - 80 раз
Скрипты для Demagog
Добавлено: 13 ноя 2018 15:35
tonio_k
Этот конкретный пример вообще был взят с потолка первое что в голову пришло.
Я могу привести несколько примеров из rex словаря, которые я мог адаптировать в dic словарь, но меня останавливает слишком Широкая трактовка значений звёздочки. Давайте это обсудим на основной ветки демагог.
А сейчас ещё раз повторюсь, я не ставлю под сомнение эффективность звёздочки и не прошу реально менять алгоритм! Это были всего лишь мечты! Не факт что от них будет больше плюсов чем минусов. Сейчас я прошу дать возможность пользователю самостоятельно на уровне скрипта WFiilter при применении словаря принудительно указать количество символов и указать "ограничение в одном предложении" Ничего более! Про звездочки Это я размышлял в Для чего в вообще это может понадобиться.
По умолчанию ее нет и на неё случайно никто не наткнется. Кому надо - тот в скрипте включит.
Скрипты для Demagog
Добавлено: 13 ноя 2018 18:40
flegont
на уровне скрипта WFiilter
Функция WFilter() во встроенном интерпретаторе - это лишь ссылка на 2 подпрограммы Демагога - быстрый алгоритм и алгоритм прямого перебора. Изменить функцию WFiltеr() как раз и означает - изменить оба алгоритма. Чего я в обозримом будущем не планирую.
Что касается: дать пользователю возможность самому на уровне скрипта творить собственные алгоритмы словарных замен - это другое дело. Не связанное с функцией WFilter(). Посмотрим. Мне надо поэкспериментировать.
Скрипты для Demagog
Добавлено: 13 ноя 2018 22:42
tonio_k
в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
хочу прощупать обходной путь к решению моей проблемы...
. Скажите пожалуйста, как Демагог работает с собственным файлом настроек
$.cfg? Подгружает при запуске и Постоянно держит в памяти, а к самому файлу
$.cfg обращается только при открытии пункта меню Настроек? Или это происходит чаще? Как
WFilter работает с
$.cfg?
Я к тому, что бы через скрипт "подменять строки" в общих настройках Демагога перед запуском к-либо функции. и возвращать ее на место, когда она отработает.
Отправлено спустя 25 минут 25 секунд:
balaamster писал(а): ↑13 ноя 2018 15:05
Действительно, встречаются нечасто. Посмотрел количество встреч подобных шаблонов в 6622 текстовых файлов книг (utf-8; 1,94 ГБ):
balaamster, я так понял, с программированием у вас "на ты"
Такая просьба, не могли бы вы проделать еще такое исследование:
Как часто встречается такая схема
w1. w1
w1. wх w1
w1 wх. w1
Условие: w1=w1 - любое слово, но равные между собой (без учета регистра букв)
wх - любое слово (без учета регистра букв)
Хочу понять, может у меня не звездочки виноваты. а моя паранойя?
и таких комбинаций в тексте так мало, что ими смело можно пренебречь?
Скрипты для Demagog
Добавлено: 13 ноя 2018 23:48
flegont
$.cfg читается 1 раз при загрузке Демагога.
Скрипты для Demagog
Добавлено: 14 ноя 2018 00:00
balaamster
tonio_k писал(а): ↑13 ноя 2018 23:07
с программированием у вас "на ты"
К сожалению, пока что, "на вы". Но определённый опыт имеется.
Прошёлся Вашими шаблонами по своей библиотеке. Получился такой
результат
Скрипты для Demagog
Добавлено: 14 ноя 2018 00:10
flegont
1) Я уже высказывался, почему не буду ничего менять ни в быстром алгоритме, ни в прямом переборе, из-за того, что * захватывает любые символы. Такой у нее смысл в словарях dic - захватывать любые символы. Если это правило нарушить, то масса ранее составленных пользователями dic-словарей перестанут правильно работать.
2) Это свойство * мне тоже иногда доставляет неудобство, и хочется иметь алгоритм замен, реализуемый только средствами Lua. Т.е. вообще без обращения к импортированной из Демагога функции WFilter(). Такой алгоритм у меня есть. Он нуждается в проверке, чтобы убедиться в его практической применимости.
Во всяком случае, пример с правилом из * воды, приведенным tonio_k, отработал мгновенно и совершенно правильно.
Скрипты для Demagog
Добавлено: 16 ноя 2018 19:36
tonio_k
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 и как это значение "вытащить" из функции уже в самом скрипте?
Скрипты для Demagog
Добавлено: 16 ноя 2018 20:42
flegont
Код: Выделить всё
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
Скрипты для Demagog
Добавлено: 17 ноя 2018 13:01
tonio_k
Предложение по функции
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 при повторном прогоне словарями может дать непредсказуемый результат.
"Для разнообразия и украшательства"
:
тот же
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)
Скрипты для Demagog
Добавлено: 17 ноя 2018 15:11
flegont
Посмотрю, потестирую.
Скрипты для Demagog
Добавлено: 17 ноя 2018 17:46
tonio_k
tonio_k писал(а): ↑17 ноя 2018 13:11
pru на выходе будет иметь вид:
КОД: ВЫДЕЛИТЬ ВСЁ
История обработки:
0001.txt - Словари: 4 сек; Аудио: 1 сек; Всего: 5 сек.
0002.txt - Словари: 6 сек; Аудио: 2 сек; Всего: 8 сек.
Немного ошибся.
Что бы получить
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
Добавлено: 19 ноя 2018 23:30
flegont
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 секунд вернет окно, которое было открытым до этого.
Скрипты для Demagog
Добавлено: 20 ноя 2018 01:11
tonio_k
Предложение по небольшой корректировке шаблона
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::
Скрипты для Demagog
Добавлено: 20 ноя 2018 09:38
flegont
Идея красивая, но сработает лишь для текстов, не содержащих юникода.
Попытка, например, составить сборник японских хайку с русским переводом, приведет к тому, что останется только русский перевод, а японский текст превратится в шифр, наподобие: #22899;#12398;#23376;#12399;#32094;#39318; ...
То же самое случится с при объединении словарей, содержащих транскрипцию МФА. И т.д. и т.п.
Причину подобных печальных казусов я оглашалуже не раз.
Lua не понимает юникод.
Поэтому предложенный вариант функции даст правильные результаты только для текстов на английском и/или русском языке. (Т.е. английский + местная локаль)
Замечание. Функция WAdd() была придумана мною именно для того, чтобы избежать указанной ситуации. Текст из одного окна добавляется к тексту из другого окна без вмешательства интерпретатора - самим Демагогом. Интерпретатор лишь обеспечивает показ Диалога открытия файлов и цикл по выбранным файлам. В цикле он передает работу по перебросу текстов Демагогу. А по завершении цикла бодро рапортует, что всё готово. "И мы пахали" (с)
Скрипты для Demagog
Добавлено: 20 ноя 2018 09:50
tonio_k
Понял. Не подумал. Так ведь и текст с фонемами IPA можно сломать! Тогда для избежания возможных "накладок" с окном 9 (вдруг там у пользователя что то уже открыто) и вообще для расширения возможностей решения подобных задач может ввести в демагоге невидимое, но всегда присутствующее буферное окно? Которое будет выполнять именно буферную (накопительную) функцию при работе со скриптами.
Скрипты для Demagog
Добавлено: 20 ноя 2018 09:57
flegont
Периодически задумываюсь о чем-то подобном. Нужно нечто, способное содержать в себе строку в формате Юникод, и невидимое пользователю. Выберу время, проведу эксперимент.
Скрипты для Demagog
Добавлено: 20 ноя 2018 10:14
tonio_k
Может такой вариант?
Формат - количество вкладок. Ограничить пользователя созданием только 15-вкладок.
в самом скрипте в начале, даётся команда
1)Получить количество существующих вкладок n
2)"Создать" вкладку n+1
3) работа с окном n+1
4) удалить вкладку n+1
Скрипты для Demagog
Добавлено: 20 ноя 2018 10:37
flegont
Я думаю вообще не о дополнительном скрытом окне, а о дополнительной переменной в программе, типа юникод-строки. Нечто вроде собственного демагоговского буфера обмена. Он мог бы сохранять текст любого указанного окна, в точности в том виде, как он есть - со всеми буквами: рус, лат, юникод. И объединение текстов проходило бы через этот буфер.
Все эти операции выполнял бы Демагог, а в интерпретатор добавить импортированные функции, наподобие: послать содержимое окна в память; извлечь из памяти в окно
Скрипты для Demagog
Добавлено: 21 ноя 2018 23:01
tonio_k
argo-interpreter.htm в описании Gauge(i) может добавить, что
Gauge(0) - убирает (обнуляет) индикатор прогресса с экрана. Не сразу догадался как избавиться от этой зеленой полоски после отработки скрипта
Скрипты для Demagog
Добавлено: 21 ноя 2018 23:23
flegont
Да, добавлю
Скрипты для Demagog
Добавлено: 22 ноя 2018 10:01
tonio_k
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]
Скрипты для Demagog
Добавлено: 22 ноя 2018 14:19
flegont
Логично. Зачищать "буферное" окно сразу после использования.
Скрипты для Demagog
Добавлено: 24 ноя 2018 04:37
tonio_k
Выкладываю примеры своих основных рабочих скриптов:
ПАКЕТНАЯ ЗАПИСЬ ВСЕХ КНИГ В ПАПКЕ.lua - производит пакетную запись книг в MP3 т.е. всех книг в указанной пользователем папке
Условие - книги в папке должны быть сохранены с расширением *.txt
В шапке скрипта можно вручную отредактировать настройки сериала в том числе указать папку по умолчанию.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua
ПРОДОЛЖИТЬ ЗАПИСЬ СЕРИАЛА В ПАПКЕ.lua - на случай если была прервана запись сериала, то с помощью этого скрипта можно продолжить запись в MP3 с места прерывания (последний аудиофайл будет перезаписан). Продолжение записи происходит в пределах указанной папки.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua
СПИСОК СЛОВАРЕЙ.lua - список пользовательских словарей с указанием папки их местонахождения, а так же алгоритмом их применения.
Этот список был выведен отдельно что бы при изменениии в назавниях или изменения в порядке применения словарей не приходилось каждый раз менять этот список по всех скриптах, которые его используют.
Скрипты для Demagog
Добавлено: 24 ноя 2018 10:10
flegont
Посмотрю, потестирую.
Скрипты для Demagog
Добавлено: 24 ноя 2018 20:15
tonio_k
balaamster,
balaamster писал(а): ↑24 ноя 2018 16:37
UPD. Если в папку с sox подкинуть библиотеку libmp3lame.dll, то можно без отдельной конвертации lame'ом обойтись, в одну строку
решил попробовать подогнать SOX под скрипт в Демагоге. Но что то не фортануло. В рабочей папке Демагог создал папку SOX в нее поместил все файлы с утилитой плюс добаавил libmp3lame.dll То ли дело в кодировке. То ли в неправильности составления командной строки.
Что не так?
► Показать
Код: Выделить всё
sox = HomeFolder('sox')
sox = sox..'sox.exe'
homedir = Folders("ВЫБЕРИТЕ ПАПКУ С MP3 для изменения скорости воспроизведения\n", '', true)
if not homedir then goto HALT end
a = AllFiles(homedir,'\\*.mp3')
for i = 1,#a do
tempfile = FileExists(homedir..a[i])
if tempfile then
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'
print(doscomand)
os.execute(doscomand)
--os.remove(homedir..a[i])
--os.rename (homedir..'temp_'..a[i], homedir..a[i])
end
end
::HALT::
Скрипты для Demagog
Добавлено: 24 ноя 2018 21:48
flegont
Просит отсутствующую библиотеку libmad.
► Показать
Код: Выделить всё
sox = [[d:\1 - Progs\sox\sox.exe]] -- полное имя утилиты на моем компе
--sox = HomeFolder('sox')
--sox = sox..'sox.exe'
homedir = Folders("ВЫБЕРИТЕ ПАПКУ С MP3 для изменения скорости воспроизведения\n", '', true)
if not homedir then goto HALT end
a = AllFiles(homedir,'\\*.mp3')
for i = 1,#a do
tempfile = FileExists(homedir..a[i])
if tempfile then
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'
print(doscomand)
-- os.execute(doscomand)
--os.remove(homedir..a[i])
--os.rename (homedir..'temp_'..a[i], homedir..a[i])
end
end
::HALT::
Распечатывает сгенерированные командные строки в окне Статистики, как будто выглядят нормально. Беру первую и запускаю в Windows консольно, чтобы посмотреть, что выдаст:
"d:\1 - Progs\sox\sox.exe" -G --multi-threaded -q "D:\MP3\0001.mp3" -C 64.01 "D:\MP3\temp_0001.mp3" tempo -s 1.1 pitch -50 reverb 20 40 40
d:\1 - Progs\sox\sox.exe FAIL util: Unable to load MAD decoder library (libmad).
d:\1 - Progs\sox\sox.exe FAIL formats: can't open input file `D:\MP3\0001.mp3':
Скрипты для Demagog
Добавлено: 24 ноя 2018 21:53
balaamster
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 будут пробелы.
Немного упростил скрипт:
► Показать
Код: Выделить всё
sox = string.format('%ssox.exe',HomeFolder('sox'))
homedir = Folders("ВЫБЕРИТЕ ПАПКУ С MP3 для изменения скорости воспроизведения\n", '', true)
if not homedir then goto HALT end
a = AllFiles(homedir,'*.mp3')
for i = 1,#a do
if FileExists(homedir..a[i]) then
in_file = string.format('"%s%s"', homedir, a[i])
out_file = string.format('"%stemp_%s"', homedir, a[i])
doscomand = string.format('%s -G --multi-threaded -q %s -C 64.01 %s tempo -s 1.1 pitch -50 reverb 20 40 40', sox, in_file, out_file)
-- doscomand = string.format('%s 2>>C:\\intel\\log.txt & pause', sox)
WLog(doscomand)
os.execute(doscomand)
--os.remove(in_file)
--os.rename (out_file, in_file)
end
end
::HALT::
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 не переваривает такое.
Скрипты для Demagog
Добавлено: 24 ноя 2018 22:27
tonio_k
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'))
Скрипты для Demagog
Добавлено: 24 ноя 2018 23:01
balaamster
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 не страшны.
Скрипты для Demagog
Добавлено: 24 ноя 2018 23:40
flegont
А если в скрипте создавать не командную строку, а bat-файл, содержащий эту строку: tmp.bat
и потом: os.execute('tmp.bat') ?