Panini

一个为我们的原型模板提供支持的平面文件编译器。 使用它可以轻松创建具有一致布局和可重复使用部分的页面。

如果您曾经创建过静态网站,则可能会有五个页面共享相同的页眉和页脚。 您创建了第一页,然后将通用元素复制并粘贴到下一页。 但是现在,如果您需要更改页眉,则必须在多个文件中进行更改。

Panini 是一个平面文件编译器,它使用模板、页面和部分的概念(由 Handlebars 模板语言提供支持)来简化创建静态原型的过程。

我们的 原型设计模板 使用 Panini 以及许多其他用于处理 Sass、JavaScript 和图像的工具,使创建静态原型变得容易。 它已经被配置为利用以下所有功能,但如果您想了解如何配置库的详细信息,请访问 Panini GitHub 页面


基础知识:模板和页面

**模板**是设计中每个页面共享的通用布局。 可以有多个模板,但通常您只需要一个,并且一个页面只能使用一个模板。 在原型设计模板中,默认布局位于 src/layouts/default.html 下。

以下是基本模板的样子

<html>
  <head>
    <title>Definitely a Website!</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 和图像。 此文件夹可以轻松上传到任何 Web 服务器或 Notable 的托管原型服务。


部分

部分是 Handlebars 的一项功能,允许您在页面或布局中的任何位置注入 HTML。 当您需要在整个页面中重复某些代码块,或者防止单个文件因 HTML 过多而变得混乱时,它们非常有用。

下面是一个布局文件的示例,它将其关键部分划分为多个部分

<html>
  <head>
    <title>Definitely STILL a Website!</title>
  </head>
  <body>
    {{> header}}
    {{> navigation}}
    {{> body}}
    {{> footer}}
  </body>
</html>

{{> }} 语法告诉 Handlebars 查找具有该名称的 HTML 文件,并将其注入到该位置。 在此示例中,我们有名为 header.htmlnavigation.htmlfooter.html 的文件。 在原型设计模板中,这些文件都存在于 src/partials 中。


页面变量

页面有一些内置变量,可以在页面模板本身内部或与页面一起使用的布局或部分中使用。

页面

打印当前页面的名称,不带其原始文件扩展名。 在下面的示例中,如果页面是 index.html,则 {{page}} 将变为 index

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

根目录

在文件路径之前使用 {{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 还包含一些自定义助手,您也可以添加自己的助手。

如果相等

如果两个值相等,则显示助手内的 HTML。

{{#ifequal foo bar}}
  <p>foo and bar are equal</p>
{{else}}
  <p>foo and bar are not equal</p>  
{{/ifequal}}

如果页面

仅在特定页面上显示助手内的 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}}

除非页面

#ifpage 相反,#unlesspage 仅在当前页面*不在*参数中时才显示其中的 HTML。

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

重复

将其内部的内容重复 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://example.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”,将 helpers: 'src/helpers' 添加到 gulpfile.babel.js 中的 Panini 进程,重新启动 npm,然后在您的模板中调用它。

// Example file src/helpers/bold.js
module.exports = function(options) {
  // options.fn(this) = Handelbars content between {{#bold}} HERE {{/bold}}
  var bolder = '<strong>' + options.fn(this) + '</strong>';
  return bolder;
}
// Example  gulpfile.babel.js
function pages() {
  return gulp.src('src/pages/**/*.html')
    .pipe(panini({
      root: 'src/pages',
      layouts: 'src/layouts',
      partials: 'src/partials',
      helpers: 'src/helpers'
    }))
    .pipe(inky())
    .pipe(gulp.dest('dist'));
}

然后在您的项目中调用您的自定义 {{#bold}} 助手

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

自定义数据

可以将自定义数据添加到您的页面。 然后可以通过 Handlebars 将此数据插入到您的 HTML 中。 有两种方法可以将数据添加到项目中。

要仅将变量添加到特定页面,请将其作为 Front Matter 块添加到页面 HTML 的顶部。 假设以下内容位于 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>,文件中的每个项目对应一个。