wikimedia/mediawiki-extensions-VisualEditor

View on GitHub
modules/ve-mw/ui/elements/ve.ui.MWPreviewElement.js

Summary

Maintainability
A
1 hr
Test Coverage
/*!
 * VisualEditor UserInterface MWPreviewElement class.
 *
 * @copyright See AUTHORS.txt
 * @license The MIT License (MIT); see LICENSE.txt
 */

/**
 * Creates an ve.ui.MWPreviewElement object.
 *
 * @class
 * @extends ve.ui.PreviewElement
 *
 * @constructor
 * @param {ve.dm.Node} [model]
 * @param {Object} [config]
 * @param {boolean} [config.useView=false] Use the view HTML, and don't bother generating model HTML, which
 *  is a bit slower
 */
ve.ui.MWPreviewElement = function VeUiMwPreviewElement() {
    // Parent constructor
    ve.ui.MWPreviewElement.super.apply( this, arguments );

    // Initialize
    this.$element.addClass( 've-ui-mwPreviewElement mw-body-content mw-parser-output' );
};

/* Inheritance */

OO.inheritClass( ve.ui.MWPreviewElement, ve.ui.PreviewElement );

/* Method */

/**
 * @inheritdoc
 */
ve.ui.MWPreviewElement.prototype.beforeAppend = function ( element ) {
    // Parent method
    ve.ui.MWPreviewElement.super.prototype.beforeAppend.apply( this, arguments );

    // Remove any TemplateStyles stylesheets already present on the page, to avoid
    // very slow repaints (T330781)
    Array.prototype.forEach.call( element.querySelectorAll( 'style[data-mw-deduplicate]' ), ( style ) => {
        const key = style.getAttribute( 'data-mw-deduplicate' );

        const duplicate = element.querySelector( 'style[data-mw-deduplicate="' + key + '"]' );
        if ( duplicate ) {
            style.parentNode.removeChild( style );
        }
    } );
};

/**
 * @inheritdoc
 */
ve.ui.MWPreviewElement.prototype.setModel = function ( model ) {
    // Parent method
    ve.ui.MWPreviewElement.super.prototype.setModel.call( this, model );

    // The following classes are used here:
    // * mw-content-ltr
    // * mw-content-rtl
    this.$element.addClass( 'mw-content-' + this.model.getDocument().getDir() );
};

/**
 * @inheritdoc
 */
ve.ui.MWPreviewElement.prototype.replaceWithModelDom = function () {
    // Parent method
    ve.ui.MWPreviewElement.super.prototype.replaceWithModelDom.apply( this, arguments );

    ve.init.platform.linkCache.styleParsoidElements(
        this.$element,
        // The DM node should be attached, but check just in case.
        this.model.getDocument() && this.model.getDocument().getHtmlDocument()
    );
};