diff --git a/package.json b/package.json
index 0a7e273..eb5194d 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,8 @@
"mongodb": "~1.2.14",
"handlebars": "~1.0.10",
"underscore": "~1.4.4",
- "less": "~1.3.3"
+ "less": "~1.3.3",
+ "when": "~2.0.1"
},
"devDependencies": {
"sockjs": "~0.3.5"
diff --git a/preview.js b/preview.js
index a1c7597..83f3bd0 100644
--- a/preview.js
+++ b/preview.js
@@ -1,8 +1,9 @@
var Handlebars = require('handlebars');
var _ = require('underscore');
var less = require('less');
+var when = require('when');
-module.exports = function (config) {
+module.exports = function (config, mongodataInstance) {
var sourceHead =
'\n' +
@@ -20,28 +21,52 @@ module.exports = function (config) {
'\n' +
'\n';
- var templateHead = Handlebars.compile(sourceHead);
- var templateBody = Handlebars.compile(sourceBody);
-
var getPreviewHTML = function (options, content, callback) {
+ config.debug && console.log('getPreviewHTML',content);
+ var html = content;
+ var promises = replaceMarkers(options, html);
+ when.all(
+ promises,
+ function onSucces (results) {
+ console.log('getPreviewHTML replaceMakers results',results);
+ _.forEach(results, function (result) {
+ if (result) {
+ html = html.replaceAll(result.regExp, result.replacement);
+ }
+ });
+ return callback(null, html);
+ },
+ function onFailure(err) {
+ return callback(err);
+ }
- var html = replaceMarkers(options, content, templateHead(options), templateBody(options));
- callback(null, html);
+ )
+
};
- var replaceMarkers = function (options, html, styleMarkerReplacement, jsMarkerReplacement) {
+ var replaceMarkers = function (options, html) {
- function replace(marker, replacement) {
+ function replace(marker, getReplacement) {
+ var deferred = when.defer();
var regExp = new RegExp('');
- if (html.match(regExp)) {
- html = html.replace(regExp, replacement);
+ var result = html.match(regExp);
+ if (result) {
+ getReplacement(result, function (err, replacement) {
+ if (err) {
+ deferred.reject(err);
+ } else {
+ deferred.resolve({regExp:regExp, replacement:replacement})
+ }
+ })
} else {
- html = html.replace('', '\n');
+ deferred.resolve();
}
+ return deferred.promise;
}
- console.log('martker options',options);
+ console.log('marker options',options);
+ var promises = [];
/* markers:
[type]_[collection]_[name]_[attribute]
@@ -58,10 +83,54 @@ module.exports = function (config) {
style ->
contains all type='style' attributes concatenated based on 'order'
*/
- replace(options.collection + '_' + options.name + '_' + 'style_marker', styleMarkerReplacement);
- replace(options.collection + '_' + options.name + '_' + 'behaviour_marker', jsMarkerReplacement);
+// replace('script_' + options.collection + '_' + options.name + '_' + options.attribute, function (result, callback) {
+ promises.push(
+ replace('script_([A-Za-z0-9]+)_([A-Za-z0-9]+)_([A-Za-z0-9]+)', function (result, callback) {
+ var context = {
+ collection: result[0],
+ name: result[1],
+ attribute: result[2]
+ };
+ return callback( null,
+ '\n'
+ );
+ }));
- return html;
+// replace('style_' + options.collection + '_' + options.name + '_' + options.attribute, function (result, callback) {
+ promises.push(
+ replace('style_([A-Za-z0-9]+)_([A-Za-z0-9]+)_([A-Za-z0-9]+)', function (result, callback) {
+ var context = {
+ collection: result[0],
+ name: result[1],
+ attribute: result[2]
+ };
+ return callback( null,
+ '\n'
+ );
+ }));
+
+
+// replace('template_' + options.collection + '_' + options.name + '_' + options.attribute + '_context_', function (result, callback) {
+ promises.push(
+ replace('template_([A-Za-z0-9]+)_([A-Za-z0-9]+)_([A-Za-z0-9]+)_context_([A-Za-z0-9]+)_([A-Za-z0-9]+)_([A-Za-z0-9]+)', function (result, callback) {
+ var context = {
+ caller_collection: result[0],
+ caller_name: result[1],
+ caller_attribute: result[2],
+ collection: result[3],
+ name: result[4],
+ attribute: result[5]
+ };
+ mongodataInstance.getMongoAttribute(options, function (err, result) {
+ if (err) {
+ return callback(err);
+ }
+ var template = Handlebars.compile(result[options.attribute]);
+ return callback(null, template(context));
+ });
+ }));
+
+ return promises;
};
diff --git a/routes.js b/routes.js
index 008dcc8..be984eb 100644
--- a/routes.js
+++ b/routes.js
@@ -267,7 +267,7 @@ module.exports = function (app, config) {
}
});
- var previewInstance = preview(config);
+ var previewInstance = preview(config, mongodataInstance);
app.get('/page/:collection/:name.:ext(html)',
function getPreviewContent(req, res, next) {
@@ -286,12 +286,16 @@ module.exports = function (app, config) {
var attribute_parts = options.query.name.split('.');
var attribute = attribute_parts[attribute_parts.length - 1];
var content = result[attribute];
- options.name = attribute_parts[0];
- //options.attribute=attribute;
- config.debug && console.log('getPreviewContent content', content);
- previewInstance.getPreviewHTML(options, content,
- responder(options, res, next)
- );
+ if (content) {
+ options.name = attribute_parts[0];
+ //options.attribute=attribute;
+ config.debug && console.log('getPreviewContent content', content);
+ previewInstance.getPreviewHTML(options, content,
+ responder(options, res, next)
+ );
+ } else {
+ return next();
+ }
}
});
}