Скрипты для Demagog

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

Модератор: flegont

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

Скрипты для Demagog

#501

Сообщение tonio_k »

flegont, :thank_you: работает как надо!

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

Скрипты для Demagog

#502

Сообщение tonio_k »

Вопрос по функции WSel
Вставим ниже текст в окно Демагога и нажимаем F2

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

ind=WActive()
k=WSel(ind)
ShowMessage(k)
Если выделить текст ind то покажет k = 3
Вопрос, а как можно определить начальную позицию выделенного текста?
Если бы WSel показывал начальную позицию, то координаты текста я бы мог получить:

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

ind=WActive()
k=WSel(ind)
fnd=WSelText(ind)
ShowMessage(k..', '..#fnd)

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

Скрипты для Demagog

#503

Сообщение flegont »

Мда... думаю, надо будет усовершенствовать функцию WSel(i), когда задан только параметр - номер окна. Чтобы, если в тексте есть выделенный фрагмент, то возвращалась бы начальная позиция выделенного (а не конечная, как сейчас), и возвращалась бы длина выделенного. Как-то так:

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

k, len = WSel(ind)
Тогда конечная позиция выделенного была бы:

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

z = k+len
Подумаю, как сделать.

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

Скрипты для Demagog

#504

Сообщение tonio_k »

Я тут ещё немного подумал, у нас же на руках есть длина текста #fnd и координата конца текста.
Можно от координаты конца выделеного текста вычесть его длину и прибавить 1 это и будет начальная координата выделенного текста

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

ind=WActive()
k=WSel(ind)
fnd=WSelText(ind)
start=k-#fnd+1
ShowMessage(start..', '..#fnd)
Надо только для удобства это в функцию превратить
k, len = WSel(ind), что бы k действительно был начальной позицией выделеного текста.

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

Скрипты для Demagog

#505

Сообщение flegont »

Вер. 385, небольшое изменение в дистрибутиве.
Функция встроенного интерпретатора:
WSel(i , pos, len) - выделяет фрагмент текста во вкладке i с позиции pos длиной len (по умолчанию 0); и возвращает pos и len;
WSel(i, pos) устанавливает текстовый курсор в позицию pos, возвращая pos и 0;
WSel(i) просто возвращает текущую позицию курсора и длину выделенного (или 0),
(это и есть тот случай, когда возвращаемые значения реально могут понадобиться :smile1: )

Пример:

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

-- пусть текст во вкладке 1 имеет выделенный фрагмент
k, len = WSel(1)
s = WText(1)
c = string.sub(s,k+1,k+len)
ShowMessage(k..' '..len..' |'..c..'|') -- посмотрим на результат
Замечание: при поиске в тексте выделенного фрагмента к найденной координате его начала прибавляем 1, т.к. позиции текстового курсора на экране нумеруются с 0.

Аватара пользователя
PETICANTROP
Прохожий

Скрипты для Demagog

#506

Сообщение PETICANTROP »

Добрый день не очень силен в работах скрипта, при попытке обработать произведение через скрипт "10_ОКНО ОБРАБОТАТЬ СЛОВАРЯМИ" выбирается небольшой фрагмент для обработки и на этом процесс зависает. Подскажите в чем может быть проблема.

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

Скрипты для Demagog

#507

Сообщение tonio_k »

PETICANTROP, в этой ветке обсуждают общие технические вопросы по скриптам. Автор Демагога не может ответить почему не работает та или иная "поделка" пользователя т.к. в её создании он не участвовал. Ваш вопрос касается пользовательской сборки. Задайте свой вопрос в той ветке где скачали сборку. При этом уточните, какой голос вы используете, меняли ли вы что нибудь в сборке. Какую версию сборки применяете. Зависает на всех книгах или только на конкретной одной. Нужно понять (локализовать) где проблема. Иначе на ваш неконкретный вопрос будет ответ: "а у нас работает".

Аватара пользователя
PETICANTROP
Прохожий

Скрипты для Demagog

#508

Сообщение PETICANTROP »

tonio_k, Благодарю за напутствие полез разбираться со сборками и понял что сам накрутил ерунды всякой. Скачал вашу сборку и все заработало. Спасибо вам за труды.

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

Скрипты для Demagog

#509

Сообщение flegont »

Пример использования функций встроенного интерпретатора: RuIPA, RuUPS.
(Demagog, вер. 386, сборка от 04.09.2020)

Скрипт для создания фонетического dic-словаря
Название любое, расширение .lua
Поместить в папку _Tests_
В активной вкладке должен находиться список русских слов - все буквы в нижнем регистре, а ударные гласные - в верхнем регистре.
Вызов скрипта - из меню по Ctrl+F2
Во вкладке "0 - Статистика" будет сформирован соответствующий dic-словарь - его можно сохранить под каким-либо именем и с расширением .dic

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

-- Создать фонетический dic-словарь в окне "0 - Статистика"
-- по списку слов с ударениями, находящемуся в активной вкладке.
-- Например:
-- вЫкатившиеся
-- двадцатИ
-- темнО

os.setlocale('', 'ctype')  -- национальная кодовая страница

cap = 'Укажите тип транскрипции'
items = {
'Международный фонетический алфавит (IPA)',
'Microsoft Universal Phone Set (UPS)'
}

ans = Menu(cap,items)
if ans == 0 then goto HALT end
if ans == 1 then 
    -- шаблон тега Pronunciation Lexicon Specification
    mask = '<phoneme ph="@"/>'
else
    -- шаблон тега Microsoft SAPI5
    mask = '<PRON SYM="@"/>'
end

ind = WActive()  -- номер активной вкладки
bom = '\239\187\191' -- спецификация UTF-8
s = WText(ind) 
a = string.split(s,'\r')
c = ''
for i = 1,#a do
    if a[i] ~= '' then
        if ans == 1 then d = RuIPA(a[i]) else d = RuUPS(a[i]) end
        b = string.lower(a[i])
        b = AnsiToUtf8(b)
        c = c..b..'='..string.gsub(mask,'@',d)..'\r'
    end 
end
-- передадим новый utf8-текст во вкладку 0
-- через сохранение во временном файле
c = bom..c
SaveToFile({c},'_.tmp')
WOpen(-1,'_.tmp'); WNew(0); WAdd(0,-1,'\r\r')
os.remove('_.tmp')

WActive(0)

::HALT::
os.setlocale('C')
Пример.
Текст в активной вкладке:

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

вЫкатившиеся
двадцатИ
темнО
Результаты (в зависимости от выбора пользователя):

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

выкатившиеся=<phoneme ph="vˈɨkətʲɪfʂᵻjəsʲə"/>
двадцати=<phoneme ph="dvətt͡sɐtʲˈi"/>
темно=<phoneme ph="tʲɪmnˈo"/>

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

выкатившиеся=<PRON SYM="V S1 IX K AX T pal IH F SR IX low J AX S pal AX"/>
двадцати=<PRON SYM="D V AX T TS AEX T pal S1 I"/>
темно=<PRON SYM="T pal IH M N S1 O"/>

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

Скрипты для Demagog

#510

Сообщение tonio_k »

есть в шпаргалке функция:
WordFrequency(s, gauger) - подсчитывает частоту слов в тексте s; возвращает таблицу строк вида: 'частота|слово'
В калькуляторе видно, что в этой функции присутствует цифровая сортировка.
А можно добавить в калькулятор отдельно функции:
-сортировка цифровая по убыванию
-сортировка цифровая по возрастанию

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

Скрипты для Demagog

#511

Сообщение flegont »

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

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

Скрипты для Demagog

#512

Сообщение flegont »

Вер. 386, сборка от 18.09.2020
[+] Функция встроенного интерпретатора table.sortdig(lines, mode) - сортирует таблицу строк lines, по их цифровому содержимому, по возрастанию, если mode = true и по убыванию, если mode = false или nil. Цифровое содержимое в строке ищется до первого символа табуляции (если он есть).

Пример использования:

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

-- цифры могут быть в любом месте строки
-- но учитываются только до знака табуляции (если он есть)

-- здесь в строках нет знака табуляции
a = {
'абрикос123',
'корабль 7К-Л1',
'миг-17б',
'восток-1',
'агент 007'
}

a = table.sortdig(a,true)  -- по возрастанию
s = table.concat(a,'\r')
print(s)
print()

-- здесь в строках присутствует знак табуляции
a = {
'17	миг',
'123	абрикос',
'1	восток',
'71	корабль',
'7	агент'
}

a = table.sortdig(a)  -- по убыванию
s = table.concat(a,'\r')
print(s)
Результат:

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

восток-1
агент 007
миг-17б
корабль 7К-Л1
абрикос123

123	абрикос
71	корабль
17	миг
7	агент
1	восток

Ответить

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