mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #288 - Provide API for discovering custom tags and attributes for autocomplete/tooling purposes
This commit is contained in:
parent
0a972d2d10
commit
33a6aaff98
@ -175,6 +175,12 @@ exports.taglibLookup = taglibLookup;
|
|||||||
exports.taglibLoader = require('./taglib-loader');
|
exports.taglibLoader = require('./taglib-loader');
|
||||||
exports.taglibFinder = require('./taglib-finder');
|
exports.taglibFinder = require('./taglib-finder');
|
||||||
|
|
||||||
|
function buildTaglibLookup(dirname) {
|
||||||
|
return taglibLookup.buildLookup(dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.buildTaglibLookup = buildTaglibLookup;
|
||||||
|
|
||||||
taglibLookup.registerTaglib(require.resolve('../taglibs/core/marko.json'));
|
taglibLookup.registerTaglib(require.resolve('../taglibs/core/marko.json'));
|
||||||
taglibLookup.registerTaglib(require.resolve('../taglibs/layout/marko.json'));
|
taglibLookup.registerTaglib(require.resolve('../taglibs/layout/marko.json'));
|
||||||
taglibLookup.registerTaglib(require.resolve('../taglibs/html/marko.json'));
|
taglibLookup.registerTaglib(require.resolve('../taglibs/html/marko.json'));
|
||||||
|
|||||||
@ -141,6 +141,53 @@ class TaglibLookup {
|
|||||||
this._mergeNestedTags(taglib);
|
this._mergeNestedTags(taglib);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forEachTag(callback) {
|
||||||
|
var tags = this.merged.tags;
|
||||||
|
if (tags) {
|
||||||
|
for (var tagName in tags) {
|
||||||
|
if (tags.hasOwnProperty(tagName)) {
|
||||||
|
var tag = tags[tagName];
|
||||||
|
var result = callback(tag);
|
||||||
|
if (result === false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forEachAttribute(tagName, callback) {
|
||||||
|
var tags = this.merged.tags;
|
||||||
|
if (!tags) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findAttributesForTagName(tagName) {
|
||||||
|
var tag = tags[tagName];
|
||||||
|
if (!tag) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var attributes = tag.attributes;
|
||||||
|
if (!attributes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var attrName in attributes) {
|
||||||
|
if (attributes.hasOwnProperty(attrName)) {
|
||||||
|
callback(attributes[attrName], tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag.patternAttributes) {
|
||||||
|
tag.patternAttributes.forEach(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
findAttributesForTagName(tagName); // Look for an exact match at the tag level
|
||||||
|
findAttributesForTagName('*'); // Including attributes that apply to all tags
|
||||||
|
}
|
||||||
|
|
||||||
getTag(element) {
|
getTag(element) {
|
||||||
if (typeof element === 'string') {
|
if (typeof element === 'string') {
|
||||||
element = {
|
element = {
|
||||||
@ -157,7 +204,6 @@ class TaglibLookup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getAttribute(element, attr) {
|
getAttribute(element, attr) {
|
||||||
|
|
||||||
if (typeof element === 'string') {
|
if (typeof element === 'string') {
|
||||||
element = {
|
element = {
|
||||||
tagName: element
|
tagName: element
|
||||||
|
|||||||
@ -1,6 +1,60 @@
|
|||||||
The Compiler API
|
The Compiler API
|
||||||
================
|
================
|
||||||
|
|
||||||
|
# require('marko/compiler')
|
||||||
|
|
||||||
|
## Methods
|
||||||
|
|
||||||
|
### buildTaglibLookup(dirname)
|
||||||
|
|
||||||
|
Returns a [TaglibLookup](#TaglibLookup) for discovering custom tags available to a template in the given directory.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var taglibLookup =
|
||||||
|
require('marko/compiler').buildTaglibLookup('some/dir');
|
||||||
|
|
||||||
|
taglibLookup.forEachTag((tag) => {
|
||||||
|
console.log(tag.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
taglibLookup.forEachAttribute('div', (attr) => {
|
||||||
|
console.log(attr.name);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### compile(src, filename, options, callback)
|
||||||
|
|
||||||
|
### compileFile(filename, options, callback)
|
||||||
|
|
||||||
|
### createBuilder(options)
|
||||||
|
|
||||||
|
### createWalker(options)
|
||||||
|
|
||||||
|
### parseRaw(templateSrc, filename)
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
|
||||||
|
### taglibLookup
|
||||||
|
|
||||||
|
Returns a reference to the [taglib-lookup](#taglib-lookup) module.
|
||||||
|
|
||||||
|
### taglibLoader
|
||||||
|
|
||||||
|
### taglibFinder
|
||||||
|
|
||||||
|
<a name="taglib-lookup"></a>
|
||||||
|
# taglib-lookup
|
||||||
|
|
||||||
|
## Methods
|
||||||
|
|
||||||
|
### registerTaglib = registerTaglib;
|
||||||
|
|
||||||
|
### buildLookup(dirname)
|
||||||
|
|
||||||
|
### clearCache();
|
||||||
|
|
||||||
# AST
|
# AST
|
||||||
|
|
||||||
## Node
|
## Node
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
var nodePath = require('path');
|
var nodePath = require('path');
|
||||||
|
|
||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup1 = taglibLookup.buildLookup(nodePath.join(__dirname, 'foo'));
|
var lookup1 = taglibLookup.buildLookup(nodePath.join(__dirname, 'foo'));
|
||||||
var lookup2 = taglibLookup.buildLookup(nodePath.join(__dirname, 'foo'));
|
var lookup2 = taglibLookup.buildLookup(nodePath.join(__dirname, 'foo'));
|
||||||
var lookup3 = taglibLookup.buildLookup(nodePath.join(__dirname, 'foo/empty'));
|
var lookup3 = taglibLookup.buildLookup(nodePath.join(__dirname, 'foo/empty'));
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
// console.log('LOOKUP: ', Object.keys(lookup.attributes));
|
// console.log('LOOKUP: ', Object.keys(lookup.attributes));
|
||||||
var ifAttr = lookup.getAttribute('div', 'if');
|
var ifAttr = lookup.getAttribute('div', 'if');
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
var ifTag = lookup.getTag('if');
|
var ifTag = lookup.getTag('if');
|
||||||
expect(ifTag != null).to.equal(true);
|
expect(ifTag != null).to.equal(true);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
var tag = lookup.getTag('test-hello');
|
var tag = lookup.getTag('test-hello');
|
||||||
// console.log(Object.keys(lookup.tags));
|
// console.log(Object.keys(lookup.tags));
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
var nodePath = require('path');
|
var nodePath = require('path');
|
||||||
|
|
||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(nodePath.join(__dirname, 'taglib-duplicate'));
|
var lookup = taglibLookup.buildLookup(nodePath.join(__dirname, 'taglib-duplicate'));
|
||||||
|
|
||||||
// The "duplicate-bar" tag was declared in the lower
|
// The "duplicate-bar" tag was declared in the lower
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
// console.log(Object.keys(lookup.attributes));
|
// console.log(Object.keys(lookup.attributes));
|
||||||
var attr = lookup.getAttribute('test-dynamic-attribute', 'DYNAMIC');
|
var attr = lookup.getAttribute('test-dynamic-attribute', 'DYNAMIC');
|
||||||
|
|||||||
10
test/autotests/taglib-lookup/forEachAttribute/expected.json
Normal file
10
test/autotests/taglib-lookup/forEachAttribute/expected.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[
|
||||||
|
"name",
|
||||||
|
"age",
|
||||||
|
"foo-on-*",
|
||||||
|
"if",
|
||||||
|
"else-if",
|
||||||
|
"else",
|
||||||
|
"for",
|
||||||
|
"while"
|
||||||
|
]
|
||||||
12
test/autotests/taglib-lookup/forEachAttribute/marko.json
Normal file
12
test/autotests/taglib-lookup/forEachAttribute/marko.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"<foo>": {
|
||||||
|
"@name": "string",
|
||||||
|
"@age": "integer",
|
||||||
|
"@foo-on-*": {
|
||||||
|
"pattern": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"<bar>": {
|
||||||
|
"@baz": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
12
test/autotests/taglib-lookup/forEachAttribute/test.js
Normal file
12
test/autotests/taglib-lookup/forEachAttribute/test.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
exports.check = function(markoCompiler, expect, helpers) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
|
|
||||||
|
var attrNames = [];
|
||||||
|
|
||||||
|
lookup.forEachAttribute('foo', (attr) => {
|
||||||
|
attrNames.push(attr.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.compare(attrNames, '.json');
|
||||||
|
};
|
||||||
33
test/autotests/taglib-lookup/forEachTag/expected.json
Normal file
33
test/autotests/taglib-lookup/forEachTag/expected.json
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
[
|
||||||
|
"*",
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"assign",
|
||||||
|
"else",
|
||||||
|
"else-if",
|
||||||
|
"for",
|
||||||
|
"if",
|
||||||
|
"include",
|
||||||
|
"include-text",
|
||||||
|
"invoke",
|
||||||
|
"macro",
|
||||||
|
"macro-body",
|
||||||
|
"marko-preserve-whitespace",
|
||||||
|
"pre",
|
||||||
|
"script",
|
||||||
|
"style",
|
||||||
|
"textarea",
|
||||||
|
"unless",
|
||||||
|
"var",
|
||||||
|
"while",
|
||||||
|
"layout-use",
|
||||||
|
"layout-put",
|
||||||
|
"layout-placeholder",
|
||||||
|
"html-comment",
|
||||||
|
"async-fragment",
|
||||||
|
"async-fragments",
|
||||||
|
"async-fragment-placeholder",
|
||||||
|
"async-fragment-timeout",
|
||||||
|
"async-fragment-error",
|
||||||
|
"cached-fragment"
|
||||||
|
]
|
||||||
11
test/autotests/taglib-lookup/forEachTag/marko.json
Normal file
11
test/autotests/taglib-lookup/forEachTag/marko.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"<*>": {
|
||||||
|
"@global-attribute": "boolean"
|
||||||
|
},
|
||||||
|
"<foo>": {
|
||||||
|
"@name": "string"
|
||||||
|
},
|
||||||
|
"<bar>": {
|
||||||
|
"@name": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
11
test/autotests/taglib-lookup/forEachTag/test.js
Normal file
11
test/autotests/taglib-lookup/forEachTag/test.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
exports.check = function(markoCompiler, expect, helpers) {
|
||||||
|
var lookup = markoCompiler.buildTaglibLookup(__dirname);
|
||||||
|
|
||||||
|
var tagNames = [];
|
||||||
|
|
||||||
|
lookup.forEachTag((tag) => {
|
||||||
|
tagNames.push(tag.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.compare(tagNames, '.json');
|
||||||
|
};
|
||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
// console.log('LOOKUP: ', Object.keys(lookup.attributes));
|
// console.log('LOOKUP: ', Object.keys(lookup.attributes));
|
||||||
var attrDef = lookup.getAttribute('test-dynamic-attributes', 'global-attribute');
|
var attrDef = lookup.getAttribute('test-dynamic-attributes', 'global-attribute');
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
// console.log(Object.keys(lookup.attributes));
|
// console.log(Object.keys(lookup.attributes));
|
||||||
var attr = lookup.getAttribute('nested-foo', 'attr1');
|
var attr = lookup.getAttribute('nested-foo', 'attr1');
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
var tag = lookup.getTag('nested-foo');
|
var tag = lookup.getTag('nested-foo');
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var transformers = [];
|
var transformers = [];
|
||||||
|
|
||||||
|
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
|
|
||||||
lookup.forEachTagTransformer('div', function(transformer) {
|
lookup.forEachTagTransformer('div', function(transformer) {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var transformers = [];
|
var transformers = [];
|
||||||
|
|
||||||
var lookup = taglibLookup.buildLookup(__dirname);
|
var lookup = taglibLookup.buildLookup(__dirname);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
exports.check = function(taglibLookup, expect) {
|
exports.check = function(markoCompiler, expect) {
|
||||||
|
var taglibLookup = markoCompiler.taglibLookup;
|
||||||
var transformers;
|
var transformers;
|
||||||
var lookup;
|
var lookup;
|
||||||
// lookup = taglibLookup.buildLookup(nodePath.join(__dirname, 'fixtures/nested'));
|
// lookup = taglibLookup.buildLookup(nodePath.join(__dirname, 'fixtures/nested'));
|
||||||
|
|||||||
@ -8,14 +8,14 @@ var expect = require('chai').expect;
|
|||||||
var nodePath = require('path');
|
var nodePath = require('path');
|
||||||
require('../compiler');
|
require('../compiler');
|
||||||
var autotest = require('./autotest');
|
var autotest = require('./autotest');
|
||||||
var taglibLookup = require('../compiler').taglibLookup;
|
var markoCompiler = require('../compiler');
|
||||||
|
|
||||||
describe('taglib-lookup' , function() {
|
describe('taglib-lookup' , function() {
|
||||||
var autoTestDir = nodePath.join(__dirname, 'autotests/taglib-lookup');
|
var autoTestDir = nodePath.join(__dirname, 'autotests/taglib-lookup');
|
||||||
|
|
||||||
autotest.scanDir(autoTestDir, function run(dir, helpers, done) {
|
autotest.scanDir(autoTestDir, function run(dir, helpers, done) {
|
||||||
var test = require(nodePath.join(dir, 'test.js'));
|
var test = require(nodePath.join(dir, 'test.js'));
|
||||||
test.check(taglibLookup, expect);
|
test.check(markoCompiler, expect, helpers);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user