diff options
author | Aaron O'Mullan <aaron.omullan@friendco.de> | 2014-10-15 21:20:10 +0200 |
---|---|---|
committer | Aaron O'Mullan <aaron.omullan@friendco.de> | 2014-10-15 21:20:10 +0200 |
commit | 52e83618467a238f6b20f5fb77f6f6a2e1450c8c (patch) | |
tree | 96b43d8396fedea81409677f1e10698a0b36265c /lib/parse/include.js | |
parent | 49e3bbc3d6e9e128df721494e9a10eaf15b7ddc8 (diff) | |
download | gitbook-52e83618467a238f6b20f5fb77f6f6a2e1450c8c.zip gitbook-52e83618467a238f6b20f5fb77f6f6a2e1450c8c.tar.gz gitbook-52e83618467a238f6b20f5fb77f6f6a2e1450c8c.tar.bz2 |
Add include support, with variables and the whole shebang
Fixes #462
Diffstat (limited to 'lib/parse/include.js')
-rw-r--r-- | lib/parse/include.js | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/parse/include.js b/lib/parse/include.js new file mode 100644 index 0000000..5fba2be --- /dev/null +++ b/lib/parse/include.js @@ -0,0 +1,48 @@ +var _ = require('lodash'); +var fs = require('graceful-fs'); +var path = require('path'); + + +// Include helper +function importInclude(name, paths) { + return paths + .map(function(folder) { + // Try including snippet from FS + try { + var fname = path.join(folder, name); + // Trim trailing newlines/space of imported snippets + return fs.readFileSync(fname, 'utf8').trimRight(); + } catch(err) {} + }) + .filter(Boolean)[0]; +} + +function includer(ctx, folders) { + return function(key) { + key = key.trim(); + return ctx[key] || importInclude(key, folders); + }; +} + +module.exports = function(markdown, folder, ctx) { + // List of folders to search for includes + var folders = []; + + // Handle folder arg (string or array) + if(_.isString(folder)) { + folders = [folder]; + } else if(_.isArray(folder)) { + folders = folder; + } + + // variable context + ctx = ctx || {}; + + // Memoized include function (to cache lookups) + var _include = _.memoize(includer(ctx, folders)); + + return markdown.replace(/{{([\s\S]+?)}}/g, function(match, key) { + // If fails leave content as is + return _include(key) || match; + }); +}; |