該博客首發於www.litreily.topjavascript
Pug – robust, elegant, feature rich template engine for Node.jscss
pug
原名jade
,因版權問題改名爲pug
,即哈巴狗。與hexo
默認模塊ejs
同樣,pug
也是一個模板引擎,可用於快速的網站開發,固然也能夠用於靜態博客網站的設計。本站點現時所用主題manupassant
也使用了pug
。html
本文針對Hexo
中使用pug
的狀況爲例,說明其基本語法。java
# common install
npm install pug
# install for hexo blog
npm install hexo-renderer-pug --save
複製代碼
pug
不一樣於html
,前者不須要標籤的開和閉,如html
的<p>Demo</p>
,在pug
使用p Demo
便可。python
pug
對空格敏感,有點相似python
對製表符tab
敏感。pug
使用空格做爲縮進符,固然用soft tab也可行。同一級標籤需保證左對齊。jquery
div
p Hello, world!
p Hello, pug.
複製代碼
渲染結果以下:web
<div>
<p>Hellow, world!</p>
<p>Hello, pug.</p>
</div>
複製代碼
pug
使用//-
或//
對代碼進行註釋,前者註釋內容不出如今渲染後的html
文件中,後者反之。npm
//- html中不包含此行
// html中會包含此行
複製代碼
pug
將標籤屬性存放於括號()
內,多個屬性之間以逗號或空格分隔。此外,對於標籤的id
和class
,pug
使用#
緊跟標籤id
,使用.
緊跟標籤class
,能夠同時設置多個class
。編程
h1#title Test title
img#name.class1.class2(src="/test.png" alt="test")
複製代碼
↓api
<h1 id="title">Test title</h1>
<img id="name" class="class1 class2" src="/test.png" alt="test">
複製代碼
爲了方便代碼複用,pug
提供了include
包含功能,如下代碼會將_partial
目錄下的head.pug
文件內容包含到當前調用的位置。有點C/C++
中內聯函數的意思。
doctype html
html(lang='en')
include _partial/head.pug
複製代碼
下面是一個簡單的base
模板,經過block
定義了頁面頭部head
和內容body
。塊block
有點相似C/C++
的抽象函數,須要在繼承者中完成定義,填充具體內容。
//- base.pug
html
head
block title
body
block content
複製代碼
如下文件使用extends
繼承以上模板,經過block
覆蓋或替換原有塊block
。固然,繼承者也能夠在原有基礎上繼續擴展。
//- index.pug
extends base.pug
block title
title "Test title"
block content
h1 Hello world!
block article
複製代碼
pug
中經過- var name = value
的形式定義變量
- var intData = 100
- var boolData = false
- var stringData = 'Test'
p.int= intData
p.bool= boolData
p.stringData= stringData
複製代碼
需注意的是,在引用變量時,須要在引用位置加上
=
號,不然會默認將變量名當成普通字符串使用。
若是想要將變量與其它字符串常量或是變量鏈接在一塊兒,就不能用等號了,而是應該用#{}
,該符號會對大括號內的變量進行求值和轉義,最終獲得渲染輸出的內容。
- var girl = 'Lily'
- var boy = 'Jack'
p #{girl} is so beautiful!
p And #{boy} is handsome.
複製代碼
pug
的條件語句與其它語言相似,均是以下這般:
- var A = {value: 'Test'}
- var B = true
if A.value
p= A.value
else if B
p= B
else
p nothing
複製代碼
pug
中使用each
和while
實現循環迭代,each
能夠返回當前所在項的索引值,默認從0開始計數。
//- each
ol
each item in ['Sun', 'Mon', 'Tus', 'Wen', 'Thu', 'Fri', 'Sat']
li= item
//- get index of each
- var week = ['Sun', 'Mon', 'Tus', 'Wen', 'Thu', 'Fri', 'Sat']
ol
each item, index in week
li= index + ':' + item
複製代碼
↓
<ol>
<li>Sun</li>
<li>Mon</li>
<li>Tus</li>
<li>Wen</li>
<li>Thu</li>
<li>Fri</li>
<li>Sat</li>
</ol>
<ol>
<li>0:Sun</li>
<li>1:Mon</li>
<li>2:Tus</li>
<li>3:Wen</li>
<li>4:Thu</li>
<li>5:Fri</li>
<li>6:Sat</li>
</ol>
複製代碼
while
調用方式以下:
//- while
- var day = 1
ul
while day < 7
li= day++
複製代碼
mixin
名曰混入,相似其它編程語言中的函數,也是爲了代碼複用,可帶參數或不帶參數,定義方式以下:
mixin menu-item(href, name)
li
span.dot ●
a(href=href)= name
複製代碼
其中,menu-item
爲調用時所用名稱,可認爲是函數名,href
及name
是參數。同上定義變量所說,a(href=href)= name
中第二個=
是爲了將後面的name
看成參數來處理,而不是看成字符串"name"來處理。
調用mixin
定義的代碼塊,需經過+
號緊跟mixin
名稱及參數:
+menu-item('/Archives','Archives')
+menu-item('/About','About')
複製代碼
mixin
之因此稱爲混入,是由於其語法不侷限於函數調用,在mixin
可使用塊block
mixin print(post)
if block
block
else
p= post
+print("no block")
+print("")
div.box
p this is the content of block
複製代碼
↓
<p>no block</p>
<div class="box"><p>this is the content of block</p></div>
複製代碼
注意如下pug
語句中第一行的.
號。
script(type='text/javascript').
var data = "Test"
var enable = true
if enable
console.log(data)
else
console.log('nothing')
複製代碼
↓
<script type='text/javascript'>
var data = "Test"
var enable = true
if enable
console.log(data)
else
console.log('nothing')
</script>
複製代碼
對於簡單腳本,使用pug
尚可,複雜的仍是單獨寫到.js
文件中,而後經過pug
引用方便一些,引用方式以下:
script(type='text/javascript', src='/path/to/js')
//- with hexo function url_for
script(type='text/javascript', src=url_for(theme.js) + '/ready.js')
複製代碼
在hexo
主題中使用pug
時,能夠經過使用hexo
提供的全局變量config
,theme
來分別調用博客根目錄下_config.yml
文件中的參數以及主題根目錄下_config.yml
文件中的參數。
//- blog config
p= config.description
//- theme config
p= theme.title
複製代碼
固然,pug
中能夠直接使用hexo
提供的其它全局變量及輔助函數,使用方法詳見hexo
的文檔
//- head.pug
head
meta(http-equiv='content-type', content='text/html; charset=utf-8')
meta(content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0', name='viewport')
meta(content='yes', name='apple-mobile-web-app-capable')
meta(content='black-translucent', name='apple-mobile-web-app-status-bar-style')
meta(content='telephone=no', name='format-detection')
meta(name='description', content=config.description)
block title
link(rel='stylesheet', type='text/css', href=url_for(theme.css) + '/style.css' + '?v=' + theme.version)
link(rel='Shortcut Icon', type='image/x-icon', href=url_for('favicon.png'))
script(type='text/javascript', src='//cdn.bootcss.com/jquery/3.3.1/jquery.min.js')
block more
複製代碼
//- base.pug
doctype html
html(lang='en')
include _partial/head.pug
block more
link(rel='stylesheet', type='text/css', href=url_for(theme.plugins) + '/prettify/doxy.css')
script(type='text/javascript', src=url_for(theme.js) + '/ready.js' + '?v=' + theme.version, async)
//- body
body: #container.box
.h-wrapper
include _partial/nav-menu.pug
// article content
block content
include _partial/footer.pug
複製代碼
其中:
theme.*
爲主題配置文件_config.yml
中的參數url_for
爲hexo
提供的用於查找資源路徑的函數pug
提供了包含,繼承,Mixin等多種方式用於代碼複用,語法簡潔易懂,除了初學時需花費一些時間學習各類標點符號的含義外,其它倒也沒有太大困難。
固然啦,pug
還有許多其它特性,但就我目前使用狀況而言,以上這些便已足夠。