Referência do D Apache FreeMarker
Operações Incorporadas de String do FreeMarker
tester
, cujo valor é enviado para "hello world "
(com três espaços em branco à direita).
A expressão a seguir permite que o bot gere o valor
tester
ou no string found
se nenhum valor tiver sido definido para a variável.${tester.value!'no string found'}
Operação Incorporada | Uso | Saída |
---|---|---|
capitalize |
${tester.value?capitalize} |
Hello World |
last_index_of |
${tester.value?last_index_of('orld')} |
7 |
left_pad |
${tester.value?left_pad(3,'_')} |
___hello world |
length |
${tester.value?length} |
14 |
lower_case |
${tester.value?lower_case} |
hello world |
upper_case |
${tester.value?upper_case} |
HELLO WORLD |
replace |
${tester.value?replace('world', 'friends')} |
hello friends |
remove_beginning |
${tester.value?remove_beginning('hello')} |
world |
trim |
${tester.value?trim} |
hello world (os três espaços à direita são removidos)
|
ensure_starts_with |
${tester.value?ensure_starts_with('brave new ')} |
brave new hello world |
ensure_ends_with |
${tester.value?ensure_ends_with(' my friend')}$ |
hello world my friend |
contains |
${tester.value?contains('world')?string ('You said world', 'You did not say world')} |
You said world As expressões |
ends_with |
${tester.value?ends_with('world')?string ('Ends with world', 'Doesn't end with world')} |
Ends with world |
starts_with |
${tester.value?starts_with('world')?string ('Starts with world', 'Doesn't start with world')} |
Doesn't start with world |
matches (expressão regular retorna verdadeiro ou falso)
|
${tester.value?matches('^([^0-9]*)$')} |
A expressão regular retorna true ou false , dependendo de se o valor contém um número (nesse caso, o valor booliano é retornado como false ). O valor tester retorna true .
|
matches (expressão regular retorna uma string)
|
${tester.value?matches('^([^0-9]*)$')?} |
Igual ao anterior, mas desta vez, true é retornado como string. A função matches('regular expression') retorna true ou false como tipos boolianos. Para imprimir true ou false em um componente System.Output , use ?string para executar uma conversão em string.
Observação: Você não pode usar a expressão regular para retornar um grupo de valores; use-a para retornar um único valor correspondente (ou nenhuma correspondência). |
Exemplo: Transformando Caso com o Componente Switch
Imagine um caso em que diferentes estados são chamados dependendo da entrada do usuário (wine ou beer), que é armazenada na variável choice
.
upper_case
, para uniformizar a capitalização:${choice.value?upper_case}
Exemplo: Concatenando Expressões FTL
Você também pode concatenar operações FTL em uma única expressão.
flight.value
) de UA1234
e UA 1234
seriam transformados em 1234
.
${flight.value?trim?lower_case?remove_beginning('ua ')?remove_beginning('ua')}"
Operações Incorporadas de Número do FreeMarker
negativeValue
(-2,5) e positiveValue
(0,5175):
Operação | Exemplo | Saída |
---|---|---|
abs |
${negativeValue.value?abs} |
2,5
O operador transforma o valor numérico negativo em um valor positivo. |
string (usado com um valor numérico)
|
${negativeValue.value?abs?string.percent} |
250%
O operador primeiro altera o valor negativo para um positivo. Em seguida, ele o converte em percentual, multiplicando implicitamente o valor por 100. |
string (com o valor de formato decimal e várias moedas)
Dica: Verifique Base de Caracteres para obter outros símbolos de moeda. |
${positiveValue.value?string['###.##']} |
0,51 |
${positiveValue.value?string['###.##%']} |
51%
O operador adiciona um caractere de porcentagem depois de multiplicar o valor por 100. |
|
${positiveValue.value?string['##.###\u00A4']} |
0,51 $ | |
${positiveValue.value?string['##.###\u20AC']} |
0,51 € | |
${positiveValue.value?string['##.###\u00A3']} |
0,51 £ | |
round |
${negativeValue.value?round} |
-2
O operador arredonda para o número inteiro mais próximo. Se o número terminar com ,5, ele será arredondado para cima. |
${positiveValue.value?round} |
1
O operador arredonda para o número inteiro mais próximo. Se o número terminar com ,5, ele será arredondado para cima. |
|
floor |
${positiveValue.value?floor} |
0
O operador arredonda para baixo. |
ceiling |
${positiveValue.value?ceiling} |
1
O operador arredonda para cima. |
lower_abc |
${negativeValue.value?abs?round?lower_abc} |
c
O operador transforma o valor negativo em um positivo e o arredonda para 3. Retorna c, a terceira letra do alfabeto. |
upper_abc |
${negativeValue.value?abs?round?upper_abc} |
C
O operador transforma o valor negativo em um positivo e o arredonda para 3. Retorna C, a terceira letra do alfabeto. |
is_infinite |
${positiveValue.value?is_infinite?string} |
falso
O operador retorna falso porque um valor flutuante não é infinito de acordo com o IEEE 754 (Padrão para Floating-Point Arithmetic). Observação: O valor retornado seria um booliano sem |
Operações Incorporadas de Array do FreeMarker
As operações de array (ou sequência ) permitem que seu bot, entre outras coisas, determine o tamanho de um array, classifique os arrays ou encontre conteúdo em um array.
person
e colors
, respectivamente.[
{
"firstName" : "Frank",
"lastName" : "Normal"
},
{
"firstName" : "Grant",
"lastName" : "Right"
},
{
"firstName" : "Geoff",
"lastName" : "Power"
},
{
"firstName" : "Marcelo",
"lastName" : "Jump"
}
]
[
"yellow", "blue", "red", "black", "white", "green"
]
Essas matrizes são usadas para ilustrar as operações de matrizes na tabela a seguir e no Exemplo: Iterando Matrizes.
Operador | Exemplo | Saída |
---|---|---|
size |
${person.value?size?number} |
4 — O tamanho (quatro membros) do array person
|
índice de array | ${person.value[1].firstName} |
Grant — É o valor da segunda propriedade firstName no array person .
|
${person.value[1].firstName !'unknown'} |
O mesmo que acima, mas nesse caso, o bot vai gerar um erro desconhecido se a segunda propriedade firstName não tiver valor.
|
|
first |
${person.value?first.firstName} |
Frank — A primeira entrada do array de pessoa. Essa operação não usa o índice de array.
|
last |
${person.value?last.firstName} |
Marcelo — O valor lastName final no array de pessoa.
|
sort_by |
${person.value?sort_by('lastName') [0].firstName} |
Marcelo Esse operador classifica o array
person pela propriedade lastName em ordem crescente. Em seguida, ele imprime o valor da propriedade firstName correspondente para entrada final no array de pessoa:
Observação: A menos que você salve o array classificado em uma variável usando |
${person.value?sort_by('lastName')?reverse[0].firstName} |
Grant — os valores são classificados em ordem decrescente:
|
|
seq_index_of |
${colors.value?seq_index_of('red')} |
2 — O valor do índice para vermelho no array de cores.
|
seq_last_index_of |
${colors.value?seq_last_index_of('red')} |
2 — O último valor de índice para vermelho no
|
join |
${colors.value?join(',')} |
Retorna o array colors como string separada por vírgulas: yellow, blue, red, black, white, green |
seq_contains |
${colors.value?seq_contains('red')?string('Yes', 'No') |
Retorna Yes porque o array contém vermelho.
Observação: |
sort |
${colors.value?sort?join(',')} |
Retorna o array de cores como string separada por vírgulas na ordem crescente: black, blue, green, red, white, yellow |
reverse |
${colors.value?sort?reverse?join(',')} |
Retorna o array colors como string separada por vírgulas em ordem decrescente: yellow, blue, red, black, white, green |
Retornando Intenções e Pontuações
-
${skill.system.nlpresult.value.entityMatches[‘name of entity’]}
retorna um array de entidades encontradas em uma string do usuário que é transmitida ao Mecanismo de Intenção armazenado na variávelnlpresult
. -
${skill.system.nlpresult.value.intentMatches.summary[n].intent}
retorna o nome da intenção que tem uma classificação de confiança den
, em que0
representa a intenção com classificação mais alta,1
representa a segunda intenção classificada etc. ${skill.system.nlpresult.value.intentMatches.summary[n].score}
retorna a pontuação de confiança para a intenção fornecida.
n
é o índice do item que você deseja pesquisar. Por exemplo, a expressão para retornar o nome da intenção resolvida no nível superior seria:${skill.system.nlpresult.value.intentMatches.summary[0].intent}
Para a pontuação da intenção superior, a expressão seria:${skill.system.nlpresult.value.intentMatches.summary[0].score}
Você pode usar essas expressões para intenções com pontuação acima do limite de confiança, mas também pode usá-las para retornar intenções cuja pontuação está abaixo do limite de confiança. Essas expressões não dependem do valor do limite de confiança configurado na página Definições da Habilidade para que você possa usá-las para retornar as intenções do candidato e suas respectivas pontuações, mesmo quando nenhuma intenção puder ser resolvida e uma ação unresolvedIntent
tiver sido acionada. Nesse caso, você pode, por exemplo, usar essas expressões para retornar as três intenções superiores e suas pontuações de limite de subconfiança.
Se você precisar se referir à intenção que um usuário selecionou após ser solicitado a desambiguar, poderá usar
${system.intent.name}
. (${skill.system.nlpresult.value.intentMatches.summary[0].intent}
sempre retorna a intenção com a pontuação superior, que pode não ser a intenção que o usuário seleciona ao desambiguar.
Exemplo: Iterando Arrays
Os arrays determinam o número de entidades na entrada do usuário.
O seguinte snippet da propriedade Metadados de um componente de Resposta Comum mostra como determinar o tamanho do array mantido na variável person
e depois repetir seus elementos para que a habilidade gere algo como:
responseItems:
- type: "text"
text: "${person?index+1}. ${person.firstName} ${person.lastName}"
name: "Sorry"
separateBubbles: true
iteratorVariable: "person"
A saída descrita neste código não é classificada (ou seja, nenhuma operação
sort_by
é usada).
Operações Incorporadas de Data do FreeMarker
.now
e o operador date
incorporado.
${.now?date}
Operações | Exemplo | Saída |
---|---|---|
date |
${.now?date} |
A data atual |
time |
${.now?time} |
A hora do dia, como 5:46:09 PM |
datetime |
${.now?datetime} |
Imprime a data e hora atuais, como Jan 17, 2018 5: 36:13 PM. |
long e number_to_date |
${(.now?long + 86400000)?number_to_date } |
Adicionar 24 horas à data atual. Se a chamada é feita em 17 de janeiro de 2018, o FreeMarker gera 18 de janeiro de 2018. |
string (com estilos de formatação)
|
${.now?string.full} |
Converte a data atual em string formatada como Wednesday, January 17, 2018 6:35:12 PM UTC. |
${.now?string.long} |
Converte data em string com a seguinte saída formatada: January 17, 20186:36:47 PM UTC. | |
${.now?string.short} |
Converte data em string com a seguinte saída formatada: 1/17/18 6:37 PM | |
${.now?string.medium} |
Converte data em string com a seguinte saída formatada: Jan 17, 2018 6:38:35. | |
${.now?string.iso} |
Imprime a data no padrão ISO 8601, como 2018-01-17T18:54:01.129Z. |
|
string (com formatos de saída especificados)
|
${.now?string['dd.MM.yyyy, HH:mm']} |
Imprime a data atual em um formato personalizado, como 17.01.2018, 18:58. |
${.now?string['yyyy']} |
2018 |
|
datetime (com string e estilo de formatação)
|
${date_variable?datetime?string.short} |
Converte a data em uma string formatada como 1/17/18 6: 37 PM.
O operador |
Convertendo o valor de entidade em uma string com o uso de
|
${dateVar.value.date?long?number_to_date?date?string.short} |
Converte a data da extração de entidade em uma string formatada como 11/17/18.
O operador de data informa ao FreeMarker que a variável mantém apenas uma data, não informações de horário. O uso desse formato evita erros. |
${dateVar.value.date?long?number_to_date?string.medium} |
Converte a data derivada da extração de entidade em uma string formatada como Jan 17, 2018.
Observação: Todos os demais formatos, como |
|
${dateVar.value.date?long?number_to_date?string['dd.MM.yyyy']} |
Imprime a data no formato personalizado. Por exemplo: 17.01.2018, 18:58. | |
${dateVar.value.date?long?number_to_date?string['yyyy']} |
Imprime a data derivada da entidade em um formato personalizado. |
Exemplo: Extraindo Datas da Entrada do Usuário
DATE
, para extrair amanhã da solicitação. Ele gera a data solicitada usando ${(theDate.value.date?long + 86400000)?number_to_date}
para adicionar 24 horas (ou 86.400.000 milissegundos) a "amanhã".
Texto com Expressão | Saída |
---|---|
|
|
|
|
|
|
Exemplo: Definindo uma Data Padrão (Quando Nenhum Valor de Data Foi Definido)
Se a mensagem do usuário não incluir informações de data, sua habilidade poderá solicitar aos usuários a data ou fornecer uma data padrão. Para fornecer a data atual, você pode usar a seguinte expressão:
${.now?datetime?string.long}
Variáveis de Sistema Acessíveis pelo FreeMarker
O Oracle Digital Assistant tem um conjunto de variáveis de sistema por meio do qual você pode recuperar informações úteis em seus fluxos de caixas de diálogo por meio de expressões do FreeMarker.
Em suas formas mais simples, essas expressões têm o seguinte formato:
${system.variableName}
Algumas variáveis podem conter objetos com propriedades aninhadas que podem ser acessadas usando a notação de ponto após o nome da variável no formato a seguir.
${system.variableName.propertyName}
Além disso, os valores de propriedades aninhadas também podem ser objetos com propriedades aninhadas.
Estas são as variáveis de sistema que estão disponíveis por meio de expressões FreeMarker.
Variável | Descrição |
---|---|
system.actualState |
Nome do estado para o qual o usuário navegou tocando em um botão "fora da ordem" mais antigo. Se o payload de postback contiver uma propriedade system.state , o mecanismo de caixa de diálogo navegará até esse estado e definirá essa variável com o nome desse estado. Consulte também Configurar o Fluxo de Caixas de Diálogo para Ações Inesperadas.
|
system.authorizedUsers |
Uma lista de todos os usuários autorizados para um chat em grupo específico. |
system.channelType |
O tipo de canal da sessão do usuário atual. Valores permitidos: facebook , androidsdk , iossdk , websdk , slack , twilio , msteams , cortana , webhook e test .
Se a sessão estiver sendo executada no testador, o valor corresponderá ao tipo de canal que está sendo simulado. |
system.entityToResolve |
Objeto que representa o item de repositório atual a ser resolvido no componente Resposta Comum quando a propriedade de variável do componente está se referindo a um objeto composto entity.The tem as seguintes propriedades:
Consulte A Variável system.entityToResolve par obter exemplos de como usar |
system.errorAction |
O texto da mensagem de um erro inesperado gerado durante a execução do estado. |
system.errorState |
Nome do estado que gerou um erro inesperado durante a execução. |
system.expectedState |
Quando o usuário rola o histórico de mensagens para cima e toca em um botão "fora da ordem" mais antigo, essa variável é preenchida com o nome do estado que deveria ser executado, mas nunca foi porque o usuário decidiu tocar nesse botão "fora da ordem". Consulte também Configurar o Fluxo de Caixas de Diálogo para Ações Inesperadas. |
system.intent.name |
Use para se referir à intenção que um usuário selecionou depois de ser solicitado a desambiguar. (
sempre retorna a intenção com a pontuação superior, que pode não ser a intenção que o usuário seleciona ao desambiguar.) |
system.invalidUserInput |
Valor booliano definido como true quando a entrada do usuário não pode corresponder ao tipo de variável solicitado.
|
system.message |
Última mensagem recebida pelo Oracle Digital Assistant. Essa variável tem as seguintes propriedades:
|
system.requestedState |
Se um usuário entrar em uma conversa em um estado que exija autorização e o usuário não estiver na lista de usuários armazenados em system.authorizedUsers , o mecanismo de caixa de diálogo armazenará o estado que pretendia executar nessa variável.
|
system.selectedCardIndex |
Essa variável mantém o índice do cartão selecionado ao usar o recurso de otimizar a renderização do cartão para canais somente texto, como o Twilio. Essa otimização permite que o usuário selecione um cartão em um processo de duas etapas: primeiramente, uma lista de cartões é apresentada; em seguida, o usuário pode informar o número dos cartões que ele deseja selecionar. O número de índice correspondente desse cartão é armazenado nessa variável. |
As variáveis do sistema na tabela acima são as únicas que você pode usar nas expressões FreeMarker. Outras variáveis do sistema não são públicas e seu uso está sujeito a alterações, o que significa que suas habilidades não podem confiar nelas.
Por exemplo, as variáveis system.routingFromSkill
, system.routingToSkill
, system.routingFromIntent
e system.routingToIntent
só estão disponíveis para definições específicas do assistente digital. Consulte Variáveis de Sistema para Assistentes Digitais.