linagora-rse
Version:
104 lines (88 loc) • 2.84 kB
JavaScript
;
angular.module('esn.parser', ['ngSanitize'])
.factory('parserResolver', function($q) {
var parsers = {};
function register(parserName, resolver) {
if (!parserName) {
throw new Error('ParserName can not be null');
}
if (!resolver) {
throw new Error('Resolver can not be null');
}
if (!angular.isFunction(resolver)) {
throw new Error('Resolver must be a function');
}
parsers[parserName] = resolver;
}
function resolve(parser, text) {
if (!parser) {
return $q.reject(new Error(parser + ' is not a valid parser name'));
}
if (!text) {
return $q.reject(new Error('Text to parse is required'));
}
var resolver = parsers[parser];
if (!resolver) {
return $q.reject(new Error(parser + ' is not a registered parser'));
}
return resolver(text);
}
/**
* Resolve the text by parsing it with all parsers.
* The text to parse is given to parsers in the array order.
* The input of a parser is the output of the previous parser or the given text for the first parser.
* The list of parsers must be :
* [
* {name: 'markdown'},
* {name: 'parser2'},
* ...
* ]
*
* @param {object[]} parsers the list of parsers
* @param {string} text the text to parse
* @return {object} a promise with the final parsed text
*/
function resolveChain(parsers, text) {
if (!parsers) {
return $q.reject(new Error('Parsers is required'));
}
if (!Array.isArray(parsers)) {
return $q.reject(new Error('Parsers must be an array'));
}
if (!text) {
return $q.reject(new Error('Text is required'));
}
function onResult(result) {
if (parsers.length) {
var parser = parsers.shift();
return resolve(parser.name, result).then(onResult);
} else {
return $q.when(result);
}
}
return $q.when(text).then(onResult);
}
return {
register: register,
resolve: resolve,
resolveChain: resolveChain
};
})
.directive('textParser', function(parserResolver, $log, $filter) {
return {
restrict: 'E',
link: function($scope, element, attrs) {
var parsers = attrs.parsers ? JSON.parse(attrs.parsers) : attrs.parsers;
var text = attrs.text;
if (!parsers || parsers.length === 0) {
return element.html($filter('linky')(text, '_blank'));
}
parserResolver.resolveChain(parsers, text).then(function(result) {
element.html(result);
}, function(err) {
$log.error('The text is displayed without modification : ', err);
element.html(text);
});
}
};
});