Add conrefs loader for templating

This commit is contained in:
Samy Pessé
2016-04-25 14:29:51 +02:00
parent 14ce495e9e
commit ac2ad8d8b5
11 changed files with 194 additions and 12 deletions
+6 -2
View File
@@ -1,7 +1,7 @@
var Immutable = require('immutable');
var Templating = require('../templating');
var TemplateEngine = require('../models/templateEngine');
var ConrefsLoader = require('./loaders/conrefs');
var defaultBlocks = require('../constants/defaultBlocks');
var defaultFilters = require('../constants/defaultFilters');
@@ -15,6 +15,9 @@ var defaultFilters = require('../constants/defaultFilters');
*/
function createTemplateEngine(output) {
var plugins = output.getPlugins();
var book = output.getBook();
var rootFolder = book.getRoot();
var logger = book.getLogger();
var filters = plugins
.reduce(function(result, plugin) {
@@ -31,7 +34,8 @@ function createTemplateEngine(output) {
blocks = defaultBlocks.concat(blocks);
filters = defaultFilters.merge(filters);
var loader = new ConrefsLoader();
// Create loader
var loader = new Templating.ConrefsLoader(rootFolder, logger);
return new TemplateEngine({
filters: filters,
+1 -1
View File
@@ -1,6 +1,6 @@
module.exports = {
name: 'json',
Options: require('./options'),
onPage: require('./onPage')
};
-8
View File
@@ -1,8 +0,0 @@
var nunjucks = require('nunjucks');
var Loader = nunjucks.Loader.extend({
async: true,
});
module.exports = Loader;
@@ -0,0 +1,15 @@
var TemplateEngine = require('../../models/templateEngine');
/**
Create templating engine to render themes
@param {Output}
@return {TemplateEngine}
*/
function createTemplateEngine(output) {
return new TemplateEngine({
});
}
module.exports = createTemplateEngine;
+6
View File
@@ -0,0 +1,6 @@
module.exports = {
name: 'json',
Options: require('./options'),
onPage: require('./onPage')
};
+23
View File
@@ -0,0 +1,23 @@
var path = require('path');
var fs = require('../../utils/fs');
/**
Copy an asset to the outptu folder
@param {Output} output
@param {Page} page
*/
function onAsset(output, asset) {
var book = output.getBook();
var options = output.getOptions();
var rootFolder = book.getRoot();
var outputFolder = options.get('root');
var filePath = path.resolve(rootFolder, asset);
var outputPath = path.resolve(outputFolder, asset);
return fs.copy(filePath, outputPath);
}
module.exports = onAsset;
+32
View File
@@ -0,0 +1,32 @@
var Templating = require('../../templating');
var JSONUtils = require('../../json');
var Modifiers = require('../modifiers');
var Writer = require('../writer');
var getModifiers = require('../getModifiers');
var createTemplateEngine = require('./createTemplateEngine');
/**
Write a page as a json file
@param {Output} output
@param {Page} page
*/
function onPage(output, page) {
var engine = createTemplateEngine(output);
return Modifiers.modifyHTML(page, getModifiers(output, page))
.then(function(resultPage) {
// Generate the context
var context = JSONUtils.encodeBookWithPage(output.getBook(), resultPage);
// Render the theme
return Templating.renderFile(engine, 'website/page.html', context)
// Write it to the disk
.then(function(html) {
return Writer.writePage(output, resultPage, html);
});
});
}
module.exports = onPage;
+8
View File
@@ -0,0 +1,8 @@
var Immutable = require('immutable');
var Options = Immutable.Record({
// Root folder for the output
root: String()
});
module.exports = Options;
+72
View File
@@ -0,0 +1,72 @@
var path = require('path');
var nunjucks = require('nunjucks');
var fs = require('../utils/fs');
var Git = require('../utils/git');
var LocationUtils = require('../utils/location');
var PathUtils = require('../utils/path');
/**
Template loader resolving both:
- relative url ("./test.md")
- absolute url ("/test.md")
- git url ("")
*/
var ConrefsLoader = nunjucks.Loader.extend({
async: true,
init: function(rootFolder, logger) {
this.rootFolder = rootFolder;
this.logger = logger;
this.git = new Git();
},
getSource: function(sourceURL, callback) {
var that = this;
this.git.resolve(sourceURL)
.then(function(filepath) {
// Is local file
if (!filepath) {
filepath = path.resolve(sourceURL);
} else {
if (that.logger) that.logger.debug.ln('resolve from git', sourceURL, 'to', filepath);
}
// Read file from absolute path
return fs.readFile(filepath)
.then(function(source) {
return {
src: source.toString('utf8'),
path: filepath
};
});
})
.nodeify(callback);
},
resolve: function(from, to) {
// If origin is in the book, we enforce result file to be in the book
if (PathUtils.isInRoot(this.root, from)) {
var href = LocationUtils.toAbsolute(to, path.dirname(from), '');
return PathUtils.resolveInRoot(this.root, href);
}
// If origin is in a git repository, we resolve file in the git repository
var gitRoot = this.git.resolveRoot(from);
if (gitRoot) {
return PathUtils.resolveInRoot(gitRoot, to);
}
// If origin is not in the book (include from a git content ref)
return path.resolve(path.dirname(from), to);
},
// Handle all files as relative, so that nunjucks pass responsability to 'resolve'
isRelative: function(filename) {
return LocationUtils.isRelative(filename);
}
});
module.exports = ConrefsLoader;
+4 -1
View File
@@ -1,5 +1,8 @@
module.exports = {
render: require('./render'),
postRender: require('./postRender')
renderFile: require('./renderFile'),
postRender: require('./postRender'),
ConrefsLoader: require('./conrefsLoader')
};
+27
View File
@@ -0,0 +1,27 @@
var Promise = require('../utils/promise');
var replaceShortcuts = require('./replaceShortcuts');
/**
Render a template
@param {TemplateEngine} engine
@param {String} filePath
@param {String} content
@param {Object} ctx
@return {Promise<String>}
*/
function renderTemplateFile(engine, filePath, content, context) {
context = context || {};
var env = engine.toNunjucks();
content = replaceShortcuts(engine, filePath, content);
return Promise.nfcall(
env.render.bind(env),
content,
context
);
}
module.exports = renderTemplateFile;