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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/*!
* VisualEditor ContentEditable MWLanguageVariantNode class.
*
* @copyright See AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* ContentEditable MediaWiki language variant node, used for
* LanguageConverter markup.
*
* @class
* @abstract
* @extends ve.ce.LeafNode
* @mixes ve.ce.FocusableNode
* @constructor
* @param {ve.dm.MWLanguageVariantNode} model Model to observe
* @param {Object} [config] Configuration options
*/
ve.ce.MWLanguageVariantNode = function VeCeMWLanguageVariantNode( model, config ) {
// Parent constructor
ve.ce.MWLanguageVariantNode.super.call( this, model, config );
// Mixin constructors
ve.ce.FocusableNode.call( this, this.$element, config );
// DOM changes
this.$element.addClass( 've-ce-mwLanguageVariantNode' );
this.$holder = this.appendHolder(); // null for a hidden node
// Events
this.model.connect( this, { update: 'onUpdate' } );
// Initialization
this.onUpdate();
};
/* Inheritance */
OO.inheritClass( ve.ce.MWLanguageVariantNode, ve.ce.LeafNode );
OO.mixinClass( ve.ce.MWLanguageVariantNode, ve.ce.FocusableNode );
/* Static Properties */
ve.ce.MWLanguageVariantNode.static.iconWhenInvisible = 'language';
/* Static Methods */
/**
* @inheritdoc
*/
ve.ce.MWLanguageVariantNode.static.getDescription = function ( model ) {
// This is shown when you hover over the node.
const variantInfo = model.getVariantInfo(),
messageKey = 'visualeditor-mwlanguagevariant-' + model.getRuleType();
let languageCodes = [];
if ( variantInfo.name ) {
languageCodes = [ variantInfo.name.t ];
} else if ( variantInfo.filter ) {
languageCodes = variantInfo.filter.l;
} else if ( variantInfo.twoway ) {
languageCodes = variantInfo.twoway.map( ( item ) => item.l );
} else if ( variantInfo.oneway ) {
languageCodes = variantInfo.oneway.map( ( item ) => item.l );
}
const languageString = languageCodes.map( ( code ) => ve.init.platform.getLanguageName( code.toLowerCase() ) ).join( ve.msg( 'comma-separator' ) );
// The following messages can be used here:
// * visualeditor-mwlanguagevariant-disabled
// * visualeditor-mwlanguagevariant-filter
// * visualeditor-mwlanguagevariant-name
// * visualeditor-mwlanguagevariant-oneway
// * visualeditor-mwlanguagevariant-twoway
// * visualeditor-mwlanguagevariant-unknown
return ve.msg( messageKey, languageString );
};
/* Methods */
/**
* Handle model update events.
*/
ve.ce.MWLanguageVariantNode.prototype.onUpdate = function () {
if ( !this.model.isHidden() ) {
this.model.constructor.static.insertPreviewElements(
this.$holder[ 0 ], this.model.getVariantInfo()
);
}
this.updateInvisibleIconLabel();
};
/**
* @inheritdoc
*
* The text preview is a trimmed down version of the actual rule. This
* means that we strip whitespace and newlines, and truncate to a
* fairly short length. The goal is to provide a fair representation of
* typical short rules, and enough context for long rules that the
* user can tell whether they want to see the full view by focusing the
* node / hovering.
*/
ve.ce.MWLanguageVariantNode.prototype.getInvisibleIconLabel = function () {
const variantInfo = this.model.getVariantInfo();
if ( this.model.isHidden() ) {
const $element = $( '<div>' );
this.model.constructor.static.insertPreviewElements(
// For compactness, just annotate hidden rule w/ its
// current variant output.
$element[ 0 ], variantInfo
);
return $element.text().trim().replace( /\s+/, ' ' );
}
return null;
};
/**
* Create a {jQuery} appropriate for holding the output of this
* conversion rule.
*
* @return {jQuery}
*/
ve.ce.MWLanguageVariantNode.prototype.appendHolder = function () {
const tagName = this.constructor.static.tagName,
document = this.$element[ 0 ].ownerDocument,
$holder = $( document.createElement( tagName ) );
$holder.addClass( 've-ce-mwLanguageVariantNode-holder' );
this.$element.append( $holder );
return $holder;
};
/**
* @inheritdoc
*/
ve.ce.MWLanguageVariantNode.prototype.hasRendering = function () {
// Efficiency improvement: the superclass implementation does a bunch
// of DOM measurement to determine if the node is empty.
// Instead consult the model for a definitive answer.
return !this.model.isHidden();
};
|