Fix #1268: fix shortcuts of template block not being applied

This commit is contained in:
Samy Pesse
2016-05-04 19:01:31 +02:00
parent 4d85d6eb6e
commit c4b54033ce
5 changed files with 105 additions and 16 deletions
+18 -3
View File
@@ -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);
};
+71
View File
@@ -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;
+1 -1
View File
@@ -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
+9 -8
View File
@@ -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;
+6 -4
View File
@@ -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 + ' %}';
});
}