Foundation

Panini

函式庫

平面檔案編譯器,為我們的原型範本提供動力。輕鬆建立具有相容版面和可重複使用部分的網頁。

如果您曾經建立過靜態網站,或許您有五個網頁都共用同一個頁首和頁尾。您建立第一個網頁,然後複製並貼上共用元素到下一個網頁。但現在,如果您需要變更頁首,則必須在多個檔案中進行變更。您也可以在活動中的電子郵件中執行此操作!

Panini 是一個平面檔案編譯器,它使用範本、網頁和部分的概念,並由 Handlebars 範本語言提供動力,以簡化建立靜態原型的流程。

我們的 原型範本 使用 Panini,以及其他處理 Sass 和影像的工具,讓建立最佳化的範本變得容易。它已經設定好使用以下所有功能,但如果您想了解如何設定函式庫的詳細資訊,請前往 Panini GitHub 頁面


基礎:範本和網頁

範本是設計中每個網頁共用的共用版面。可以有多個範本,但通常您只需要一個,而且一個網頁只能使用一個範本。在原型範本中,預設版面位於 src/layouts/default.html 下。

以下是一個基本範本的範例

<html>
  <head>
    <title>Definitely an Email!</title>
  </head>
  <body>
    <header class="header"><!-- ... --></header>
    {{> body}}
    <footer class="footer"><!-- ... --></footer>
  </body>
</html>

HTML 中間有一點 Handlebars 程式碼:{{> body}}。這是當 Panini 執行時,您編寫的網頁會插入的地方,最後會提供一系列完整的 HTML 檔案。

網頁構成版面的主體。這些檔案只會有設計的中間部分,因為版面已經涵蓋頂部和底部。原型範本包含一個空白網頁讓您開始,位於 src/pages/index.html 下。

一個基本網頁可能如下所示

<h1>Page Title</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Praesentium ducimus eligendi, reiciendis corporis quam facere quaerat qui, aspernatur molestiae velit, vero ea quisquam laborum corrupti repudiandae totam, at aliquam esse.</p>

請注意,沒有 <html><body> 標籤,也沒有頁首或頁尾。當 Panini 組合您的網頁時,此程式碼會插入到 {{> body}} 宣告中。

在原型模板中,這些完成的文件會編譯成一個獨立資料夾,稱為 dist(「distribution」的縮寫),其中也包含處理過的 CSS、JavaScript 和圖片。這個資料夾可以輕鬆上傳到任何 ESP(電子郵件服務供應商)。


部分

部分是 Handlebars 的一個功能,允許你在頁面或版面中的任何地方插入 HTML。當你需要在頁面中重複某些程式碼區塊,或防止個別檔案因 HTML 而過於雜亂時,它們非常有用。

以下是將其關鍵部分分為部分的版面檔案範例

<html>
  <head>
    <title>Definitely STILL an Email!</title>
  </head>
  <body>
    {{> header}}
    {{> body}}
    {{> footer}}
  </body>
</html>

{{> }} 語法告訴 Handlebars 尋找具有該名稱的 HTML 檔案,並將其插入該位置。在此範例中,我們有稱為 header.htmlnavigation.htmlfooter.html 的檔案。在原型模板中,這些檔案都存在於 src/partials 中。


頁面變數

頁面有幾個內建變數,可以在頁面模板本身中使用,或與頁面串用的版面或部分中使用。

page

列印目前頁面的名稱,不含其原始檔案副檔名。在以下範例中,如果頁面是 index.html{{page}} 將會變成 index

<p>You are here: {{page}}</p>

root

在檔案路徑前使用 {{root}},以確保它在目前頁面所在的資料夾中都能正常運作。

例如,如果目前頁面位於網站的根目錄或子資料夾中,則外部 CSS 檔案的路徑將需要有所不同。

以下是使用 <link> 標籤的方式

<link rel="stylesheet" href="{{root}}assets/css/app.css">

如果頁面是 index.html,路徑將如下所示

<link rel="stylesheet" href="assets/css/app.css">

如果頁面是 folder/page.html,路徑將如下所示

<link rel="stylesheet" href="../assets/css/app.css">

../ 僅新增在子資料夾中的頁面,因此 CSS 仍可以正確載入。


輔助函式

輔助函式是處理頁面內容的特殊函式。除了 Handlebars 的內建輔助函式 之外,Panini 還包含一些自訂輔助函式,而且你可以新增自己的輔助函式。

ifpage

僅在特定頁面上顯示輔助函式內的 HTML。在以下範例中,輔助函式內的 HTML 將只會顯示在 index.html 頁面上。

{{#ifpage 'index'}}
  <p>This is definitely the Index page.</p>
{{/ifpage}}

你也可以檢查多個頁面。如果清單中的任何名稱與目前頁面相符,HTML 將會顯示。

{{#ifpage 'index' 'about'}}
  <p>This is definitely either the Index or About page.</p>
{{/ifpage}}

unlesspage

#ifpage 的相反,#unlesspage 僅會在目前頁面不在參數中時顯示其內的 HTML。

{{#unlesspage 'index'}}
  <p>This is definitely <em>not</em> the Index page.</p>
{{/unlesspage}}

repeat

重複其內部的內容 n 次。在原型中使用此功能可以輕鬆列印大量重複的 HTML。

<ul>
  {{#repeat 5}}
  <li>Five hundred ninety-nine US dollars</li>
  {{/repeat}}
</ul>

markdown

將 Markdown 轉換為 HTML。

{{#markdown}}
# Heading 1
Lorem ipsum [dolor sit amet](https://html5zombo.com), consectetur adipisicing elit. Nam dolor, perferendis. Mollitia aut dolorum, est amet libero eos ad facere pariatur, ullam dolorem similique fugit, debitis impedit, eligendi officiis dolores.
{{/markdown}}

自訂輔助函式

如果您找不到合適的輔助函式,您可以自行撰寫。將 JavaScript 檔案新增至「src/helpers」,重新啟動 npm,然後在範本中呼叫它。

// Example file src/helpers/bold.js
module.exports = function(options) {
  // options.fn(this) = Handlebars content between {{#bold}} HERE {{/bold}}
  var bolder = '<strong>' + options.fn(this) + '</strong>';
  return bolder;
}

然後在您的專案中呼叫自訂的 {{#bold}} 輔助函式

{{#bold}}ideas{{/bold}}

自訂資料

可以將自訂資料新增至您的網頁。然後,您可以透過 Handlebars 將這些資料插入 HTML 中。有兩種方式可以將資料新增至專案。

若要僅將變數新增至特定網頁,請將其新增至網頁 HTML 的最上方,作為 Front Matter 區塊。假設以下內容位於 src/pages/index.html 內。

---
title: Page Title
description: Lorem ipsum.
---

<!-- The rest of your HTML is down here. -->

現在,您可以將這些變數的值插入 index.html 網頁default.html 版面。若要插入變數,請將變數名稱用雙大括號括起來,如下所示

<h1>{{ title }}</h1>

也可以透過建立外部 JSON 或 YML 檔案,並將其新增至專案中的 src/data 資料夾,來全域新增變數。我們來建立一個名為 breakfast.yml 的檔案

- eggs
- bacon
- toast

Panini 會將此 YML 檔案的內容載入為名為 {{ breakfast }} 的變數。由於它是一個陣列,因此我們可以使用 Handlebars 的 {{#each}} 輔助函式來迴圈瀏覽它

<ul class="breakfast-items">
  {{#each breakfast}}
    <li>{{ this }}</li>
  {{/each}}
</ul>

這段程式碼會列印三個 <li>,每個檔案中的項目一個。

教學課程

保持 D.R.Y. 的 Panini Panini 內建許多 Handlebars 輔助函式,例如重複輔助函式或 Markdown 解析器,但在本課程中,我們將了解如何為 HTML 電子郵件建立自訂的月份/年份輔助函式。