@@ -161,8 +161,8 @@ function $CompileProvider($provide) {
161161 }
162162 } ;
163163
164- function compile ( $compileNodes ) {
165- var compositeLinkFn = compileNodes ( $compileNodes ) ;
164+ function compile ( $compileNodes , maxPriority ) {
165+ var compositeLinkFn = compileNodes ( $compileNodes , maxPriority ) ;
166166
167167 return function publicLinkFn ( scope , cloneAttachFn , options ) {
168168 options = options || { } ;
@@ -183,19 +183,19 @@ function $CompileProvider($provide) {
183183 } ;
184184 }
185185
186- function compileNodes ( $compileNodes ) {
186+ function compileNodes ( $compileNodes , maxPriority ) {
187187 var linkFns = [ ] ;
188- _ . forEach ( $compileNodes , function ( node , i ) {
189- var attrs = new Attributes ( $ ( node ) ) ;
190- var directives = collectDirectives ( node , attrs ) ;
188+ _ . times ( $compileNodes . length , function ( i ) {
189+ var attrs = new Attributes ( $ ( $compileNodes [ i ] ) ) ;
190+ var directives = collectDirectives ( $compileNodes [ i ] , attrs , maxPriority ) ;
191191 var nodeLinkFn ;
192192 if ( directives . length ) {
193- nodeLinkFn = applyDirectivesToNode ( directives , node , attrs ) ;
193+ nodeLinkFn = applyDirectivesToNode ( directives , $compileNodes [ i ] , attrs ) ;
194194 }
195195 var childLinkFn ;
196196 if ( ( ! nodeLinkFn || ! nodeLinkFn . terminal ) &&
197- node . childNodes && node . childNodes . length ) {
198- childLinkFn = compileNodes ( node . childNodes ) ;
197+ $compileNodes [ i ] . childNodes && $compileNodes [ i ] . childNodes . length ) {
198+ childLinkFn = compileNodes ( $compileNodes [ i ] . childNodes ) ;
199199 }
200200 if ( nodeLinkFn && nodeLinkFn . scope ) {
201201 attrs . $$element . addClass ( 'ng-scope' ) ;
@@ -279,12 +279,12 @@ function $CompileProvider($provide) {
279279 return false ;
280280 }
281281
282- function collectDirectives ( node , attrs ) {
282+ function collectDirectives ( node , attrs , maxPriority ) {
283283 var directives = [ ] ;
284284 var match ;
285285 if ( node . nodeType === Node . ELEMENT_NODE ) {
286286 var normalizedNodeName = directiveNormalize ( nodeName ( node ) . toLowerCase ( ) ) ;
287- addDirective ( directives , normalizedNodeName , 'E' ) ;
287+ addDirective ( directives , normalizedNodeName , 'E' , maxPriority ) ;
288288 _ . forEach ( node . attributes , function ( attr ) {
289289 var attrStartName , attrEndName ;
290290 var name = attr . name ;
@@ -309,7 +309,7 @@ function $CompileProvider($provide) {
309309 }
310310 }
311311 normalizedAttrName = directiveNormalize ( name . toLowerCase ( ) ) ;
312- addDirective ( directives , normalizedAttrName , 'A' , attrStartName , attrEndName ) ;
312+ addDirective ( directives , normalizedAttrName , 'A' , maxPriority , attrStartName , attrEndName ) ;
313313 if ( isNgAttr || ! attrs . hasOwnProperty ( normalizedAttrName ) ) {
314314 attrs [ normalizedAttrName ] = attr . value . trim ( ) ;
315315 if ( isBooleanAttribute ( node , normalizedAttrName ) ) {
@@ -322,7 +322,7 @@ function $CompileProvider($provide) {
322322 if ( _ . isString ( className ) && ! _ . isEmpty ( className ) ) {
323323 while ( ( match = / ( [ \d \w \- _ ] + ) (?: \: ( [ ^ ; ] + ) ) ? ; ? / . exec ( className ) ) ) {
324324 var normalizedClassName = directiveNormalize ( match [ 1 ] ) ;
325- if ( addDirective ( directives , normalizedClassName , 'C' ) ) {
325+ if ( addDirective ( directives , normalizedClassName , 'C' , maxPriority ) ) {
326326 attrs [ normalizedClassName ] = match [ 2 ] ? match [ 2 ] . trim ( ) : undefined ;
327327 }
328328 className = className . substr ( match . index + match [ 0 ] . length ) ;
@@ -332,7 +332,7 @@ function $CompileProvider($provide) {
332332 match = / ^ \s * d i r e c t i v e \: \s * ( [ \d \w \- _ ] + ) \s * ( .* ) $ / . exec ( node . nodeValue ) ;
333333 if ( match ) {
334334 var normalizedName = directiveNormalize ( match [ 1 ] ) ;
335- if ( addDirective ( directives , normalizedName , 'M' ) ) {
335+ if ( addDirective ( directives , normalizedName , 'M' , maxPriority ) ) {
336336 attrs [ normalizedName ] = match [ 2 ] ? match [ 2 ] . trim ( ) : undefined ;
337337 }
338338 }
@@ -341,12 +341,13 @@ function $CompileProvider($provide) {
341341 return directives ;
342342 }
343343
344- function addDirective ( directives , name , mode , attrStartName , attrEndName ) {
344+ function addDirective ( directives , name , mode , maxPriority , attrStartName , attrEndName ) {
345345 var match ;
346346 if ( hasDirectives . hasOwnProperty ( name ) ) {
347347 var foundDirectives = $injector . get ( name + 'Directive' ) ;
348348 var applicableDirectives = _ . filter ( foundDirectives , function ( dir ) {
349- return dir . restrict . indexOf ( mode ) !== - 1 ;
349+ return ( maxPriority === undefined || maxPriority > dir . priority ) &&
350+ dir . restrict . indexOf ( mode ) !== - 1 ;
350351 } ) ;
351352 _ . forEach ( applicableDirectives , function ( directive ) {
352353 if ( attrStartName ) {
@@ -488,9 +489,17 @@ function $CompileProvider($provide) {
488489 throw 'Multiple directives asking for transclude' ;
489490 }
490491 hasTranscludeDirective = true ;
491- var $transcludedNodes = $compileNode . clone ( ) . contents ( ) ;
492- childTranscludeFn = compile ( $transcludedNodes ) ;
493- $compileNode . empty ( ) ;
492+ if ( directive . transclude === 'element' ) {
493+ var $originalCompileNode = $compileNode ;
494+ $compileNode = attrs . $$element = $ ( document . createComment ( ' ' + directive . name + ': ' + attrs [ directive . name ] + ' ' ) ) ;
495+ $originalCompileNode . replaceWith ( $compileNode ) ;
496+ terminalPriority = directive . priority ;
497+ childTranscludeFn = compile ( $originalCompileNode , terminalPriority ) ;
498+ } else {
499+ var $transcludedNodes = $compileNode . clone ( ) . contents ( ) ;
500+ childTranscludeFn = compile ( $transcludedNodes ) ;
501+ $compileNode . empty ( ) ;
502+ }
494503 }
495504 if ( directive . template ) {
496505 if ( templateDirective ) {
0 commit comments