%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.Annotation.js |
/*!
* VisualEditor DataModel Annotation class.
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
/**
* Generic DataModel annotation.
*
* This is an abstract class, annotations should extend this and call this constructor from their
* constructor. You should not instantiate this class directly.
*
* Annotations in the linear model are instances of subclasses of this class. Subclasses should
* only override static properties and functions.
*
* @class
* @extends ve.dm.Model
* @constructor
* @param {Object} element Linear model annotation
* @param {ve.dm.IndexValueStore} store Store used by annotation
*/
ve.dm.Annotation = function VeDmAnnotation( element, store ) {
// Parent constructor
ve.dm.Annotation.super.call( this, element );
// Properties
this.name = this.constructor.static.name; // For ease of filtering
this.store = store;
};
/* Inheritance */
OO.inheritClass( ve.dm.Annotation, ve.dm.Model );
/* Static properties */
/**
* About grouping is not supported for annotations; setting this to true has no effect.
*
* @static
* @property {boolean}
* @inheritable
*/
ve.dm.Annotation.static.enableAboutGrouping = false;
/**
* Automatically apply annotation to content inserted after it.
*
* @property {boolean}
* @see ve.ce.TextState#getChangeTransaction
*/
ve.dm.Annotation.static.applyToAppendedContent = true;
/**
* Accept this annotation when the browser spontaneously adds it to view's DOM.
*
* @property {boolean}
*/
ve.dm.Annotation.static.inferFromView = false;
/**
* Annotations which are removed when this one is applied
*
* @type {string[]}
*/
ve.dm.Annotation.static.removes = [];
/**
* Static function to convert a linear model data element for this annotation type back to
* a DOM element.
*
* As special facilities for annotations, the annotated content that the returned element will
* wrap around is passed in as childDomElements, and this function may return an empty array to
* indicate that the annotation should produce no output. In that case, the child DOM elements will
* not be wrapped in anything and will be inserted directly into this annotation's parent.
*
* @abstract
* @static
* @inheritable
* @method
* @param {Object|Array} dataElement Linear model element or array of linear model data
* @param {HTMLDocument} doc HTML document for creating elements
* @param {ve.dm.Converter} converter Converter object to optionally call .getDomSubtreeFromData() on
* @param {Node[]} childDomElements Children that will be appended to the returned element
* @return {HTMLElement[]} Array of DOM elements; only the first element is used; may be empty
*/
ve.dm.Annotation.static.toDomElements = null;
/* Methods */
/**
* Get an object containing comparable annotation properties.
*
* This is used by the converter to merge adjacent annotations.
*
* @return {Object} An object containing a subset of the annotation's properties
*/
ve.dm.Annotation.prototype.getComparableObject = function () {
var hashObject = this.getHashObject();
delete hashObject.originalDomElementsIndex;
return hashObject;
};
/**
* FIXME T126037: This method strips data-parsoid & Parsoid IDs from HTML attributes for comparisons.
*
* This should be removed once similar annotation merging is handled correctly
* by Parsoid.
*
* @return {Object} An object all HTML attributes except data-parsoid & Parsoid IDs
*/
ve.dm.Annotation.prototype.getComparableHtmlAttributes = function () {
var comparableAttributes, domElements = this.store && this.getOriginalDomElements( this.store );
if ( domElements && domElements[ 0 ] ) {
comparableAttributes = ve.getDomAttributes( domElements[ 0 ] );
delete comparableAttributes[ 'data-parsoid' ];
if ( comparableAttributes.id && comparableAttributes.id.match( /^mw[\w-]{2,}$/ ) ) {
delete comparableAttributes.id;
}
return comparableAttributes;
}
return {};
};
/**
* FIXME T126038: This method adds in HTML attributes so comparable objects
* aren't serialized together if they have different HTML attributes.
*
* This method needs to be different from #getComparableObject which is
* still used for editing annotations.
*
* @return {Object} An object containing a subset of the annotation's properties and HTML attributes
*/
ve.dm.Annotation.prototype.getComparableObjectForSerialization = function () {
var object = this.getComparableObject(),
htmlAttributes = this.getComparableHtmlAttributes();
if ( !ve.isEmptyObject( htmlAttributes ) ) {
object.htmlAttributes = htmlAttributes;
}
return object;
};
/**
* Check if the annotation was generated by the converter
*
* Used by compareToForSerialization to avoid merging generated annotations.
*
* @return {boolean} The annotation was generated
*/
ve.dm.Annotation.prototype.isGenerated = function () {
// Only annotations and nodes generated by the converter have originalDomElements set.
// If this annotation was not generated by the converter, this.getOriginalDomElements()
// will return an empty array.
return this.getOriginalDomElementsIndex() !== undefined;
};
/**
* Compare two annotations using #getComparableObject
*/
ve.dm.Annotation.prototype.compareTo = function ( annotation ) {
return ve.compare(
this.getComparableObject(),
annotation.getComparableObject()
);
};
/**
* FIXME T126039: Compare to another annotation for serialization
*
* Compares two annotations using #getComparableObjectForSerialization, unless
* they are both generated annotations, in which case they must be identical.
*
* @param {ve.dm.Annotation} annotation Annotation to compare to
* @return {boolean} The other annotation is similar to this one
*/
ve.dm.Annotation.prototype.compareToForSerialization = function ( annotation ) {
// If both annotations were generated
if ( this.isGenerated() && annotation.isGenerated() ) {
return ve.compare( this.getHashObject(), annotation.getHashObject() );
}
return ve.compare(
this.getComparableObjectForSerialization(),
annotation.getComparableObjectForSerialization()
);
};