Vapor文檔學(xué)習(xí)六:Leaf

Leaf是一種模板語言卡者,目的就是使視圖渲染更加容易。其實在其他服務(wù)端開發(fā)過程中也經(jīng)常使用模板棺亭,比如Mustache虎眨、Express蟋软。
Leaf作為一種可擴展的模板語言镶摘,專用于Vapor,至于其與其他模板的區(qū)別以及原理我暫時沒有研究岳守,咳咳凄敢,我們還是先學(xué)習(xí)怎么使用吧。

Synax(語法)

Structure

Leaf標(biāo)簽由四個元素構(gòu)成:

  • Token:#就是Leaf的標(biāo)識
  • Name:用字符串來區(qū)分這個標(biāo)簽
  • Parameter List:()可以接收0到多個參數(shù)
  • Body(可選): {} 必須用空格與Parameter List分開

根據(jù)標(biāo)簽的實現(xiàn)湿痢,這4個元素可以有很多不同的用法涝缝。我們來看幾個例子扑庞,說明如何使用Leaf的內(nèi)置標(biāo)簽:

  • #()
  • #(variable)
  • #import("template")
  • #export("link") { <a href="#()"></a> }
  • #index(friends, "0")
  • #loop(friends, "friend") { <li>#(friend.name)</li> }
  • #raw() { <a href="#raw">Anything goes @#$%^&*</a> }

Using the # token in HTML

#無法轉(zhuǎn)義,在Leaf模板中要使用#()#raw() {}來輸出#拒逮。#() => #

Raw HTML

任何Leaf模板的輸出都默認被轉(zhuǎn)義罐氨,如果不想被轉(zhuǎn)義輸出可以使用#raw()標(biāo)簽。#raw() { <a href="#link">Link</a> }=><a href="#link">Link</a>

<i><b>ps:</b>這里體現(xiàn)了Leaf選擇用#作為標(biāo)簽的缺點滩援,很容易與html中的鏈接沖突栅隐。</i>

Chaining(鏈接)

##表示鏈接標(biāo)簽,可以用在任何標(biāo)準(zhǔn)標(biāo)簽上玩徊,如果前一個標(biāo)簽失敗租悄,就會執(zhí)行鏈接的標(biāo)簽。

#if(hasFriends) ##embed("getFriends")

上面代碼中恩袱,如果#if(hasFriends)調(diào)用失敗泣棋,就調(diào)用#embed("getFriends")(也就是沒friends的話就去獲取friends)。

Leaf's build-in Tags(Leaf內(nèi)置標(biāo)簽)

  • Token:#()
#() #()hashtags #()FTW => # #Hashtags #FTW
  • Raw: #raw() {} ,body部分不會被Leaf轉(zhuǎn)義渲染
#raw() {
    Do whatever w/ #'s here, this code won't be rendered as leaf document and is not escaped.
    It's a great place for things like Javascript or large HTML sections.
}
  • Equal:#equal(lhs,rhs) {} 用于判斷body內(nèi)的表達式是否成立畔塔。
#equal(leaf, leaf) { Leaf == Leaf } => Leaf == Leaf
#equal(leaf, mustache) { Leaf == Mustache } =>  Leaf == Mustache
  • Variable:#(variable) 變量
Hello, #(name)!
  • Loop: #loop(object, "index") 循環(huán)潭辈,相當(dāng)于for item in object
#loop(friends, "friend") {
  Hello, #(friend.name)!
}
  • Index: #index(object, _ index: Int|String) 用下標(biāo)或鍵取值
Hello, #index(friends, 0)!
Hello, #index(friends, "best")!
  • If-Else: #if(Bool) ##else(){ this } "if... else...",需要注意的是else if也是用#if()表示俩檬。
#if(entering) {
   Hello, there!
} ##if(leaving) {
   Goodbye!
} ##else() {
   I've been here the whole time.
}
  • Import: #import("template") 設(shè)置插入點
  • Export: #export("template") { Leaf/HTML } 在插入點處引入木本內(nèi)容
  • Extend: #extend("template") 繼承模板萎胰,使用模板內(nèi)容
  • Embed: #embed("template") 將模板內(nèi)容插入到當(dāng)前位置

使用這些標(biāo)簽的引入模板的時候不用加.leaf后綴。

這么說你是不是懵逼了棚辽?還吃吃個??吧:

/// base.leaf
<!DOCTYPE html>
#import("html")

/// html.leaf
#extend("base")

#export("html") { <html>#embed("body")</html> }

/// body.leaf
<body></body>

Leaf最后會將html.leaf按照如下內(nèi)容渲染:

<!DOCTYPE html>
<html><body></body></html>

我給你剝下栗子皮:
1技竟,base.leaf#import("html")設(shè)置了一個插入點,點名使用名為"html.leaf"的模板去填充屈藐。
2榔组,html.leaf#extend("base")表明我繼承base.leaf,要引入base.leaf的內(nèi)容联逻。
3搓扯,#export("html"){...}就是將{...}中的內(nèi)容填充到base.leaf中插入點位置。
4包归,#embed("body")就是把body.leaf模板的內(nèi)容直接嵌入到當(dāng)前位置锨推。

Custom Tags(自定義標(biāo)簽)

內(nèi)置標(biāo)簽肯定無法滿足各種復(fù)雜場景的需要,當(dāng)然也滿足不了你膨脹的內(nèi)心公壤,所以自定義標(biāo)簽?zāi)愕脮伞?br> 看一下現(xiàn)在存在的高級場景應(yīng)用的標(biāo)簽换可,一起學(xué)習(xí)一下創(chuàng)建 Index標(biāo)簽的基礎(chǔ)示例,它接收兩個參數(shù)厦幅,一個是數(shù)組沾鳄,一個是索引的下標(biāo):

class Index: BasicTag {
  let name = "index"

  func run(arguments: [Argument]) throws -> Node? {
    guard
      arguments.count == 2,
      let array = arguments[0].value?.nodeArray,
      let index = arguments[1].value?.int,
      index < array.count
    else { return nil }
        return array[index]
    }
}

然后將這個標(biāo)簽注冊到main.swift中:

if let leaf = drop.view as? LeafRenderer {
    leaf.stem.register(Index())
}

<i><b>ps:</b>Dependencies/Leaf 1.0.7/Leaf/Tag/Models/目錄下有每個內(nèi)置標(biāo)簽類的實現(xiàn)過程。</i>

Note: 不推薦使用除字母或數(shù)字之外的字符作為標(biāo)簽名确憨,并且在未來的Leaf版本中可能會禁止使用译荞。

Syntax Highlighting

語法高亮這部分不多說了瓤的,Atom編輯器支持Leaf語法。Xcode不支持吞歼,可以Editor > Syntax Coloring > HTML改成html語法略微改善圈膏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篙骡,隨后出現(xiàn)的幾起案子本辐,更是在濱河造成了極大的恐慌,老刑警劉巖医增,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慎皱,死亡現(xiàn)場離奇詭異,居然都是意外死亡叶骨,警方通過查閱死者的電腦和手機茫多,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忽刽,“玉大人天揖,你說我怎么就攤上這事」虻郏” “怎么了今膊?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伞剑。 經(jīng)常有香客問我斑唬,道長,這世上最難降的妖魔是什么黎泣? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任恕刘,我火速辦了婚禮,結(jié)果婚禮上抒倚,老公的妹妹穿的比我還像新娘褐着。我一直安慰自己,他們只是感情好托呕,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布含蓉。 她就那樣靜靜地躺著,像睡著了一般项郊。 火紅的嫁衣襯著肌膚如雪馅扣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天呆抑,我揣著相機與錄音岂嗓,去河邊找鬼汁展。 笑死鹊碍,一個胖子當(dāng)著我的面吹牛厌殉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侈咕,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼公罕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耀销?” 一聲冷哼從身側(cè)響起楼眷,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熊尉,沒想到半個月后罐柳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡狰住,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年张吉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片催植。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肮蛹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出创南,到底是詐尸還是另有隱情伦忠,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布稿辙,位于F島的核電站昆码,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邻储。R本人自食惡果不足惜未桥,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芥备。 院中可真熱鬧冬耿,春花似錦、人聲如沸萌壳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袱瓮。三九已至缤骨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尺借,已是汗流浹背绊起。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燎斩,地道東北人虱歪。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓蜂绎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笋鄙。 傳聞我的和親對象是個殘疾皇子师枣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容