## 6.1 handlebars模板語言
>本節主要介紹handlebars模板語言的使用,利用handlebars語音定制機器人回答,使機器人更加靈活多樣。
>
[ruyi.ai](http://ruyi.ai) 為開發者提供了豐富的定制模塊。在匹配用戶的自然語言表達方 面,提供了詞典,暗號,必須詞條以及優先級的配置,以達到對用戶意圖的精 準匹配。而在回答用戶說法的角度上,開發了基于模版語言handlebars的自 定義版本,為ruyi.ai的用戶提供持續定制改進空間。
>handlebars語言在微信硬件端皆可以編寫。

### 6.1.1 簡介
**Handlebars = JSON + 模版 + 函數**
>Handlebars 是一個語義化的 web模板系統,最初由 Yehuda Katz 于 2010 年編寫。[1]它是 Mustache (模板系統)的一個超集,除渲染 Handlebars 模板之外,也可以渲染 Mustache 模板。不像 Mustache, Handlebars 包括一 些邏輯,如 #if, #unless, #with 和 #list。
Handlebars.js是一個由Javascript構建的編譯器,它接收任意HTML與 Handlebars.js表達式并將它們編譯為Javascript函數。這個派生出來的 Javascript函數接著接收一個參數,一個對象 - 即你的數據 - 然后它返回一個 包含HTML以及被插值在HTML中的對象屬性值的字符串。因此,你最終可以 得到一個對象屬性值位于相應地方的字符串(HTML),你可以將這個字符串 插入到頁面中。
### 6.1.2 基本概念實戰
在線測試(基于javascript): http://tryhandlebarsjs.com/ (注意,RUYI- API 使用的是JAVA版實現,可能與Javascript有細微差異)
Handlebars模板看起來就像是正常的文本,并使用了嵌入的 handlebars表達式。更多handlebars表達式參見以下鏈接。http://handlebarsjs.com/
(中文首頁翻譯http://handlebarsjs.cn/)
handlebars表達式,是以`{{`開始,跟一些內容,然后以`}}`結束。 姓名: {{name}} 城市:{{address.city}} 姓名:張三,城市:上海
```
name:姓名—張三
age:城市—上海
```
JSON數據結構, JSON(JavaScript Object Notation) 是一種輕量級的數據交換格 式。 易于人閱讀和編寫。同時也易于機器解析和生成。
```
http://www.json.org/json-zh.html
{
"name": "張三", "age": 24,
"address": {
"street": "盛夏路",
"city": "上海" },
"friends": ["李四", "Joe"]
}
```
對象(Object)是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開 始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’對”之間使 用“,”(逗號)分隔。
數組(Array)是值(value)的有序集合。一個數組以“[”(左中括號)開 始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。
編譯/應用模板
`JAVA(https://github.com/jknack/handlebars.java)
javascript(https://github.com/wycats/handlebars.js/)
`
采用不同技術實現
### 6.1.3 技術要點
基于模版的JSON數據渲染 支持自定義函數回調豐富渲染能力--基本上支持編程
### 6.1.4 網上教程
中文資料1:Handlebars.js初級教程:學習Javascript模板Handlebars.js
http://www.html-js.com/article/1595
中文資料2:js模版引擎handlebars.js實用教程 -楊元
http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html
### 6.1.5 實例分析
基于ruyi開發者后臺 注:所有handlebars的表達式均填寫在助理答的 handlebars編輯框中,助理識別結果結構
`in=parameters (如意NLP識別結果)`
`out=result (如意ACTION處理結果)`
### 6.1.6 變量引用
簡單路徑
` sys.template.mustache={{in.details}`
標準變量引用路徑
`sys.template.mustache={{#in}}{{details}}{{/in}}`
引用自己
`{{ .}}` (如果沒有該變量,則不顯示)
定制變量格式化
`
sys.template.mustache={{#in}}
{{#time_start}}從【{{timeFormat . format="yyyy年M月d日h點m分"}}】{{/ time_start}}
{{/in}}
`
timeFormat為ruyi-api定制函數,可以講數字型時間表示轉化為中文表示。具體時間格式化參數(format) 參考https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
### 6.1.7 實例(日程提醒)
+ 例一
`用戶說:今天晚上6點在張江深山老屋和朋友吃飯,提前1小時提醒 `
`期望答復:
日程: (內容)吃飯
(開始的時間)【2016年4月1日18點0分】在(地點 )【張江深山老屋】和【朋友】(提醒時間)【提前一小時】提醒`
+ 變量分解
details:內容-吃飯
time_start:開始時間-晚上六點,調用timeFormat為ruyi-api定制函數,將數字型時間表示轉化為中文表示,“yyyy年M月d日h點m分”,并且用方括號“【】”括起來,這里顯示的就是“【2016年4月1日18點0分】”具體時間格式化參數(format)參考https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
time_end:結束時間-沒有該變量不顯示
timedelta_alert:提醒時間-時間差,提前一小時識別為“-1小時”。
participant:參與者-朋友
location:地點-張江深山老屋
助理答填寫(按照句子期望回答的結構順序)
sys.template.mustache=
{{#in}}
日程:{{details}}\n
{{#time_start}}【{{timeFormat . format="yyyy年M月d日h點m分"}}】{ {/time_start}}
{{#location}}在【{{.}}】{{/location}}
{{#participant}}和【{{.}}】{{/participant}}
{{#timedelta_alert}}\n【{{timedeltaFormat .}}】提醒{{/timedelta
_alert}}
{{/in}}
JSON輸出結果
"result": {
"text": "日程: 和朋友吃飯\\n【2016年4月1日18點0分】 在【張江深山老屋 】 \\n【提前1小時】提醒 ",
"type": "dialog"
},
### 6.1.8 條件分支邏輯 IF THEN ELSE
`if—>{{#}}...{{/}}`
`else——>{{^}}...{{/}}`
舉例:
sys.template.mustache=
{{#age}}有年齡:{{.}}{{/age}}——>有年齡則引用輸入的年齡
{{^age}}無年齡{{/age}}——>若沒有年 齡則什么都不引用
數據1 -- 期望輸出年齡
{
"name": "張三", "age": 24
}(有年齡”24“的顯示)
數據2-- 期望沒有年齡的輸出
{
"name": "張三"
}(沒有年齡的顯示)
### 6.1.9 自建處理函數
為了提高智能助理回答答案的多樣化和定制性,我們持續自定義和擴充 handlebars helper函數,幫助用戶可以以快捷,簡便的方式對數據結果進行自定 義的輸出。
### 6.1.10 split函數
Handlebars新增了split函數,可以將參數值按照一定的分隔符分隔,并按照下標 獲取其中的某個值。如果分隔不成功,或者下標值超出范圍,則返回原參數值。
使用方法:
`{{split 參數名 分隔符 下標值}}`
舉例:
input值為 a#b#c
{{split input "#" 0}} 返回 a
{{split input "#" 1}} 返回 b
{{split input "#" 2}} 返回 c
### 6.1.11 概述: strComp
Handlebars之前不能對字符串之間進行比較,現在新增了strComp (String Compare)函數,可以進行如下的邏輯判斷:
1. 等于 equals
2. 包含 contains
3. 前綴比較 startswith
4. 后綴比較 endswith
使用方法: # 號跟strComp,后面跟三個參數,第一個是變量名,第二個是判斷符號,(如equals,需要使用雙引號“”括起來,否則無法識別),第三個是需要 比較的字符串
局限性: 目前只能支持一個參數與字符串之間進行比較,無法進行兩個參數的比較。
### 6.1.12 概述:ifCond
Handlebars內置的 if 只能判斷一個參數值有沒有,是不是null或者0,不能對其 具體的值進行邏輯判斷,所以新增了ifCond,可以進行如下的邏輯判斷:
1.等于 ==
2.不等于 !=
3.大于 >
4.小于 <
5.大于等于 >=
6.小于等于 <=
使用方法: # 號跟ifCond,后面跟三個參數,第一個是變量名,第二個是判斷符 號,(如==,需要使用雙引號 “ ” 或者單引號 ‘ ’ 括起來,否則無法識別),第三 個是數值(除了整數之外,小數、布爾值、字符串等都需要用雙引號 “ ” 或者單引 號 ‘ ’ 括起來,否則無法識別)
舉例:
```
{{#ifCond num "==" 3}}
number equals to 3
{{else}}
number not equal to 3
{{/ifCond}}
=================================
{{#ifCond num "==" "3.2"}}
number equals to 3.2
{{else}}
number not equal to 3.2
{{/ifCond}}
=================================
{{#ifCond bool "==" "true"}}
bool is true
{{else}}
bool is false
{{/ifCond}}
=================================
{{#ifCond str "==" "good"}}
str is good
{{else}}
str is not good
{{/ifCond}}
```
局限性: 目前只能支持一個參數與數值之間進行比較,無法進行兩個參數的比較。
- 1. 海知智能第三方技能插件開放平臺概述
- 2. 快速接入API
- 2.1 硬件接口調用
- 2.2 快速接入微信
- 2.3 API接入常見問題
- 3. 技能插件
- 3.1 基礎能力類
- 頂級過濾器
- 用戶知識圖譜
- 機器人檔案
- 通用閑聊
- 兒童閑聊
- Smart Reply
- 輕量閑聊
- 3.2 語音游戲類
- 成語接龍
- 詞匯樂園
- 詞語接龍
- 鸚鵡學舌
- 動腦猜猜
- 挑戰單詞
- 冒險世界
- 猜猜我是誰
- 阿拉丁學詩詞
- 貓貓托管所
- 漂流瓶
- 詩詞大會
- 國學大會
- 我愛猜歌名
- 我在看著你
- 燈謎猜猜
- 3.3 休閑娛樂類
- 星座運勢
- 悅耳聲音
- 幸運簽
- 調教機器人
- 娛樂推送
- 3.4 生活服務類
- 黃歷
- 計算器
- 古詩詞
- 時間詢問
- 翻譯類技能
- 天氣資訊
- 日程創建
- 日程創建指令
- 鬧鐘
- 食材知識
- 冥想音樂
- 格言
- 每日英語
- 漢語詞典
- 豆果菜譜
- 古文翻譯
- 3.5 音頻點播類
- 喜馬拉雅FM
- 新聞廣播
- 音樂點播
- Smart Music
- 兒童聽聽
- Smart Audio
- 兒童笑話
- 點播控制指令
- 3.6 視頻點播類
- 影視點播
- 3.7 百科知識類
- 人物百科
- 百科問答
- 實時百科
- 3.8 體育健康類
- 五分鐘健身
- 4. 開發者初級教程
- 4.1 開通服務
- 4.2 創建機器人
- 4.3 設置機器人
- 4.4 獲取技能插件
- 4.5 讓機器人學會聊天
- 4.6 導入知識庫
- 4.7 多種問答形式
- 4.8 數據統計
- 4.9 粉絲管理
- 5. 開發者中級教程
- 5.1 詞典運用
- 5.2 意圖處理
- 5.3 暗號使用
- 5.4 事件觸發
- 5.5 優先級
- 5.6 觸發器
- 5.7 快捷鍵
- 5.8 意圖報錯
- 6. 開發者高級教程
- 6.1 handlebars模版語言
- 6.2 JavaScript簡單介紹
- 6.3 JavaScript使用說明
- 6.4 JavaScript使用案例
- 6.5 JavaScript常見問題
- 7. 快速發布技能
- 8. 幫助中心
- 8.1 常見概念
- 8.2 幫助視頻
- 8.3 聯系我們