LoginSignup
1
1

More than 5 years have passed since last update.

Angular2からのpug2を利用するための調査メモ

Posted at

pug2とは何か?

Angular2を勉強するための基礎知識として、pug2を勉強したのでそれのメモ
htmlファイルを生成するための形式。最初は jade と言っていたが、商標?の関係で名称がpugと成ったようだ。

環境 OSX 10.11.6,Angular2,pug

  • node: 6.10.3
  • @angular/cli: 1.0.3
  • pug version: 2.0.0-rc.1
  • pug-cli version: 1.0.0-alpha6

記述ルール

h1 タイトル

上記のpugを変換すると以下のhtmlになる。

<h1>タイトル</h1>

先駆者が情報をまとめているので、参考に。

重要そうなところメインに調査

idとclassの書き方

idは「#」、classは「.」で区切れば属性として展開される。また、タグを省略すると「div」タグとなる。

section#top
  .content.inner
<section id="top">
    <div class="content inner"></div>
</section>

改行せずに要素の入れ子をつくる

pugは、「: + 半角スペース」で横並びに書いても、要素の入れ子を作れる。

ul
  li: a(href="#") Top
  li: a(href="#") About
  li: a(href="#"): span Links
<ul>
    <li><a href="#">Top</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#"><span>Contacts</span></a></li>
</ui>

コメント

pugのコメントの書き方は2種類あり、書き出したHTML内にコメントを残す方法と残さない方法。

// HTMLで書き出されるコメント

//- HTMLで書き出されないコメント

include機能

記述の一部をパーツ化し、includeで必要な箇所に読み込むことが出来る。
拡張子「.pug」を省略すると「.pug」付きのファイル名で読み込む。[.jade]では読み込んでくれないようだ。

変数の利用

「- var 変数名 = 変数の中身」で定義できる。

  • 変数の展開は、include展開を行った後評価されるようで、以下のような使い方も出来た。
index.pug
- var title = "サンプルソース";
doctype html
html(lang="ja")
  include header.pug
  body
     h1 title
header.pug
head
  meta(charset="utf-8")
  style(src="css/style.css")
  title #{title}
index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <style src="css/style.css"></style>
    <title>サンプルソース</title>
  </head>
  <body>
    <h1>title</h1>
  </body>
</html>

forループ文

section#top
  .content.top
  - for (var i = 0; i < 3; i++) {
    .block
      h2(class="#{i}") 見出し
      p テキストテキスト#{i}
      a(href="#") ボタン
  - }
<section id="top">
  <div class="content top"></div>
  <div class="block">
    <h2 class="#{i}">見出し</h2>
    <p>テキストテキスト0</p><a href="#">ボタン</a>
  </div>
  <div class="block">
    <h2 class="#{i}">見出し</h2>
    <p>テキストテキスト1</p><a href="#">ボタン</a>
  </div>
  <div class="block">
    <h2 class="#{i}">見出し</h2>
    <p>テキストテキスト2</p><a href="#">ボタン</a>
  </div>
</section>

参考にしたページでは、classの変数は展開されていたが、やってみると展開されなかった。
pug-cliのバージョンにより動きが変わるのか?

jadeがpugになって変わった所のメモに記載があった。仕様が変わったようだ。
行先頭の - なしでIteration命令(each,while)が使えるようだ。ただ、forがeachの別名(機能はeachと同じ)になったのは、少し不便。
一定回数のループは、whileを利用するか、下記のサンプルのようにArrayのキー不自然に利用するしかなくなる。

section#top
  .content.top
  each idx in [ ...Array(3).keys() ]
    .block
      h2(class='test'+idx) 見出し
      p テキストテキスト #{idx}
      a(href="#") ボタン
<section id="top">
  <div class="content top"></div>
  <div class="block">
    <h2 class="test0">見出し</h2>
    <p>テキストテキスト 0</p><a href="#">ボタン</a>
  </div>
  <div class="block">
    <h2 class="test1">見出し</h2>
    <p>テキストテキスト 1</p><a href="#">ボタン</a>
  </div>
  <div class="block">
    <h2 class="test2">見出し</h2>
    <p>テキストテキスト 2</p><a href="#">ボタン</a>
  </div>
</section>

一応、期待した動きになったが、変数(idx)へのアクセスルールがよく理解できない。idx でアクセスしたり、#{idx}でアクセスしたり。

eachループ文

ul
  each val in ["Top", "About", "Works", "Contact"]
    li: a(href="#")= val
<ul>
  <li><a href="#">Top</a></li>
  <li><a href="#">About</a></li>
  <li><a href="#">Works</a></li>
  <li><a href="#">Contact</a></li>

mixin機能

mixin 関数のような機能を実現できる。

mixin title-block(title, date)
  h1= title
  p= date || new Date

mixin title-block("Hello, World!", "Tue Jan 14 2014 00:00:00 GMT+0900 (JST)")
mixin title-block("Hello, World!")

こ記述方法では、以下のエラーとなる。

Error: d.pug:5:1
    3|   p= date || new Date
    4| 
  > 5| mixin title-block("Hello, World!", "Tue Jan 14 2014 00:00:00 GMT+0900 (JST)")
-------^
    6| mixin title-block("Hello, World!")
    7| 

以下のように + での指定のみになったようだ。jadeがpugになって変わった所のメモでも記載があるが、jadeからpugに変わったときの影響のようだ。

mixin title-block(title, date)
  h1= title
  p= date || new Date

+title-block("Hello, World!", "Tue Jan 14 2014 00:00:00 GMT+0900 (JST)")
+title-block("Hello, World!")
<h1>Hello, World!</h1>
<p>Tue Jan 14 2014 00:00:00 GMT+0900 (JST)</p>
<h1>Hello, World!</h1>
<p>Sun May 14 2017 10:44:35 GMT+0900 (JST)</p>

mixin機能とinclude機能を組み合わせ

include header2

doctype html
html(lang="ja")
  +header-block("タイトル")
  body
     h1 title
header2.pug
mixin header-block(ti)
  head
    meta(charset="utf-8")
    style(src="css/style.css")
    title ti
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8"/>
    <style src="css/style.css"></style>
    <title>ti</title>
  </head>
  <body>
    <h1>title</h1>
  </body>
</html>

参考

jadeがpugになって変わった所のメモ
pug Getting Started
Migrating to Pug 2
Iteration to Pug 2

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1