marko/compiler/util/html-elements.js
2017-02-08 19:55:53 -08:00

78 lines
1.8 KiB
JavaScript

var lassoPackageRoot = require('lasso-package-root');
var path = require('path');
var lassoCachingFS = require('lasso-caching-fs');
var fs = require('fs');
var stripJsonComments = require('strip-json-comments');
var fsReadOptions = { encoding: 'utf8' };
function parseJSONFile(path) {
var json = fs.readFileSync(path, fsReadOptions);
try {
var taglibProps = JSON.parse(stripJsonComments(json));
return taglibProps;
} catch(e) {
throw new Error('Unable to parse JSON file at path "' + path + '". Error: ' + e);
}
}
function loadTags(file) {
var raw = parseJSONFile(file);
var tags = {};
for (var k in raw) {
if (raw.hasOwnProperty(k)) {
if (k.charAt(0) === '<' && k.charAt(k.length - 1) === '>') {
var tagName = k.substring(1, k.length - 1);
tags[tagName] = true;
}
}
}
return tags;
}
var cache = {};
function getPackageRootDir(dirname) {
try {
return lassoPackageRoot.getRootDir(dirname);
} catch(e) {
return undefined;
}
}
function isRegisteredElement(tagName, dir) {
var packageRootDir = getPackageRootDir(dir);
var currentDir = dir;
while (true) {
var filePath = path.join(currentDir, 'html-elements.json');
if (lassoCachingFS.existsSync(filePath)) {
var tags = cache[filePath];
if (!tags) {
tags = cache[filePath] = loadTags(filePath);
}
if (tags[tagName]) {
return true;
}
}
var parentDir = path.dirname(currentDir);
if (!parentDir || parentDir === currentDir || parentDir === packageRootDir) {
break;
}
currentDir = parentDir;
}
return false;
}
exports.isRegisteredElement = isRegisteredElement;