mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-21 01:53:26 +00:00
Add conrefs loader for templating
This commit is contained in:
@@ -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,6 +1,6 @@
|
||||
|
||||
|
||||
module.exports = {
|
||||
name: 'json',
|
||||
Options: require('./options'),
|
||||
onPage: require('./onPage')
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
module.exports = {
|
||||
name: 'json',
|
||||
Options: require('./options'),
|
||||
onPage: require('./onPage')
|
||||
};
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -0,0 +1,8 @@
|
||||
var Immutable = require('immutable');
|
||||
|
||||
var Options = Immutable.Record({
|
||||
// Root folder for the output
|
||||
root: String()
|
||||
});
|
||||
|
||||
module.exports = Options;
|
||||
@@ -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;
|
||||
@@ -1,5 +1,8 @@
|
||||
|
||||
module.exports = {
|
||||
render: require('./render'),
|
||||
postRender: require('./postRender')
|
||||
renderFile: require('./renderFile'),
|
||||
postRender: require('./postRender'),
|
||||
|
||||
ConrefsLoader: require('./conrefsLoader')
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user