Split out async and layout taglibs into separate modules

This commit is contained in:
Patrick Steele-Idem 2014-06-04 21:48:57 -06:00
parent b65d1a3205
commit 6f147786c6
10 changed files with 4 additions and 245 deletions

View File

@ -1,39 +0,0 @@
var raptorDust = require('raptor-dust');
exports.registerHelpers = function(dust) {
raptorDust.registerHelpers({
'async-fragment': {
buildInput: function(chunk, context, bodies, params, renderContext) {
var arg = params.arg = {};
for (var k in params) {
if (params.hasOwnProperty(k)) {
if (k.startsWith('arg-')) {
arg[k.substring(4)] = params[k];
delete params[k];
}
}
}
var dataProvider = params.dataProvider;
if (typeof dataProvider === 'string') {
var dataProviderFunc = context.get(dataProvider);
if (dataProviderFunc) {
params.dataProvider = dataProviderFunc;
}
}
params.invokeBody = function(asyncContext, data) {
var varName = params['var'];
var newContextObj = {};
newContextObj[varName] = data;
var newContext = context.push(newContextObj);
asyncContext.renderDustBody(bodies.block, newContext);
};
return params;
},
render: require('../taglibs/async/async-fragment-tag')
}
}, dust);
};

View File

@ -12,7 +12,7 @@
"url": "https://github.com/raptorjs3/raptor-templates.git"
},
"scripts": {
"test": "node_modules/.bin/mocha --ui bdd --reporter spec ./test && node_modules/.bin/jshint compiler/ runtime/ taglibs/ dust/"
"test": "node_modules/.bin/mocha --ui bdd --reporter spec ./test && node_modules/.bin/jshint compiler/ runtime/ taglibs/"
},
"author": "Patrick Steele-Idem <pnidem@gmail.com>",
"maintainers": [
@ -26,7 +26,6 @@
"raptor-json": "^0.2.0-beta",
"raptor-modules": "^0.2.0-beta",
"raptor-render-context": "^0.2.0-beta",
"raptor-data-providers": "^0.2.0-beta",
"raptor-ecma": "^0.2.0-beta",
"htmlparser2": "~3.5.1",
"char-props": "~0.1.5",
@ -34,8 +33,9 @@
"raptor-args": "^0.1.9-beta",
"minimatch": "^0.2.14",
"property-handlers": "^0.2.1-beta",
"raptor-dust": "^0.3.6-beta",
"sax": "^0.6.0"
"sax": "^0.6.0",
"raptor-taglib-async": "^0.1.0-beta",
"raptor-taglib-layout": "^0.1.0-beta"
},
"devDependencies": {
"mocha": "~1.15.1",

View File

@ -1,40 +0,0 @@
'use strict';
var varNameRegExp = /^[A-Za-z_][A-Za-z0-9_]*$/;
module.exports = function transform(node, compiler, template) {
var varName = node.getAttribute('var') || node.getAttribute('data-provider') || node.getAttribute('dependency');
if (varName) {
if (!varNameRegExp.test(varName)) {
node.addError('Invalid variable name of "' + varName + '"');
return;
}
} else {
node.addError('Either "var" or "data-provider" is required');
return;
}
var argProps = [];
var propsToRemove = [];
node.forEachProperty(function (name, value) {
if (name.startsWith('arg-')) {
var argName = name.substring('arg-'.length);
argProps.push(JSON.stringify(argName) + ': ' + value);
propsToRemove.push(name);
}
});
propsToRemove.forEach(function (propName) {
node.removeProperty(propName);
});
var argString;
if (argProps.length) {
argString = '{' + argProps.join(', ') + '}';
}
var arg = node.getProperty('arg');
if (arg) {
var extendFuncName = template.getStaticHelperFunction('extend', 'xt');
argString = extendFuncName + '(' + arg + ', ' + argString + ')';
}
if (argString) {
node.setProperty('arg', template.makeExpression(argString));
}
};

View File

@ -1,45 +0,0 @@
'use strict';
var raptorDataProviders = require('raptor-data-providers');
module.exports = function render(input, context) {
var dataProvider = input.dataProvider;
var dataProviders = raptorDataProviders.forContext(context, false /* don't create if missing */);
var arg = input.arg || {};
arg.context = context;
var asyncContext = context.beginAsync(input.timeout);
function onError(e) {
asyncContext.error(e || 'Async fragment failed');
}
function renderBody(data) {
try {
if (input.invokeBody) {
input.invokeBody(asyncContext, data);
}
asyncContext.end();
} catch (e) {
onError(e);
}
}
var method = input.method;
if (method) {
dataProvider = dataProvider[method].bind(dataProvider);
}
try {
dataProviders.requestData(dataProvider, arg, function(err, data) {
if (err) {
return onError(err);
}
renderBody(data);
});
} catch (e) {
onError(e);
}
};

View File

@ -1,8 +0,0 @@
{
"dependencies": [
{
"package": "raptor/render-context/async"
},
"AsyncFragmentTag.js"
]
}

View File

@ -1,37 +0,0 @@
{
"tags": {
"async-fragment": {
"renderer": "./async-fragment-tag",
"attributes": {
"data-provider": {
"type": "string"
},
"arg": {
"type": "expression",
"preserve-name": true
},
"arg-*": {
"pattern": true,
"type": "string",
"preserve-name": true
},
"var": {
"type": "identifier"
},
"timeout": {
"type": "integer"
},
"method": {
"type": "string"
}
},
"vars": [
"context",
{
"name-from-attribute": "var OR dependency OR data-provider|keep"
}
],
"transformer": "./async-fragment-tag-transformer"
}
}
}

View File

@ -1,14 +0,0 @@
module.exports = function render(input, context) {
var content = input.content[input.name];
if (content) {
if (content.value) {
context.write(content.value);
} else if (content.invokeBody) {
content.invokeBody();
}
} else {
if (input.invokeBody) {
input.invokeBody();
}
}
};

View File

@ -1,3 +0,0 @@
module.exports = function render(input, context) {
input._layout.handlePutTag(input);
};

View File

@ -1,42 +0,0 @@
{
"tags": {
"layout-use": {
"renderer": "./use-tag",
"attributes": {
"template": {
"type": "template"
},
"*": {
"remove-dashes": true,
"type": "string"
}
},
"var": "_layout"
},
"layout-put": {
"renderer": "./put-tag",
"attributes": {
"into": {
"type": "string"
},
"value": {
"type": "string"
}
},
"import-var": {
"_layout": "_layout"
}
},
"layout-placeholder": {
"renderer": "./placeholder-tag",
"attributes": {
"name": {
"type": "string"
}
},
"import-var": {
"content": "data.layoutContent"
}
}
}
}

View File

@ -1,13 +0,0 @@
var extend = require('raptor-util').extend;
module.exports = function render(input, context) {
var content = {};
input.invokeBody({
handlePutTag: function (putTag) {
content[putTag.into] = putTag;
}
});
var viewModel = extend(input['*'] || {}, { layoutContent: content });
input.template.render(viewModel, context);
};