diff options
author | Samy Pesse <samypesse@gmail.com> | 2016-05-04 19:01:31 +0200 |
---|---|---|
committer | Samy Pesse <samypesse@gmail.com> | 2016-05-04 19:01:31 +0200 |
commit | c4b54033cefe54f2c7fda92b8765ed500178ea74 (patch) | |
tree | 14b83ff6b7950f542dfff4dfa9c6c676209631bb | |
parent | 4d85d6eb6e12192146e8f2450f1bddada6e6f6d1 (diff) | |
download | gitbook-c4b54033cefe54f2c7fda92b8765ed500178ea74.zip gitbook-c4b54033cefe54f2c7fda92b8765ed500178ea74.tar.gz gitbook-c4b54033cefe54f2c7fda92b8765ed500178ea74.tar.bz2 |
Fix #1268: fix shortcuts of template block not being applied
-rw-r--r-- | lib/models/templateBlock.js | 21 | ||||
-rw-r--r-- | lib/models/templateShortcut.js | 71 | ||||
-rw-r--r-- | lib/parsers.js | 2 | ||||
-rw-r--r-- | lib/templating/listShortcuts.js | 17 | ||||
-rw-r--r-- | lib/templating/replaceShortcuts.js | 10 |
5 files changed, 105 insertions, 16 deletions
diff --git a/lib/models/templateBlock.js b/lib/models/templateBlock.js index 340f808..76aeb55 100644 --- a/lib/models/templateBlock.js +++ b/lib/models/templateBlock.js @@ -4,6 +4,7 @@ var Immutable = require('immutable'); var Promise = require('../utils/promise'); var genKey = require('../utils/genKey'); +var TemplateShortcut = require('./templateShortcut'); var NODE_ENDARGS = '%%endargs%%'; @@ -23,7 +24,7 @@ var TemplateBlock = Immutable.Record({ blocks: Immutable.List(), // List of shortcuts to replace with this block - shortcuts: Immutable.List(), + shortcuts: Immutable.Map(), // Function to execute in post processing post: null, @@ -55,8 +56,19 @@ TemplateBlock.prototype.getBlocks = function() { return this.get('blocks'); }; + +/** + Return shortcuts associated with this block or undefined + + @return {TemplateShortcut|undefined} +*/ TemplateBlock.prototype.getShortcuts = function() { - return this.get('shortcuts'); + var shortcuts = this.get('shortcuts'); + if (shortcuts.size === 0) { + return undefined; + } + + return TemplateShortcut.createForBlock(this, shortcuts); }; /** @@ -292,7 +304,10 @@ TemplateBlock.create = function(blockName, block) { }); } - block = block.set('name', blockName); + block = block.merge({ + name: blockName + }); + return new TemplateBlock(block); }; diff --git a/lib/models/templateShortcut.js b/lib/models/templateShortcut.js new file mode 100644 index 0000000..672c7ba --- /dev/null +++ b/lib/models/templateShortcut.js @@ -0,0 +1,71 @@ +var Immutable = require('immutable'); +var is = require('is'); + +/* + A TemplateShortcut is defined in plugin's template blocks + to replace content with a templating block using delimiters. +*/ +var TemplateShortcut = Immutable.Record({ + // List of parser names accepting this shortcut + parsers: Immutable.Map(), + + start: String(), + end: String(), + + startTag: String(), + endTag: String() +}, 'TemplateShortcut'); + +TemplateShortcut.prototype.getStart = function() { + return this.get('start'); +}; + +TemplateShortcut.prototype.getEnd = function() { + return this.get('end'); +}; + +TemplateShortcut.prototype.getStartTag = function() { + return this.get('startTag'); +}; + +TemplateShortcut.prototype.getEndTag = function() { + return this.get('endTag'); +}; + +TemplateShortcut.prototype.getParsers = function() { + return this.get('parsers'); +}; + +/** + Test if this shortcut accept a parser + + @param {Parser|String} parser + @return {Boolean} +*/ +TemplateShortcut.prototype.acceptParser = function(parser) { + if (!is.string(parser)) { + parser = parser.getName(); + } + + var parserNames = this.get('parsers'); + return parserNames.includes(parser); +}; + +/** + Create a shortcut for a block + + @param {TemplateBlock} block + @param {Map} details + @return {TemplateShortcut} +*/ +TemplateShortcut.createForBlock = function(block, details) { + return new TemplateShortcut({ + parsers: details.get('parsers'), + start: details.get('start'), + end: details.get('end'), + startTag: block.getName(), + endTag: block.getEndTag() + }); +}; + +module.exports = TemplateShortcut; diff --git a/lib/parsers.js b/lib/parsers.js index 1c9ba4c..2c5156e 100644 --- a/lib/parsers.js +++ b/lib/parsers.js @@ -43,7 +43,7 @@ function getParserByExt(ext) { @return {Parser|undefined} */ function getParserForFile(filename) { - return getParser(path.extname(filename)); + return getParserByExt(path.extname(filename)); } // List all parsable extensions diff --git a/lib/templating/listShortcuts.js b/lib/templating/listShortcuts.js index 8f2388b..12d09ad 100644 --- a/lib/templating/listShortcuts.js +++ b/lib/templating/listShortcuts.js @@ -7,25 +7,26 @@ var parsers = require('../parsers'); @param {TemplateEngine} engine @param {String} filePath - @return {List<Shortcut>} + @return {List<TemplateShortcut>} */ function listShortcuts(engine, filePath) { var blocks = engine.getBlocks(); var parser = parsers.getForFile(filePath); + if (!parser) { return Immutable.List(); } return blocks .map(function(block) { - var shortcuts = block.getShortcuts(); - - return shortcuts.filter(function(shortcut) { - var parsers = shortcut.get('parsers'); - return parsers.includes(parser.name); - }); + return block.getShortcuts(); }) - .flatten(1); + .filter(function(shortcuts) { + return ( + shortcuts && + shortcuts.acceptParser(parser.getName()) + ); + }); } module.exports = listShortcuts; diff --git a/lib/templating/replaceShortcuts.js b/lib/templating/replaceShortcuts.js index f6a51cb..66ddff3 100644 --- a/lib/templating/replaceShortcuts.js +++ b/lib/templating/replaceShortcuts.js @@ -8,16 +8,18 @@ var listShortcuts = require('./listShortcuts'); @return {String} */ function applyShortcut(content, shortcut) { - var tags = shortcut.get('tag'); - var start = shortcut.get('start'); - var end = shortcut.get('end'); + var start = shortcut.getStart(); + var end = shortcut.getEnd(); + + var tagStart = shortcut.getStartTag(); + var tagEnd = shortcut.getEndTag(); var regex = new RegExp( escapeStringRegexp(start) + '([\\s\\S]*?[^\\$])' + escapeStringRegexp(end), 'g' ); return content.replace(regex, function(all, match) { - return '{% ' + tags.start + ' %}' + match + '{% ' + tags.end + ' %}'; + return '{% ' + tagStart + ' %}' + match + '{% ' + tagEnd + ' %}'; }); } |