Initial template override support

This commit is contained in:
Rodrigo Fernandes 2016-10-09 16:41:54 +01:00
parent d4bab74b1a
commit 2aaae31cc2
11 changed files with 62 additions and 29 deletions

View file

@ -173,11 +173,11 @@ function namespace(name) {
// write a template foreach file that matches template extension // write a template foreach file that matches template extension
templates = extractFiles(options.argv.remain) templates = extractFiles(options.argv.remain)
.map(function(file) { .map(function(file) {
var openedFile = fs.readFileSync(file, 'utf-8'); var openedFile = fs.readFileSync(file, 'utf-8').trim();
var name; var name;
if (!openedFile) return; if (!openedFile) return;
name = namespace(path.basename(file).replace(/\..*$/, '')); name = namespace(path.basename(file).replace(/\..*$/, ''));
openedFile = removeByteOrderMark(openedFile.trim()); openedFile = removeByteOrderMark(openedFile);
openedFile = wrap(file, name, openedFile); openedFile = wrap(file, name, openedFile);
if (!options.outputdir) return openedFile; if (!options.outputdir) return openedFile;
fs.writeFileSync(path.join(options.outputdir, name + '.js') fs.writeFileSync(path.join(options.outputdir, name + '.js')

View file

@ -7,7 +7,6 @@
(function() { (function() {
var diffParser = require('./diff-parser.js').DiffParser; var diffParser = require('./diff-parser.js').DiffParser;
var fileLister = require('./file-list-printer.js').FileListPrinter;
var htmlPrinter = require('./html-printer.js').HtmlPrinter; var htmlPrinter = require('./html-printer.js').HtmlPrinter;
function Diff2Html() { function Diff2Html() {
@ -43,7 +42,7 @@
var fileList = ''; var fileList = '';
if (configOrEmpty.showFiles === true) { if (configOrEmpty.showFiles === true) {
fileList = fileLister.generateFileList(diffJson, configOrEmpty); fileList = htmlPrinter.generateFileListSummary(diffJson, configOrEmpty);
} }
var diffOutput = ''; var diffOutput = '';

View file

@ -8,11 +8,16 @@
(function() { (function() {
var printerUtils = require('./printer-utils.js').PrinterUtils; var printerUtils = require('./printer-utils.js').PrinterUtils;
var hoganUtils = require('./hoganjs-utils.js').HoganJsUtils; var hoganUtils;
var baseTemplatesPath = 'file-summary'; var baseTemplatesPath = 'file-summary';
var iconsBaseTemplatesPath = 'icon'; var iconsBaseTemplatesPath = 'icon';
function FileListPrinter() { function FileListPrinter(config) {
this.config = config;
var HoganJsUtils = require('./hoganjs-utils.js').HoganJsUtils;
hoganUtils = new HoganJsUtils(config);
} }
FileListPrinter.prototype.generateFileList = function(diffFiles) { FileListPrinter.prototype.generateFileList = function(diffFiles) {
@ -38,5 +43,5 @@
}); });
}; };
module.exports.FileListPrinter = new FileListPrinter(); module.exports.FileListPrinter = FileListPrinter;
})(); })();

View file

@ -8,18 +8,19 @@
(function() { (function() {
var fs = require('fs'); var fs = require('fs');
var path = require('path'); var path = require('path');
var hogan = require('hogan.js'); var hogan = require('hogan.js');
var hoganTemplates = require('./templates/diff2html-templates.js'); var hoganTemplates = require('./templates/diff2html-templates.js');
var templatesPath = path.resolve(__dirname, 'templates'); var extraTemplates;
function HoganJsUtils() { function HoganJsUtils(configuration) {
this.config = configuration || {};
extraTemplates = this.config.templates || {};
} }
HoganJsUtils.prototype.render = function(namespace, view, params, configuration) { HoganJsUtils.prototype.render = function(namespace, view, params) {
var template = this.template(namespace, view, configuration); var template = this.template(namespace, view);
if (template) { if (template) {
return template.render(params); return template.render(params);
} }
@ -27,17 +28,16 @@
return null; return null;
}; };
HoganJsUtils.prototype.template = function(namespace, view, configuration) { HoganJsUtils.prototype.template = function(namespace, view) {
var config = configuration || {};
var templateKey = this._templateKey(namespace, view); var templateKey = this._templateKey(namespace, view);
return this._getTemplate(templateKey, config); return this._getTemplate(templateKey);
}; };
HoganJsUtils.prototype._getTemplate = function(templateKey, config) { HoganJsUtils.prototype._getTemplate = function(templateKey) {
var template; var template;
if (!config.noCache) { if (!this.config.noCache) {
template = this._readFromCache(templateKey); template = this._readFromCache(templateKey);
} }
@ -53,6 +53,7 @@
try { try {
if (fs.readFileSync) { if (fs.readFileSync) {
var templatesPath = path.resolve(__dirname, 'templates');
var templatePath = path.join(templatesPath, templateKey); var templatePath = path.join(templatesPath, templateKey);
var templateContent = fs.readFileSync(templatePath + '.mustache', 'utf8'); var templateContent = fs.readFileSync(templatePath + '.mustache', 'utf8');
template = hogan.compile(templateContent); template = hogan.compile(templateContent);
@ -66,12 +67,16 @@
}; };
HoganJsUtils.prototype._readFromCache = function(templateKey) { HoganJsUtils.prototype._readFromCache = function(templateKey) {
return hoganTemplates[templateKey]; return extraTemplates[templateKey] || hoganTemplates[templateKey];
}; };
HoganJsUtils.prototype._templateKey = function(namespace, view) { HoganJsUtils.prototype._templateKey = function(namespace, view) {
return namespace + '-' + view; return namespace + '-' + view;
}; };
module.exports.HoganJsUtils = new HoganJsUtils(); HoganJsUtils.prototype.compile = function(templateStr) {
return hogan.compile(templateStr);
};
module.exports.HoganJsUtils = HoganJsUtils;
})(); })();

View file

@ -8,6 +8,7 @@
(function() { (function() {
var LineByLinePrinter = require('./line-by-line-printer.js').LineByLinePrinter; var LineByLinePrinter = require('./line-by-line-printer.js').LineByLinePrinter;
var SideBySidePrinter = require('./side-by-side-printer.js').SideBySidePrinter; var SideBySidePrinter = require('./side-by-side-printer.js').SideBySidePrinter;
var FileListPrinter = require('./file-list-printer.js').FileListPrinter;
function HtmlPrinter() { function HtmlPrinter() {
} }
@ -22,5 +23,10 @@
return sideBySidePrinter.generateSideBySideJsonHtml(diffFiles); return sideBySidePrinter.generateSideBySideJsonHtml(diffFiles);
}; };
HtmlPrinter.prototype.generateFileListSummary = function(diffJson, config) {
var fileListPrinter = new FileListPrinter(config);
return fileListPrinter.generateFileList(diffJson);
};
module.exports.HtmlPrinter = new HtmlPrinter(); module.exports.HtmlPrinter = new HtmlPrinter();
})(); })();

View file

@ -11,7 +11,8 @@
var utils = require('./utils.js').Utils; var utils = require('./utils.js').Utils;
var Rematch = require('./rematch.js').Rematch; var Rematch = require('./rematch.js').Rematch;
var hoganUtils = require('./hoganjs-utils.js').HoganJsUtils; var hoganUtils;
var genericTemplatesPath = 'generic'; var genericTemplatesPath = 'generic';
var baseTemplatesPath = 'line-by-line'; var baseTemplatesPath = 'line-by-line';
var iconsBaseTemplatesPath = 'icon'; var iconsBaseTemplatesPath = 'icon';
@ -19,6 +20,9 @@
function LineByLinePrinter(config) { function LineByLinePrinter(config) {
this.config = config; this.config = config;
var HoganJsUtils = require('./hoganjs-utils.js').HoganJsUtils;
hoganUtils = new HoganJsUtils(config);
} }
LineByLinePrinter.prototype.makeFileDiffHtml = function(file, diffs) { LineByLinePrinter.prototype.makeFileDiffHtml = function(file, diffs) {

View file

@ -11,7 +11,8 @@
var utils = require('./utils.js').Utils; var utils = require('./utils.js').Utils;
var Rematch = require('./rematch.js').Rematch; var Rematch = require('./rematch.js').Rematch;
var hoganUtils = require('./hoganjs-utils.js').HoganJsUtils; var hoganUtils;
var genericTemplatesPath = 'generic'; var genericTemplatesPath = 'generic';
var baseTemplatesPath = 'side-by-side'; var baseTemplatesPath = 'side-by-side';
var iconsBaseTemplatesPath = 'icon'; var iconsBaseTemplatesPath = 'icon';
@ -26,6 +27,9 @@
function SideBySidePrinter(config) { function SideBySidePrinter(config) {
this.config = config; this.config = config;
var HoganJsUtils = require('./hoganjs-utils.js').HoganJsUtils;
hoganUtils = new HoganJsUtils(config);
} }
SideBySidePrinter.prototype.makeDiffHtml = function(file, diffs) { SideBySidePrinter.prototype.makeDiffHtml = function(file, diffs) {

View file

@ -1,6 +1,6 @@
var assert = require('assert'); var assert = require('assert');
var fileListPrinter = require('../src/file-list-printer.js').FileListPrinter; var fileListPrinter = new (require('../src/file-list-printer.js').FileListPrinter)();
describe('FileListPrinter', function() { describe('FileListPrinter', function() {
describe('generateFileList', function() { describe('generateFileList', function() {

View file

@ -1,6 +1,6 @@
var assert = require('assert'); var assert = require('assert');
var HoganJsUtils = require('../src/hoganjs-utils.js').HoganJsUtils; var HoganJsUtils = new (require('../src/hoganjs-utils.js').HoganJsUtils)();
var diffParser = require('../src/diff-parser.js').DiffParser; var diffParser = require('../src/diff-parser.js').DiffParser;
describe('HoganJsUtils', function() { describe('HoganJsUtils', function() {
@ -21,16 +21,28 @@ describe('HoganJsUtils', function() {
}); });
assert.equal(emptyDiffHtml, result); assert.equal(emptyDiffHtml, result);
}); });
it('should render view without cache', function() { it('should render view without cache', function() {
var result = HoganJsUtils.render('generic', 'empty-diff', { var result = HoganJsUtils.render('generic', 'empty-diff', {
contentClass: 'd2h-code-line', contentClass: 'd2h-code-line',
diffParser: diffParser diffParser: diffParser
}, {noCache: true}); }, {noCache: true});
assert.equal(emptyDiffHtml + '\n', result); assert.equal(emptyDiffHtml, result);
}); });
it('should return null if template is missing', function() { it('should return null if template is missing', function() {
var result = HoganJsUtils.render('generic', 'missing-template', {}, {noCache: true}); var hoganUtils = new (require('../src/hoganjs-utils.js').HoganJsUtils)({noCache: true});
var result = hoganUtils.render('generic', 'missing-template', {});
assert.equal(null, result); assert.equal(null, result);
}); });
it('should allow templates to be overridden', function() {
var emptyDiffTemplate = HoganJsUtils.compile('<p>{{myName}}</p>');
var config = {templates: {'generic-empty-diff': emptyDiffTemplate}};
var hoganUtils = new (require('../src/hoganjs-utils.js').HoganJsUtils)(config);
var result = hoganUtils.render('generic', 'empty-diff', {myName: 'Rodrigo Fernandes'});
assert.equal('<p>Rodrigo Fernandes</p>', result);
});
}); });
}); });

View file

@ -14,7 +14,7 @@ describe('LineByLinePrinter', function() {
' File without changes\n' + ' File without changes\n' +
' </div>\n' + ' </div>\n' +
' </td>\n' + ' </td>\n' +
'</tr>\n'; '</tr>';
assert.equal(expected, fileHtml); assert.equal(expected, fileHtml);
}); });
@ -422,7 +422,6 @@ describe('LineByLinePrinter', function() {
' </div>\n' + ' </div>\n' +
' </td>\n' + ' </td>\n' +
'</tr>\n' + '</tr>\n' +
'\n' +
' </tbody>\n' + ' </tbody>\n' +
' </table>\n' + ' </table>\n' +
' </div>\n' + ' </div>\n' +

View file

@ -14,7 +14,7 @@ describe('SideBySidePrinter', function() {
' File without changes\n' + ' File without changes\n' +
' </div>\n' + ' </div>\n' +
' </td>\n' + ' </td>\n' +
'</tr>\n'; '</tr>';
assert.equal(expectedRight, fileHtml.right); assert.equal(expectedRight, fileHtml.right);
assert.equal(expectedLeft, fileHtml.left); assert.equal(expectedLeft, fileHtml.left);
@ -324,7 +324,6 @@ describe('SideBySidePrinter', function() {
' </div>\n' + ' </div>\n' +
' </td>\n' + ' </td>\n' +
'</tr>\n' + '</tr>\n' +
'\n' +
' </tbody>\n' + ' </tbody>\n' +
' </table>\n' + ' </table>\n' +
' </div>\n' + ' </div>\n' +