Fixed issue where compiler would pass in detached text node if previous markup would have removed it.

This commit is contained in:
Misko Hevery 2010-10-12 21:52:04 -07:00
parent d9abfe8a7e
commit 2cb9497d02
4 changed files with 59 additions and 16 deletions

View file

@ -0,0 +1,24 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns:ng="http://angularjs.org">
<head>
<script type="text/javascript" src="../src/angular-bootstrap.js" ng:autobind></script>
<script type="text/javascript">
angular.markup('-'+'--', function(text, textNode, parentElement) {
var compiler = this;
var index = text.indexOf('-'+'--');
if (index > -1) {
textNode.after(text.substring(index + 3));
textNode.after('<hr/>');
textNode.after(compiler.text(text.substring(0, index)));
textNode.remove();
}
});
</script>
</head>
<body>
{{1+3}}
xxx
---
xxx
<select name="something"><option selected="true">{{'a'}}</option><option value="">{{'b'}}</option><option>C</option></select></body>
</html>

View file

@ -158,12 +158,17 @@ Compiler.prototype = {
}
if (descend){
// process markup for text nodes only
eachTextNode(element, function(textNode){
var text = textNode.text();
foreach(self.markup, function(markup){
markup.call(selfApi, text, textNode, element);
});
});
for(var i=0, child=element[0].childNodes;
i<child.length; i++) {
if (isTextNode(child[i])) {
foreach(self.markup, function(markup){
if (i<child.length) {
var textNode = jqLite(child[i]);
markup.call(selfApi, textNode.text(), textNode, element);
}
});
}
}
}
if (directives) {
@ -187,15 +192,6 @@ Compiler.prototype = {
}
};
function eachTextNode(element, fn){
var i, chldNodes = element[0].childNodes || [], chld;
for (i = 0; i < chldNodes.length; i++) {
if(isTextNode(chld = chldNodes[i])) {
fn(jqLite(chld), i);
}
}
}
function eachNode(element, fn){
var i, chldNodes = element[0].childNodes || [], chld;
for (i = 0; i < chldNodes.length; i++) {

View file

@ -52,8 +52,8 @@ angularTextMarkup('{{}}', function(text, textNode, parentElement) {
cursor.after(newElement);
cursor = newElement;
});
textNode.remove();
}
textNode.remove();
}
});

View file

@ -134,4 +134,27 @@ describe('compiler', function(){
expect(scope.$element.text()).toEqual('3');
});
it('should allow multiple markups per text element', function(){
markup.push(function(text, textNode, parent){
var index = text.indexOf('---');
if (index > -1) {
textNode.after(text.substring(index + 3));
textNode.after("<hr/>");
textNode.after(text.substring(0, index));
textNode.remove();
}
});
markup.push(function(text, textNode, parent){
var index = text.indexOf('===');
if (index > -1) {
textNode.after(text.substring(index + 3));
textNode.after("<p>");
textNode.after(text.substring(0, index));
textNode.remove();
}
});
var scope = compile('A---B---C===D');
expect(sortedHtml(scope.$element)).toEqual('<div>A<hr></hr>B<hr></hr>C<p></p>D</div>');
});
});