A Metalsmith plugin to load files from paths added to frontmatter.
You could then use metalsmith-frontmatter-renderer to render the loaded data into html.
$ npm install metalsmith-frontmatter-file-loader
You can pass some basic options to customize the behaviour:
{
"key": "files",
"out": "files",
"suppressNoFilesError": false,
"allowMissingFiles": false
}keyis the key of the object to iterate over in the files frontmatter. Default"files".outis the key of the object to update the values upon. Default the value ofkey.suppressNoFilesErroris a boolean to determine the behaviour when there are no files to load. Set totrueto prevent an error being thrown if there are no files to load. Defaultfalse.allowMissingFilesis a boolean to determine the behaviour when a file fails to load. Set totrueto prevent an error being thrown if a file is missing or cannot be read as a utf-8 string. If a file fails to load then it will replace the value with an empty string. Defaultfalse.
Install via npm and then add the metalsmith-frontmatter-file-loader key to your metalsmith.json plugin:
{
"plugins": {
"metalsmith-frontmatter-file-loader": true
}
}or with configuration options:
{
"plugins": {
"metalsmith-frontmatter-file-loader": {
"key": "blocks",
"suppressNoFilesError": true,
"allowMissingFiles": true
}
}
}Pass options to the plugin and pass it to Metalsmith with the use method:
var fmfl = require('metalsmith-frontmatter-file-loader');
metalsmith.use(fmfl({
key: "blocks",
suppressNoFilesError: true,
allowMissingFiles: true
}));src/index.html
———
files:
foo: './files/foo.txt'
bar: './files/bar.md'
———
<h1>This is the <code>contents</code> of the file.</h1>By default this would load the contents of ./files/foo.txt (relative to the metalsmith root, not the file containing the frontmatter) and replace the path with the file contents. Then it would do the same for ./files/bar.md. It doesn't do any conversion of the data but you can use metalsmith-frontmatter-renderer if you desire this behaviour.
e.g this is the equivalent of having written out the file contents into the frontmatter as so:
———
files:
foo: 'This is the text content of ./files/foo.txt!'
bar: 'This is the *markdown* content of `./files/bar.md` :)'
———
<h1>This is the <code>contents</code> of the file.</h1>If you use a property other than files then you can pass the name as a configuration option. See the config documentation above.
MIT