summaryrefslogtreecommitdiffstats
path: root/lib/models
diff options
context:
space:
mode:
authorSamy Pesse <samypesse@gmail.com>2016-05-04 19:01:31 +0200
committerSamy Pesse <samypesse@gmail.com>2016-05-04 19:01:31 +0200
commitc4b54033cefe54f2c7fda92b8765ed500178ea74 (patch)
tree14b83ff6b7950f542dfff4dfa9c6c676209631bb /lib/models
parent4d85d6eb6e12192146e8f2450f1bddada6e6f6d1 (diff)
downloadgitbook-c4b54033cefe54f2c7fda92b8765ed500178ea74.zip
gitbook-c4b54033cefe54f2c7fda92b8765ed500178ea74.tar.gz
gitbook-c4b54033cefe54f2c7fda92b8765ed500178ea74.tar.bz2
Fix #1268: fix shortcuts of template block not being applied
Diffstat (limited to 'lib/models')
-rw-r--r--lib/models/templateBlock.js21
-rw-r--r--lib/models/templateShortcut.js71
2 files changed, 89 insertions, 3 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;