marko/compiler/taglibs/taglib-lookup.js
Patrick Steele-Idem 43f2662606 Fixed licensing
2015-08-18 14:28:30 -06:00

75 lines
2.1 KiB
JavaScript

/*
* Copyright 2011 eBay Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var taglibLoader = require('./taglib-loader');
var taglibFinder = require('./taglib-finder');
var TaglibLookup = require('./TaglibLookup');
exports.registeredTaglibs = [];
var lookupCache = {};
function buildLookup(dirname) {
var taglibs = taglibFinder.find(dirname, exports.registeredTaglibs);
var lookupCacheKey = taglibs
.map(function(taglib) {
return taglib.id;
})
.join(',');
var lookup = lookupCache[lookupCacheKey];
if (lookup === undefined) {
lookup = new TaglibLookup();
// The taglibs "closer" to the template will be earlier in the list
// and the taglibs "farther" from the template will be later. We
// want closer taglibs to take precedence (especially when de-duping)
// so we loop from beginning to end. We used to loop from the end
// to the beginning, but that appears to have been a mistake.
for (var i=0; i<taglibs.length; 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;
}
return lookup;
}
function registerTaglib(taglib) {
if (typeof taglib === 'string') {
taglib = taglibLoader.load(taglib);
}
exports.registeredTaglibs.push(taglib);
}
exports.excludeDir = taglibFinder.excludeDir;
exports.registerTaglib = registerTaglib;
exports.buildLookup = buildLookup;
exports.clearCaches = function() {
lookupCache = {};
};