"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parser = require("raml-1-parser");
var _ = require("underscore");
var tools = require("../common/tools");
var _labelProviders = [];
var _decorators = [];
var _categoryFilters = {};
var _visibilityFilter = null;
var _contentProvider = null;
var _keyProvider = null;
function addLabelProvider(provider) {
_labelProviders.push(provider);
}
exports.addLabelProvider = addLabelProvider;
function addDecorator(decorator) {
_decorators.push(decorator);
}
exports.addDecorator = addDecorator;
function addCategoryFilter(categoryName, categoryFilter) {
_categoryFilters[categoryName] = categoryFilter;
}
exports.addCategoryFilter = addCategoryFilter;
function setVisibilityFilter(visibilityFilter) {
_visibilityFilter = visibilityFilter;
}
exports.setVisibilityFilter = setVisibilityFilter;
function setContentProvider(contentProvider) {
_contentProvider = contentProvider;
}
exports.setContentProvider = setContentProvider;
function setKeyProvider(keyProvider) {
_keyProvider = keyProvider;
}
exports.setKeyProvider = setKeyProvider;
var StructureNodeImpl = (function () {
function StructureNodeImpl(hlSource) {
this.hlSource = hlSource;
}
StructureNodeImpl.prototype.getSource = function () {
return this.hlSource;
};
StructureNodeImpl.prototype.toJSON = function () {
var result = {
text: this.text,
typeText: this.typeText,
icon: this.icon,
textStyle: this.textStyle,
children: [],
key: this.key,
start: this.start,
end: this.end,
selected: this.selected,
category: this.category
};
Eif (this.children) {
this.children.forEach(function (child) {
result.children.push(child.toJSON());
});
}
return result;
};
return StructureNodeImpl;
}());
function isStructureNodeImpl(node) {
return node.getSource != null;
}
function getLabelProvider(node) {
Iif (!_labelProviders)
return null;
var source = node.getSource();
Iif (!source)
return null;
return _.find(_labelProviders, function (labelProvider) { return labelProvider.getLabelText(source) != null; });
}
function getDecorator(node) {
Iif (!_decorators)
return null;
var source = node.getSource();
Iif (!source)
return null;
return _.find(_decorators, function (decorator) {
return decorator.getIcon(source) != null || decorator.getTextStyle(source) != null;
});
}
function hlNodeToStructureNode(hlNode, selected) {
Iif (!hlNode)
return null;
var result = new StructureNodeImpl(hlNode);
var labelProvider = getLabelProvider(result);
Eif (labelProvider) {
result.text = labelProvider.getLabelText(hlNode);
result.typeText = labelProvider.getTypeText(hlNode);
}
var decorator = getDecorator(result);
if (decorator) {
result.icon = decorator.getIcon(hlNode);
result.textStyle = decorator.getTextStyle(hlNode);
}
Eif (_keyProvider) {
result.key = _keyProvider(hlNode);
}
result.start = hlNode.getLowLevelStart();
result.end = hlNode.getLowLevelEnd();
if (selected && selected.isSameNode(hlNode))
result.selected = true;
return result;
}
function cloneNode(toClone) {
var result = new StructureNodeImpl(toClone.getSource());
result.text = toClone.text;
result.typeText = toClone.typeText;
result.icon = toClone.icon;
result.textStyle = toClone.textStyle;
result.children = toClone.children;
result.key = toClone.key;
result.start = toClone.start;
result.end = toClone.end;
result.selected = toClone.selected;
result.category = toClone.category;
return result;
}
function filterTreeByCategory(root, categoryName) {
Iif (!root.children)
return;
var result = cloneNode(root);
var filteredChildren = root.children;
Eif (categoryName) {
var filter = _categoryFilters[categoryName];
Eif (filter) {
filteredChildren =
_.filter(root.children, function (child) { return filter(child.getSource()); });
filteredChildren.forEach(function (filteredChild) { return filteredChild.category = categoryName; });
}
}
result.children = filteredChildren;
return result;
}
function buildTreeRecursively(structureNode, contentProvider) {
var children = contentProvider(structureNode);
Eif (children) {
structureNode.children = children;
children.forEach(function (child) { return buildTreeRecursively(child, contentProvider); });
}
else {
structureNode.children = [];
}
}
var _selected = null;
function defaultContentProvider(node) {
Iif (node === null) {
return [];
}
var isStructureImpl = isStructureNodeImpl(node);
Iif (!isStructureImpl)
return;
var source = node.getSource();
Iif (source == null)
return [];
Iif (source.isAttr()) {
return [];
}
Iif (source.isUnknown()) {
return [];
}
var sourceChildren = source.children();
var filteredSourceChildren = sourceChildren.filter(function (child) { return !child.isAttr() && !child.isUnknown(); });
var result = [];
filteredSourceChildren.forEach(function (child) {
Iif (_visibilityFilter && !_visibilityFilter(child))
return;
var converted = hlNodeToStructureNode(child, _selected);
Iif (!converted)
return;
result.push(converted);
});
return result;
}
function getStructure(categoryName) {
var hlRoot = tools.getRootNode();
if (!hlRoot)
return null;
var _selected = tools.getCurrentNode();
var structureRoot = hlNodeToStructureNode(hlRoot, _selected);
if (!structureRoot)
return null;
var contentProvider = _contentProvider;
if (!contentProvider)
contentProvider = defaultContentProvider;
buildTreeRecursively(structureRoot, contentProvider);
var result = filterTreeByCategory(structureRoot, categoryName);
return result;
}
exports.getStructure = getStructure;
function getStructureForAllCategories() {
var hlRoot = tools.getRootNode();
Iif (!hlRoot)
return null;
var _selected = tools.getCurrentNode();
var structureRoot = hlNodeToStructureNode(hlRoot, _selected);
Iif (!structureRoot)
return null;
var contentProvider = _contentProvider;
Eif (!contentProvider)
contentProvider = defaultContentProvider;
buildTreeRecursively(structureRoot, contentProvider);
var result = {};
for (var categoryName in _categoryFilters) {
Eif (_categoryFilters.hasOwnProperty(categoryName)) {
var filteredTree = filterTreeByCategory(structureRoot, categoryName);
result[categoryName] = filteredTree;
}
}
return result;
}
exports.getStructureForAllCategories = getStructureForAllCategories;
//# sourceMappingURL=structureImpl.js.map |