UNPKG

linagora-rse

Version:
146 lines (127 loc) 3.82 kB
'use strict'; angular.module('esn.oembed', [ 'esn.registry' ]) .directive('oembeds', function($compile, $log, oembedService) { return { restrict: 'E', scope: { message: '=', maxwidth: '=', maxheight: '=' }, link: function($scope, $element) { if (!$scope.message || $scope.message.length === 0) { $log.debug('Can not process oembed for empty text'); return; } oembedService.getLinks($scope.message).forEach(function(link) { $log.debug('Processing oembed for link', link); var oembed = oembedService.getProvider(link); if (oembed) { var e = angular.element('<' + oembed.name + '-oembed></' + oembed.name + '-oembed>'); e.attr({url: link, maxwidth: $scope.maxwidth, maxheight: $scope.maxheight}); var template = angular.element(e); var newElt = $compile(template)($scope); $element.append(newElt); } else { $log.debug('No oembed provider found for', link); } }); } }; }) .factory('oembedService', function($log, oembedRegistry) { function getLinks(text) { var source = (text || '').toString(); var urlArray = []; var regexToken = /(((https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g; var matchArray = regexToken.exec(source); while (matchArray !== null) { var token = matchArray[0]; urlArray.push(token); matchArray = regexToken.exec(source); } return urlArray; } function validate(url, regExps) { return regExps.some(function(regexp) { if (url.match(regexp) !== null) { return true; } return false; }); } function getProvider(url) { var providers = oembedRegistry.getProviders(); var provider = null; angular.forEach(providers, function(value, key) { if (validate(url, value.regexps)) { provider = value; } else { $log.debug('URL ' + url + ' does not match the provider ' + key); } }); return provider; } function fixHttpLinks(fragment) { if (!fragment) { return; } var re = new RegExp('https?:\\/\\/', 'g'); return fragment.replace(re, '//'); } return { getLinks: getLinks, getProvider: getProvider, fixHttpLinks: fixHttpLinks }; }) .factory('oembedRegistry', function(esnRegistry) { var registry = esnRegistry('oembed'); return { getProviders: registry.getAll.bind(registry), addProvider: registry.add.bind(registry) }; }) .factory('oembedResolver', function($http) { return { yql: function(oembed, url, width, height) { var q = 'select * from json where url ="' + oembed.endpoint + '?url=' + url; if (width) { q = q + '&maxwidth=' + width; } if (height) { q = q + '&maxheight=' + height; } if (oembed.format) { q = q + '&format=' + oembed.format; } q = q + '"'; return $http.get('//query.yahooapis.com/v1/public/yql', { params: { q: q, format: 'json' } }).then(function(response) { if (response.data.query.count > 0) { return response.data.query.results.json; } else { return {}; } }); }, http: function(oembed, url, width, height) { return $http.get(oembed.endpoint, { params: { format: 'json', maxwidth: width, maxheight: height, url: url } }).then(function(response) { return response.data; }); } }; });