webcol/Calima

View on GitHub
public_/librerias/angular/js/migrate/namespaceAliases.js

Summary

Maintainability
A
1 hr
Test Coverage
(function() {
  'use strict';      

  var module = angular.module('mobile-angular-ui.migrate.namespaceAliases', []);

  var uncamelize = function(text) {
    var separator = "-";

    text = text.replace(/[A-Z]/g, function (letter) {
      return separator + letter.toLowerCase();
    });
   
    return text.replace("/^" + separator + "/", '');   
  };

  var aliasDirective = function(aliasName, targetDirective, options) {
    options = options || {};
    var beforeLink = options.beforeLink;
    var restrict = options.restrict || 'A';
    module.directive(aliasName, ['$compile', function($compile){
      return {
          restrict: restrict,

          // this should be higher than any other directives
          // declared for the same element
          priority: 99999,
          compile: function(elem, attrs){
            var placeholder = angular.element(document.createElement('div'));
            elem.after(placeholder);
            
            var dasherizedTarget = uncamelize(targetDirective);
            var dasherizedAlias = uncamelize(aliasName);

            if (restrict.match(/A/)) {
              // Replace old attr with new attr
              elem.attr(dasherizedTarget, elem.attr(dasherizedAlias));
              elem.removeAttr(dasherizedAlias);
            }

            if (restrict.match(/E/)) {
              elem[0].name = dasherizedTarget;
            }
            
            if (beforeLink) {
              beforeLink(elem, attrs);
            }

            // Detach element until link phase 
            // so Angular wont go down to the children.
            elem.remove();
            
            return function(scope){
              placeholder.replaceWith(elem);
              $compile(elem)(scope);
              elem = null;
            };
          }
      };
    }]);
  };

  aliasDirective('switch', 'uiSwitch', {restrict: 'EA'});
  aliasDirective('contentFor', 'uiContentFor', {
    beforeLink: function(elem) {
      elem.attr('uiDuplicate', elem.attr('duplicate'));
    }
  });
  aliasDirective('yieldTo', 'uiYieldTo');
}());