初心者のためのpug入門

# はじめに

テンプレートエンジンのpugに触れる機会があったので、初心者の方でもわかりやすいようにまとめようと思います。

# pug（パグ）とは

pug(パグ)とは、HTMLを簡単に、かつ効率的に書くためのテンプレートエンジンです。
閉じタグの概念がなく、素のHTMLに比べて記述が少なくなるのが特徴です。
また、内部で定数を定義してループできたりもします。

# ① 導入

pugを導入するには、

- pug-cliをグローバルにインストール
- gulpなどのタスクランナーでコンパイル

などの方法がありますが、今回は一番手軽なpug-cliを使用します。

pug-cliをglobalにインストールします。

```bash
$ npm install pug-cli -g
or
$ yarn global add pug-cli
```

pugコマンドが使用できるようになっていればOKです。

```bash
$ pug --version
//　 実行結果
pug version: 2.0.4
pug-cli version: 1.0.0-alpha6
```

任意のディレクトリにpugファイルを作成し、記述していきます。

```bash
$ touch index.pug
```

HTMLファイルに出力する際は

```bash
$ pug index.pug
```

を実行すると、同じディレクトリにHTMLファイルが出力されます。

ただし、そのままだと1行に圧縮されてHTMLファイルが出力されてしまいますので、`—pretty` オプションをつけるのがおすすめです。

```bash
$ pug index.pug —pretty
```

pug-cliにはその他たくさんのoptionコマンドがありますので、[公式](https://github.com/pugjs/pug-cli)を参考にしてみてください。

# ② 基本文法

pugには閉じタグの概念がないので、タグに入れるテキスト等は半角スペースの後に記述します。

```bash
h1 見出し
p ここに文章が入ります
div ここはdivタグです
	button ボタンタグです
```

HTMLに出力すると以下のようになります。

```html
<h1>見出し</h1>
<p>ここに文章が入ります</p>
<div>
	ここはdivタグです
	<button>ボタンタグです</button>
</div>
```

## idとclassを付けたい場合

idとclassを付けたい場合はタグの直後に記述します。
CSSやJavaScriptと同じように、idは`#`、classは`.` で表記します。

```html
h1#title 見出し
p.text ここに文章が入ります
```

```html
<h1 id="title">見出し</h1>
<p class="text">ここに文章が入ります</p>
```

## 属性を指定したい場合

属性を指定したい場合も、直後に()で記述します。

```html
a(href="#" target="_blank") リンク
img(src="/pass/image.png" alt="画像1")
```

```html
<a href="#" target="_blank">リンク</a>
<img src="/pass/image.png" alt="画像1">
```

## 改行したい場合

pタグの中に長い文章を記述する際など、改行をしたい場合は `|` を使用します。
インデントをひとつ下げて `|` で繋ぐと改行されます。

```bash
p
 | テキスト
```

```html
<p>
	テキスト
</p>
```

## コメントアウトしたい場合

コメントアウトの方法には、

- HTMLファイルに出力されるコメント
- HTMLファイルに出力されないコメント

の2種類の記述方法があります。

```html
// HTMLファイルに出力されるコメント
//- HTMLファイルに出力されないコメント
```

ブロックコメントも可能です。

```html
//
	ブロックコメントです。
	HTMLファイルに出力されます。

//-
	ブロックコメントです。
	HTMLファイルに出力されません。
```

# ③ 応用文法(ループ文)

pugファイル内でforやeach等のループ文を記述することが可能です。

## for：特定の回数ループさせる

for文の書き方はJavaScriptとほぼ同じです。

```html
ul
	- for (let i = 0; i < 3; i++)
	li リスト #{i}
```

```html
<ul>
	<li>リスト 0</li>
	<li>リスト 1</li>
	<li>リスト 2</li>
</ul>
```

## each：配列をループさせる

pugファイル内で配列を定義し、ループで出力させます。
配列を定義する際は `-` の直後から記述します。

```html
ul
	- const list = ['リスト1', 'リスト2', 'リスト3']
	each item in list
		li #{item}
```

```html
<ul>
	<li>リスト1</li>
	<li>リスト2</li>
	<li>リスト3</li>
</ul>
```

連想配列を出力することも可能です。
連想配列を定義する際は `-`の後改行が必要になるので注意です。

```html
dl
	-
		const list = [
			{
				name: 'item1',
				text: 'あいうえお'
			},
			{
				name: 'item2',
				text: 'かきくけこ'
			},
			{
				name: 'item3',
				text: 'さしすせそ'
			}
		]
	each item in list
		dt #{[item.name](http://item.name/)}
		dd #{item.text}
```

```html
<dl>
	<dt>item1</dt>
	<dd>あいうえお</dd>
	<dt>item2</dt>
	<dd>かきくけこ</dd>
	<dt>item3</dt>
	<dd>さしすせそ</dd>
</dl>
```

# ④応用文法(mixin, include)

## include：別ファイルを呼びこむ

includeを使用して別のpugファイルを呼び込むことも可能です。
ヘッダーやフッターなど、共通で使うものを別ファイルで切り出して使用することができます。
分割したファイルはファイル名の先頭に`アンダースコア(_)`をつけてコンパイルされないようにします。

```html
// _header.pug

header ヘッダーコンテンツ
```

```html
// index.pug

include _header.pug
	main
		| メインコンテンツ
```

```html
<header>ヘッダーコンテンツ</header>
<main>メインコンテンツ</main>
```

## mixin：関数を定義する

関数を定義して、pugファイル内で実行することも可能です。
`mixin` で関数を定義し、 `+`で実行します。
if文も記述することができます。

```html
mixin listItems(items, active)
	ul
		each item in items
			if(item === active)
				li.isActive= item
			else
				li= item

+listItems(['リスト1','リスト2', 'リスト3'], 'リスト3')
```

```html
<ul>
	<li>リスト1</li>
	<li>リスト2</li>
	<li class="isActive">リスト3</li>
</ul>
```

# おわりに

以上がpugの基本的文法です。
色々便利そうですね。