Vapor 2.0 - Leaf概述(Leaf Overview)

前往 Vapor 2.0 - 文檔目錄

警告
本節(jié)可能包含過(guò)時(shí)的信息氓英。

葉(Leaf)

歡迎來(lái)到Leaf。Leaf的目標(biāo)是成為一種簡(jiǎn)單的模板語(yǔ)言鹦筹,可以使生成視圖更容易铝阐。有很多偉大的模板語(yǔ)言,使用最適合你的盛龄,也許就是Leaf饰迹!葉的目標(biāo)如下:

  • Small set of strictly enforced rules 小套嚴(yán)格執(zhí)行規(guī)則
  • Consistency 一致性
  • Parser first mentality 解析器第一心態(tài)
  • Extensibility 可擴(kuò)展性

語(yǔ)法(Syntax)

結(jié)構(gòu)(Structure)

葉標(biāo)簽由4個(gè)元素組成: - Token:#
是令牌 - Name:標(biāo)識(shí)標(biāo)簽的string- Parameter List:()可以接受0或更多個(gè)參數(shù) - Body (optional(可選)):{}必須與參數(shù)列表分隔開(kāi)一個(gè)空格

根據(jù)標(biāo)簽的實(shí)現(xiàn),這4個(gè)元素可以有很多不同的用法余舶。我們來(lái)看幾個(gè)例子啊鸭,說(shuō)明如何使用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> }

在HTML中使用#令牌(Using the # token in HTML)

#令牌不能轉(zhuǎn)義。在葉子模板中,使用#()#raw() {}標(biāo)簽輸出一個(gè)#匿值。#()=>#

原始 HTML(Raw HTML)

默認(rèn)情況下赠制,所有Leaf輸出都將被轉(zhuǎn)義。使用#raw() {}標(biāo)簽進(jìn)行非轉(zhuǎn)義輸出挟憔。
#raw() { <a href="#link">Link</a> } => <a href="#link">Link</a>

重要钟些!確保您沒(méi)有使用#raw() {}帶有用戶輸入的標(biāo)簽。

鏈(Chaining)

雙重令牌:##表示鏈绊谭。它可以應(yīng)用于任何標(biāo)準(zhǔn)標(biāo)簽政恍。如果以前的標(biāo)簽失敗,鏈接的標(biāo)簽將被給予運(yùn)行的機(jī)會(huì)达传。

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

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

令牌:#()(Token: #()
#() #()hashtags #()FTW => # #Hashtags #FTW
原始:#raw() {}(Raw: #raw() {}
#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(lhs, rhs) {}(Equal: #equal(lhs, rhs) {}
#equal(leaf, leaf) { Leaf == Leaf } => Leaf == Leaf
#equal(leaf, mustache) { Leaf == Mustache } =>
變量:#(variable)(Variable:#(variable)
Hello, #(name)!
循環(huán):#loop(object, "index")(Loop: #loop(object, "index")
#loop(friends, "friend") {
  Hello, #(friend.name)!
}
索引:#index(object, _ index: Int|String)(Index: #index(object, _ index: Int|String)
Hello, #index(friends, 0)!
Hello, #index(friends, "best")!
如果 - 其他:#if(bool) ##else() { this }(If - Else: #if(bool) ##else() { this }
#if(entering) {
  Hello, there!
} ##if(leaving) {
  Goodbye!
} ##else() {
  I've been here the whole time.
}
導(dǎo)入 Import: #import("template")
出口 Export: #export("template") { Leaf/HTML }
擴(kuò)展 Extend: #extend("template")
嵌入 Embed: #embed("template")

使用這些布局標(biāo)簽時(shí)迫筑,請(qǐng)省略模板文件的.leaf擴(kuò)展名。

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

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

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

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

Leaf呈現(xiàn)html.leaf為:

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

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

看一下現(xiàn)有的高級(jí)場(chǎng)景標(biāo)簽蒙保,讓我們一起來(lái)看一個(gè)基本的Index例子辕棚。此標(biāo)簽將使用兩個(gè)參數(shù),數(shù)組和要訪問(wèn)的索引邓厕。

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]
    }
}

我們現(xiàn)在可以注冊(cè)這個(gè)標(biāo)簽在我們main.swift文件:

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

并就像我們上面所做的那樣使用逝嚎。

注意:強(qiáng)烈不提倡在標(biāo)簽名稱(chēng)中使用非字母數(shù)字字符,并且在將來(lái)的Leaf版本中可能不允許使用邑狸。

語(yǔ)法突出顯示(Syntax Highlighting)

原子(Atom)

language-leaf
由ButkiewiczP提供

Xcode

目前不可能在Xcode中實(shí)現(xiàn)Leaf Syntax Highlighting懈糯,但是,使用Xcode的HTML語(yǔ)法著色可以幫助一點(diǎn)单雾。選擇一個(gè)或多個(gè)Leaf文件,然后選擇編輯器>語(yǔ)法著色> HTML她紫。您選擇的Leaf文件現(xiàn)在將使用Xcode的HTML語(yǔ)法著色硅堆。不幸的是,這樣做的有用性是有限的贿讹,因?yàn)?code>vapor xcode運(yùn)行時(shí)會(huì)關(guān)閉這個(gè)關(guān)聯(lián)渐逃。

似乎有一種辦法可以使Xcode文件關(guān)聯(lián)持續(xù)存在,但這需要更多的功夫民褂。

VS代碼(VS Code)

html-leaf 由FranciscoAmado提供

CLion & AppCode

一些初步的工作已經(jīng)完成了為CLion和AppCode實(shí)施一個(gè)Leaf插件茄菊,但缺乏對(duì)Java的技能和興趣已經(jīng)放慢了進(jìn)展!如果您有IntelliJ SDK的經(jīng)驗(yàn)赊堪,并希望幫助這一點(diǎn)面殖,在Vapor Slack上發(fā)送消息給Tom Holland 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哭廉,一起剝皮案震驚了整個(gè)濱河市脊僚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遵绰,老刑警劉巖辽幌,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異椿访,居然都是意外死亡乌企,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)成玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)加酵,“玉大人端辱,你說(shuō)我怎么就攤上這事∷浠” “怎么了舞蔽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)码撰。 經(jīng)常有香客問(wèn)我渗柿,道長(zhǎng),這世上最難降的妖魔是什么脖岛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任朵栖,我火速辦了婚禮,結(jié)果婚禮上柴梆,老公的妹妹穿的比我還像新娘陨溅。我一直安慰自己,他們只是感情好绍在,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布门扇。 她就那樣靜靜地躺著,像睡著了一般偿渡。 火紅的嫁衣襯著肌膚如雪臼寄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天溜宽,我揣著相機(jī)與錄音吉拳,去河邊找鬼。 笑死适揉,一個(gè)胖子當(dāng)著我的面吹牛留攒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫉嘀,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炼邀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吃沪?” 一聲冷哼從身側(cè)響起汤善,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎票彪,沒(méi)想到半個(gè)月后红淡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡降铸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年在旱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片推掸。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桶蝎,死狀恐怖驻仅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情登渣,我是刑警寧澤噪服,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站胜茧,受9級(jí)特大地震影響粘优,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呻顽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一雹顺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廊遍,春花似錦嬉愧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至被饿,卻和暖如春四康,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狭握。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疯溺,地道東北人论颅。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像囱嫩,于是被迫代替她去往敵國(guó)和親恃疯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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

  • Leaf是一種模板語(yǔ)言墨闲,目的就是使視圖渲染更加容易今妄。其實(shí)在其他服務(wù)端開(kāi)發(fā)過(guò)程中也經(jīng)常使用模板,比如Mustache...
    Supremodeamor閱讀 873評(píng)論 0 1
  • 模版引擎鸳碧,對(duì)現(xiàn)在的 Web 開(kāi)發(fā)極為重要盾鳞,幾乎所有主流 Web 框架都會(huì)支持一種或多種模版引擎,模版引擎可以分離用...
    isaced閱讀 1,497評(píng)論 1 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理瞻离,服務(wù)發(fā)現(xiàn)腾仅,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 最近換了工作套利,換工作的理由是考上了新單位推励『姿#看上去是個(gè)很不錯(cuò)的理由⊙榇牵可是沒(méi)有人知道我到新單位之后多么不適應(yīng)稿黄。同...
    燕子妮妮189閱讀 163評(píng)論 0 0
  • 我現(xiàn)在腦海中那三個(gè)字還是揮之不去,就像影子一樣前后左右的亂晃跌造,真想點(diǎn)根煙杆怕,狠狠的吸上一口,然后大喊一聲 :“去你媽...
    留在花果山閱讀 288評(píng)論 0 0