mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #47 - Added support for "taglib-imports"
This commit is contained in:
parent
ad067a9b65
commit
d0998ad9f1
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
2
test/test-project/html-templates/taglib-imports.marko
Normal file
2
test/test-project/html-templates/taglib-imports.marko
Normal file
@ -0,0 +1,2 @@
|
||||
<imported-foo name="John"/>
|
||||
<imported-bar name="Jane"/>
|
||||
@ -0,0 +1 @@
|
||||
[imported-foo] Name: John[imported-bar] Name: Jane
|
||||
@ -98,5 +98,6 @@
|
||||
"template": "./hello.marko"
|
||||
}
|
||||
},
|
||||
"tags-dir": "./scanned-tags"
|
||||
"tags-dir": "./scanned-tags",
|
||||
"taglib-imports": ["./package.json"]
|
||||
}
|
||||
10
test/test-project/node_modules/imported-bar/marko-taglib.json
generated
vendored
Normal file
10
test/test-project/node_modules/imported-bar/marko-taglib.json
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"tags": {
|
||||
"imported-bar": {
|
||||
"renderer": "./renderer.js",
|
||||
"attributes": {
|
||||
"name": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
4
test/test-project/node_modules/imported-bar/package.json
generated
vendored
Normal file
4
test/test-project/node_modules/imported-bar/package.json
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "imported-bar",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
3
test/test-project/node_modules/imported-bar/renderer.js
generated
vendored
Normal file
3
test/test-project/node_modules/imported-bar/renderer.js
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.renderer = function(input, out) {
|
||||
out.write('[imported-bar] Name: ' + input.name);
|
||||
};
|
||||
10
test/test-project/node_modules/imported-foo/marko-taglib.json
generated
vendored
Normal file
10
test/test-project/node_modules/imported-foo/marko-taglib.json
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"tags": {
|
||||
"imported-foo": {
|
||||
"renderer": "./renderer.js",
|
||||
"attributes": {
|
||||
"name": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
4
test/test-project/node_modules/imported-foo/package.json
generated
vendored
Normal file
4
test/test-project/node_modules/imported-foo/package.json
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "imported-foo",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
3
test/test-project/node_modules/imported-foo/renderer.js
generated
vendored
Normal file
3
test/test-project/node_modules/imported-foo/renderer.js
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.renderer = function(input, out) {
|
||||
out.write('[imported-foo] Name: ' + input.name);
|
||||
};
|
||||
6
test/test-project/package.json
Normal file
6
test/test-project/package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"imported-foo": "^1.0.0",
|
||||
"imported-bar": "^1.0.0"
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user