Performance improvement for getRenderedContents

Instead of calling $.append for every single char - buffer and call $.append only when really needed.

Change-Id: I53acfa795ea5dc6a8ca39ce11017daa85c9151d2
This commit is contained in:
Inez Korczyński 2013-04-25 14:04:51 -07:00
parent e7ee9564e6
commit 93357b8f34

View file

@ -78,9 +78,18 @@ ve.ce.ContentBranchNode.prototype.getRenderedContents = function () {
annotationStack = new ve.dm.AnnotationSet( store ), annotationStack = new ve.dm.AnnotationSet( store ),
annotatedHtml = [], annotatedHtml = [],
$wrapper = $( '<div>' ), $wrapper = $( '<div>' ),
$current = $wrapper; $current = $wrapper,
buffer = '';
function flushBuffer() {
if ( buffer !== '' ) {
$current.append( buffer );
buffer = '';
}
}
function openAnnotation( annotation ) { function openAnnotation( annotation ) {
flushBuffer();
// Create a new DOM node and descend into it // Create a new DOM node and descend into it
$ann = ve.ce.annotationFactory.create( annotation.getType(), annotation ).$; $ann = ve.ce.annotationFactory.create( annotation.getType(), annotation ).$;
$current.append( $ann ); $current.append( $ann );
@ -88,6 +97,7 @@ ve.ce.ContentBranchNode.prototype.getRenderedContents = function () {
} }
function closeAnnotation() { function closeAnnotation() {
flushBuffer();
// Traverse up // Traverse up
$current = $current.parent(); $current = $current.parent();
} }
@ -111,10 +121,15 @@ ve.ce.ContentBranchNode.prototype.getRenderedContents = function () {
openAnnotation, closeAnnotation openAnnotation, closeAnnotation
); );
// Output the actual HTML // Handle the actual HTML
$current.append( itemHtml ); if ( typeof itemHtml === 'string' ) {
buffer += itemHtml;
} else {
flushBuffer();
$current.append( itemHtml );
}
} }
flushBuffer();
return $wrapper.contents(); return $wrapper.contents();
}; };