diff options
Diffstat (limited to 'lib/output/website/createTemplateEngine.js')
-rw-r--r-- | lib/output/website/createTemplateEngine.js | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/lib/output/website/createTemplateEngine.js b/lib/output/website/createTemplateEngine.js new file mode 100644 index 0000000..334ec13 --- /dev/null +++ b/lib/output/website/createTemplateEngine.js @@ -0,0 +1,118 @@ +var path = require('path'); +var nunjucks = require('nunjucks'); +var DoExtension = require('nunjucks-do')(nunjucks); + +var Api = require('../../api'); +var JSONUtils = require('../../json'); +var LocationUtils = require('../../utils/location'); +var fs = require('../../utils/fs'); +var PathUtils = require('../../utils/path'); +var TemplateEngine = require('../../models/templateEngine'); +var templatesFolder = require('../../constants/templatesFolder'); +var defaultFilters = require('../../constants/defaultFilters'); +var Templating = require('../../templating'); +var listSearchPaths = require('./listSearchPaths'); + +var fileToURL = require('../helper/fileToURL'); +var resolveFileToURL = require('../helper/resolveFileToURL'); + +/** + Directory for a theme with the templates +*/ +function templateFolder(dir) { + return path.join(dir, templatesFolder); +} + +/** + Create templating engine to render themes + + @param {Output} output + @param {String} currentFile + @return {TemplateEngine} +*/ +function createTemplateEngine(output, currentFile) { + var book = output.getBook(); + var state = output.getState(); + var i18n = state.getI18n(); + var config = book.getConfig(); + var summary = book.getSummary(); + var outputFolder = output.getRoot(); + + // Search paths for templates + var searchPaths = listSearchPaths(output); + var tplSearchPaths = searchPaths.map(templateFolder); + + // Create loader + var loader = new Templating.ThemesLoader(tplSearchPaths); + + // Get languages + var language = config.get('language'); + + // Create API context + var context = Api.encodeGlobal(output); + + return TemplateEngine.create({ + loader: loader, + + context: context, + + filters: defaultFilters.merge({ + /** + Translate a sentence + */ + t: function t(s) { + return i18n.t(language, s); + }, + + /** + Resolve an absolute file path into a + relative path. + it also resolve pages + */ + resolveFile: function(filePath) { + filePath = resolveFileToURL(output, filePath); + return LocationUtils.relativeForFile(currentFile, filePath); + }, + + resolveAsset: function(filePath) { + filePath = LocationUtils.toAbsolute(filePath, '', ''); + filePath = path.join('gitbook', filePath); + filePath = LocationUtils.relativeForFile(currentFile, filePath); + + // Use assets from parent if language book + if (book.isLanguageBook()) { + filePath = path.join('../', filePath); + } + + return LocationUtils.normalize(filePath); + }, + + /** + Check if a file exists + */ + fileExists: function(fileName) { + var filePath = PathUtils.resolveInRoot(outputFolder, fileName); + return fs.existsSync(filePath); + }, + + contentURL: function(filePath) { + return fileToURL(output, filePath); + }, + + /** + Return an article by its path + */ + getArticleByPath: function(s) { + var article = summary.getByPath(s); + if (!article) return undefined; + return JSONUtils.encodeSummaryArticle(article); + } + }), + + extensions: { + 'DoExtension': new DoExtension() + } + }); +} + +module.exports = createTemplateEngine; |