В.в.2 Работа со словарем

В этой части рассмотрим как можно задействовать редактор sed для работы со словарем festival.

Начнем разработку с создания формы для ввода слова и поиска совпадений в словаре. Для этого надо в «браузере» проекта,  который в режиме редактора открывается на месте панель виджетов (1),  кликнуть по «Форма» и выбрать в контекстном меню «Добавить новый». В открывшемся мастере в диалоге выбора шаблона выбрать в поле «Файлы и классы» пункт «Qt», в правом поле – «Форма Qt Designer«. на следующем шаге: «Dialоg without Buttonos«, размер экрана по вкусу, на этапе мастера «Размещение» зададим имя для файла формы и т.п. И в «Итоге», на конец, укажем в какой проект будет добавлена форма и, если требуется, добавить в контроль версий.

Для работы со словарем через QProcess будет задействован следующей shell командой потоковый редактор sed:

sed -n /(.»+word+»/p msu_ru_nsh_dict.scm | sed 5q

Рассматриваемая это выражение: оно осуществляет поиск строк подходящих под регулярное выражение /(.»+word+»/. Это означает, что будут найдены строки, в которых присутствуют слова начинающиеся слевой скобки, далее любой символ, и за ним слово, которое набирает пользователь. Строчная буква лат алфавита  «p», стоящая за регулярным выражением отдает «приказ» редактору распечатывать строки, ключ же -n требует, чтобы печатался не весь фаил, а только найденные строки. Далее следует файл словаря над содержимом, которого и производятся манипуляции редактора – msu_ru_nsh_dict.scm (на этапе отладки фаил расположен в директории откуда запускается sed). Далее следует вертикальная черта «|» (pipe), которая сообщаяет shell, что предыдущий вывод должен быть помещен в буфер и передан следующей команде sed 5q. Последняя команда производит печать первых 5 найденный строк.

Для выражения shell типа command1 | command2 используется перенаправление стандартного вывода процесса, в котором  происходит первая часть нашей командной строки, в другой, который его обработает – вторая часть командной строки.

Схематично рассмотрим реализацию:

Будем использовать два процесса:
QProcess Sediing;
QProcess Sediing2;

Заранее установим путь к программе sed - потребуется для OS windows
QString Sp;

Пусть в процессе, когда мы набираем слово, которое хотим найти в словаре, с каждым нажатием клавиш, будет выполняться  функция StartSed(word), где word - это набранная часть слова. Для обнаружения строки (слова) из словаря, в котором не просто есть часть word, но в котором есть фраза («word - то есть нас интересуют строки в которых word является частью начала слова, к которому указывается ударение и т.п. Тут мы натыкаемся на проблему как передать символ кавычек в sed. Посоветовавшись с инструкцией по QProcess выяснилось, что кавычки передаются следующим выражением: \»\»\».

void dict::StartSed(QString word)
{
//сформирована строка запуска процесса sed с командой
//поиска всех записей куда входит наше word
word = «sed -n /\(\»\»\»"+word+»/p msu_ru_nsh_dict.scm»;

//формирование переменных окружения
QStringList env = QProcess::systemEnvironment();
env << Sp;
//устанавливаем для обоих процессов переменные окружения
Sediing.setEnvironment(env);
Sediing2.setEnvironment(env);
//задаем для первого процесса стандартный вывод во второй процесс
//эмуляция sed -n /Rexpr/p file | sed 5q
Sediing.setStandardOutputProcess(&Sediing2);
//запуск sed для поиска вхождения слова  в записи файла-словаря
Sediing.start(word);
//на этом этапе мы ограничиваемся 5 найденными записями
//извывода предыдущего sed
Sediing2.start(«sed 5q»);

}

Для вывода найденного слова мы создадим коннект соединив таким образом сигнал стандартного вывода процесса Sediing2 с выводом в текстовое поле.

void dict::FOutSed()
{

//для  преобразование текста из стандартного вывода
//будем использовать следующий код
QTextCodec *codec = QTextCodec::codecForName(«UTF-8″);
QByteArray bOut = Sediing2.readAllStandardOutput();
QByteArray bErr = Sediing2.readAllStandardError();
QString msgOut = codec->toUnicode(bOut);
QString msgErr = codec->toUnicode(bErr);
if (!msgOut.isEmpty()) {
ui->plainTextEdit->clear();
ui->plainTextEdit->insertPlainText(msgOut);
}
}

Используя такой подход удается организовать поиск строчки словаря, в которой имеются совпадения с вводимым словом. Далее надо обработать полученный результат отрезав все кроме самого слова.

Следующим шагом надо организовать механизм записи слова в словарь.

Добавить комментарий