Merge "Fix template rendering"

This commit is contained in:
jenkins-bot 2017-11-27 15:36:02 +00:00 committed by Gerrit Code Review
commit 65a27b48ce

View file

@ -89,21 +89,53 @@ ve.ce.MWTransclusionNode.static.getDescription = function ( model ) {
* @return {HTMLElement[]} Filtered rendered nodes * @return {HTMLElement[]} Filtered rendered nodes
*/ */
ve.ce.MWTransclusionNode.static.filterRendering = function ( contentNodes ) { ve.ce.MWTransclusionNode.static.filterRendering = function ( contentNodes ) {
// Filter out auto-generated items, e.g. reference lists var whitespaceRegex, wrapper;
contentNodes = contentNodes.filter( function ( node ) {
var dataMw = node.nodeType === Node.ELEMENT_NODE && if ( !contentNodes.length ) {
return;
}
whitespaceRegex = new RegExp( '^[' + ve.dm.Converter.static.whitespaceList + ']+$' );
wrapper = contentNodes[ 0 ].ownerDocument.createElement( 'div' );
// Unwrap Parsoid sections (which probably shouldn't exist: T181226)
contentNodes.forEach( function ( node ) { wrapper.appendChild( node ); } );
ve.unwrapParsoidSections( wrapper );
contentNodes = Array.prototype.slice.call( wrapper.childNodes );
function isAutoGenerated( node ) {
var dataMw = node &&
node.nodeType === Node.ELEMENT_NODE &&
node.hasAttribute( 'data-mw' ) && node.hasAttribute( 'data-mw' ) &&
JSON.parse( node.getAttribute( 'data-mw' ) ); JSON.parse( node.getAttribute( 'data-mw' ) );
if ( dataMw && dataMw.autoGenerated ) {
return dataMw && dataMw.autoGenerated;
}
// Filter out auto-generated items, e.g. reference lists
contentNodes = contentNodes.filter( function ( node ) {
// HACK: Also check first-child as auto-generated is applied inside ref wrapper (T181230)
if ( isAutoGenerated( node ) || isAutoGenerated( node.childNodes[ 0 ] ) ) {
return false; return false;
} }
return true; return true;
} ); } );
function isWhitespaceNode( node ) {
return node && node.nodeType === Node.TEXT_NODE && !!node.data.match( whitespaceRegex );
}
while ( isWhitespaceNode( contentNodes[ 0 ] ) ) {
contentNodes.shift();
}
while ( isWhitespaceNode( contentNodes[ contentNodes.length - 1 ] ) ) {
contentNodes.pop();
}
// HACK: if $content consists of a single paragraph, unwrap it. // HACK: if $content consists of a single paragraph, unwrap it.
// We have to do this because the parser wraps everything in <p>s, and inline templates // We have to do this because the parser wraps everything in <p>s, and inline templates
// will render strangely when wrapped in <p>s. // will render strangely when wrapped in <p>s.
if ( contentNodes.length === 1 && contentNodes[ 0 ].nodeName.toLowerCase() === 'p' ) { if ( contentNodes.length === 1 && contentNodes[ 0 ].nodeName.toLowerCase() === 'p' ) {
contentNodes = Array.prototype.slice.apply( contentNodes[ 0 ].childNodes ); contentNodes = Array.prototype.slice.call( contentNodes[ 0 ].childNodes );
} }
return contentNodes; return contentNodes;
}; };