mediawiki-extensions-Visual.../modules/ve/dm/nodes/ve.dm.AlienNode.js
Ed Sanders cddb3f1b39 AlienNode stores original DOM elements instead of HTML
As jQuery hash problems in some cases converting HTML, it is
easier just to store the original DOM elements.

The bulk of this commit is fixing the tests as although we have an
assertion for comparing DOM elements, we don't have one for comparing
objects or arrays which may contain DOM elements.

ve.js
* copyObject & copyArray fixed to run cloneNode(true) on any item
  of type Node.
* Added callback function so an object/array can be copied with
  modifications.

ve.qunit.js
* Added deepEqualWithDomElements: Using the new copyObect/Array
  callback, we can copy the incoming object and convert any nodes
  to node summaries, then just run the normal deep equal comparison.

ve.dm.AlienNodes.js
* Instead of storing HMTL we store cloned DOM elements which we can
  send straight back to the converter without any processing.

ve.dm.example.js
* Updated tests to expect DOM elements instead of HTML.

ve.dm.Converter.test.js
* Updated tests to use deepEqualWithDomElements

Bug: 47737
Change-Id: I3df8f49b170c31da9610129d53cf8cb65dd5d5f8
2013-04-27 21:04:58 +00:00

97 lines
2.6 KiB
JavaScript

/*!
* VisualEditor DataModel AlienNode, AlienBlockNode and AlienInlineNode classes.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* DataModel alien node.
*
* @class
* @abstract
* @extends ve.dm.GeneratedContentNode
* @constructor
* @param {number} [length] Length of content data in document; ignored and overridden to 0
* @param {Object} [element] Reference to element in linear model
*/
ve.dm.AlienNode = function VeDmAlienNode( length, element ) {
// Parent constructor
ve.dm.GeneratedContentNode.call( this, 0, element );
};
/* Inheritance */
ve.inheritClass( ve.dm.AlienNode, ve.dm.GeneratedContentNode );
/* Static members */
ve.dm.AlienNode.static.name = 'alien';
ve.dm.AlienNode.static.storeHtmlAttributes = false;
// TODO: Develop better method to test for generated content
ve.dm.AlienNode.static.generatedContent = true;
ve.dm.AlienNode.static.toDataElement = function ( domElements, converter ) {
var isInline = this.isHybridInline( domElements, converter ),
type = isInline ? 'alienInline' : 'alienBlock';
return {
'type': type,
'attributes': {
'domElements': ve.copyArray( domElements )
}
};
};
ve.dm.AlienNode.static.toDomElements = function ( dataElement ) {
return dataElement.attributes.domElements;
};
/* Concrete subclasses */
/**
* DataModel alienBlock node.
*
* @class
* @extends ve.dm.AlienNode
* @constructor
* @param {number} [length] Length of content data in document; ignored and overridden to 0
* @param {Object} [element] Reference to element in linear model
*/
ve.dm.AlienBlockNode = function VeDmAlienBlockNode( length, element ) {
// Parent constructor
ve.dm.AlienNode.call( this, length, element );
};
ve.inheritClass( ve.dm.AlienBlockNode, ve.dm.AlienNode );
ve.dm.AlienBlockNode.static.name = 'alienBlock';
/**
* DataModel alienInline node.
*
* @class
* @extends ve.dm.AlienNode
* @constructor
* @param {number} [length] Length of content data in document; ignored and overridden to 0
* @param {Object} [element] Reference to element in linear model
*/
ve.dm.AlienInlineNode = function VeDmAlienInlineNode( length, element ) {
// Parent constructor
ve.dm.AlienNode.call( this, length, element );
};
ve.inheritClass( ve.dm.AlienInlineNode, ve.dm.AlienNode );
ve.dm.AlienInlineNode.static.name = 'alienInline';
ve.dm.AlienInlineNode.static.isContent = true;
/* Registration */
ve.dm.modelRegistry.register( ve.dm.AlienNode );
ve.dm.modelRegistry.register( ve.dm.AlienBlockNode );
ve.dm.modelRegistry.register( ve.dm.AlienInlineNode );