/** * Service which exposes access to the documentation metadata. */ angular.module('quay').factory('DocumentationService', ['Config', '$timeout', function(Config, $timeout) { var documentationService = {}; var documentationData = null; var documentationFailure = false; var MINIMUM_KEYWORD_LENGTH = 3; var TITLE_MATCH_SCORE = 1; var CONTENT_MATCH_SCORE = 0.5; documentationService.findDocumentation = function($scope, keywords, callback, opt_mapper, opt_threshold) { opt_threshold = opt_threshold || 0; documentationService.loadDocumentation(function(metadata) { if (!metadata) { $scope.$apply(function() { callback([]); }); return; } var results = []; metadata.forEach(function(page) { var score = 0; keywords.forEach(function(keyword) { if (keyword.length < MINIMUM_KEYWORD_LENGTH) { return; } var title = page.title || ''; var content = page.content || ''; if (title.toLowerCase().indexOf(keyword.toLowerCase()) >= 0) { score += TITLE_MATCH_SCORE; } if (content.toLowerCase().indexOf(keyword.toLowerCase()) >= 0) { score += CONTENT_MATCH_SCORE; } }); if (score > opt_threshold) { results.push(opt_mapper ? opt_mapper(page, score) : {'page': page, 'score': score}); } }); $scope.$apply(function() { results.sort(function(a, b) { return b.score - a.score; }); callback(results); }); }); }; documentationService.loadDocumentation = function(callback) { if (documentationFailure) { $timeout(function() { callback(null); }); return; } if (documentationData != null) { $timeout(function() { callback(documentationData); }); return; } $.ajax(Config.DOCUMENTATION_METADATA) .done(function(r) { documentationData = r; callback(documentationData); }) .fail(function() { documentationFailure = true; }); }; return documentationService; }]);