All files / src/dm/nodes ve.dm.TableCellNode.js

95.23% Statements 40/42
87.5% Branches 28/32
83.33% Functions 5/6
95.23% Lines 40/42

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133                                  1x   1455x     1455x         1x   1x       1x   1x   1x   1x   1x   1x     1x           1x 745x   745x   745x           1x 199x 199x 199x   199x   199x                         1x 61x 61x               61x       61x     1x 18x               18x   9x 1x   9x 3x     9x 4x   9x 9x       5x         1x  
/*!
 * VisualEditor DataModel TableCellNode class.
 *
 * @copyright See AUTHORS.txt
 */
 
/**
 * DataModel table cell node.
 *
 * @class
 * @extends ve.dm.BranchNode
 * @mixins ve.dm.TableCellableNode
 *
 * @constructor
 * @param {Object} [element] Reference to element in linear model
 * @param {ve.dm.Node[]} [children]
 */
ve.dm.TableCellNode = function VeDmTableCellNode() {
	// Parent constructor
	ve.dm.TableCellNode.super.apply( this, arguments );
 
	// Mixin constructor
	ve.dm.TableCellableNode.call( this );
};
 
/* Inheritance */
 
OO.inheritClass( ve.dm.TableCellNode, ve.dm.BranchNode );
 
OO.mixinClass( ve.dm.TableCellNode, ve.dm.TableCellableNode );
 
/* Static Properties */
 
ve.dm.TableCellNode.static.name = 'tableCell';
 
ve.dm.TableCellNode.static.isUnwrappable = false;
 
ve.dm.TableCellNode.static.parentNodeTypes = [ 'tableRow' ];
 
ve.dm.TableCellNode.static.defaultAttributes = { style: 'data' };
 
ve.dm.TableCellNode.static.matchTagNames = [ 'td', 'th' ];
 
ve.dm.TableCellNode.static.isCellEditable = true;
 
// Exclude 'colspan' and 'rowspan' as they are managed explicitly
ve.dm.TableCellNode.static.preserveHtmlAttributes = function ( attribute ) {
	return attribute !== 'colspan' && attribute !== 'rowspan';
};
 
/* Static Methods */
 
ve.dm.TableCellNode.static.toDataElement = function ( domElements ) {
	var attributes = {};
 
	ve.dm.TableCellableNode.static.setAttributes( attributes, domElements );
 
	return {
		type: this.name,
		attributes: attributes
	};
};
 
ve.dm.TableCellNode.static.toDomElements = function ( dataElement, doc ) {
	var tag = dataElement.attributes && dataElement.attributes.style === 'header' ? 'th' : 'td',
		domElement = doc.createElement( tag ),
		attributes = dataElement.attributes;
 
	ve.dm.TableCellableNode.static.applyAttributes( attributes, domElement );
 
	return [ domElement ];
};
 
/**
 * Creates data that can be inserted into the model to create a new table cell.
 *
 * @param {Object} [options]
 * @param {string} [options.style='data'] Either 'header' or 'data'
 * @param {number} [options.rowspan=1] Number of rows the cell spans
 * @param {number} [options.colspan=1] Number of columns the cell spans
 * @param {Array} [options.content] Linear model data, defaults to empty wrapper paragraph
 * @return {Array} Model data for a new table cell
 */
ve.dm.TableCellNode.static.createData = function ( options ) {
	options = options || {};
	var opening = {
		type: 'tableCell',
		attributes: {
			style: options.style || 'data',
			rowspan: options.rowspan || 1,
			colspan: options.colspan || 1
		}
	};
	var content = options.content || [
		{ type: 'paragraph', internal: { generated: 'wrapper' } },
		{ type: '/paragraph' }
	];
	return [ opening ].concat( content ).concat( [ { type: '/tableCell' } ] );
};
 
ve.dm.TableCellNode.static.describeChange = function ( key, change ) {
	Iif ( key === 'style' ) {
		return ve.htmlMsg( 'visualeditor-changedesc-no-key',
			// The following messages are used here:
			// * visualeditor-table-format-data
			// * visualeditor-table-format-header
			this.wrapText( 'del', ve.msg( 'visualeditor-table-format-' + change.from ) ),
			this.wrapText( 'ins', ve.msg( 'visualeditor-table-format-' + change.to ) )
		);
	} else if ( key === 'colspan' || key === 'rowspan' ) {
		// colspan/rowspan of '1' is the same as not setting it
		if ( change.from === 1 ) {
			change.from = undefined;
		}
		if ( change.to === 1 ) {
			change.to = undefined;
		}
		// These might be the same now
		if ( change.from === change.to ) {
			return null;
		}
	} else Eif ( key === 'originalColspan' || key === 'originalRowspan' ) {
		return null;
	}
 
	// Parent method
	return ve.dm.TableCellNode.super.static.describeChange.call( this, key, change );
};
 
/* Registration */
 
ve.dm.modelRegistry.register( ve.dm.TableCellNode );