-
Notifications
You must be signed in to change notification settings - Fork 40
Динамические шаблоны
Ваш модуль может генерировать шаблоны для грамматики "на лету". Это может быть полезно, когда вы не знаете заранее, какова структура определенного шаблона в вашей грамматике, или когда вы хотите дать пользователю возможность самостоятельно указывать какой-то список возможных вариантов шаблонов в файле конфигурации.
Например, если ваш модуль умеет запускать какие-то программы на компьютере с помощью голосовой команды "Запусти <название программы>", то вы можете заранее не знать названи всех программ, установленных у пользователя.
Для этого и нужна возможность генерации динамических шаблонов.
В файле грамматики вашего модуля укажите в качестве значения для нужного шаблона URI соответствующего типа (см ниже) вместо самого шаблона.
Например:
<pattern name="AppName" value="fuzzy://config:appsList">В этом примере мы указали, что шаблон AppName содержит названия всех приложений, которые указаны в поле "appsList" в файле конфигурации вашего модуля. Таким образом, сам пользователь может создать такой список и после запуска Агрегата шаблон AppName будет автоматически сгенерирован для вашего модуля.
При этом модификатор "fuzzy" указывает Агрегату, что ему нужно учитывать морфологию и использовать нечеткий поиск при обработке пользовательского запроса. То есть, слова могут иметь различные окончания или вообще иметь созвучное написание.
{
"appsList" : ["Skype", "Калькулятор", "Браузер"]
}URI для генерируемого шаблона имеет следущий общий вид:
<модификатор>://<тип контента>:<идентификатор контента>
Модификатор указывает, какой алгоритм должен использоваться Агрегатом при генерации шаблона.
Этот модификатор приводит к генерации простого шаблона, в котором не учитывается морфология.
Приводит к генерации шаблона, в котором учитывается морфология. То есть учитываются окончания слов или даже близкие по звучанию слова.
Этот тип указывает Агрегату, что он должен запросить контент для шаблона, отправив событие с именем, которое указано в части <идентификатор контента>.
То есть Агрегат пошлет событие с именем <идентификатор контента> и дождется ответа в формате JSON массива или JSON объекта (см формат ниже) и из него сгенерирует шаблон.
Ваш модуль должен слушать событие, чтобы ответить на него.
Например, если ваш модуль возвращает контент для динамического шаблона по событию "appsList", то вы должны указать в файле грамматики шаблон следующего вида:
<pattern name="AppName" value="fuzzy://event:appsList"/>Этот тип указывает, что контент шаблона указан в определенном поле файла конфигурации вашего модуля. Идентификатор контента содержит название поля.
То есть Агрегат прочитает контент из файла конфигурации и сгенерирует из него шаблон.
Например, если вы хотите, чтобы список для шаблона можно было указать в поле "appsList" в конфигурации вашего модуля, то нужно написать в грамматике:
<pattern name="AppName" value="fuzzy://config:appsList"/>А в файле конфигурации тогда можно указать:
{
"appsList" : ["Skype", "Блокнот"]
}Этот тип позволяет сгенерировать шаблон из контента, получаемого с какого-то HTTP сервера. Сервер при этом обязан возвращать ответ в формате JSON объекта или JSON массива.
Идентификатор контента в этом случае содержит полный URL, по которому Агрегат будет делать GET запрос при генерации шаблона. Например:
<pattern name="AppName" value="fuzzy://http://myserver.com/appsList"/>Вы также можете использовать https.
В качестве контента для генерации шаблона подходит или JSON массив, или JSON объект.
Массив должен содержать строки, которые нужно использовать в качестве контента шаблона. Например:
["Skype", "Браузер", "Калькулятор"]Если вы используете модификатор content, то строки могут содержать шаблоны:
["(Skype|Телефон*):skype", "(Браузер|Хром*):chrome", "Калькулятор*:calc"]Если вы используете модификатор fuzzy, то в поле value шаблона будет содержаться исходная строка:
Markup m = request.markup.get("AppName");
System.out.println(m.value); //Skype, Браузер или КалькуляторОбъект можно использовать для того, чтобы указать каноническое значение для каждого элемента шаблона, которое потом будет доступно в поле value при разборе семантического дерева в вашем модуле.
Пример:
{
"Skype" : 1, "Браузер" : 2, "Хром" : 2, "Калькулятор" : 3
}Не используйте знаки препинания и символы используемые в грамматиках, если вы используете модификатор content
Если вы используете модификатор content, то строки могут содержать шаблоны.
- Разработка в Eclipse
- Разработка в IntelliJ IDEA
- List of available modules
-
Where to get
-
How to install
-
How to use
-
Setting up
- Java
- Javascript
- Typescript
- Groovy
- Ruby
-
Query grammar
-
Pattern syntax
-
Dynamic patterns
-
Standard patterns
- Developing in Eclipse
- Developing in IntelliJ IDEA