%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() ); };