From 169ca8ba5f0df75767c55b3816b48d4f047a5e4f Mon Sep 17 00:00:00 2001 From: jamos-tay Date: Wed, 23 Jan 2019 22:06:58 +0800 Subject: [PATCH 1/9] Implement page variable functionality --- src/lib/markbind/src/parser.js | 31 +++++++++++++++++-- .../test_site/_markbind/variables.md | 2 ++ test/functional/test_site/expected/index.html | 22 +++++++++++++ .../test_site/expected/siteData.json | 5 +++ test/functional/test_site/index.md | 24 ++++++++++++++ 5 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/lib/markbind/src/parser.js b/src/lib/markbind/src/parser.js index 2635d2472f..df3b4b7bfe 100644 --- a/src/lib/markbind/src/parser.js +++ b/src/lib/markbind/src/parser.js @@ -114,6 +114,28 @@ function extractVariables(includeElement, contextVariables) { return includedVariables; } +/** + * Extract page variables from an include element + * @param filename for error printing + * @param data to extract variables from + * @param userDefinedVariables global variables + */ +function extractPageVariables(fileName, data, userDefinedVariables) { + const $ = cheerio.load(data); + const pageVariables = {}; + $('variable').each(function () { + const variableElement = $(this); + if (!variableElement.attr('name')) { + // eslint-disable-next-line no-console + console.warn(`Missing 'name' for variable in ${fileName}\n`); + return; + } + pageVariables[variableElement.attr('name')] + = nunjucks.renderString(variableElement.html(), { ...pageVariables, ...userDefinedVariables }); + }); + return pageVariables; +} + Parser.prototype.getDynamicIncludeSrc = function () { return _.clone(this.dynamicIncludeSrc); }; @@ -234,8 +256,10 @@ Parser.prototype._preprocess = function (node, context, config) { // process variables declared within the include const includedVariables = extractVariables(element, context.includedVariables); + const pageVariables = extractPageVariables(filePath, fileContent, userDefinedVariables); + fileContent = nunjucks.renderString(fileContent, + { ...includedVariables, ...pageVariables, ...userDefinedVariables }); - fileContent = nunjucks.renderString(fileContent, { ...includedVariables, ...userDefinedVariables }); delete element.attribs.boilerplate; delete element.attribs.src; delete element.attribs.inline; @@ -306,6 +330,8 @@ Parser.prototype._preprocess = function (node, context, config) { element.attribs.src = filePath; this.dynamicIncludeSrc.push({ from: context.cwf, to: actualFilePath, asIfTo: filePath }); return element; + } else if (element.name === 'variable') { + return createEmptyNode(); } else { if (element.name === 'body') { // eslint-disable-next-line no-console @@ -444,7 +470,8 @@ Parser.prototype.includeFile = function (file, config) { } const { parent, relative } = calculateNewBaseUrls(file, config.rootPath, config.baseUrlMap); const userDefinedVariables = config.userDefinedVariablesMap[path.resolve(parent, relative)]; - const fileContent = nunjucks.renderString(data, userDefinedVariables); + const pageVariables = extractPageVariables(file, data, userDefinedVariables); + const fileContent = nunjucks.renderString(data, { ...pageVariables, ...userDefinedVariables }); const fileExt = utils.getExt(file); if (utils.isMarkdownFileExt(fileExt)) { context.source = 'md'; diff --git a/test/functional/test_site/_markbind/variables.md b/test/functional/test_site/_markbind/variables.md index da1cb897c8..87734c3f19 100644 --- a/test/functional/test_site/_markbind/variables.md +++ b/test/functional/test_site/_markbind/variables.md @@ -10,3 +10,5 @@ Global variable overriding included variable Global variable +Global Variable +Global Variable overriding Page Variable diff --git a/test/functional/test_site/expected/index.html b/test/functional/test_site/expected/index.html index 21af6137f0..55657d2dee 100644 --- a/test/functional/test_site/expected/index.html +++ b/test/functional/test_site/expected/index.html @@ -42,6 +42,11 @@ Testing Page Navigation