mediawiki-extensions-Visual.../modules/ve-mw/ui/contextitems/ve.ui.MWReferenceContextItem.js
Trevor Parscal 5cbd04ac3e Stringify and parse rendered references
It turns out there are events bound to the rendering of CE nodes that
prevent certain events. The quick fix is to just round trip the
reference rendering to through the browser's HTML serializer and
parser, but T92583 has been filed to find a more general solution.

Bug: T92427
Change-Id: I725a0d2dbb24af9cbe7b1e7e0c8e0bda7fd8417c
2015-03-12 23:41:11 +00:00

88 lines
2.3 KiB
JavaScript

/*!
* VisualEditor MWReferenceContextItem class.
*
* @copyright 2011-2015 VisualEditor Team and others; see http://ve.mit-license.org
*/
/**
* Context item for a MWReference.
*
* @class
* @extends ve.ui.ContextItem
*
* @constructor
* @param {ve.ui.Context} context Context item is in
* @param {ve.dm.Model} model Model item is related to
* @param {Object} config Configuration options
*/
ve.ui.MWReferenceContextItem = function VeMWReferenceContextItem( context, model, config ) {
// Parent constructor
ve.ui.MWReferenceContextItem.super.call( this, context, model, config );
// Initialization
this.$element.addClass( 've-ui-mwReferenceContextItem' );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWReferenceContextItem, ve.ui.ContextItem );
/* Static Properties */
ve.ui.MWReferenceContextItem.static.name = 'reference';
ve.ui.MWReferenceContextItem.static.icon = 'reference';
ve.ui.MWReferenceContextItem.static.label = OO.ui.deferMsg( 'visualeditor-dialogbutton-reference-tooltip' );
ve.ui.MWReferenceContextItem.static.modelClasses = [ ve.dm.MWReferenceNode ];
ve.ui.MWReferenceContextItem.static.commandName = 'reference';
/* Methods */
/**
* Get a DOM rendering of the reference.
*
* @private
* @return {jQuery} DOM rendering of reference
*/
ve.ui.MWReferenceContextItem.prototype.getRendering = function () {
var ref = ve.dm.MWReferenceModel.static.newFromReferenceNode( this.model ),
view = new ve.ce.InternalItemNode(
this.model.getDocument().getInternalList().getItemNode( ref.getListIndex() )
);
// HACK: PHP parser doesn't wrap single lines in a paragraph
if ( view.$element.children().length === 1 && view.$element.children( 'p' ).length === 1 ) {
// unwrap inner
view.$element.children().replaceWith( view.$element.children().contents() );
}
// Make all links open in a new window
view.$element.find( 'a' ).attr( 'target', '_blank' );
view.destroy();
// Strip the HTML rendering of any events that might be still bound to it
return $( view.$element.html() );
};
/**
* @inheritdoc
*/
ve.ui.MWReferenceContextItem.prototype.getDescription = function () {
return this.getRendering().text();
};
/**
* @inheritdoc
*/
ve.ui.MWReferenceContextItem.prototype.renderBody = function () {
this.$body.empty().append( this.getRendering() );
};
/* Registration */
ve.ui.contextItemFactory.register( ve.ui.MWReferenceContextItem );