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

100% Statements 35/35
94.11% Branches 16/17
100% Functions 8/8
100% Lines 35/35

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                                1x   982x         1x       1x   1x   1x       1x   1x             1x 3x     1x 258x 258x     1x 98x 98x     1x 24x 24x 3x 3x 6x 3x 3x     3x 3x       24x     1x 22x         22x 6x                 16x         1x   1479x         1x  
/*!
 * VisualEditor DataModel ListNode class.
 *
 * @copyright See AUTHORS.txt
 */
 
/**
 * DataModel list node.
 *
 * @class
 * @extends ve.dm.BranchNode
 *
 * @constructor
 * @param {Object} [element] Reference to element in linear model
 * @param {ve.dm.Node[]} [children]
 */
ve.dm.ListNode = function VeDmListNode() {
	// Parent constructor
	ve.dm.ListNode.super.apply( this, arguments );
};
 
/* Inheritance */
 
OO.inheritClass( ve.dm.ListNode, ve.dm.BranchNode );
 
/* Static Properties */
 
ve.dm.ListNode.static.name = 'list';
 
ve.dm.ListNode.static.childNodeTypes = [ 'listItem' ];
 
ve.dm.ListNode.static.defaultAttributes = {
	style: 'bullet'
};
 
ve.dm.ListNode.static.matchTagNames = [ 'ul', 'ol' ];
 
ve.dm.ListNode.static.isDiffedAsList = true;
 
/**
 * Creates a list item element
 *
 * @return {Object} Element data
 */
ve.dm.ListNode.static.createItem = function () {
	return { type: 'listItem' };
};
 
ve.dm.ListNode.static.toDataElement = function ( domElements ) {
	const style = domElements[ 0 ].nodeName.toLowerCase() === 'ol' ? 'number' : 'bullet';
	return { type: this.name, attributes: { style: style } };
};
 
ve.dm.ListNode.static.toDomElements = function ( dataElement, doc ) {
	const tag = dataElement.attributes && dataElement.attributes.style === 'number' ? 'ol' : 'ul';
	return [ doc.createElement( tag ) ];
};
 
ve.dm.ListNode.static.describeChanges = function ( attributeChanges, attributes, element ) {
	attributeChanges = ve.copy( attributeChanges );
	if ( 'listType' in attributeChanges ) {
		let mapped = false;
		[ 'from', 'to' ].forEach( ( fromOrTo ) => {
			if ( attributeChanges.listType[ fromOrTo ] === 'definitionList' ) {
				attributeChanges.style[ fromOrTo ] = 'indent';
				mapped = true;
			}
		} );
		Eif ( mapped ) {
			delete attributeChanges.listType;
		}
	}
	// Parent method
	return ve.dm.ListNode.super.static.describeChanges.call( this, attributeChanges, attributes, element );
};
 
ve.dm.ListNode.static.describeChange = function ( key, change ) {
	const messageKeys = {
		bullet: 'visualeditor-listbutton-bullet-tooltip',
		number: 'visualeditor-listbutton-number-tooltip',
		indent: 'visualeditor-changedesc-list-style-indent'
	};
	if ( key === 'style' && change.from in messageKeys && change.to in messageKeys ) {
		return ve.htmlMsg( 'visualeditor-changedesc-no-key',
			// Message keys documented above
			// eslint-disable-next-line mediawiki/msg-doc
			this.wrapText( 'del', ve.msg( messageKeys[ change.from ] ) ),
			// eslint-disable-next-line mediawiki/msg-doc
			this.wrapText( 'ins', ve.msg( messageKeys[ change.to ] ) )
		);
	}
	// Parent method
	return ve.dm.ListNode.super.static.describeChange.apply( this, arguments );
};
 
/* Methods */
 
ve.dm.ListNode.prototype.canHaveSlugAfter = function () {
	// A paragraph can be added after a list by pressing enter in an empty list item
	return false;
};
 
/* Registration */
 
ve.dm.modelRegistry.register( ve.dm.ListNode );