node package manager
Love JavaScript? Your insights can make it even better. Take the 2017 JavaScript Ecosystem Survey »



Convert a folder of Markdown files into data ready for a pagemaker book


$ npm install bookmaker


Each markdown file represents a page of the book and can have front-matter. The values can be used in the book template to show images and play sounds.

An example of a single page .md:

title: Page 2
image: images/balloons.png
template: dinosaur
This is some markdown
It will be converted to HTML

Take a folder of these with some images and sounds and you can use the following code:

var BookMaker = require('bookmaker')
// the base folder for the book content 
var book = BookMaker(__dirname + '/test/book')
// a glob pattern for what .json files to merge into the top level book config 
book.loadConfig('*.json', function(err, config){
    // the config is an object containing a merge of the *.json files 
// a glob pattern for what markdown files to load for pages 
book.loadPages('*.md', function(err, pages){
    // pages is an array of objects each representing a page 
        // page has .body .html and .attributes 
// a combination of getConfig and getPages 
book.load('*.json', '*.md', function(err, book){
    // book has a 'pages' property 
    // we can write the .json to the dest folder 
// a glob pattern for the files to copy 
book.copyFiles('*.{mp3,ogg}', targetFolder, function(err){
    // the source files have been copied to the target dir 
// a glob pattern for the images to resize 
book.resizeImages('*.{png,jpg,gif}', targetFolder, '600x400', function(err){
    // the source images have been resized and copied to the target dir 

A simplied version of the above:

var BookMaker = require('bookmaker')
// the base folder for the book content 
var book = BookMaker(__dirname + '/test/book')
book.write(__dirname + '/output', {
}, function(){
    // the book has been written to __dirname + '/output' 


var book = BookMaker(src)

Create a new book object passing the folder root for where the markdown pages and other files live

book.loadConfig(glob, callback(err, config){})

Load an object that is the result of merging the files found in the passed file glob.

This object is the top level of the book - the 'pages' property is populated by the markdown files.

Normally a single json file will be used but you can use a glob to merge multiple configs for one book:

var book = BookMaker(src)
book.getConfig('{main,theme}.json', function(err, config){
    // config is main.json and theme.json merged 

book.loadPages(glob, callback(err, pages){})

Process each markdown file found in the glob and return an array of the JSON objects.

book.load(configGlob, pageGlob, callback(err, book){})

A combo of loadConfig and loadPages that returns a single object that is the config with a 'pages' property

book.copyFiles(glob, targetFolder, done(error){})

Copy a glob of files from the book folder to the targetFolder

book.resizeImages(glob, targetFolder, size, done(error){})

Copy and resize the images in the glob. Size can be a string: '100x100' or an object with 'width' and 'height' properties.


You can also install bookmaker globally and use it as a command line script

$ npm install bookmaker -g
$ bookmaker --help
usage: bookmaker [options] sourcefolder destfolder
  --config, -c - a glob for the config files
  --pages, -p - a glob for the .md pages
  --files, -f - a glob for files to copy
  --images, -i - a glob for images to resize
  --imagesize, -s - the size for resized images
$ bookmaker --config "*.json" --pages "*.md" --images "*.jpg" --imagesize 600x400 ./input ./output