%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/dm/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/dm/ve.dm.TableCellableNode.js |
/*!
* VisualEditor DataModel TableCellableNode class.
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
/**
* DataModel node which can behave as a table cell
*
* @class
*
* @abstract
* @constructor
*/
ve.dm.TableCellableNode = function VeDmTableCellableNode() {
// Events
this.connect( this, {
attributeChange: 'onCellableAttributeChange'
} );
};
/* Inheritance */
OO.initClass( ve.dm.TableCellableNode );
/* Static Properties */
ve.dm.TableCellableNode.static.isCellable = true;
/* Static Methods */
ve.dm.TableCellableNode.static.setAttributes = function ( attributes, domElements ) {
var style = domElements[ 0 ].nodeName.toLowerCase() === 'th' ? 'header' : 'data',
colspan = domElements[ 0 ].getAttribute( 'colspan' ),
rowspan = domElements[ 0 ].getAttribute( 'rowspan' );
attributes.style = style;
if ( colspan !== null ) {
attributes.originalColspan = colspan;
if ( colspan !== '' && !isNaN( Number( colspan ) ) ) {
attributes.colspan = Number( colspan );
}
}
if ( rowspan !== null ) {
attributes.originalRowspan = rowspan;
if ( rowspan !== '' && !isNaN( Number( rowspan ) ) ) {
attributes.rowspan = Number( rowspan );
}
}
};
ve.dm.TableCellableNode.static.applyAttributes = function ( attributes, domElement ) {
var spans = {
colspan: attributes.colspan,
rowspan: attributes.rowspan
};
// Ignore spans of 1 unless they were in the original HTML
if ( attributes.colspan === 1 && Number( attributes.originalColspan ) !== 1 ) {
spans.colspan = null;
}
if ( attributes.rowspan === 1 && Number( attributes.originalRowspan ) !== 1 ) {
spans.rowspan = null;
}
// Use original value if the numerical value didn't change, or if we didn't set one
if ( attributes.colspan === undefined || attributes.colspan === Number( attributes.originalColspan ) ) {
spans.colspan = attributes.originalColspan;
}
if ( attributes.rowspan === undefined || attributes.rowspan === Number( attributes.originalRowspan ) ) {
spans.rowspan = attributes.originalRowspan;
}
ve.setDomAttributes( domElement, spans );
};
/* Methods */
/**
* Get the number of rows the cell spans
*
* @return {number} Rows spanned
*/
ve.dm.TableCellableNode.prototype.getRowspan = function () {
return this.element.attributes.rowspan || 1;
};
/**
* Get the number of columns the cell spans
*
* @return {number} Columns spanned
*/
ve.dm.TableCellableNode.prototype.getColspan = function () {
return this.element.attributes.colspan || 1;
};
/**
* Get number of columns and rows the cell spans
*
* @return {Object} Object containing 'col' and 'row'
*/
ve.dm.TableCellableNode.prototype.getSpans = function () {
return {
col: this.getColspan(),
row: this.getRowspan()
};
};
/**
* Get the style of the cell
*
* @return {string} Style, 'header' or 'data'
*/
ve.dm.TableCellableNode.prototype.getStyle = function () {
return this.element.attributes.style || 'data';
};
/**
* Handle attributes changes
*
* @param {string} key Attribute key
* @param {string} from Old value
* @param {string} to New value
*/
ve.dm.TableCellableNode.prototype.onCellableAttributeChange = function ( key ) {
if ( this.getParent() && ( key === 'colspan' || key === 'rowspan' ) ) {
// In practice the matrix should already be invalidated as you
// shouldn't change a span without adding/removing other cells,
// but it is possible to just change spans if you don't mind a
// non-rectangular table.
this.findParent( ve.dm.TableNode ).getMatrix().invalidate();
}
};