Giter Site home page Giter Site logo

layouts's Introduction

Metalsmith

npm: version ci: build code coverage license: MIT Gitter chat

An extremely simple, pluggable static site generator for NodeJS.

In Metalsmith, all of the logic is handled by plugins. You simply chain them together.

Here's what the simplest blog looks like:

import { fileURLToPath } from 'node:url'
import { dirname } from 'path'
import Metalsmith from 'metalsmith'
import layouts from '@metalsmith/layouts'
import markdown from '@metalsmith/markdown'

const __dirname = dirname(fileURLToPath(import.meta.url))

Metalsmith(__dirname)
  .use(markdown())
  .use(
    layouts({
      pattern: '**/*.html'
    })
  )
  .build(function (err) {
    if (err) throw err
    console.log('Build finished!')
  })

Installation

NPM:

npm install metalsmith

Yarn:

yarn add metalsmith

Quickstart

What if you want to get fancier by hiding unfinished drafts, grouping posts in collections, and using custom permalinks? Just add plugins...

import { fileURLToPath } from 'node:url'
import { dirname } from 'node:path'
import Metalsmith from 'metalsmith'
import collections from '@metalsmith/collections'
import layouts from '@metalsmith/layouts'
import markdown from '@metalsmith/markdown'
import permalinks from '@metalsmith/permalinks'
import drafts from '@metalsmith/drafts'

const __dirname = dirname(fileURLToPath(import.meta.url))
const t1 = performance.now()
const devMode = process.env.NODE_ENV === 'development'

Metalsmith(__dirname) // parent directory of this file
  .source('./src') // source directory
  .destination('./build') // destination directory
  .clean(true) // clean destination before
  .env({
    // pass NODE_ENV & other environment variables
    DEBUG: process.env.DEBUG,
    NODE_ENV: process.env.NODE_ENV
  })
  .metadata({
    // add any variable you want & use them in layout-files
    sitename: 'My Static Site & Blog',
    siteurl: 'https://example.com/',
    description: "It's about saying »Hello« to the world.",
    generatorname: 'Metalsmith',
    generatorurl: 'https://metalsmith.io/'
  })
  .use(drafts(devMode)) // only include drafts when NODE_ENV === 'development'
  .use(
    collections({
      // group all blog posts by adding key
      posts: 'posts/*.md' // collections:'posts' to metalsmith.metadata()
    })
  ) // use `collections.posts` in layouts
  .use(
    markdown({
      // transpile all md file contents into html
      keys: ['description'], // and also file.description
      globalRefs: {
        // define links available to all markdown files
        home: 'https://example.com'
      }
    })
  )
  .use(permalinks()) // change URLs to permalink URLs
  .use(
    layouts({
      // wrap layouts around html
      pattern: '**/*.html'
    })
  )
  .build((err) => {
    // build process
    if (err) throw err // error handling is required
    console.log(`Build success in ${((performance.now() - t1) / 1000).toFixed(1)}s`)
  })

How does it work?

Metalsmith works in three simple steps:

  1. Read all the files in a source directory.
  2. Invoke a series of plugins that manipulate the files.
  3. Write the results to a destination directory!

Each plugin is invoked with the contents of the source directory, and each file can contain YAML front-matter that will be attached as metadata, so a simple file like...

---
title: A Catchy Title
date: 2024-01-01
---
An informative article.

...would be parsed into...

{
  'path/to/my-file.md': {
    title: 'A Catchy Title',
    date: new Date(2024, 1, 1),
    contents: Buffer.from('An informative article'),
    stats: fs.Stats
  }
}

...which any of the plugins can then manipulate however they want. Writing plugins is incredibly simple, just take a look at the example drafts plugin.

Of course they can get a lot more complicated too. That's what makes Metalsmith powerful; the plugins can do anything you want!

Plugins

A Metalsmith plugin is a function that is passed the file list, the metalsmith instance, and a done callback. It is often wrapped in a plugin initializer that accepts configuration options.

Check out the official plugin registry at: https://metalsmith.io/plugins.
Find all the core plugins at: https://github.com/search?q=org%3Ametalsmith+metalsmith-plugin
See the draft plugin for a simple plugin example.

API

Check out the full API reference at: https://metalsmith.io/api.

CLI

In addition to a simple Javascript API, the Metalsmith CLI can read configuration from a metalsmith.json file, so that you can build static-site generators similar to Jekyll or Hexo easily. The example blog above would be configured like this:

metalsmith.json

{
  "source": "src",
  "destination": "build",
  "clean": true,
  "metadata": {
    "sitename": "My Static Site & Blog",
    "siteurl": "https://example.com/",
    "description": "It's about saying »Hello« to the world.",
    "generatorname": "Metalsmith",
    "generatorurl": "https://metalsmith.io/"
  },
  "plugins": [
    { "@metalsmith/drafts": true },
    { "@metalsmith/collections": { "posts": "posts/*.md" } },
    { "@metalsmith/markdown": true },
    { "@metalsmith/permalinks": "posts/:title" },
    { "@metalsmith/layouts": true }
  ]
}

Then run:

metalsmith

# Metalsmith · reading configuration from: /path/to/metalsmith.json
# Metalsmith · successfully built to: /path/to/build

Options recognised by metalsmith.json are source, destination, concurrency, metadata, clean and frontmatter. Checkout the static site, Jekyll examples to see the CLI in action.

Local plugins

If you want to use a custom plugin, but feel like it's too domain-specific to be published to the world, you can include plugins as local npm modules: (simply use a relative path from your root directory)

{
  "plugins": [{ "./lib/metalsmith/plugin.js": true }]
}

The secret...

We often refer to Metalsmith as a "static site generator", but it's a lot more than that. Since everything is a plugin, the core library is just an abstraction for manipulating a directory of files.

Which means you could just as easily use it to make...

Resources

Troubleshooting

Set metalsmith.env('DEBUG', '*metalsmith*') to debug your build. This will log debug logs for all plugins using the built-in metalsmith.debug debugger. For older plugins using debug directly, run your build with export DEBUG=metalsmith-*,@metalsmith/* (Linux) or set DEBUG=metalsmith-*,@metalsmith/* for Windows.

Node Version Requirements

Future Metalsmith releases will at least support the oldest supported Node LTS versions.

Metalsmith 2.6.x supports NodeJS versions 14.18.0 and higher.
Metalsmith 2.5.x supports NodeJS versions 12 and higher.
Metalsmith 2.4.x supports NodeJS versions 8 and higher.
Metalsmith 2.3.0 and below support NodeJS versions all the way back to 0.12.

Compatibility & support policy

Metalsmith is supported on all common operating systems (Windows, Linux, Mac). Metalsmith releases adhere to semver (semantic versioning) with 2 minor gray-area exceptions for what could be considered breaking changes:

  • Major Node version support for EOL (End of Life) versions can be dropped in minor releases
  • If a change represents a major improvement that is backwards-compatible with 99% of use cases (not considering outdated plugins), they will be considered eligible for inclusion in minor version updates.

Credits

Special thanks to Ian Storm Taylor, Andrew Meyer, Dominic Barnes, Andrew Goodricke, Ismay Wolff, Kevin Van Lierde and others for their contributions!

layouts's People

Contributors

bbor avatar blakeembrey avatar doodzik avatar exortech avatar greenkeeper[bot] avatar howarddierking avatar ianstormtaylor avatar ismay avatar jfirebaugh avatar killercup avatar micahgodbolt avatar mpalpha avatar sethfalco avatar webketje avatar willeastcott avatar zakhenry avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

layouts's Issues

liquid filename bug

var basename = path.basename(name);
var extname = path.extname(name) || '.liquid';
var filename = path.join(includeDir, basename + extname);

name === "default.html" // Input
basename === "default.html"
extname === ".html"
filename === "default.html.html" // variable used to fetch the file from file system.

Does Nunjucks actually work with metalsmith-layouts?

Has anyone successfully got nunjucks working with metalsmith-layouts? I'm quite interested in using them after finding out Swig was no longer being maintained, but I am unable to specify the folder for includes or extends.

There was some discussion on #43 about this same issue, but it was closed without giving any examples.

Support multiple template directories?

In certain projects
It would be useful to pass an array of directories (or better yet blob patterns) to treat as templates.

Specifically in the case of styleguide generation.

Adding custom helpers

Is there any way to add custom helpers to handlebars?

I basically want to use the handlebars-layouts library. I cannot figure out how to register the helpers.

I tried registering them individually using the metalsmith-register-helpers plugin, but that doesn't seem to work.

Update readme

To clarify the difference with metalsmith-templates

'layout' and 'template' meta data variable

To make metalsmith-layout, a drop-in replacement for the deprecated metalsmith-templates, is it possible to use template meta data in addition to the existing layout?

It also, helps metalsmith-layout to work seamless with other plugins like 'metalsmith-pagination',…

small issue with partials and swig

Hi there. Using the metalsmith CLI, I have trouble configuring / using partials with the Swig templating engine. Must be doing something stupid. Here is a reduced test case.

metalsmith.json

"metalsmith-layouts": {
      "engine": "swig",
      "directory": "layouts",
      "partials": "includes"
    }

layouts/default.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>This is a Metalsmith test</title>
  </head>
  <body>

    {% include "test.html" %}

    {{ contents|raw }}

  </body>
</html>

src/index.html


---
layout: default.html

---
<p>Hello world</p>

includes/test.html

<p>This is a test</p>

I get the following error

Metalsmith · ENOENT, no such file or directory '/data/weblocal/metalsmith_sandbox/layouts/pouet.html'

Any idea / pointer ?

Use hound for linting

And switch to it for stylelint as well when and if that's supported. Until then just use travis. Apply these changes to the other superwolff repos as well.

Use `layout` instead of `template`

For selecting the template in the frontmatter (and on any other places where template refers to the layout), to avoid any confusion with metalsmith-templates.

Nested layouts

It would be nice to be able to do nested layouts, just like jekyll. This is probably a long-shot given layouts are not parsed by Metalsmith, but hey, why not.

# src/index.html

---
layout: default.html
title: Home page

---
<!-- layouts/default.html -->

---
layout: html5.html
body_class: 'default'

---
<div class='menu'>...</div>
<div class='content'>{{{ contents }}}</div>
<!-- layouts/html5.html -->
<!doctype html>
<html>
  <meta charset='utf-8'>
  <title>{{ title }}</title>
  <body class='{{ body_class }}'>
  {{{ contents }}}
  </body>
</html>

Metalsmith · [metalsmith-sass] Error: invalid top-level expression -> :1:1

My sass file has

@import './components/bower_components/sassarch/sass/style';

My metal script jason has

"metalsmith-sass": { "files":["*.css"], "includePaths":["app/components/bower_components/sassarch/sass"], "outputDir":"css", "watch":"*.scss", "indentedSyntax": false },
and when I run the metalsmith script I get

Metalsmith · [metalsmith-sass] Error: invalid top-level expression -> main.scss:1:1

I'm not sure what is wrong though...I am new to metalsmith and sass
Any thoughts?

Windows Missing helper: "strftime"

Am trying to use metalsmith-layouts with Handlebars, and I am getting this error:

2015-11-12_16-03-44

Was getting a different error at first, which was all red and much longer. I solved that by npm install handlebars --save and including handlebars in my index file. Any idea as to what's wrong? Also tried installing strftime and including it, but that didn't do anything (as I imagined).

Nunjucks: Specify default extends

Nunjucks template inheritance works by specifying an extends tag, like {% extends 'default.html' %} at the top of the file. What makes this tricky with metalsmith-layouts is if I specify default: 'default.html' as one of the options, it automatically surrounds the content, but I can't hook into any blocks that have been specified in the extended template. Any thoughts on how I can do this?

Nunjucks extends, file not found

Having trouble getting template inheritance to work with Nunjucks. Tried putting both templates in the layouts directory and also defining partials as "layouts" but always get "file not found" error for the template being inherited.

Consolidate.js suggets this loader option, not sure how that would work in the context of metalsmith?

Any way to render matter in the template itself?


---
layout: layout.html.hbs
title: The title
name: Devin

---
<p>{{name}}</p>

This is being output as:

<!doctype html>
<html>
<head>
  <title>The title</title>
</head>
<body>
  <p>{{name}}</p>

</body>
</html>

Support Template Inheritance

It'd be awesome if a layout file could extend another layout. For example I could have a base.html layout that has the opening <html> tag, <head> partial, and <body> tags. Then, I could have a post.html layout that has layout: base.html in it's frontmatter. Finally I could have a page in my src directory that has layout: post.html, which would get contents from post.html and base.html. This is essentially the same things as this previous feature request on the metalsmith-template repo.

Nested `src` directories not finding layouts

I have an issue where all my root-level handlebars templates are rendering perfectly, but any content files nested within directories are not linking with the appropriate layouts.

For example, consider this folder structure:

layouts/
    index.hbs
    subpage.hbs

src/
    subsection01/
        index.hbs    <--- layout:subpage.hbs  DOES NOT FIND TEMPLATE
    index.hbs        <--- layout:index.hbs    FINDS TEMPLATE

So after I run metalsmith.build(), The url /index.html renders perfectly and finds the template in layouts/index.hbs, but the url /subsection01/index.html only loads the contents of src/subsection01/index.hbs and does not find the template layouts/subpage.hbs

Is there something obvious that I am missing here? I feel like the solution is simple and staring me in the face, but I can't see it now.

If you want to see a live example, I have a github repository with a starter project that currently demonstrates the exact problem. If you install my boilerplate project and run it, as soon as you click on any of the "Subsection" links in the navigation you will see what I am talking about.

I would appreciate the help!

Access to underlying filename

I'm trying to render markdown files using a handlebars layout. I need access to the original markdown filename. But unfortunately, the filename template variable is showing the name of the layout, instead of the underlying markdown file.

Here's my config from the CLI:

          'metalsmith-layouts': {
            engine: 'handlebars',
            partials: 'partials',
            directory: 'layouts',
            pattern: 'team/*',
            default: 'layout-bio.html'
          },

And in this case, when I use {{filename}}, is equals layouts/layout-bio.html instead of something like team/braden-kowitz.md

I'm a bit stuck, so any suggestions would be greatly appreciated!
Thanks.

Partials

So I am trying to do partial views for my site, like so:

src/layouts/default.hbs
src/partials/footer.hbs

So I can use them like this:

<html>
...
    <body>

        <div class="container">{{{contents}}</div>

        {{>footer}}

    </body>
</html>

What can I do to make this work?

No layout specified for ...

Starting with v1.3.0, metalsmith-layouts now requires a layout in the front matter.

This introduces a breaking change from v1.2.1, which would warrant a major version bump.

That said, it's unclear why this is desired behavior. Shouldn't it just ignore files without a layout?

I've worked around the immediate issue by setting...

...
default: "empty.hbt"

and in empty.hbt I just do...

{{{ contents }}}

But this feels like an unnecessary hack.

Update to consolidate 0.14

v0.14 includes support for passing Lodash options through to the Lodash renderer. That would be super helpful for me.

Nothing in the list of commits between v0.13.1 and v14 sounds (to me, at least) like it would break for metalsmith-layouts.

Layouts not rendered at all!

Here is my code:

src/index.md

---
layout: layout.hbs
title: Test Article

---

### Test Article
Some content will go here...

layouts/layout.hbs

!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>{{ title }}</title>
    </head>
    <body>
        {{> header }}
        {{{ contents }}}
        <p>Default Layout</p>
    </body>
</html>

partials/header.hbs

<header>Header Content</header>

build.js

var Metalsmith = require('metalsmith'),
    layouts  = require('metalsmith-layouts'),
    markdown   = require('metalsmith-markdown');

Metalsmith(__dirname)
    .use(markdown())
    .use(layouts({
        engine: 'handlebars',
        pattern: '*.hbs',
        partials: {
            'header': 'partials/header'
        }
    }))
    .destination('./build')
    .build(function(err, files){
        if (err) {
            console.log(err);
        }
    });

When I run node build.js I get the following:

build/index.html

<h3 id="test-article">Test Article</h3>
<p>Some content will go here...</p>

Anything I might be missing?

Not being able to render jade blocks

Hi guys,

I'm using jade as the template engine and blocks are not rendering from the layout file.

I have the following file structure:

src/post.md - the file that is going to be built, which contains:

    ---
    layout: post.jade
    title: The title goes here
    ---
    # Hello World!

layouts/homepage.jade - this contains various main, footer and head blocks
layouts/post.jade - this is the main post template that contains
layouts/head.jade - the head block

extends homepage

block main
  #content!= contents

and partials/footer.jade with:

extends homepage

block footer
  #footer
    p footer content here

My build.js file looks like this:

var Metalsmith = require('metalsmith'),
  markdown = require('metalsmith-markdown'),
  layouts = require('metalsmith-layouts'),
  inPlace = require('metalsmith-in-place');

Metalsmith(__dirname)
  .use(markdown())
  .use(layouts({
    engine: 'jade',
    directory: 'layouts',
    partials: 'partials'
  }))
  .build(function(err) {
    if (err) throw err;
  });

If, on my post.md file I set the layout to homepage.jade NONE of the blocks are rendering.
While using post.jade as layout ONLY the main block is rendering inside of the homepage layout (extends seem to work).
If I use block main in any other jade file, that will not render either.

Could you please give me some feedback on this issue. It was previously working with metalsmith-templates ...

Cheers!

Passing `filename` to jade

Using includes and extends in jade is not supported because it needs the filename option passed onto jade.compile(). is there a sane solution to this -- maybe bypass consolidate for jade?

/ layouts/default.jade
html
  include ../partials/menu.jade
  != contents
Error: the "filename" option is required to use "include" with "relative" paths

I'd be happy to prepare a PR if you'd like.

Have layout for a layout

Is there a way to define a layout for a layout?
For example I have a "layouts/post.html":

---
layout: default

---
<div class="post">
  <h1 class="post-title">{{ title }}</h1>
  <span class="post-date">{{ date|date('d.m.Y') }}</span>
  {{ contents|safe }}
</div>

and I have layouts/default.html:

<!DOCTYPE html>
<html lang="en-us">
<body>
<div class="container content">
        {{ contents|safe }}
</div>
</body>

and src/some-post.md:

---
title: First Post
date: 2012-08-20
layout: post.html

---

Some testing here

?

(I am trying to adopt jekyll theme)

generated files have no layout

While 1.1.0 works well for me, updating to version 1.2.0 does not work : all html generated file contains only the content file (from markdown) but not layout at all.

Could you lead me to some point where I can debug and find where it comes from ?

First thing, I notice that, in debug mode, version 1.1.0 the build output the following :

contents: <Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 63 6c 61 73 73 3d 22 77 66 2d 70 74 73 61 6e 73 2d 6e 34 2d 61 63 74 69 76 65 20 77 66 ...>,

while in version 1.2.0, I get the following output :

contents: '<h1 id="first-header"><a class="heading-anchor" href="#first-header"><span></span></a>[...]

Update readme

  • Include metalsmith-templates deprecation
  • Document passing of unrecognised parameters to consolidate

Should templating syntax in contents be rendered?

Don't want to duplicate metalsmith-in-places functionality. But maybe this defines the goals for both plugins pretty well:

metalsmith-in-place: A generic template plugin that simply renders the contents in each source file, passing [the rendered contents] to the templating engine WITH the yaml matter in the top of the file.

metalsmith-layouts: A 'layout' plugin that has support for the [layout] template yaml which will pass the rendered content from the template onto the main layout. Again, this would conflict if you was using something like swig or nunjucks so that would have to be noted when using the plugin. It's really just a plugin for templating engines that don't support template inheritance.

from: segment-boneyard/metalsmith-templates#35

Metalsmith-layouts could be easily used for blogs rendering .md files into a main template, etc. Whereas metalsmith-in-place would support more diy, complex templating use-cases.

So basically the support for a layout yaml property is what separates them. Which doesn't mean templating syntax in source files shouldn't be processed by metalsmith-layouts, I'd say. Or are there reasons not to do this? You could also just drop a metalsmith-in-place instance in front of it of course..

Non-YAML front matter?

Is it possible to use another format as front matter, such as JSON or TOML? One of the things that irritates me about YAML is that tabs are not permitted for indentation. Considering many developers use tabs for their code (including layouts and partials), having to switch between the two styles is not only a bit of a slowdown (editor configuration, brain power, ...) but also violates the widely accepted rule of not mixing tabs and spaces for indentationtation.
(I am aware that YAML is apparently a JSON superset, but AFAIK tabs are still banned when using JSON in YAML)

document partials

It seems partials support is now available! Would be nice to know how they're meant to work, along with some examples. Eg,

  • Will they work for indented languages like Jade?
  • Will I be able to access page metadata from partials?
  • Can I pass local variables to partials ({{> profile name="John Smith"}})?
  • etc...

wrong layouts directory with nunjucs

I have a standard

{{ extends "base.html" }}

entry on my nunjucs templates.

But when I run the plugin it will not read the base.html from the layouts/ directory but from the root of my project:

/
  base.html <-- used
  /layouts
    base.html <-- ignored

using 2 layout engines?

is using handlebars and jade at the same time a supported use case?

ms = new Metalsmith(dir)
  .use(require('metalsmith-layouts')({ engine: 'handlebars' }))
  .use(require('metalsmith-layouts')({ engine: 'jade' }))
---
# file1.html
layout: handlebars.html

---
---
# file2.html
layout: nested.jade

---

Add example to the readme

I think this really needs an example of using metalsmith-layouts and metalsmith-templates to make sense.

Error while using with gulpsmith

I was using metalsmith-templates so far. Since it's deprecated, today I decided to use metalsmith-layouts. I use gulpsmith so I can use metalsmith with gulp. But, I'm getting this error when I started using metalsmith-layouts. Any ideas why it is happening?

/Users/saneef/workspace/saneef/saneef.com/node_modules/gulpsmith/node_modules/vinyl/index.js:110
      throw new Error("File.contents can only be a Buffer, a Stream, or null."
            ^
Error: File.contents can only be a Buffer, a Stream, or null.
    at File.Object.defineProperty.set (/Users/saneef/workspace/saneef/saneef.com/node_modules/gulpsmith/node_modules/vinyl/index.js:110:13)
    at new File (/Users/saneef/workspace/saneef/saneef.com/node_modules/gulpsmith/node_modules/vinyl/index.js:25:17)
    at Function.gulpsmith.to_vinyl (/Users/saneef/workspace/saneef/saneef.com/node_modules/gulpsmith/gulpsmith.js:211:18)
    at /Users/saneef/workspace/saneef/saneef.com/node_modules/gulpsmith/gulpsmith.js:124:43
    at Metalsmith.<anonymous> (/Users/saneef/workspace/saneef/saneef.com/node_modules/gulpsmith/gulpsmith.js:127:17)
    at Immediate._onImmediate (/Users/saneef/workspace/saneef/saneef.com/node_modules/metalsmith/node_modules/unyield/node_modules/co/index.js:52:14)
    at processImmediate [as _immediateCallback] (timers.js:358:17)

Passing variables to templates

Using your plugin I've replaced the metalsmith-jade one but now I don't know how to pass variables to my .jade templates.
The code I wrote is:

.use(
    layouts({
      engine: 'jade',
      directory: './_layouts',
      partials: './_partials',
      pretty: true,
      locals: {
        devel: process.env.MODE,
        test: 'pippo'
      }
    })
  )

but in template I don't know how to print them... In my template files locals seems to be passed so I tried

pre=JSON.stringify(locals)

or

pre=locals.toString()

but no success. Is there any other options or something related to metalsmith-in-place that I don't know?

Thank you.

Update readme

  • document purpose of metalsmith-layouts, as opposed to metalsmith-in-place
  • document use of partials (not all languages implement it)
  • document use of extends, includes (relative to.., filename requirement)
  • clarify that the default option will apply layouts to everything
  • document use with nunjucks #62

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.