WEB制作環境の構築として、前回の記事ではCSSを使いやすくする為のSassの導入を行いました。まだご覧になっていない方は是非ご覧ください↓↓
今回はHTMLをより使いやすくする為のPugの導入を行っていきます!
Sassと同様に、Pugも独自の構文を持ち、その構文に従って記述したPugファイルをHTMLファイルに変換する事ができます。
Pugとは??
HTMLをシンプル・コンパクトな構文で記述することができるもので、ファイルの拡張子は.pug
になります。
次の例のような構文でPugを記述することができます。
html
head
title()
body
h1
p()
HTMLタグで必要だった不等号<
、>
が不要で、各要素の親子関係はインデントで表します。
かなり記述量は減りそうですね!
Pugを用いて上記のコードをHTMLに変換すると次のようになります。
<html>
<head>
<title></title>
</head>
<body>
<h1></h1>
<p></p>
</body>
</html>
Pugの使用準備
Sassの導入記事で使用したフォルダで準備をします。
Sassの導入完了時点で、以下のようなフォルダ構成でした。
sample/
├ node_modules/
├ public/
│ ├ index.html
│ └ css/
│ └ style.css
├ src/
│ └ sass/
│ └ style.scss
└ package.json
変換前の.pug
ファイルを入れるフォルダを作成します。
sample/
├ node_modules/
├ public/
│ ├ index.html
│ └ css/
│ └ style.css
├ src/
│ ├ pug/ │ └ sass/
│ └ style.scss
└ package.json
変換前の.pug
ファイルはsample/src/pug
フォルダに、変換後の.html
ファイルはsample/public
フォルダに出力することとします。
Pugのインストール
Sassの導入時と同じく、npmを使ってPugをインストールしていきましょう。
まずはコマンドプロンプトorターミナルを立ち上げ、作業ディレクトリに移動します(パスは適宜変更してください)
> cd sample
ディレクトリを移動したら、次のコマンドでPugをインストールします。Sassのインストールと同様に-g
オプションを付けてグローバルインストールとします。
> npm install -g pug-cli
インストールが完了したら、次のコマンドを入力してみてください。
> pug --version
pug version: 2.0.4
、pug-cli version: 1.0.0-alpha6
等が表示されていればPugのインストールは完了です!
Pugの実行
コマンドプロンプト又はターミナルでpug
コマンドを走らせましょう。
> pug --watch src/pug --out public --pretty
これもsass
コマンドと似たような感じで、--watch
オプションで変更を監視するフォルダを指定し、--out
オプションで変換したHTMLファイルの出力先を指定します。
--pretty
オプションは出力されるHTMLでの改行・インデントを維持するものです。これを付けない場合は全てのコードが一行に纏められたHTMLが出力されます。
監視するフォルダsrc/pug
以下の構成はそのままpublic
フォルダへとコピーされます。
適当な.pug
ファイルを作成してみましょう。
sample/
├ node_modules/
├ public/
│ ├ index.html
│ └ css/
│ └ style.css
├ src/
│ ├ pug/
│ │ └ index.pug │ └ sass/
│ └ style.scss
└ package.json
src/pug/index.pug
ファイルを作成した時点で、出力先となるpublic
フォルダへindex.html
ファイルが作成されます。
今回は既にindex.html
がありましたので、内容が更新されたと思います。
src/pug
フォルダ内の全ての.pug
ファイルを編集して保存する度にこの変換が行われるようになります。
これでPugを用いたHTMLのコーディング編集が可能になりました!
Pug構文について
Pugの使用準備は完了しました。ここからはPugの構文を紹介していきます。
タグの省略
HTMLでは、不等号<
、>
で開始タグ、終了タグを記述しましたが、Pugでは不等号が不要となり、タグ名のみで要素を記述できます。
Pugファイルで次の記述をします。
p
これは次のようなHTMLに変換されます。
<p></p>
テキスト
要素の後に半角スペースを空けることでテキストを記述できます。
p Hellow, World!!
これは次のように変換されます。
<p>Hellow, World!!</p>
テキストにHTMLタグを含ませた場合はそのままHTMLとして出力できます。
p Hellow, <br/>World!!
<p>Hellow, <br/>World!!</p>
テキスト中で#[要素 テキスト]
のようにすると、テキストの中にHTML要素を入れる事ができます。属性を指定しないインライン要素であればこちらの方が記述が短くなる場合があります。
p hoge#[span fuga]piyo
<p>hoge<span>fuga</span>piyo</p>
テキストを複数行に分けたい場合はパイプ|
を使います。テキストとする範囲にインデントを付けて、| テキスト
とします。
p
| hoge
| fuga
| piyo
<p>
hoge
fuga
piyo
</p>
このパイプを応用して、属性の指定のあるインライン要素を記述する場合は次のように記述することができます。長い文章中で属性の指定のあるインライン要素を書きたいときにいいかもしれません。
p
| 詳細は
a(href="./page.html") こちらの記事
| で紹介しています。
<p>詳細は<a href="./page.html">こちらの記事</a>で紹介しています。</p>
後に出てくる変数をテキストで展開したい場合は、要素 #{変数}
や、要素= 変数
を使用します。
- var age = 20
- var hoge = "hogehoge"
p 私は#{age}歳です。
p= hoge
<p>私は20歳です。</p>
<p>hogehoge</p>
これらの方法でテキスト中に変数を展開する場合、変数にHTMLタグが含まれていればエスケープされます。
- var text = "span要素は<span>fuga</span>のように記述します"
p= text
<p>span要素は<span>fuga</span>のように記述します</p>
ネスト
ネストはインデント(字下げ)で表します。インデントはスペース・タブどちらでもOKですが、混在せずに統一して使いましょう。
対象の要素の次の行よりインデントが深いものから、インデントの深さが元に戻るまでがネストされます。
div
p Hellow,
div
p World!!
これは次のように変換されます。
<div>
<p>Hellow,</p>
</div>
<div>
<p>World!!</p>
</div>
親要素: 子要素
のようにすると一行でネストの記述ができます。直下に子要素がある場合に使えます。
a: img
<a><img/></a>
クラス・ID
クラス・IDはCSSと同じ構文で記述することができます。
div.hoge
div#fuga
また、<div>
のみ要素名を省略することができます。
.hoge
#fuga
これらはどちらも次のように変換されます。
<div class="hoge"> </div>
<div id="fuga"> </div>
属性
要素(属性="値")
とすることで、属性を記述することができます。
属性が複数ある場合は、スペースで区切り複数指定することができます。
a(href="./hoge.html") hogeページへのリンク
img(src="./image.png" alt="image")
これは次のように変換されます。
<a href="./hoge.html">hogeページへのリンク</a>
<img src="./image.png" alt="image"/>
コメント
//
を用いてコメントを挿入することができます。
// hogehoge
p fugafuga
<!-- hogehoge -->
<p>fugafuga</p>
出力されるHTMLにコメントを残したくない場合は//-
を用います。
//- hogehoge
p fugafuga
<p>fugafuga</p>
変数
- var 変数名 = 値
とすると事で、JavaScriptと同様に変数を定義できます。
定義した変数はテキストに埋め込んだり、次以降で紹介する条件分岐等で使用できます。
- var hoge = "fuga"
p= hoge
これは次のように変換されます。
<p>fuga</p>
条件分岐
if ~ else
文を用いて条件毎にレンダリングする要素を変えることが出来ます。
次のような構文になります。
if 条件式
条件式がtrueの時レンダリングする要素
else
条件式がfalseの時レンダリングする要素
次のようなPugを記述します。
- var auth = false
if auth
p ログインしています
else
p ログインしてください
これは次のように変換されます。
<p>ログインしてください</p>
反復
each
文を使って、配列・オブジェクトの反復ができます。
次のような構文になります。
each 配列から順に取り出した値 in 反復する配列
取り出した値を使用した反復処理
次のようなPugファイルを記述します。
ul
each item in ["hoge","fuga","piyo"]
li item: #{item}
これは次のように変換されます。
<ul>
<li>item: hoge</li>
<li>item: fuga</li>
<li>item: piyo</li>
</ul>
他のファイルの読込
共通部分となるファイルを用意しておいて、他のファイルからinclude
で読み込むことができます。
WEBサイト上で共通部分となるヘッダーや、フッターをこの方法で読み込むようにすると、コードの記述量が減り、見通しもよくなります!
include
用のフォルダを用意し、そこに_header.pug
と_footer.pug
の二つのファイルを用意します。
sample/
├ node_modules/
├ public/
│ ├ index.html
│ └ css/
│ └ style.css
├ src/
│ ├ pug/
│ │ ├ index.pug
│ │ └ include/ │ │ ├ _header.pug │ │ └ _footer_.pug │ └ sass/
│ └ style.scss
└ package.json
PugもSassと同様に、ファイル名の先頭にアンダースコア_
を付けておくと、HTMLとして出力されないようになります。
これらは他のPugファイルから読込んでHTMLに出力するのでアンダースコアを付けておきましょう。
次のようにPugを記述します。
//- _header.pug
header
p page header
//- _footer.pug
footer
p page footer
これら二つのPugファイルをinclude 読込むPugファイルのパス
として読込すると、その箇所で読み込んだファイルが展開されます。
//- index.pug
body
include ./include/_header.pug
main
p hogehoge
include ./include/_footer.pug
読込むPugファイルのパスは、ファイルから見た相対パスとします。ここではindex.pug
を基準としています。
これは次のように変換されます。
<body>
<header>
<p>page header</p>
</header>
<main>
<p>hogehoge</p>
</main>
<footer>
<p>page footer</p>
</footer>
</body>
まとめ
かなりHTMLの編集が楽になりそうですね!
特に後半の条件分岐、反復、他のファイルの読み込みあたりは上手に使いこなせばコーディングの効率も上がるし保守性も良くなります!
ぜひ使ってみてください!
次の記事
WEB制作の各種タスクを自動化するタスクランナーについて紹介します!