mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-21 01:53:26 +00:00
Fix #1268: fix shortcuts of template block not being applied
This commit is contained in:
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 + ' %}';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user