Skip to content

Commit 717c291

Browse files
SimeonCSimeonC
SimeonC
authored and
SimeonC
committedNov 4, 2014
feat(taBind): Press enter to escape a blockquote
See #377
1 parent 00954fa commit 717c291

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed
 

‎src/textAngular.js

+22
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,27 @@ See README.md or https://github.com/fraywing/textAngular/wiki for requirements a
13321332
_redo();
13331333
event.preventDefault();
13341334
}
1335+
/* istanbul ignore next: difficult to test as can't seem to select */
1336+
}else if(event.keyCode === 13 && !event.shiftKey){
1337+
var selection = taSelection.getSelectionElement();
1338+
if(!selection.tagName.match(VALIDELEMENTS)) return;
1339+
var _new = angular.element(_defaultVal);
1340+
if (/^<br(|\/)>$/i.test(selection.innerHTML.trim()) && selection.parentNode.tagName.toLowerCase() === 'blockquote' && !selection.nextSibling) {
1341+
// if last element in blockquote and element is blank, pull element outside of blockquote.
1342+
$selection = angular.element(selection);
1343+
var _parent = $selection.parent();
1344+
_parent.after(_new);
1345+
$selection.remove();
1346+
if(_parent.children().length === 0) _parent.remove();
1347+
taSelection.setSelectionToElementStart(_new[0]);
1348+
event.preventDefault();
1349+
}else if (/^<[^>]+><br(|\/)><\/[^>]+>$/i.test(selection.innerHTML.trim()) && selection.tagName.toLowerCase() === 'blockquote'){
1350+
$selection = angular.element(selection);
1351+
$selection.after(_new);
1352+
$selection.remove();
1353+
taSelection.setSelectionToElementStart(_new[0]);
1354+
event.preventDefault();
1355+
}
13351356
}
13361357
}
13371358
});
@@ -1349,6 +1370,7 @@ See README.md or https://github.com/fraywing/textAngular/wiki for requirements a
13491370
while(!selection.tagName.match(VALIDELEMENTS) && selection !== element[0]){
13501371
selection = selection.parentNode;
13511372
}
1373+
13521374
if(selection.tagName.toLowerCase() !== attrs.taDefaultWrap && selection.tagName.toLowerCase() !== 'li' && (selection.innerHTML.trim() === '' || selection.innerHTML.trim() === '<br>')){
13531375
var _new = angular.element(_defaultVal);
13541376
angular.element(selection).replaceWith(_new);

‎test/taBind/taBind.spec.js

+21
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,27 @@ describe('taBind', function () {
281281
expect(element.html()).toBe('<b><br></b>');
282282
element.remove();
283283
}));
284+
it('should escape blockquote when only empty element', inject(function($rootScope, $compile, $window, $document){
285+
$rootScope.html = '<blockquote><p><br></p></blockquote>';
286+
element = $compile('<div ta-bind contenteditable="contenteditable" ng-model="html"></div>')($rootScope);
287+
$document.find('body').append(element);
288+
$rootScope.$digest();
289+
var range = $window.rangy.createRangyRange();
290+
range.selectNodeContents(element.find('p')[0]);
291+
$window.rangy.getSelection().setSingleRange(range);
292+
var event;
293+
if(angular.element === jQuery){
294+
event = jQuery.Event('keydown');
295+
event.keyCode = 13;
296+
element.triggerHandler(event);
297+
}else{
298+
event = {keyCode: 13};
299+
element.triggerHandler('keydown', event);
300+
}
301+
$rootScope.$digest();
302+
expect(element.html()).toBe('<p><br></p>');
303+
element.remove();
304+
}));
284305
});
285306
});
286307
});

0 commit comments

Comments
 (0)