Скрипты для Demagog
Модератор: flegont
- flegont
- V.I.P.
Скрипты для Demagog
Да, так сказать, "проходная версия" будет. Сейчас на оф. сайте экзешник с новым номером залью, и "флажок" подниму, чтобы проверка на наличие новой версии срабатывала
Отправлено спустя 15 минут 1 секунду:
Ну, вот. Без шума и пыли (с) номер 360
Отправлено спустя 15 минут 1 секунду:
Ну, вот. Без шума и пыли (с) номер 360
- tonio_k
- V.I.P.
Скрипты для Demagog
► Показать
Код: Выделить всё
-- WSave(0,folder..a[i])
-- WOpen(0,folder..a[i])
20181107-231539.mp3
20181107-231618.mp3
- flegont
- V.I.P.
Скрипты для Demagog
текст серии не сохранен, имеется только в окне Демагога, у него еще нет имени - для аудио генерируется имя из даты и времени
- tonio_k
- V.I.P.
Скрипты для Demagog
Хотелось бы что нибудь сделать с кнопкой "стоп" на время работы скриптов.
Если вместо os.exit() по привычке нажать "стоп", да еще несколько раз, то результат работы скрипта может быть очень непредсказуемым. Ведь происходит "остановка и пропуск" работы текущего словаря, но работа самого скрипта продолжается и файл на выходе становится "битым"(не до конца обработанным словарями) и этот "битый" файл подхватывается WAudio. А если еще активировано удаление txt файлов после срабатывания WAudio, то даже "продолжить" с прерванного места будет невозможно - файлы удалены. Пока в настройках вообще убрал с панели кнопку "стоп". Но это не выход для тех, кто читает вслух из самой программы Демагог
Отправлено спустя 15 минут 51 секунду:
Как вариант, WFilter и WAudio вообще отключить реакцию на кнопку "стоп". Эта кнопка все равно не может остановить скрипт, то пусть хотя бы его не "ломает"
Если вместо os.exit() по привычке нажать "стоп", да еще несколько раз, то результат работы скрипта может быть очень непредсказуемым. Ведь происходит "остановка и пропуск" работы текущего словаря, но работа самого скрипта продолжается и файл на выходе становится "битым"(не до конца обработанным словарями) и этот "битый" файл подхватывается WAudio. А если еще активировано удаление txt файлов после срабатывания WAudio, то даже "продолжить" с прерванного места будет невозможно - файлы удалены. Пока в настройках вообще убрал с панели кнопку "стоп". Но это не выход для тех, кто читает вслух из самой программы Демагог
Отправлено спустя 15 минут 51 секунду:
Как вариант, WFilter и WAudio вообще отключить реакцию на кнопку "стоп". Эта кнопка все равно не может остановить скрипт, то пусть хотя бы его не "ломает"
- tonio_k
- V.I.P.
Скрипты для Demagog
Черновик скрипта для анализа и сравнения по времени работы правил из словарей.
Для его работы нужно создать в папке 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 раз для нагрузки и выявления времени задержки при обработке.
flegont, может вы сможете доработать данный скрипт, но уже не под словари, а под встроенную в Демагог функцию Найти/Заменить (Ctrl+F)?
Для его работы нужно создать в папке 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
- V.I.P.
Скрипты для Demagog
Спасибо. Посмотрю, потестирую.Черновик скрипта для анализа и сравнения по времени работы правил
Уточните, пожалуйста, что имеется в виду? Проверка сохраненных шаблонов поиска, если они являются правилами типа dic или rex?доработать данный скрипт, но уже не под словари, а под встроенную в Демагог функцию Найти/Заменить
- tonio_k
- V.I.P.
Скрипты для Demagog
Наверное это и имел в виду...
я хотел вместо 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 секунды:
Хм... А ведь это плавно "возвращает" к когда то ранее поднятой мною теме:
► Показать
Отправлено спустя 3 минуты 51 секунду:
Я к тому, что благодаря поддержке Демагогом скриптам, search.lst можно будет спокойно присоединять к обработке текста в тех местах, где не требуется Юникод
- flegont
- V.I.P.
Скрипты для Demagog
Похоже, что это так и есть. Какая (в принципе) разница: вытащить очередное правило из файла словаря и прогнать его через скрипт проверки; или вытащить одну строку из файла search.lst, убрать префикс и прогнать получившееся правило через скрипт проверки?если WFilter и работа с шаблоном search по функциональности и ресурсам одно и тоже
Что лбом, что по лбу (с)
Ближе к Новому году найду (надеюсь) время провести соответствующий эксперимент.словари DIC , REX как нибудь адаптировать под скрипт для демагога
- tonio_k
- V.I.P.
Скрипты для Demagog
Ок. Значит останусь на текущем "черновике". К стати, этот "черновик" показал, что правило со звездочкой в dic работает ощутимее медленнее чем в rex. Правила со звездочкой хороши своим удобством и легкостью в написании. А ведь был момент, когда будучи уверенным, что dic это быстрота, начал правила из rex "упрощать" путем экспорта в правила dic со звездочкой. Оговорюсь: DIC - это реально быстрота! Но только для простых правил без звёзд
- flegont
- V.I.P.
Скрипты для Demagog
dic-словари хороши своей интуитивной понятностью.
rex-словари хороши своей универсальностью.
Поэтому, там, где требуется сложное, нетривиальное правило - надо применять регулярные выражения, и не искать легких путей
rex-словари хороши своей универсальностью.
Поэтому, там, где требуется сложное, нетривиальное правило - надо применять регулярные выражения, и не искать легких путей
- tonio_k
- V.I.P.
Скрипты для Demagog
flegont, Поиск/замена (Ctrl+F)
Шаблон REX, Все подходящие.
Иногда очень не хватает кнопки "Переместить все подходящие"
т.е. одной кнопкой Две операции:
1)Все подходящие вывести в окно Статистики
2)В окне где велся поиск - Заменить найденное на "пусто"
Может это как то можно через диалог скрипта сделать?
Вызываю скрипт, ввожу регулярное выражение и результат вижу в окне статистики, а в оригинальном документе этих строк уже нет.
Отправлено спустя 11 минут 42 секунды:
Хотя, как скрипт - все же не надо. Не удобно - слишком много кликов что бы вызвать скрипт, а как окно поиска на 2 окнах "параллельно" работать не будет. Тупиковая идея - через скрипт. Подумайте тогда над дополнительной галочкой "Удалить найденное в оригинале" - что бы срабатывал только при нажатии кнопки "Все подходящие" Или ввести дополнительную кнопку "Переместить в окно статистики"
Шаблон REX, Все подходящие.
Иногда очень не хватает кнопки "Переместить все подходящие"
т.е. одной кнопкой Две операции:
1)Все подходящие вывести в окно Статистики
2)В окне где велся поиск - Заменить найденное на "пусто"
Может это как то можно через диалог скрипта сделать?
Вызываю скрипт, ввожу регулярное выражение и результат вижу в окне статистики, а в оригинальном документе этих строк уже нет.
Отправлено спустя 11 минут 42 секунды:
Хотя, как скрипт - все же не надо. Не удобно - слишком много кликов что бы вызвать скрипт, а как окно поиска на 2 окнах "параллельно" работать не будет. Тупиковая идея - через скрипт. Подумайте тогда над дополнительной галочкой "Удалить найденное в оригинале" - что бы срабатывал только при нажатии кнопки "Все подходящие" Или ввести дополнительную кнопку "Переместить в окно статистики"
- tonio_k
- V.I.P.
Скрипты для Demagog
Вопрос, почему в скрипте 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
Как бы да, индикатор должен сработать 3 раза.
Но если каждый словарь из одной строчки, то индикатор иногда даже запуститься может не успеть, как ему уже пора выключаться.
Но если каждый словарь из одной строчки, то индикатор иногда даже запуститься может не успеть, как ему уже пора выключаться.
- tonio_k
- V.I.P.
Скрипты для Demagog
У правил со звездочками есть один недостаток:
Например:
из * воды=из водЫ
Недостаток в том, что это же правило "ошибочно" сработает и на :
Никак не могли достать из воды. Воды здесь были мутные.
тут под звездочку попадает воды.
Это немного притормаживало желание их применять.
Обсуждая в Вами вопросы о разбитии блоков для чтения на части по символам в пределах предложения или в пределах абзаца - навело меня на идею, как можно уменьшить вероятность ложного срабатывания звездочек в правилах DIC не меняя сам алгоритм их работы.
Для этого нужно в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
Вот и всё.
Тогда при указании этого параметра, все правила со звездочкой WFilter будет отрабатывать только в рамках одного предложения.
Никак не могли достать из воды. Воды здесь были мутные. - так как это уже два предложения, и по отдельности они уже не попадают под это правило, ошибочного срабатывания не будет.
Правила, которые требуют захват "соседнего предложения" напрмер:
*. А что стоит?=. А что стОит?
*. бегом.=. бегОм.
*. берете?=. берёте?
можно перенести в другой словарь и обрабатывать его в скрипте с разбиением на блоки по умолчанию - согласно общим настройкам из Демагога.
Например:
из * воды=из водЫ
Недостаток в том, что это же правило "ошибочно" сработает и на :
Никак не могли достать из воды. Воды здесь были мутные.
тут под звездочку попадает воды.
Это немного притормаживало желание их применять.
Обсуждая в Вами вопросы о разбитии блоков для чтения на части по символам в пределах предложения или в пределах абзаца - навело меня на идею, как можно уменьшить вероятность ложного срабатывания звездочек в правилах DIC не меняя сам алгоритм их работы.
Для этого нужно в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
Вот и всё.
Тогда при указании этого параметра, все правила со звездочкой WFilter будет отрабатывать только в рамках одного предложения.
Никак не могли достать из воды. Воды здесь были мутные. - так как это уже два предложения, и по отдельности они уже не попадают под это правило, ошибочного срабатывания не будет.
Правила, которые требуют захват "соседнего предложения" напрмер:
*. А что стоит?=. А что стОит?
*. бегом.=. бегОм.
*. берете?=. берёте?
можно перенести в другой словарь и обрабатывать его в скрипте с разбиением на блоки по умолчанию - согласно общим настройкам из Демагога.
- flegont
- V.I.P.
Скрипты для Demagog
А с этим что делать?
Никак не могли достать из воды; воды здесь были мутные.
Это - одно предложение. И, тем не менее, правило из * воды=из водЫ сработает на нем неверно. По той же самой причине - звездочка - это очень широко действующий символ, под него подходит любое слово.
Кстати, я пока не соображу, как и регулярными выражениями этот (и другие подобные) казус обойти.
Никак не могли достать из воды; воды здесь были мутные.
Это - одно предложение. И, тем не менее, правило из * воды=из водЫ сработает на нем неверно. По той же самой причине - звездочка - это очень широко действующий символ, под него подходит любое слово.
Кстати, я пока не соображу, как и регулярными выражениями этот (и другие подобные) казус обойти.
- tonio_k
- V.I.P.
Скрипты для Demagog
ваш пример действительно скорее казус, чем распространенное явление.
Вообще если посмотреть нынешний словарь от waska, то почти половина правил в словарях REX идут с запретом на любые знаки препинания. Именно это минимизирует до предела ложные срабатывания.
Алгоритм звездочек за счет их расширенности в трактовке - скорее увеличивают вероятность ложных срабатываний.
Моя идея сузить поиск в работе правил со звездочками в одно предложение - это скорее попытка сделать уникальное свойство звездочек в Демагоге - еще более гибким и настраиваемым инструментом создания правил. Как для разгрузки словарей REX и ускорения обработки, так и упрощения создания словарей в целом.
Я не прошу сделать DIC конкурентом для REX словарей с вводом всяких ключей и спец символов. Но сделать звездочки в правилах DIC более гибкими и настраиваемыми хотя бы на уровне скриптов - было бы очень круто для составителя словаря.
В идеале хотелось бы для трактовки звездочки сделать 2 режима на выбор пользователя на уровне скрипта:
1) стандартный (который сейчас применяется)
2) полный аналог (\w+) в словарях REX (тогда и необходимость свести поиск словарем в пределах одного предложения сама собой отпадёт)
само по себе это был бы уже большой шаг к дополнительному применению звездочек в словаре DIC причем не меняющий уже существующий "традиционный" алгоритмв WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
- flegont
- V.I.P.
Скрипты для Demagog
Я не хочу вдаваться в подробности dic-алгоритма словарных замен. Но одна существенная особенность, на которую он опирается, это то, что * в правиле обозначает любой символ. Любой, без всяких исключений.
Отступление от этого принципа повлечет за собой нарастающую лавину изменений - в сущности, это будет уже новый алгоритм. А, как известно, перестройка - дело ответственное.
"Когда у меня будет, что сказать, я ответ даду" (с)
Отправлено спустя 3 часа 16 минут 32 секунды:
P.S. Правила с отдельно стоящими * соблазняют своей простотой. Но надо быть внимательными. Например, упомянутое правило: из * воды=из водЫ мало того, что захватывает ненужные словосочетания, еще и правильные сочетания являются весьма редкими.
Отступление от этого принципа повлечет за собой нарастающую лавину изменений - в сущности, это будет уже новый алгоритм. А, как известно, перестройка - дело ответственное.
"Когда у меня будет, что сказать, я ответ даду" (с)
Отправлено спустя 3 часа 16 минут 32 секунды:
P.S. Правила с отдельно стоящими * соблазняют своей простотой. Но надо быть внимательными. Например, упомянутое правило: из * воды=из водЫ мало того, что захватывает ненужные словосочетания, еще и правильные сочетания являются весьма редкими.
► Показать
- balaamster
- Обыватель
Скрипты для Demagog
Действительно, встречаются нечасто. Посмотрел количество встреч подобных шаблонов в 6622 текстовых файлов книг (utf-8; 1,94 ГБ):
из * воды G Docs
Из * воды - 177 раз
из * * воды - 80 раз
- tonio_k
- V.I.P.
Скрипты для Demagog
Этот конкретный пример вообще был взят с потолка первое что в голову пришло.
Я могу привести несколько примеров из rex словаря, которые я мог адаптировать в dic словарь, но меня останавливает слишком Широкая трактовка значений звёздочки. Давайте это обсудим на основной ветки демагог.
А сейчас ещё раз повторюсь, я не ставлю под сомнение эффективность звёздочки и не прошу реально менять алгоритм! Это были всего лишь мечты! Не факт что от них будет больше плюсов чем минусов. Сейчас я прошу дать возможность пользователю самостоятельно на уровне скрипта WFiilter при применении словаря принудительно указать количество символов и указать "ограничение в одном предложении" Ничего более! Про звездочки Это я размышлял в Для чего в вообще это может понадобиться.
По умолчанию ее нет и на неё случайно никто не наткнется. Кому надо - тот в скрипте включит.
Я могу привести несколько примеров из rex словаря, которые я мог адаптировать в dic словарь, но меня останавливает слишком Широкая трактовка значений звёздочки. Давайте это обсудим на основной ветки демагог.
А сейчас ещё раз повторюсь, я не ставлю под сомнение эффективность звёздочки и не прошу реально менять алгоритм! Это были всего лишь мечты! Не факт что от них будет больше плюсов чем минусов. Сейчас я прошу дать возможность пользователю самостоятельно на уровне скрипта WFiilter при применении словаря принудительно указать количество символов и указать "ограничение в одном предложении" Ничего более! Про звездочки Это я размышлял в Для чего в вообще это может понадобиться.
По умолчанию ее нет и на неё случайно никто не наткнется. Кому надо - тот в скрипте включит.
- flegont
- V.I.P.
Скрипты для Demagog
Функция WFilter() во встроенном интерпретаторе - это лишь ссылка на 2 подпрограммы Демагога - быстрый алгоритм и алгоритм прямого перебора. Изменить функцию WFiltеr() как раз и означает - изменить оба алгоритма. Чего я в обозримом будущем не планирую.на уровне скрипта WFiilter
Что касается: дать пользователю возможность самому на уровне скрипта творить собственные алгоритмы словарных замен - это другое дело. Не связанное с функцией WFilter(). Посмотрим. Мне надо поэкспериментировать.
- tonio_k
- V.I.P.
Скрипты для Demagog
хочу прощупать обходной путь к решению моей проблемы... . Скажите пожалуйста, как Демагог работает с собственным файлом настроек $.cfg? Подгружает при запуске и Постоянно держит в памяти, а к самому файлу $.cfg обращается только при открытии пункта меню Настроек? Или это происходит чаще? Как WFilter работает с $.cfg?в WFilter добавить возможность игнорировать настройки разбития на блоки Демагог и задать конкретно: количество символов 2 и в пределах одного предложения.
Я к тому, что бы через скрипт "подменять строки" в общих настройках Демагога перед запуском к-либо функции. и возвращать ее на место, когда она отработает.
Отправлено спустя 25 минут 25 секунд:
balaamster, я так понял, с программированием у вас "на ты" Такая просьба, не могли бы вы проделать еще такое исследование:balaamster писал(а): ↑13 ноя 2018 15:05Действительно, встречаются нечасто. Посмотрел количество встреч подобных шаблонов в 6622 текстовых файлов книг (utf-8; 1,94 ГБ):
Как часто встречается такая схема
w1. w1
w1. wх w1
w1 wх. w1
Условие: w1=w1 - любое слово, но равные между собой (без учета регистра букв)
wх - любое слово (без учета регистра букв)
Хочу понять, может у меня не звездочки виноваты. а моя паранойя?
и таких комбинаций в тексте так мало, что ими смело можно пренебречь?
- balaamster
- Обыватель
Скрипты для Demagog
К сожалению, пока что, "на вы". Но определённый опыт имеется.
Прошёлся Вашими шаблонами по своей библиотеке. Получился такой результат
- flegont
- V.I.P.
Скрипты для Demagog
1) Я уже высказывался, почему не буду ничего менять ни в быстром алгоритме, ни в прямом переборе, из-за того, что * захватывает любые символы. Такой у нее смысл в словарях dic - захватывать любые символы. Если это правило нарушить, то масса ранее составленных пользователями dic-словарей перестанут правильно работать.
2) Это свойство * мне тоже иногда доставляет неудобство, и хочется иметь алгоритм замен, реализуемый только средствами Lua. Т.е. вообще без обращения к импортированной из Демагога функции WFilter(). Такой алгоритм у меня есть. Он нуждается в проверке, чтобы убедиться в его практической применимости.
Во всяком случае, пример с правилом из * воды, приведенным tonio_k, отработал мгновенно и совершенно правильно.
2) Это свойство * мне тоже иногда доставляет неудобство, и хочется иметь алгоритм замен, реализуемый только средствами Lua. Т.е. вообще без обращения к импортированной из Демагога функции WFilter(). Такой алгоритм у меня есть. Он нуждается в проверке, чтобы убедиться в его практической применимости.
Во всяком случае, пример с правилом из * воды, приведенным tonio_k, отработал мгновенно и совершенно правильно.
- tonio_k
- V.I.P.
Скрипты для Demagog
Код: Выделить всё
x, y = FilterToAll([[d:/MP3]], '0*.txt', diclist)
ShowMessage('Готово!\13Обработано файлов: '..x..'\13Применено словарей: '..y)
Если я захочу, например, еще одну переменную добавить в mylib в функцию FilterToAll(folder, mask, diclist) например с каждым циклом запись в переменную имя файла. Что бы при завершении работы функции получить список всех обработанных файлов.txt и как это значение "вытащить" из функции уже в самом скрипте?
- flegont
- V.I.P.
Скрипты для Demagog
Код: Выделить всё
function primer(x)
return x^2, x^3, x^4 -- функция возвратит 3 значения
end
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
Предложение по функции FilterAndAudioToAll(folder, mask, diclist, remsource)
Изменения:
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) но только с ведением лога файла с записью времени обработки по каждому файлу сериала
pru на выходе будет иметь вид:
и т.д.
Отправлено спустя 9 минут 49 секунд:
конвертирует секунды в формат hh:mm:ss
Пример вызова:
z = os.time()
... работа словарей
z = os.time() - z
z = SecToHMS(z)
Код: Выделить всё
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
Код: Выделить всё
История обработки:
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
Пример вызова:
z = os.time()
... работа словарей
z = os.time() - z
z = SecToHMS(z)
- tonio_k
- V.I.P.
Скрипты для Demagog
Немного ошибся.
Что бы получить pru надо в function FilterAndAudioToAllAndLog(folder, mask, diclist, remsource)
перед return #a, pru добавить 2 строки что бы получилось:
Код: Выделить всё
WOpen(0,folder..'\\log.log')
pru = WText(0)
return #a, pru
- flegont
- V.I.P.
Скрипты для Demagog
sleep(n) - задерживает выполнение скрипта на заданное количество секунд.
Поместим следующий код в файл mylib.lua в папке work в рабочей папке Демагога:
Пример использования:
Этот код откроет Окно статистики с сообщением "Действую без шума и пыли...", и через 5 секунд вернет окно, которое было открытым до этого.
Поместим следующий код в файл 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)
- tonio_k
- V.I.P.
Скрипты для Demagog
Предложение по небольшой корректировке шаблона Collection of texts.lua.
Изменения - все действия теперь только в окне статистики. Окно №9 не используется.
Изменения - все действия теперь только в окне статистики. Окно №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
Идея красивая, но сработает лишь для текстов, не содержащих юникода.
Попытка, например, составить сборник японских хайку с русским переводом, приведет к тому, что останется только русский перевод, а японский текст превратится в шифр, наподобие: #22899;#12398;#23376;#12399;#32094;#39318; ...
То же самое случится с при объединении словарей, содержащих транскрипцию МФА. И т.д. и т.п.
Причину подобных печальных казусов я оглашалуже не раз.
Lua не понимает юникод.
Поэтому предложенный вариант функции даст правильные результаты только для текстов на английском и/или русском языке. (Т.е. английский + местная локаль)
Замечание. Функция WAdd() была придумана мною именно для того, чтобы избежать указанной ситуации. Текст из одного окна добавляется к тексту из другого окна без вмешательства интерпретатора - самим Демагогом. Интерпретатор лишь обеспечивает показ Диалога открытия файлов и цикл по выбранным файлам. В цикле он передает работу по перебросу текстов Демагогу. А по завершении цикла бодро рапортует, что всё готово. "И мы пахали" (с)
Попытка, например, составить сборник японских хайку с русским переводом, приведет к тому, что останется только русский перевод, а японский текст превратится в шифр, наподобие: #22899;#12398;#23376;#12399;#32094;#39318; ...
То же самое случится с при объединении словарей, содержащих транскрипцию МФА. И т.д. и т.п.
Причину подобных печальных казусов я оглашалуже не раз.
Lua не понимает юникод.
Поэтому предложенный вариант функции даст правильные результаты только для текстов на английском и/или русском языке. (Т.е. английский + местная локаль)
Замечание. Функция WAdd() была придумана мною именно для того, чтобы избежать указанной ситуации. Текст из одного окна добавляется к тексту из другого окна без вмешательства интерпретатора - самим Демагогом. Интерпретатор лишь обеспечивает показ Диалога открытия файлов и цикл по выбранным файлам. В цикле он передает работу по перебросу текстов Демагогу. А по завершении цикла бодро рапортует, что всё готово. "И мы пахали" (с)
- tonio_k
- V.I.P.
Скрипты для Demagog
Понял. Не подумал. Так ведь и текст с фонемами IPA можно сломать! Тогда для избежания возможных "накладок" с окном 9 (вдруг там у пользователя что то уже открыто) и вообще для расширения возможностей решения подобных задач может ввести в демагоге невидимое, но всегда присутствующее буферное окно? Которое будет выполнять именно буферную (накопительную) функцию при работе со скриптами.
- flegont
- V.I.P.
Скрипты для Demagog
Периодически задумываюсь о чем-то подобном. Нужно нечто, способное содержать в себе строку в формате Юникод, и невидимое пользователю. Выберу время, проведу эксперимент.
- tonio_k
- V.I.P.
Скрипты для Demagog
Может такой вариант?
Формат - количество вкладок. Ограничить пользователя созданием только 15-вкладок.
в самом скрипте в начале, даётся команда
1)Получить количество существующих вкладок n
2)"Создать" вкладку n+1
3) работа с окном n+1
4) удалить вкладку n+1
Формат - количество вкладок. Ограничить пользователя созданием только 15-вкладок.
в самом скрипте в начале, даётся команда
1)Получить количество существующих вкладок n
2)"Создать" вкладку n+1
3) работа с окном n+1
4) удалить вкладку n+1
- flegont
- V.I.P.
Скрипты для Demagog
Я думаю вообще не о дополнительном скрытом окне, а о дополнительной переменной в программе, типа юникод-строки. Нечто вроде собственного демагоговского буфера обмена. Он мог бы сохранять текст любого указанного окна, в точности в том виде, как он есть - со всеми буквами: рус, лат, юникод. И объединение текстов проходило бы через этот буфер.
Все эти операции выполнял бы Демагог, а в интерпретатор добавить импортированные функции, наподобие: послать содержимое окна в память; извлечь из памяти в окно
Все эти операции выполнял бы Демагог, а в интерпретатор добавить импортированные функции, наподобие: послать содержимое окна в память; извлечь из памяти в окно
- tonio_k
- V.I.P.
Скрипты для Demagog
argo-interpreter.htm в описании Gauge(i) может добавить, что Gauge(0) - убирает (обнуляет) индикатор прогресса с экрана. Не сразу догадался как избавиться от этой зеленой полоски после отработки скрипта
- tonio_k
- V.I.P.
Скрипты для Demagog
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]
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.
- tonio_k
- V.I.P.
Скрипты для Demagog
Выкладываю примеры своих основных рабочих скриптов:
ПАКЕТНАЯ ЗАПИСЬ ВСЕХ КНИГ В ПАПКЕ.lua - производит пакетную запись книг в MP3 т.е. всех книг в указанной пользователем папке
Условие - книги в папке должны быть сохранены с расширением *.txt
В шапке скрипта можно вручную отредактировать настройки сериала в том числе указать папку по умолчанию.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua
ПРОДОЛЖИТЬ ЗАПИСЬ СЕРИАЛА В ПАПКЕ.lua - на случай если была прервана запись сериала, то с помощью этого скрипта можно продолжить запись в MP3 с места прерывания (последний аудиофайл будет перезаписан). Продолжение записи происходит в пределах указанной папки.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua
СПИСОК СЛОВАРЕЙ.lua - список пользовательских словарей с указанием папки их местонахождения, а так же алгоритмом их применения.
Этот список был выведен отдельно что бы при изменениии в назавниях или изменения в порядке применения словарей не приходилось каждый раз менять этот список по всех скриптах, которые его используют.
► Показать
Условие - книги в папке должны быть сохранены с расширением *.txt
В шапке скрипта можно вручную отредактировать настройки сериала в том числе указать папку по умолчанию.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua
ПРОДОЛЖИТЬ ЗАПИСЬ СЕРИАЛА В ПАПКЕ.lua - на случай если была прервана запись сериала, то с помощью этого скрипта можно продолжить запись в MP3 с места прерывания (последний аудиофайл будет перезаписан). Продолжение записи происходит в пределах указанной папки.
Работает ТОЛЬКО в связке с СПИСОК СЛОВАРЕЙ.lua
СПИСОК СЛОВАРЕЙ.lua - список пользовательских словарей с указанием папки их местонахождения, а так же алгоритмом их применения.
Этот список был выведен отдельно что бы при изменениии в назавниях или изменения в порядке применения словарей не приходилось каждый раз менять этот список по всех скриптах, которые его используют.
- tonio_k
- V.I.P.
Скрипты для Demagog
balaamster,
Что не так?
решил попробовать подогнать SOX под скрипт в Демагоге. Но что то не фортануло. В рабочей папке Демагог создал папку SOX в нее поместил все файлы с утилитой плюс добаавил libmp3lame.dll То ли дело в кодировке. То ли в неправильности составления командной строки.balaamster писал(а): ↑24 ноя 2018 16:37UPD. Если в папку с sox подкинуть библиотеку libmp3lame.dll, то можно без отдельной конвертации lame'ом обойтись, в одну строку
Что не так?
► Показать
- flegont
- V.I.P.
- balaamster
- Обыватель
Скрипты для Demagog
В целом, в скрипте всё правильно.
Но происходит непонятная мне ошибка - путь к команде, обрамлённый кавычками, приводит к ошибке:
"Синтаксическая ошибка в имени файла, имени папки или метке тома."
Если кавычки убрать, то скрипт отрабатывает корректно:
Код: Выделить всё
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'
Немного упростил скрипт:
► Показать
Отсутствующую библиотеку нашёл 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
Можно так пользоваться для записи через 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\\"')
- tonio_k
- V.I.P.
Скрипты для Demagog
может так можно обойти ситуацию?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
Нет, квадратные скобки тут не помогут. Проблема не в экранировании кавычек, а в том, как такую строку обрабатывает os.execute()
%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 не страшны.
- flegont
- V.I.P.
Скрипты для Demagog
А если в скрипте создавать не командную строку, а bat-файл, содержащий эту строку: tmp.bat
и потом: os.execute('tmp.bat') ?
и потом: os.execute('tmp.bat') ?