Fixes #47 - Added support for "taglib-imports"

This commit is contained in:
Patrick Steele-Idem 2015-03-16 14:27:33 -06:00
parent ad067a9b65
commit d0998ad9f1
14 changed files with 97 additions and 3 deletions

View File

@ -36,6 +36,7 @@ function Taglib(id) {
this.attributes = {};
this.patternAttributes = [];
this.inputFilesLookup = {};
this.imports = null;
}
Taglib.prototype = {
@ -82,6 +83,13 @@ Taglib.prototype = {
forEachEntry(this.tags, function (key, tag) {
callback.call(thisObj, tag);
}, this);
},
addImport: function(path) {
if (!this.imports) {
this.imports = [];
}
this.imports.push(path);
}
};

View File

@ -456,6 +456,38 @@ function load(path) {
scanTagsDir(path, dirname, dir, taglib);
}
},
taglibImports: function(imports) {
if (imports && Array.isArray(imports)) {
for (var i=0; i<imports.length; i++) {
var curImport = imports[i];
if (typeof curImport === 'string') {
var basename = nodePath.basename(curImport);
if (basename === 'package.json') {
var packagePath = resolve(curImport, dirname);
var pkg = require(packagePath);
var dependencies = pkg.dependencies;
if (dependencies) {
var dependencyNames = Object.keys(dependencies);
for (var j=0; j<dependencyNames.length; j++) {
var dependencyName = dependencyNames[j];
var importPath;
try {
importPath = require('resolve-from')(dirname, dependencyName + '/marko-taglib.json');
} catch(e) {}
if (importPath) {
taglib.addImport(importPath);
}
}
}
}
}
}
}
},
textTransformer: function(value) {
var transformer = new Taglib.Transformer();

View File

@ -22,7 +22,15 @@ function buildLookup(dirname) {
lookup = new TaglibLookup();
for (var i=taglibs.length-1; i>=0; i--) {
lookup.addTaglib(taglibs[i]);
var taglib = taglibs[i];
lookup.addTaglib(taglib);
if (taglib.imports) {
for (var j=0; j<taglib.imports.length; j++) {
var importedTaglib = taglibLoader.load(taglib.imports[j]);
lookup.addTaglib(importedTaglib);
}
}
}
lookupCache[lookupCacheKey] = lookup;

View File

@ -377,5 +377,7 @@ describe('marko/render' , function() {
}, done);
});
it("should support importing taglibs into other taglibs", function(done) {
testRender("test-project/html-templates/taglib-imports.marko", {}, done);
});
});

View File

@ -0,0 +1,2 @@
<imported-foo name="John"/>
<imported-bar name="Jane"/>

View File

@ -0,0 +1 @@
[imported-foo] Name: John[imported-bar] Name: Jane

View File

@ -98,5 +98,6 @@
"template": "./hello.marko"
}
},
"tags-dir": "./scanned-tags"
"tags-dir": "./scanned-tags",
"taglib-imports": ["./package.json"]
}

View File

@ -0,0 +1,10 @@
{
"tags": {
"imported-bar": {
"renderer": "./renderer.js",
"attributes": {
"name": "string"
}
}
}
}

View File

@ -0,0 +1,4 @@
{
"name": "imported-bar",
"version": "1.0.0"
}

View File

@ -0,0 +1,3 @@
exports.renderer = function(input, out) {
out.write('[imported-bar] Name: ' + input.name);
};

View File

@ -0,0 +1,10 @@
{
"tags": {
"imported-foo": {
"renderer": "./renderer.js",
"attributes": {
"name": "string"
}
}
}
}

View File

@ -0,0 +1,4 @@
{
"name": "imported-foo",
"version": "1.0.0"
}

View File

@ -0,0 +1,3 @@
exports.renderer = function(input, out) {
out.write('[imported-foo] Name: ' + input.name);
};

View File

@ -0,0 +1,6 @@
{
"dependencies": {
"imported-foo": "^1.0.0",
"imported-bar": "^1.0.0"
}
}