summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/models/templateBlock.js21
-rw-r--r--lib/models/templateShortcut.js71
-rw-r--r--lib/parsers.js2
-rw-r--r--lib/templating/listShortcuts.js17
-rw-r--r--lib/templating/replaceShortcuts.js10
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 + ' %}';
});
}