rt-5.0.5/0000755000201500020150000000000014515446367010641 5ustar puckpuckrt-5.0.5/devel/0000755000201500020150000000000014515446367011740 5ustar puckpuckrt-5.0.5/devel/third-party/0000755000201500020150000000000014515447262014202 5ustar puckpuckrt-5.0.5/devel/third-party/jquery-ui-1.13.2.custom/0000755000201500020150000000000014514270122020151 5ustar puckpuckrt-5.0.5/devel/third-party/jquery-ui-1.13.2.custom/jquery-ui.js0000644000201500020150000070060014514270122022444 0ustar puckpuck/*! jQuery UI - v1.13.2 - 2022-08-16 * http://jqueryui.com * Includes: widget.js, position.js, data.js, keycode.js, scroll-parent.js, unique-id.js, widgets/sortable.js, widgets/autocomplete.js, widgets/datepicker.js, widgets/menu.js, widgets/mouse.js, widgets/slider.js * Copyright jQuery Foundation and other contributors; Licensed MIT */ ( function( factory ) { "use strict"; if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define( [ "jquery" ], factory ); } else { // Browser globals factory( jQuery ); } } )( function( $ ) { "use strict"; $.ui = $.ui || {}; var version = $.ui.version = "1.13.2"; /*! * jQuery UI Widget 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Widget //>>group: Core //>>description: Provides a factory for creating stateful widgets with a common API. //>>docs: http://api.jqueryui.com/jQuery.widget/ //>>demos: http://jqueryui.com/widget/ var widgetUuid = 0; var widgetHasOwnProperty = Array.prototype.hasOwnProperty; var widgetSlice = Array.prototype.slice; $.cleanData = ( function( orig ) { return function( elems ) { var events, elem, i; for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { // Only trigger remove when necessary to save time events = $._data( elem, "events" ); if ( events && events.remove ) { $( elem ).triggerHandler( "remove" ); } } orig( elems ); }; } )( $.cleanData ); $.widget = function( name, base, prototype ) { var existingConstructor, constructor, basePrototype; // ProxiedPrototype allows the provided prototype to remain unmodified // so that it can be used as a mixin for multiple widgets (#8876) var proxiedPrototype = {}; var namespace = name.split( "." )[ 0 ]; name = name.split( "." )[ 1 ]; var fullName = namespace + "-" + name; if ( !prototype ) { prototype = base; base = $.Widget; } if ( Array.isArray( prototype ) ) { prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); } // Create selector for plugin $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) { return !!$.data( elem, fullName ); }; $[ namespace ] = $[ namespace ] || {}; existingConstructor = $[ namespace ][ name ]; constructor = $[ namespace ][ name ] = function( options, element ) { // Allow instantiation without "new" keyword if ( !this || !this._createWidget ) { return new constructor( options, element ); } // Allow instantiation without initializing for simple inheritance // must use "new" keyword (the code above always passes args) if ( arguments.length ) { this._createWidget( options, element ); } }; // Extend with the existing constructor to carry over any static properties $.extend( constructor, existingConstructor, { version: prototype.version, // Copy the object used to create the prototype in case we need to // redefine the widget later _proto: $.extend( {}, prototype ), // Track widgets that inherit from this widget in case this widget is // redefined after a widget inherits from it _childConstructors: [] } ); basePrototype = new base(); // We need to make the options hash a property directly on the new instance // otherwise we'll modify the options hash on the prototype that we're // inheriting from basePrototype.options = $.widget.extend( {}, basePrototype.options ); $.each( prototype, function( prop, value ) { if ( typeof value !== "function" ) { proxiedPrototype[ prop ] = value; return; } proxiedPrototype[ prop ] = ( function() { function _super() { return base.prototype[ prop ].apply( this, arguments ); } function _superApply( args ) { return base.prototype[ prop ].apply( this, args ); } return function() { var __super = this._super; var __superApply = this._superApply; var returnValue; this._super = _super; this._superApply = _superApply; returnValue = value.apply( this, arguments ); this._super = __super; this._superApply = __superApply; return returnValue; }; } )(); } ); constructor.prototype = $.widget.extend( basePrototype, { // TODO: remove support for widgetEventPrefix // always use the name + a colon as the prefix, e.g., draggable:start // don't prefix for widgets that aren't DOM-based widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name }, proxiedPrototype, { constructor: constructor, namespace: namespace, widgetName: name, widgetFullName: fullName } ); // If this widget is being redefined then we need to find all widgets that // are inheriting from it and redefine all of them so that they inherit from // the new version of this widget. We're essentially trying to replace one // level in the prototype chain. if ( existingConstructor ) { $.each( existingConstructor._childConstructors, function( i, child ) { var childPrototype = child.prototype; // Redefine the child widget using the same prototype that was // originally used, but inherit from the new version of the base $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); } ); // Remove the list of existing child constructors from the old constructor // so the old child constructors can be garbage collected delete existingConstructor._childConstructors; } else { base._childConstructors.push( constructor ); } $.widget.bridge( name, constructor ); return constructor; }; $.widget.extend = function( target ) { var input = widgetSlice.call( arguments, 1 ); var inputIndex = 0; var inputLength = input.length; var key; var value; for ( ; inputIndex < inputLength; inputIndex++ ) { for ( key in input[ inputIndex ] ) { value = input[ inputIndex ][ key ]; if ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) { // Clone objects if ( $.isPlainObject( value ) ) { target[ key ] = $.isPlainObject( target[ key ] ) ? $.widget.extend( {}, target[ key ], value ) : // Don't extend strings, arrays, etc. with objects $.widget.extend( {}, value ); // Copy everything else by reference } else { target[ key ] = value; } } } } return target; }; $.widget.bridge = function( name, object ) { var fullName = object.prototype.widgetFullName || name; $.fn[ name ] = function( options ) { var isMethodCall = typeof options === "string"; var args = widgetSlice.call( arguments, 1 ); var returnValue = this; if ( isMethodCall ) { // If this is an empty collection, we need to have the instance method // return undefined instead of the jQuery instance if ( !this.length && options === "instance" ) { returnValue = undefined; } else { this.each( function() { var methodValue; var instance = $.data( this, fullName ); if ( options === "instance" ) { returnValue = instance; return false; } if ( !instance ) { return $.error( "cannot call methods on " + name + " prior to initialization; " + "attempted to call method '" + options + "'" ); } if ( typeof instance[ options ] !== "function" || options.charAt( 0 ) === "_" ) { return $.error( "no such method '" + options + "' for " + name + " widget instance" ); } methodValue = instance[ options ].apply( instance, args ); if ( methodValue !== instance && methodValue !== undefined ) { returnValue = methodValue && methodValue.jquery ? returnValue.pushStack( methodValue.get() ) : methodValue; return false; } } ); } } else { // Allow multiple hashes to be passed on init if ( args.length ) { options = $.widget.extend.apply( null, [ options ].concat( args ) ); } this.each( function() { var instance = $.data( this, fullName ); if ( instance ) { instance.option( options || {} ); if ( instance._init ) { instance._init(); } } else { $.data( this, fullName, new object( options, this ) ); } } ); } return returnValue; }; }; $.Widget = function( /* options, element */ ) {}; $.Widget._childConstructors = []; $.Widget.prototype = { widgetName: "widget", widgetEventPrefix: "", defaultElement: "
", options: { classes: {}, disabled: false, // Callbacks create: null }, _createWidget: function( options, element ) { element = $( element || this.defaultElement || this )[ 0 ]; this.element = $( element ); this.uuid = widgetUuid++; this.eventNamespace = "." + this.widgetName + this.uuid; this.bindings = $(); this.hoverable = $(); this.focusable = $(); this.classesElementLookup = {}; if ( element !== this ) { $.data( element, this.widgetFullName, this ); this._on( true, this.element, { remove: function( event ) { if ( event.target === element ) { this.destroy(); } } } ); this.document = $( element.style ? // Element within the document element.ownerDocument : // Element is window or document element.document || element ); this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); } this.options = $.widget.extend( {}, this.options, this._getCreateOptions(), options ); this._create(); if ( this.options.disabled ) { this._setOptionDisabled( this.options.disabled ); } this._trigger( "create", null, this._getCreateEventData() ); this._init(); }, _getCreateOptions: function() { return {}; }, _getCreateEventData: $.noop, _create: $.noop, _init: $.noop, destroy: function() { var that = this; this._destroy(); $.each( this.classesElementLookup, function( key, value ) { that._removeClass( value, key ); } ); // We can probably remove the unbind calls in 2.0 // all event bindings should go through this._on() this.element .off( this.eventNamespace ) .removeData( this.widgetFullName ); this.widget() .off( this.eventNamespace ) .removeAttr( "aria-disabled" ); // Clean up events and states this.bindings.off( this.eventNamespace ); }, _destroy: $.noop, widget: function() { return this.element; }, option: function( key, value ) { var options = key; var parts; var curOption; var i; if ( arguments.length === 0 ) { // Don't return a reference to the internal hash return $.widget.extend( {}, this.options ); } if ( typeof key === "string" ) { // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } options = {}; parts = key.split( "." ); key = parts.shift(); if ( parts.length ) { curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); for ( i = 0; i < parts.length - 1; i++ ) { curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; curOption = curOption[ parts[ i ] ]; } key = parts.pop(); if ( arguments.length === 1 ) { return curOption[ key ] === undefined ? null : curOption[ key ]; } curOption[ key ] = value; } else { if ( arguments.length === 1 ) { return this.options[ key ] === undefined ? null : this.options[ key ]; } options[ key ] = value; } } this._setOptions( options ); return this; }, _setOptions: function( options ) { var key; for ( key in options ) { this._setOption( key, options[ key ] ); } return this; }, _setOption: function( key, value ) { if ( key === "classes" ) { this._setOptionClasses( value ); } this.options[ key ] = value; if ( key === "disabled" ) { this._setOptionDisabled( value ); } return this; }, _setOptionClasses: function( value ) { var classKey, elements, currentElements; for ( classKey in value ) { currentElements = this.classesElementLookup[ classKey ]; if ( value[ classKey ] === this.options.classes[ classKey ] || !currentElements || !currentElements.length ) { continue; } // We are doing this to create a new jQuery object because the _removeClass() call // on the next line is going to destroy the reference to the current elements being // tracked. We need to save a copy of this collection so that we can add the new classes // below. elements = $( currentElements.get() ); this._removeClass( currentElements, classKey ); // We don't use _addClass() here, because that uses this.options.classes // for generating the string of classes. We want to use the value passed in from // _setOption(), this is the new value of the classes option which was passed to // _setOption(). We pass this value directly to _classes(). elements.addClass( this._classes( { element: elements, keys: classKey, classes: value, add: true } ) ); } }, _setOptionDisabled: function( value ) { this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); // If the widget is becoming disabled, then nothing is interactive if ( value ) { this._removeClass( this.hoverable, null, "ui-state-hover" ); this._removeClass( this.focusable, null, "ui-state-focus" ); } }, enable: function() { return this._setOptions( { disabled: false } ); }, disable: function() { return this._setOptions( { disabled: true } ); }, _classes: function( options ) { var full = []; var that = this; options = $.extend( { element: this.element, classes: this.options.classes || {} }, options ); function bindRemoveEvent() { var nodesToBind = []; options.element.each( function( _, element ) { var isTracked = $.map( that.classesElementLookup, function( elements ) { return elements; } ) .some( function( elements ) { return elements.is( element ); } ); if ( !isTracked ) { nodesToBind.push( element ); } } ); that._on( $( nodesToBind ), { remove: "_untrackClassesElement" } ); } function processClassString( classes, checkOption ) { var current, i; for ( i = 0; i < classes.length; i++ ) { current = that.classesElementLookup[ classes[ i ] ] || $(); if ( options.add ) { bindRemoveEvent(); current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) ); } else { current = $( current.not( options.element ).get() ); } that.classesElementLookup[ classes[ i ] ] = current; full.push( classes[ i ] ); if ( checkOption && options.classes[ classes[ i ] ] ) { full.push( options.classes[ classes[ i ] ] ); } } } if ( options.keys ) { processClassString( options.keys.match( /\S+/g ) || [], true ); } if ( options.extra ) { processClassString( options.extra.match( /\S+/g ) || [] ); } return full.join( " " ); }, _untrackClassesElement: function( event ) { var that = this; $.each( that.classesElementLookup, function( key, value ) { if ( $.inArray( event.target, value ) !== -1 ) { that.classesElementLookup[ key ] = $( value.not( event.target ).get() ); } } ); this._off( $( event.target ) ); }, _removeClass: function( element, keys, extra ) { return this._toggleClass( element, keys, extra, false ); }, _addClass: function( element, keys, extra ) { return this._toggleClass( element, keys, extra, true ); }, _toggleClass: function( element, keys, extra, add ) { add = ( typeof add === "boolean" ) ? add : extra; var shift = ( typeof element === "string" || element === null ), options = { extra: shift ? keys : extra, keys: shift ? element : keys, element: shift ? this.element : element, add: add }; options.element.toggleClass( this._classes( options ), add ); return this; }, _on: function( suppressDisabledCheck, element, handlers ) { var delegateElement; var instance = this; // No suppressDisabledCheck flag, shuffle arguments if ( typeof suppressDisabledCheck !== "boolean" ) { handlers = element; element = suppressDisabledCheck; suppressDisabledCheck = false; } // No element argument, shuffle and use this.element if ( !handlers ) { handlers = element; element = this.element; delegateElement = this.widget(); } else { element = delegateElement = $( element ); this.bindings = this.bindings.add( element ); } $.each( handlers, function( event, handler ) { function handlerProxy() { // Allow widgets to customize the disabled handling // - disabled as an array instead of boolean // - disabled class as method for disabling individual parts if ( !suppressDisabledCheck && ( instance.options.disabled === true || $( this ).hasClass( "ui-state-disabled" ) ) ) { return; } return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); } // Copy the guid so direct unbinding works if ( typeof handler !== "string" ) { handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++; } var match = event.match( /^([\w:-]*)\s*(.*)$/ ); var eventName = match[ 1 ] + instance.eventNamespace; var selector = match[ 2 ]; if ( selector ) { delegateElement.on( eventName, selector, handlerProxy ); } else { element.on( eventName, handlerProxy ); } } ); }, _off: function( element, eventName ) { eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; element.off( eventName ); // Clear the stack to avoid memory leaks (#10056) this.bindings = $( this.bindings.not( element ).get() ); this.focusable = $( this.focusable.not( element ).get() ); this.hoverable = $( this.hoverable.not( element ).get() ); }, _delay: function( handler, delay ) { function handlerProxy() { return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); } var instance = this; return setTimeout( handlerProxy, delay || 0 ); }, _hoverable: function( element ) { this.hoverable = this.hoverable.add( element ); this._on( element, { mouseenter: function( event ) { this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); }, mouseleave: function( event ) { this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); } } ); }, _focusable: function( element ) { this.focusable = this.focusable.add( element ); this._on( element, { focusin: function( event ) { this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); }, focusout: function( event ) { this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); } } ); }, _trigger: function( type, event, data ) { var prop, orig; var callback = this.options[ type ]; data = data || {}; event = $.Event( event ); event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase(); // The original event may come from any element // so we need to reset the target on the new event event.target = this.element[ 0 ]; // Copy original event properties over to the new event orig = event.originalEvent; if ( orig ) { for ( prop in orig ) { if ( !( prop in event ) ) { event[ prop ] = orig[ prop ]; } } } this.element.trigger( event, data ); return !( typeof callback === "function" && callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || event.isDefaultPrevented() ); } }; $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { if ( typeof options === "string" ) { options = { effect: options }; } var hasOptions; var effectName = !options ? method : options === true || typeof options === "number" ? defaultEffect : options.effect || defaultEffect; options = options || {}; if ( typeof options === "number" ) { options = { duration: options }; } else if ( options === true ) { options = {}; } hasOptions = !$.isEmptyObject( options ); options.complete = callback; if ( options.delay ) { element.delay( options.delay ); } if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { element[ method ]( options ); } else if ( effectName !== method && element[ effectName ] ) { element[ effectName ]( options.duration, options.easing, callback ); } else { element.queue( function( next ) { $( this )[ method ](); if ( callback ) { callback.call( element[ 0 ] ); } next(); } ); } }; } ); var widget = $.widget; /*! * jQuery UI Position 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/position/ */ //>>label: Position //>>group: Core //>>description: Positions elements relative to other elements. //>>docs: http://api.jqueryui.com/position/ //>>demos: http://jqueryui.com/position/ ( function() { var cachedScrollbarWidth, max = Math.max, abs = Math.abs, rhorizontal = /left|center|right/, rvertical = /top|center|bottom/, roffset = /[\+\-]\d+(\.[\d]+)?%?/, rposition = /^\w+/, rpercent = /%$/, _position = $.fn.position; function getOffsets( offsets, width, height ) { return [ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) ]; } function parseCss( element, property ) { return parseInt( $.css( element, property ), 10 ) || 0; } function isWindow( obj ) { return obj != null && obj === obj.window; } function getDimensions( elem ) { var raw = elem[ 0 ]; if ( raw.nodeType === 9 ) { return { width: elem.width(), height: elem.height(), offset: { top: 0, left: 0 } }; } if ( isWindow( raw ) ) { return { width: elem.width(), height: elem.height(), offset: { top: elem.scrollTop(), left: elem.scrollLeft() } }; } if ( raw.preventDefault ) { return { width: 0, height: 0, offset: { top: raw.pageY, left: raw.pageX } }; } return { width: elem.outerWidth(), height: elem.outerHeight(), offset: elem.offset() }; } $.position = { scrollbarWidth: function() { if ( cachedScrollbarWidth !== undefined ) { return cachedScrollbarWidth; } var w1, w2, div = $( "
" + "
" ), innerDiv = div.children()[ 0 ]; $( "body" ).append( div ); w1 = innerDiv.offsetWidth; div.css( "overflow", "scroll" ); w2 = innerDiv.offsetWidth; if ( w1 === w2 ) { w2 = div[ 0 ].clientWidth; } div.remove(); return ( cachedScrollbarWidth = w1 - w2 ); }, getScrollInfo: function( within ) { var overflowX = within.isWindow || within.isDocument ? "" : within.element.css( "overflow-x" ), overflowY = within.isWindow || within.isDocument ? "" : within.element.css( "overflow-y" ), hasOverflowX = overflowX === "scroll" || ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ), hasOverflowY = overflowY === "scroll" || ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight ); return { width: hasOverflowY ? $.position.scrollbarWidth() : 0, height: hasOverflowX ? $.position.scrollbarWidth() : 0 }; }, getWithinInfo: function( element ) { var withinElement = $( element || window ), isElemWindow = isWindow( withinElement[ 0 ] ), isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9, hasOffset = !isElemWindow && !isDocument; return { element: withinElement, isWindow: isElemWindow, isDocument: isDocument, offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 }, scrollLeft: withinElement.scrollLeft(), scrollTop: withinElement.scrollTop(), width: withinElement.outerWidth(), height: withinElement.outerHeight() }; } }; $.fn.position = function( options ) { if ( !options || !options.of ) { return _position.apply( this, arguments ); } // Make a copy, we don't want to modify arguments options = $.extend( {}, options ); var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, // Make sure string options are treated as CSS selectors target = typeof options.of === "string" ? $( document ).find( options.of ) : $( options.of ), within = $.position.getWithinInfo( options.within ), scrollInfo = $.position.getScrollInfo( within ), collision = ( options.collision || "flip" ).split( " " ), offsets = {}; dimensions = getDimensions( target ); if ( target[ 0 ].preventDefault ) { // Force left top to allow flipping options.at = "left top"; } targetWidth = dimensions.width; targetHeight = dimensions.height; targetOffset = dimensions.offset; // Clone to reuse original targetOffset later basePosition = $.extend( {}, targetOffset ); // Force my and at to have valid horizontal and vertical positions // if a value is missing or invalid, it will be converted to center $.each( [ "my", "at" ], function() { var pos = ( options[ this ] || "" ).split( " " ), horizontalOffset, verticalOffset; if ( pos.length === 1 ) { pos = rhorizontal.test( pos[ 0 ] ) ? pos.concat( [ "center" ] ) : rvertical.test( pos[ 0 ] ) ? [ "center" ].concat( pos ) : [ "center", "center" ]; } pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; // Calculate offsets horizontalOffset = roffset.exec( pos[ 0 ] ); verticalOffset = roffset.exec( pos[ 1 ] ); offsets[ this ] = [ horizontalOffset ? horizontalOffset[ 0 ] : 0, verticalOffset ? verticalOffset[ 0 ] : 0 ]; // Reduce to just the positions without the offsets options[ this ] = [ rposition.exec( pos[ 0 ] )[ 0 ], rposition.exec( pos[ 1 ] )[ 0 ] ]; } ); // Normalize collision option if ( collision.length === 1 ) { collision[ 1 ] = collision[ 0 ]; } if ( options.at[ 0 ] === "right" ) { basePosition.left += targetWidth; } else if ( options.at[ 0 ] === "center" ) { basePosition.left += targetWidth / 2; } if ( options.at[ 1 ] === "bottom" ) { basePosition.top += targetHeight; } else if ( options.at[ 1 ] === "center" ) { basePosition.top += targetHeight / 2; } atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); basePosition.left += atOffset[ 0 ]; basePosition.top += atOffset[ 1 ]; return this.each( function() { var collisionPosition, using, elem = $( this ), elemWidth = elem.outerWidth(), elemHeight = elem.outerHeight(), marginLeft = parseCss( this, "marginLeft" ), marginTop = parseCss( this, "marginTop" ), collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, position = $.extend( {}, basePosition ), myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); if ( options.my[ 0 ] === "right" ) { position.left -= elemWidth; } else if ( options.my[ 0 ] === "center" ) { position.left -= elemWidth / 2; } if ( options.my[ 1 ] === "bottom" ) { position.top -= elemHeight; } else if ( options.my[ 1 ] === "center" ) { position.top -= elemHeight / 2; } position.left += myOffset[ 0 ]; position.top += myOffset[ 1 ]; collisionPosition = { marginLeft: marginLeft, marginTop: marginTop }; $.each( [ "left", "top" ], function( i, dir ) { if ( $.ui.position[ collision[ i ] ] ) { $.ui.position[ collision[ i ] ][ dir ]( position, { targetWidth: targetWidth, targetHeight: targetHeight, elemWidth: elemWidth, elemHeight: elemHeight, collisionPosition: collisionPosition, collisionWidth: collisionWidth, collisionHeight: collisionHeight, offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], my: options.my, at: options.at, within: within, elem: elem } ); } } ); if ( options.using ) { // Adds feedback as second argument to using callback, if present using = function( props ) { var left = targetOffset.left - position.left, right = left + targetWidth - elemWidth, top = targetOffset.top - position.top, bottom = top + targetHeight - elemHeight, feedback = { target: { element: target, left: targetOffset.left, top: targetOffset.top, width: targetWidth, height: targetHeight }, element: { element: elem, left: position.left, top: position.top, width: elemWidth, height: elemHeight }, horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" }; if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { feedback.horizontal = "center"; } if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { feedback.vertical = "middle"; } if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { feedback.important = "horizontal"; } else { feedback.important = "vertical"; } options.using.call( this, props, feedback ); }; } elem.offset( $.extend( position, { using: using } ) ); } ); }; $.ui.position = { fit: { left: function( position, data ) { var within = data.within, withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, outerWidth = within.width, collisionPosLeft = position.left - data.collisionPosition.marginLeft, overLeft = withinOffset - collisionPosLeft, overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, newOverRight; // Element is wider than within if ( data.collisionWidth > outerWidth ) { // Element is initially over the left side of within if ( overLeft > 0 && overRight <= 0 ) { newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; position.left += overLeft - newOverRight; // Element is initially over right side of within } else if ( overRight > 0 && overLeft <= 0 ) { position.left = withinOffset; // Element is initially over both left and right sides of within } else { if ( overLeft > overRight ) { position.left = withinOffset + outerWidth - data.collisionWidth; } else { position.left = withinOffset; } } // Too far left -> align with left edge } else if ( overLeft > 0 ) { position.left += overLeft; // Too far right -> align with right edge } else if ( overRight > 0 ) { position.left -= overRight; // Adjust based on position and margin } else { position.left = max( position.left - collisionPosLeft, position.left ); } }, top: function( position, data ) { var within = data.within, withinOffset = within.isWindow ? within.scrollTop : within.offset.top, outerHeight = data.within.height, collisionPosTop = position.top - data.collisionPosition.marginTop, overTop = withinOffset - collisionPosTop, overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, newOverBottom; // Element is taller than within if ( data.collisionHeight > outerHeight ) { // Element is initially over the top of within if ( overTop > 0 && overBottom <= 0 ) { newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; position.top += overTop - newOverBottom; // Element is initially over bottom of within } else if ( overBottom > 0 && overTop <= 0 ) { position.top = withinOffset; // Element is initially over both top and bottom of within } else { if ( overTop > overBottom ) { position.top = withinOffset + outerHeight - data.collisionHeight; } else { position.top = withinOffset; } } // Too far up -> align with top } else if ( overTop > 0 ) { position.top += overTop; // Too far down -> align with bottom edge } else if ( overBottom > 0 ) { position.top -= overBottom; // Adjust based on position and margin } else { position.top = max( position.top - collisionPosTop, position.top ); } } }, flip: { left: function( position, data ) { var within = data.within, withinOffset = within.offset.left + within.scrollLeft, outerWidth = within.width, offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, collisionPosLeft = position.left - data.collisionPosition.marginLeft, overLeft = collisionPosLeft - offsetLeft, overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, myOffset = data.my[ 0 ] === "left" ? -data.elemWidth : data.my[ 0 ] === "right" ? data.elemWidth : 0, atOffset = data.at[ 0 ] === "left" ? data.targetWidth : data.at[ 0 ] === "right" ? -data.targetWidth : 0, offset = -2 * data.offset[ 0 ], newOverRight, newOverLeft; if ( overLeft < 0 ) { newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { position.left += myOffset + atOffset + offset; } } else if ( overRight > 0 ) { newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { position.left += myOffset + atOffset + offset; } } }, top: function( position, data ) { var within = data.within, withinOffset = within.offset.top + within.scrollTop, outerHeight = within.height, offsetTop = within.isWindow ? within.scrollTop : within.offset.top, collisionPosTop = position.top - data.collisionPosition.marginTop, overTop = collisionPosTop - offsetTop, overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, top = data.my[ 1 ] === "top", myOffset = top ? -data.elemHeight : data.my[ 1 ] === "bottom" ? data.elemHeight : 0, atOffset = data.at[ 1 ] === "top" ? data.targetHeight : data.at[ 1 ] === "bottom" ? -data.targetHeight : 0, offset = -2 * data.offset[ 1 ], newOverTop, newOverBottom; if ( overTop < 0 ) { newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { position.top += myOffset + atOffset + offset; } } else if ( overBottom > 0 ) { newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { position.top += myOffset + atOffset + offset; } } } }, flipfit: { left: function() { $.ui.position.flip.left.apply( this, arguments ); $.ui.position.fit.left.apply( this, arguments ); }, top: function() { $.ui.position.flip.top.apply( this, arguments ); $.ui.position.fit.top.apply( this, arguments ); } } }; } )(); var position = $.ui.position; /*! * jQuery UI :data 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: :data Selector //>>group: Core //>>description: Selects elements which have data stored under the specified key. //>>docs: http://api.jqueryui.com/data-selector/ var data = $.extend( $.expr.pseudos, { data: $.expr.createPseudo ? $.expr.createPseudo( function( dataName ) { return function( elem ) { return !!$.data( elem, dataName ); }; } ) : // Support: jQuery <1.8 function( elem, i, match ) { return !!$.data( elem, match[ 3 ] ); } } ); /*! * jQuery UI Keycode 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Keycode //>>group: Core //>>description: Provide keycodes as keynames //>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ var keycode = $.ui.keyCode = { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 }; /*! * jQuery UI Scroll Parent 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: scrollParent //>>group: Core //>>description: Get the closest ancestor element that is scrollable. //>>docs: http://api.jqueryui.com/scrollParent/ var scrollParent = $.fn.scrollParent = function( includeHidden ) { var position = this.css( "position" ), excludeStaticParent = position === "absolute", overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, scrollParent = this.parents().filter( function() { var parent = $( this ); if ( excludeStaticParent && parent.css( "position" ) === "static" ) { return false; } return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); } ).eq( 0 ); return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; }; /*! * jQuery UI Unique ID 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: uniqueId //>>group: Core //>>description: Functions to generate and remove uniqueId's //>>docs: http://api.jqueryui.com/uniqueId/ var uniqueId = $.fn.extend( { uniqueId: ( function() { var uuid = 0; return function() { return this.each( function() { if ( !this.id ) { this.id = "ui-id-" + ( ++uuid ); } } ); }; } )(), removeUniqueId: function() { return this.each( function() { if ( /^ui-id-\d+$/.test( this.id ) ) { $( this ).removeAttr( "id" ); } } ); } } ); // This file is deprecated var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); /*! * jQuery UI Mouse 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Mouse //>>group: Widgets //>>description: Abstracts mouse-based interactions to assist in creating certain widgets. //>>docs: http://api.jqueryui.com/mouse/ var mouseHandled = false; $( document ).on( "mouseup", function() { mouseHandled = false; } ); var widgetsMouse = $.widget( "ui.mouse", { version: "1.13.2", options: { cancel: "input, textarea, button, select, option", distance: 1, delay: 0 }, _mouseInit: function() { var that = this; this.element .on( "mousedown." + this.widgetName, function( event ) { return that._mouseDown( event ); } ) .on( "click." + this.widgetName, function( event ) { if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) { $.removeData( event.target, that.widgetName + ".preventClickEvent" ); event.stopImmediatePropagation(); return false; } } ); this.started = false; }, // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse _mouseDestroy: function() { this.element.off( "." + this.widgetName ); if ( this._mouseMoveDelegate ) { this.document .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); } }, _mouseDown: function( event ) { // don't let more than one widget handle mouseStart if ( mouseHandled ) { return; } this._mouseMoved = false; // We may have missed mouseup (out of window) if ( this._mouseStarted ) { this._mouseUp( event ); } this._mouseDownEvent = event; var that = this, btnIsLeft = ( event.which === 1 ), // event.target.nodeName works around a bug in IE 8 with // disabled inputs (#7620) elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ? $( event.target ).closest( this.options.cancel ).length : false ); if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) { return true; } this.mouseDelayMet = !this.options.delay; if ( !this.mouseDelayMet ) { this._mouseDelayTimer = setTimeout( function() { that.mouseDelayMet = true; }, this.options.delay ); } if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { this._mouseStarted = ( this._mouseStart( event ) !== false ); if ( !this._mouseStarted ) { event.preventDefault(); return true; } } // Click event may never have fired (Gecko & Opera) if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) { $.removeData( event.target, this.widgetName + ".preventClickEvent" ); } // These delegates are required to keep context this._mouseMoveDelegate = function( event ) { return that._mouseMove( event ); }; this._mouseUpDelegate = function( event ) { return that._mouseUp( event ); }; this.document .on( "mousemove." + this.widgetName, this._mouseMoveDelegate ) .on( "mouseup." + this.widgetName, this._mouseUpDelegate ); event.preventDefault(); mouseHandled = true; return true; }, _mouseMove: function( event ) { // Only check for mouseups outside the document if you've moved inside the document // at least once. This prevents the firing of mouseup in the case of IE<9, which will // fire a mousemove event if content is placed under the cursor. See #7778 // Support: IE <9 if ( this._mouseMoved ) { // IE mouseup check - mouseup happened when mouse was out of window if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button ) { return this._mouseUp( event ); // Iframe mouseup check - mouseup occurred in another document } else if ( !event.which ) { // Support: Safari <=8 - 9 // Safari sets which to 0 if you press any of the following keys // during a drag (#14461) if ( event.originalEvent.altKey || event.originalEvent.ctrlKey || event.originalEvent.metaKey || event.originalEvent.shiftKey ) { this.ignoreMissingWhich = true; } else if ( !this.ignoreMissingWhich ) { return this._mouseUp( event ); } } } if ( event.which || event.button ) { this._mouseMoved = true; } if ( this._mouseStarted ) { this._mouseDrag( event ); return event.preventDefault(); } if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { this._mouseStarted = ( this._mouseStart( this._mouseDownEvent, event ) !== false ); if ( this._mouseStarted ) { this._mouseDrag( event ); } else { this._mouseUp( event ); } } return !this._mouseStarted; }, _mouseUp: function( event ) { this.document .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); if ( this._mouseStarted ) { this._mouseStarted = false; if ( event.target === this._mouseDownEvent.target ) { $.data( event.target, this.widgetName + ".preventClickEvent", true ); } this._mouseStop( event ); } if ( this._mouseDelayTimer ) { clearTimeout( this._mouseDelayTimer ); delete this._mouseDelayTimer; } this.ignoreMissingWhich = false; mouseHandled = false; event.preventDefault(); }, _mouseDistanceMet: function( event ) { return ( Math.max( Math.abs( this._mouseDownEvent.pageX - event.pageX ), Math.abs( this._mouseDownEvent.pageY - event.pageY ) ) >= this.options.distance ); }, _mouseDelayMet: function( /* event */ ) { return this.mouseDelayMet; }, // These are placeholder methods, to be overriden by extending plugin _mouseStart: function( /* event */ ) {}, _mouseDrag: function( /* event */ ) {}, _mouseStop: function( /* event */ ) {}, _mouseCapture: function( /* event */ ) { return true; } } ); /*! * jQuery UI Sortable 1.13.2 * http://jqueryui.com * * Copyright jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license */ //>>label: Sortable //>>group: Interactions //>>description: Enables items in a list to be sorted using the mouse. //>>docs: http://api.jqueryui.com/sortable/ //>>demos: http://jqueryui.com/sortable/ //>>css.structure: ../../themes/base/sortable.css var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, { version: "1.13.2", widgetEventPrefix: "sort", ready: false, options: { appendTo: "parent", axis: false, connectWith: false, containment: false, cursor: "auto", cursorAt: false, dropOnEmpty: true, forcePlaceholderSize: false, forceHelperSize: false, grid: false, handle: false, helper: "original", items: "> *", opacity: false, placeholder: false, revert: false, scroll: true, scrollSensitivity: 20, scrollSpeed: 20, scope: "default", tolerance: "intersect", zIndex: 1000, // Callbacks activate: null, beforeStop: null, change: null, deactivate: null, out: null, over: null, receive: null, remove: null, sort: null, start: null, stop: null, update: null }, _isOverAxis: function( x, reference, size ) { return ( x >= reference ) && ( x < ( reference + size ) ); }, _isFloating: function( item ) { return ( /left|right/ ).test( item.css( "float" ) ) || ( /inline|table-cell/ ).test( item.css( "display" ) ); }, _create: function() { this.containerCache = {}; this._addClass( "ui-sortable" ); //Get the items this.refresh(); //Let's determine the parent's offset this.offset = this.element.offset(); //Initialize mouse events for interaction this._mouseInit(); this._setHandleClassName(); //We're ready to go this.ready = true; }, _setOption: function( key, value ) { this._super( key, value ); if ( key === "handle" ) { this._setHandleClassName(); } }, _setHandleClassName: function() { var that = this; this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" ); $.each( this.items, function() { that._addClass( this.instance.options.handle ? this.item.find( this.instance.options.handle ) : this.item, "ui-sortable-handle" ); } ); }, _destroy: function() { this._mouseDestroy(); for ( var i = this.items.length - 1; i >= 0; i-- ) { this.items[ i ].item.removeData( this.widgetName + "-item" ); } return this; }, _mouseCapture: function( event, overrideHandle ) { var currentItem = null, validHandle = false, that = this; if ( this.reverting ) { return false; } if ( this.options.disabled || this.options.type === "static" ) { return false; } //We have to refresh the items data once first this._refreshItems( event ); //Find out if the clicked node (or one of its parents) is a actual item in this.items $( event.target ).parents().each( function() { if ( $.data( this, that.widgetName + "-item" ) === that ) { currentItem = $( this ); return false; } } ); if ( $.data( event.target, that.widgetName + "-item" ) === that ) { currentItem = $( event.target ); } if ( !currentItem ) { return false; } if ( this.options.handle && !overrideHandle ) { $( this.options.handle, currentItem ).find( "*" ).addBack().each( function() { if ( this === event.target ) { validHandle = true; } } ); if ( !validHandle ) { return false; } } this.currentItem = currentItem; this._removeCurrentsFromItems(); return true; }, _mouseStart: function( event, overrideHandle, noActivation ) { var i, body, o = this.options; this.currentContainer = this; //We only need to call refreshPositions, because the refreshItems call has been moved to // mouseCapture this.refreshPositions(); //Prepare the dragged items parent this.appendTo = $( o.appendTo !== "parent" ? o.appendTo : this.currentItem.parent() ); //Create and append the visible helper this.helper = this._createHelper( event ); //Cache the helper size this._cacheHelperProportions(); /* * - Position generation - * This block generates everything position related - it's the core of draggables. */ //Cache the margins of the original element this._cacheMargins(); //The element's absolute position on the page minus margins this.offset = this.currentItem.offset(); this.offset = { top: this.offset.top - this.margins.top, left: this.offset.left - this.margins.left }; $.extend( this.offset, { click: { //Where the click happened, relative to the element left: event.pageX - this.offset.left, top: event.pageY - this.offset.top }, // This is a relative to absolute position minus the actual position calculation - // only used for relative positioned helper relative: this._getRelativeOffset() } ); // After we get the helper offset, but before we get the parent offset we can // change the helper's position to absolute // TODO: Still need to figure out a way to make relative sorting possible this.helper.css( "position", "absolute" ); this.cssPosition = this.helper.css( "position" ); //Adjust the mouse offset relative to the helper if "cursorAt" is supplied if ( o.cursorAt ) { this._adjustOffsetFromHelper( o.cursorAt ); } //Cache the former DOM position this.domPosition = { prev: this.currentItem.prev()[ 0 ], parent: this.currentItem.parent()[ 0 ] }; // If the helper is not the original, hide the original so it's not playing any role during // the drag, won't cause anything bad this way if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { this.currentItem.hide(); } //Create the placeholder this._createPlaceholder(); //Get the next scrolling parent this.scrollParent = this.placeholder.scrollParent(); $.extend( this.offset, { parent: this._getParentOffset() } ); //Set a containment if given in the options if ( o.containment ) { this._setContainment(); } if ( o.cursor && o.cursor !== "auto" ) { // cursor option body = this.document.find( "body" ); // Support: IE this.storedCursor = body.css( "cursor" ); body.css( "cursor", o.cursor ); this.storedStylesheet = $( "" ).appendTo( body ); } // We need to make sure to grab the zIndex before setting the // opacity, because setting the opacity to anything lower than 1 // causes the zIndex to change from "auto" to 0. if ( o.zIndex ) { // zIndex option if ( this.helper.css( "zIndex" ) ) { this._storedZIndex = this.helper.css( "zIndex" ); } this.helper.css( "zIndex", o.zIndex ); } if ( o.opacity ) { // opacity option if ( this.helper.css( "opacity" ) ) { this._storedOpacity = this.helper.css( "opacity" ); } this.helper.css( "opacity", o.opacity ); } //Prepare scrolling if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && this.scrollParent[ 0 ].tagName !== "HTML" ) { this.overflowOffset = this.scrollParent.offset(); } //Call callbacks this._trigger( "start", event, this._uiHash() ); //Recache the helper size if ( !this._preserveHelperProportions ) { this._cacheHelperProportions(); } //Post "activate" events to possible containers if ( !noActivation ) { for ( i = this.containers.length - 1; i >= 0; i-- ) { this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) ); } } //Prepare possible droppables if ( $.ui.ddmanager ) { $.ui.ddmanager.current = this; } if ( $.ui.ddmanager && !o.dropBehaviour ) { $.ui.ddmanager.prepareOffsets( this, event ); } this.dragging = true; this._addClass( this.helper, "ui-sortable-helper" ); //Move the helper, if needed if ( !this.helper.parent().is( this.appendTo ) ) { this.helper.detach().appendTo( this.appendTo ); //Update position this.offset.parent = this._getParentOffset(); } //Generate the original position this.position = this.originalPosition = this._generatePosition( event ); this.originalPageX = event.pageX; this.originalPageY = event.pageY; this.lastPositionAbs = this.positionAbs = this._convertPositionTo( "absolute" ); this._mouseDrag( event ); return true; }, _scroll: function( event ) { var o = this.options, scrolled = false; if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && this.scrollParent[ 0 ].tagName !== "HTML" ) { if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) - event.pageY < o.scrollSensitivity ) { this.scrollParent[ 0 ].scrollTop = scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed; } else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) { this.scrollParent[ 0 ].scrollTop = scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed; } if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) - event.pageX < o.scrollSensitivity ) { this.scrollParent[ 0 ].scrollLeft = scrolled = this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed; } else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) { this.scrollParent[ 0 ].scrollLeft = scrolled = this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed; } } else { if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) { scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed ); } else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) < o.scrollSensitivity ) { scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed ); } if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) { scrolled = this.document.scrollLeft( this.document.scrollLeft() - o.scrollSpeed ); } else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) < o.scrollSensitivity ) { scrolled = this.document.scrollLeft( this.document.scrollLeft() + o.scrollSpeed ); } } return scrolled; }, _mouseDrag: function( event ) { var i, item, itemElement, intersection, o = this.options; //Compute the helpers position this.position = this._generatePosition( event ); this.positionAbs = this._convertPositionTo( "absolute" ); //Set the helper position if ( !this.options.axis || this.options.axis !== "y" ) { this.helper[ 0 ].style.left = this.position.left + "px"; } if ( !this.options.axis || this.options.axis !== "x" ) { this.helper[ 0 ].style.top = this.position.top + "px"; } //Do scrolling if ( o.scroll ) { if ( this._scroll( event ) !== false ) { //Update item positions used in position checks this._refreshItemPositions( true ); if ( $.ui.ddmanager && !o.dropBehaviour ) { $.ui.ddmanager.prepareOffsets( this, event ); } } } this.dragDirection = { vertical: this._getDragVerticalDirection(), horizontal: this._getDragHorizontalDirection() }; //Rearrange for ( i = this.items.length - 1; i >= 0; i-- ) { //Cache variables and intersection, continue if no intersection item = this.items[ i ]; itemElement = item.item[ 0 ]; intersection = this._intersectsWithPointer( item ); if ( !intersection ) { continue; } // Only put the placeholder inside the current Container, skip all // items from other containers. This works because when moving // an item from one container to another the // currentContainer is switched before the placeholder is moved. // // Without this, moving items in "sub-sortables" can cause // the placeholder to jitter between the outer and inner container. if ( item.instance !== this.currentContainer ) { continue; } // Cannot intersect with itself // no useless actions that have been done before // no action if the item moved is the parent of the item checked if ( itemElement !== this.currentItem[ 0 ] && this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement && !$.contains( this.placeholder[ 0 ], itemElement ) && ( this.options.type === "semi-dynamic" ? !$.contains( this.element[ 0 ], itemElement ) : true ) ) { this.direction = intersection === 1 ? "down" : "up"; if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) { this._rearrange( event, item ); } else { break; } this._trigger( "change", event, this._uiHash() ); break; } } //Post events to containers this._contactContainers( event ); //Interconnect with droppables if ( $.ui.ddmanager ) { $.ui.ddmanager.drag( this, event ); } //Call callbacks this._trigger( "sort", event, this._uiHash() ); this.lastPositionAbs = this.positionAbs; return false; }, _mouseStop: function( event, noPropagation ) { if ( !event ) { return; } //If we are using droppables, inform the manager about the drop if ( $.ui.ddmanager && !this.options.dropBehaviour ) { $.ui.ddmanager.drop( this, event ); } if ( this.options.revert ) { var that = this, cur = this.placeholder.offset(), axis = this.options.axis, animation = {}; if ( !axis || axis === "x" ) { animation.left = cur.left - this.offset.parent.left - this.margins.left + ( this.offsetParent[ 0 ] === this.document[ 0 ].body ? 0 : this.offsetParent[ 0 ].scrollLeft ); } if ( !axis || axis === "y" ) { animation.top = cur.top - this.offset.parent.top - this.margins.top + ( this.offsetParent[ 0 ] === this.document[ 0 ].body ? 0 : this.offsetParent[ 0 ].scrollTop ); } this.reverting = true; $( this.helper ).animate( animation, parseInt( this.options.revert, 10 ) || 500, function() { that._clear( event ); } ); } else { this._clear( event, noPropagation ); } return false; }, cancel: function() { if ( this.dragging ) { this._mouseUp( new $.Event( "mouseup", { target: null } ) ); if ( this.options.helper === "original" ) { this.currentItem.css( this._storedCSS ); this._removeClass( this.currentItem, "ui-sortable-helper" ); } else { this.currentItem.show(); } //Post deactivating events to containers for ( var i = this.containers.length - 1; i >= 0; i-- ) { this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) ); if ( this.containers[ i ].containerCache.over ) { this.containers[ i ]._trigger( "out", null, this._uiHash( this ) ); this.containers[ i ].containerCache.over = 0; } } } if ( this.placeholder ) { //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, // it unbinds ALL events from the original node! if ( this.placeholder[ 0 ].parentNode ) { this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] ); } if ( this.options.helper !== "original" && this.helper && this.helper[ 0 ].parentNode ) { this.helper.remove(); } $.extend( this, { helper: null, dragging: false, reverting: false, _noFinalSort: null } ); if ( this.domPosition.prev ) { $( this.domPosition.prev ).after( this.currentItem ); } else { $( this.domPosition.parent ).prepend( this.currentItem ); } } return this; }, serialize: function( o ) { var items = this._getItemsAsjQuery( o && o.connected ), str = []; o = o || {}; $( items ).each( function() { var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" ) .match( o.expression || ( /(.+)[\-=_](.+)/ ) ); if ( res ) { str.push( ( o.key || res[ 1 ] + "[]" ) + "=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) ); } } ); if ( !str.length && o.key ) { str.push( o.key + "=" ); } return str.join( "&" ); }, toArray: function( o ) { var items = this._getItemsAsjQuery( o && o.connected ), ret = []; o = o || {}; items.each( function() { ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" ); } ); return ret; }, /* Be careful with the following core functions */ _intersectsWith: function( item ) { var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height, l = item.left, r = l + item.width, t = item.top, b = t + item.height, dyClick = this.offset.click.top, dxClick = this.offset.click.left, isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ), isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ), isOverElement = isOverElementHeight && isOverElementWidth; if ( this.options.tolerance === "pointer" || this.options.forcePointerForContainers || ( this.options.tolerance !== "pointer" && this.helperProportions[ this.floating ? "width" : "height" ] > item[ this.floating ? "width" : "height" ] ) ) { return isOverElement; } else { return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half x2 - ( this.helperProportions.width / 2 ) < r && // Left Half t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half } }, _intersectsWithPointer: function( item ) { var verticalDirection, horizontalDirection, isOverElementHeight = ( this.options.axis === "x" ) || this._isOverAxis( this.positionAbs.top + this.offset.click.top, item.top, item.height ), isOverElementWidth = ( this.options.axis === "y" ) || this._isOverAxis( this.positionAbs.left + this.offset.click.left, item.left, item.width ), isOverElement = isOverElementHeight && isOverElementWidth; if ( !isOverElement ) { return false; } verticalDirection = this.dragDirection.vertical; horizontalDirection = this.dragDirection.horizontal; return this.floating ? ( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 ) : ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) ); }, _intersectsWithSides: function( item ) { var isOverBottomHalf = this._isOverAxis( this.positionAbs.top + this.offset.click.top, item.top + ( item.height / 2 ), item.height ), isOverRightHalf = this._isOverAxis( this.positionAbs.left + this.offset.click.left, item.left + ( item.width / 2 ), item.width ), verticalDirection = this.dragDirection.vertical, horizontalDirection = this.dragDirection.horizontal; if ( this.floating && horizontalDirection ) { return ( ( horizontalDirection === "right" && isOverRightHalf ) || ( horizontalDirection === "left" && !isOverRightHalf ) ); } else { return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) || ( verticalDirection === "up" && !isOverBottomHalf ) ); } }, _getDragVerticalDirection: function() { var delta = this.positionAbs.top - this.lastPositionAbs.top; return delta !== 0 && ( delta > 0 ? "down" : "up" ); }, _getDragHorizontalDirection: function() { var delta = this.positionAbs.left - this.lastPositionAbs.left; return delta !== 0 && ( delta > 0 ? "right" : "left" ); }, refresh: function( event ) { this._refreshItems( event ); this._setHandleClassName(); this.refreshPositions(); return this; }, _connectWith: function() { var options = this.options; return options.connectWith.constructor === String ? [ options.connectWith ] : options.connectWith; }, _getItemsAsjQuery: function( connected ) { var i, j, cur, inst, items = [], queries = [], connectWith = this._connectWith(); if ( connectWith && connected ) { for ( i = connectWith.length - 1; i >= 0; i-- ) { cur = $( connectWith[ i ], this.document[ 0 ] ); for ( j = cur.length - 1; j >= 0; j-- ) { inst = $.data( cur[ j ], this.widgetFullName ); if ( inst && inst !== this && !inst.options.disabled ) { queries.push( [ typeof inst.options.items === "function" ? inst.options.items.call( inst.element ) : $( inst.options.items, inst.element ) .not( ".ui-sortable-helper" ) .not( ".ui-sortable-placeholder" ), inst ] ); } } } } queries.push( [ typeof this.options.items === "function" ? this.options.items .call( this.element, null, { options: this.options, item: this.currentItem } ) : $( this.options.items, this.element ) .not( ".ui-sortable-helper" ) .not( ".ui-sortable-placeholder" ), this ] ); function addItems() { items.push( this ); } for ( i = queries.length - 1; i >= 0; i-- ) { queries[ i ][ 0 ].each( addItems ); } return $( items ); }, _removeCurrentsFromItems: function() { var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" ); this.items = $.grep( this.items, function( item ) { for ( var j = 0; j < list.length; j++ ) { if ( list[ j ] === item.item[ 0 ] ) { return false; } } return true; } ); }, _refreshItems: function( event ) { this.items = []; this.containers = [ this ]; var i, j, cur, inst, targetData, _queries, item, queriesLength, items = this.items, queries = [ [ typeof this.options.items === "function" ? this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) : $( this.options.items, this.element ), this ] ], connectWith = this._connectWith(); //Shouldn't be run the first time through due to massive slow-down if ( connectWith && this.ready ) { for ( i = connectWith.length - 1; i >= 0; i-- ) { cur = $( connectWith[ i ], this.document[ 0 ] ); for ( j = cur.length - 1; j >= 0; j-- ) { inst = $.data( cur[ j ], this.widgetFullName ); if ( inst && inst !== this && !inst.options.disabled ) { queries.push( [ typeof inst.options.items === "function" ? inst.options.items .call( inst.element[ 0 ], event, { item: this.currentItem } ) : $( inst.options.items, inst.element ), inst ] ); this.containers.push( inst ); } } } } for ( i = queries.length - 1; i >= 0; i-- ) { targetData = queries[ i ][ 1 ]; _queries = queries[ i ][ 0 ]; for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) { item = $( _queries[ j ] ); // Data for target checking (mouse manager) item.data( this.widgetName + "-item", targetData ); items.push( { item: item, instance: targetData, width: 0, height: 0, left: 0, top: 0 } ); } } }, _refreshItemPositions: function( fast ) { var i, item, t, p; for ( i = this.items.length - 1; i >= 0; i-- ) { item = this.items[ i ]; //We ignore calculating positions of all connected containers when we're not over them if ( this.currentContainer && item.instance !== this.currentContainer && item.item[ 0 ] !== this.currentItem[ 0 ] ) { continue; } t = this.options.toleranceElement ? $( this.options.toleranceElement, item.item ) : item.item; if ( !fast ) { item.width = t.outerWidth(); item.height = t.outerHeight(); } p = t.offset(); item.left = p.left; item.top = p.top; } }, refreshPositions: function( fast ) { // Determine whether items are being displayed horizontally this.floating = this.items.length ? this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) : false; // This has to be redone because due to the item being moved out/into the offsetParent, // the offsetParent's position will change if ( this.offsetParent && this.helper ) { this.offset.parent = this._getParentOffset(); } this._refreshItemPositions( fast ); var i, p; if ( this.options.custom && this.options.custom.refreshContainers ) { this.options.custom.refreshContainers.call( this ); } else { for ( i = this.containers.length - 1; i >= 0; i-- ) { p = this.containers[ i ].element.offset(); this.containers[ i ].containerCache.left = p.left; this.containers[ i ].containerCache.top = p.top; this.containers[ i ].containerCache.width = this.containers[ i ].element.outerWidth(); this.containers[ i ].containerCache.height = this.containers[ i ].element.outerHeight(); } } return this; }, _createPlaceholder: function( that ) { that = that || this; var className, nodeName, o = that.options; if ( !o.placeholder || o.placeholder.constructor === String ) { className = o.placeholder; nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(); o.placeholder = { element: function() { var element = $( "<" + nodeName + ">", that.document[ 0 ] ); that._addClass( element, "ui-sortable-placeholder", className || that.currentItem[ 0 ].className ) ._removeClass( element, "ui-sortable-helper" ); if ( nodeName === "tbody" ) { that._createTrPlaceholder( that.currentItem.find( "tr" ).eq( 0 ), $( "", that.document[ 0 ] ).appendTo( element ) ); } else if ( nodeName === "tr" ) { that._createTrPlaceholder( that.currentItem, element ); } else if ( nodeName === "img" ) { element.attr( "src", that.currentItem.attr( "src" ) ); } if ( !className ) { element.css( "visibility", "hidden" ); } return element; }, update: function( container, p ) { // 1. If a className is set as 'placeholder option, we don't force sizes - // the class is responsible for that // 2. The option 'forcePlaceholderSize can be enabled to force it even if a // class name is specified if ( className && !o.forcePlaceholderSize ) { return; } // If the element doesn't have a actual height or width by itself (without // styles coming from a stylesheet), it receives the inline height and width // from the dragged item. Or, if it's a tbody or tr, it's going to have a height // anyway since we're populating them with s above, but they're unlikely to // be the correct height on their own if the row heights are dynamic, so we'll // always assign the height of the dragged item given forcePlaceholderSize // is true. if ( !p.height() || ( o.forcePlaceholderSize && ( nodeName === "tbody" || nodeName === "tr" ) ) ) { p.height( that.currentItem.innerHeight() - parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) - parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) ); } if ( !p.width() ) { p.width( that.currentItem.innerWidth() - parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) - parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) ); } } }; } //Create the placeholder that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) ); //Append it after the actual current item that.currentItem.after( that.placeholder ); //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) o.placeholder.update( that, that.placeholder ); }, _createTrPlaceholder: function( sourceTr, targetTr ) { var that = this; sourceTr.children().each( function() { $( " ", that.document[ 0 ] ) .attr( "colspan", $( this ).attr( "colspan" ) || 1 ) .appendTo( targetTr ); } ); }, _contactContainers: function( event ) { var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis, innermostContainer = null, innermostIndex = null; // Get innermost container that intersects with item for ( i = this.containers.length - 1; i >= 0; i-- ) { // Never consider a container that's located within the item itself if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) { continue; } if ( this._intersectsWith( this.containers[ i ].containerCache ) ) { // If we've already found a container and it's more "inner" than this, then continue if ( innermostContainer && $.contains( this.containers[ i ].element[ 0 ], innermostContainer.element[ 0 ] ) ) { continue; } innermostContainer = this.containers[ i ]; innermostIndex = i; } else { // container doesn't intersect. trigger "out" event if necessary if ( this.containers[ i ].containerCache.over ) { this.containers[ i ]._trigger( "out", event, this._uiHash( this ) ); this.containers[ i ].containerCache.over = 0; } } } // If no intersecting containers found, return if ( !innermostContainer ) { return; } // Move the item into the container if it's not there already if ( this.containers.length === 1 ) { if ( !this.containers[ innermostIndex ].containerCache.over ) { this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) ); this.containers[ innermostIndex ].containerCache.over = 1; } } else { // When entering a new container, we will find the item with the least distance and // append our item near it dist = 10000; itemWithLeastDistance = null; floating = innermostContainer.floating || this._isFloating( this.currentItem ); posProperty = floating ? "left" : "top"; sizeProperty = floating ? "width" : "height"; axis = floating ? "pageX" : "pageY"; for ( j = this.items.length - 1; j >= 0; j-- ) { if ( !$.contains( this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] ) ) { continue; } if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) { continue; } cur = this.items[ j ].item.offset()[ posProperty ]; nearBottom = false; if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) { nearBottom = true; } if ( Math.abs( event[ axis ] - cur ) < dist ) { dist = Math.abs( event[ axis ] - cur ); itemWithLeastDistance = this.items[ j ]; this.direction = nearBottom ? "up" : "down"; } } //Check if dropOnEmpty is enabled if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) { return; } if ( this.currentContainer === this.containers[ innermostIndex ] ) { if ( !this.currentContainer.containerCache.over ) { this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() ); this.currentContainer.containerCache.over = 1; } return; } if ( itemWithLeastDistance ) { this._rearrange( event, itemWithLeastDistance, null, true ); } else { this._rearrange( event, null, this.containers[ innermostIndex ].element, true ); } this._trigger( "change", event, this._uiHash() ); this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) ); this.currentContainer = this.containers[ innermostIndex ]; //Update the placeholder this.options.placeholder.update( this.currentContainer, this.placeholder ); //Update scrollParent this.scrollParent = this.placeholder.scrollParent(); //Update overflowOffset if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && this.scrollParent[ 0 ].tagName !== "HTML" ) { this.overflowOffset = this.scrollParent.offset(); } this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) ); this.containers[ innermostIndex ].containerCache.over = 1; } }, _createHelper: function( event ) { var o = this.options, helper = typeof o.helper === "function" ? $( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) : ( o.helper === "clone" ? this.currentItem.clone() : this.currentItem ); //Add the helper to the DOM if that didn't happen already if ( !helper.parents( "body" ).length ) { this.appendTo[ 0 ].appendChild( helper[ 0 ] ); } if ( helper[ 0 ] === this.currentItem[ 0 ] ) { this._storedCSS = { width: this.currentItem[ 0 ].style.width, height: this.currentItem[ 0 ].style.height, position: this.currentItem.css( "position" ), top: this.currentItem.css( "top" ), left: this.currentItem.css( "left" ) }; } if ( !helper[ 0 ].style.width || o.forceHelperSize ) { helper.width( this.currentItem.width() ); } if ( !helper[ 0 ].style.height || o.forceHelperSize ) { helper.height( this.currentItem.height() ); } return helper; }, _adjustOffsetFromHelper: function( obj ) { if ( typeof obj === "string" ) { obj = obj.split( " " ); } if ( Array.isArray( obj ) ) { obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 }; } if ( "left" in obj ) { this.offset.click.left = obj.left + this.margins.left; } if ( "right" in obj ) { this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; } if ( "top" in obj ) { this.offset.click.top = obj.top + this.margins.top; } if ( "bottom" in obj ) { this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; } }, _getParentOffset: function() { //Get the offsetParent and cache its position this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); // This is a special case where we need to modify a offset calculated on start, since the // following happened: // 1. The position of the helper is absolute, so it's position is calculated based on the // next positioned parent // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't // the document, which means that the scroll is included in the initial calculation of the // offset of the parent, and never recalculated upon drag if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) { po.left += this.scrollParent.scrollLeft(); po.top += this.scrollParent.scrollTop(); } // This needs to be actually done for all browsers, since pageX/pageY includes this // information with an ugly IE fix if ( this.offsetParent[ 0 ] === this.document[ 0 ].body || ( this.offsetParent[ 0 ].tagName && this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) { po = { top: 0, left: 0 }; } return { top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ), left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 ) }; }, _getRelativeOffset: function() { if ( this.cssPosition === "relative" ) { var p = this.currentItem.position(); return { top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) + this.scrollParent.scrollTop(), left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) + this.scrollParent.scrollLeft() }; } else { return { top: 0, left: 0 }; } }, _cacheMargins: function() { this.margins = { left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ), top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 ) }; }, _cacheHelperProportions: function() { this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() }; }, _setContainment: function() { var ce, co, over, o = this.options; if ( o.containment === "parent" ) { o.containment = this.helper[ 0 ].parentNode; } if ( o.containment === "document" || o.containment === "window" ) { this.containment = [ 0 - this.offset.relative.left - this.offset.parent.left, 0 - this.offset.relative.top - this.offset.parent.top, o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left, ( o.containment === "document" ? ( this.document.height() || document.body.parentNode.scrollHeight ) : this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top ]; } if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) { ce = $( o.containment )[ 0 ]; co = $( o.containment ).offset(); over = ( $( ce ).css( "overflow" ) !== "hidden" ); this.containment = [ co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left, co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top, co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) - ( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left, co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) - ( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top ]; } }, _convertPositionTo: function( d, pos ) { if ( !pos ) { pos = this.position; } var mod = d === "absolute" ? 1 : -1, scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent, scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName ); return { top: ( // The absolute mouse position pos.top + // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.relative.top * mod + // The offsetParent's offset without borders (offset + border) this.offset.parent.top * mod - ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod ) ), left: ( // The absolute mouse position pos.left + // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.relative.left * mod + // The offsetParent's offset without borders (offset + border) this.offset.parent.left * mod - ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod ) ) }; }, _generatePosition: function( event ) { var top, left, o = this.options, pageX = event.pageX, pageY = event.pageY, scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent, scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName ); // This is another very weird special case that only happens for relative elements: // 1. If the css position is relative // 2. and the scroll parent is the document or similar to the offset parent // we have to refresh the relative offset during the scroll so there are no jumps if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] && this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) { this.offset.relative = this._getRelativeOffset(); } /* * - Position constraining - * Constrain the position to a mix of grid, containment. */ if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options if ( this.containment ) { if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) { pageX = this.containment[ 0 ] + this.offset.click.left; } if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) { pageY = this.containment[ 1 ] + this.offset.click.top; } if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) { pageX = this.containment[ 2 ] + this.offset.click.left; } if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) { pageY = this.containment[ 3 ] + this.offset.click.top; } } if ( o.grid ) { top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ]; pageY = this.containment ? ( ( top - this.offset.click.top >= this.containment[ 1 ] && top - this.offset.click.top <= this.containment[ 3 ] ) ? top : ( ( top - this.offset.click.top >= this.containment[ 1 ] ) ? top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top; left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ]; pageX = this.containment ? ( ( left - this.offset.click.left >= this.containment[ 0 ] && left - this.offset.click.left <= this.containment[ 2 ] ) ? left : ( ( left - this.offset.click.left >= this.containment[ 0 ] ) ? left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left; } } return { top: ( // The absolute mouse position pageY - // Click offset (relative to the element) this.offset.click.top - // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.relative.top - // The offsetParent's offset without borders (offset + border) this.offset.parent.top + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) ) ), left: ( // The absolute mouse position pageX - // Click offset (relative to the element) this.offset.click.left - // Only for relative positioned nodes: Relative offset from element to offset parent this.offset.relative.left - // The offsetParent's offset without borders (offset + border) this.offset.parent.left + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) ) }; }, _rearrange: function( event, i, a, hardRefresh ) { if ( a ) { a[ 0 ].appendChild( this.placeholder[ 0 ] ); } else { i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ], ( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) ); } //Various things done here to improve the performance: // 1. we create a setTimeout, that calls refreshPositions // 2. on the instance, we have a counter variable, that get's higher after every append // 3. on the local scope, we copy the counter variable, and check in the timeout, // if it's still the same // 4. this lets only the last addition to the timeout stack through this.counter = this.counter ? ++this.counter : 1; var counter = this.counter; this._delay( function() { if ( counter === this.counter ) { //Precompute after each DOM insertion, NOT on mousemove this.refreshPositions( !hardRefresh ); } } ); }, _clear: function( event, noPropagation ) { this.reverting = false; // We delay all events that have to be triggered to after the point where the placeholder // has been removed and everything else normalized again var i, delayedTriggers = []; // We first have to update the dom position of the actual currentItem // Note: don't do it if the current item is already removed (by a user), or it gets // reappended (see #4088) if ( !this._noFinalSort && this.currentItem.parent().length ) { this.placeholder.before( this.currentItem ); } this._noFinalSort = null; if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) { for ( i in this._storedCSS ) { if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) { this._storedCSS[ i ] = ""; } } this.currentItem.css( this._storedCSS ); this._removeClass( this.currentItem, "ui-sortable-helper" ); } else { this.currentItem.show(); } if ( this.fromOutside && !noPropagation ) { delayedTriggers.push( function( event ) { this._trigger( "receive", event, this._uiHash( this.fromOutside ) ); } ); } if ( ( this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] || this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) { // Trigger update callback if the DOM position has changed delayedTriggers.push( function( event ) { this._trigger( "update", event, this._uiHash() ); } ); } // Check if the items Container has Changed and trigger appropriate // events. if ( this !== this.currentContainer ) { if ( !noPropagation ) { delayedTriggers.push( function( event ) { this._trigger( "remove", event, this._uiHash() ); } ); delayedTriggers.push( ( function( c ) { return function( event ) { c._trigger( "receive", event, this._uiHash( this ) ); }; } ).call( this, this.currentContainer ) ); delayedTriggers.push( ( function( c ) { return function( event ) { c._trigger( "update", event, this._uiHash( this ) ); }; } ).call( this, this.currentContainer ) ); } } //Post events to containers function delayEvent( type, instance, container ) { return function( event ) { container._trigger( type, event, instance._uiHash( instance ) ); }; } for ( i = this.containers.length - 1; i >= 0; i-- ) { if ( !noPropagation ) { delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); } if ( this.containers[ i ].containerCache.over ) { delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); this.containers[ i ].containerCache.over = 0; } } //Do what was originally in plugins if ( this.storedCursor ) { this.document.find( "body" ).css( "cursor", this.storedCursor ); this.storedStylesheet.remove(); } if ( this._storedOpacity ) { this.helper.css( "opacity", this._storedOpacity ); } if ( this._storedZIndex ) { this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex ); } this.dragging = false; if ( !noPropagation ) { this._trigger( "beforeStop", event, this._uiHash() ); } //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, // it unbinds ALL events from the original node! this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] ); if ( !this.cancelHelperRemoval ) { if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { this.helper.remove(); } this.helper = null; } if ( !noPropagation ) { for ( i = 0; i < delayedTriggers.length; i++ ) { // Trigger all delayed events delayedTriggers[ i ].call( this, event ); } this._trigger( "stop", event, this._uiHash() ); } this.fromOutside = false; return !this.cancelHelperRemoval; }, _trigger: function() { if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) { this.cancel(); } }, _uiHash: function( _inst ) { var inst = _inst || this; return { helper: inst.helper, placeholder: inst.placeholder || $( [] ), position: inst.position, originalPosition: inst.originalPosition, offset: inst.positionAbs, item: inst.currentItem, sender: _inst ? _inst.element : null }; } } ); var safeActiveElement = $.ui.safeActiveElement = function( document ) { var activeElement; // Support: IE 9 only // IE9 throws an "Unspecified error" accessing document.activeElement from an ' ); iframe.setStyles( { width: '100%', height: '100%' } ); iframe.addClass( 'cke_wysiwyg_frame' ).addClass( 'cke_reset' ); var contentSpace = editor.ui.space( 'contents' ); contentSpace.append( iframe ); // Asynchronous iframe loading is only required in IE>8 and Gecko (other reasons probably). // Do not use it on WebKit as it'll break the browser-back navigation. var useOnloadEvent = ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) || CKEDITOR.env.gecko; if ( useOnloadEvent ) iframe.on( 'load', onLoad ); var frameLabel = editor.title, helpLabel = editor.fire( 'ariaEditorHelpLabel', {} ).label, recreateEditable = false, isIE11 = CKEDITOR.env.ie && CKEDITOR.env.version === 11, isMutationObserverSupported = !!window.MutationObserver, mutationObserver; if ( frameLabel ) { if ( CKEDITOR.env.ie && helpLabel ) frameLabel += ', ' + helpLabel; iframe.setAttribute( 'title', frameLabel ); } if ( helpLabel ) { var labelId = CKEDITOR.tools.getNextId(), desc = CKEDITOR.dom.element.createFromHtml( '' + helpLabel + '' ); contentSpace.append( desc, 1 ); iframe.setAttribute( 'aria-describedby', labelId ); } // Remove the ARIA description. editor.on( 'beforeModeUnload', function( evt ) { evt.removeListener(); if ( desc ) { desc.remove(); } if ( isMutationObserverSupported ) { mutationObserver.disconnect(); } } ); editor.on( 'destroy', function() { if ( mutationObserver ) { mutationObserver.disconnect(); } } ); iframe.setAttributes( { tabIndex: editor.tabIndex, allowTransparency: 'true' } ); // Execute onLoad manually for all non IE||Gecko browsers. !useOnloadEvent && onLoad(); editor.fire( 'ariaWidget', iframe ); function onLoad( evt ) { evt && evt.removeListener(); if ( editor.isDestroyed() || editor.isDetached() ) { return; } editor.editable( new framedWysiwyg( editor, iframe.getFrameDocument().getBody() ) ); editor.setData( editor.getData( 1 ), callback ); // Skip IE's below version 11. They don't support MutationObserver (#4462). if ( !isMutationObserverSupported ) { return; } if ( isIE11 ) { editor.on( 'mode', attachIframeReloader, { iframe: iframe, editor: editor, callback: callback } ); } editor.on( 'mode', function() { editor.status = 'ready'; } ); observeEditor(); } function attachIframeReloader( evt ) { evt && evt.removeListener(); iframe.on( 'load', function() { if ( recreateEditable ) { recreateEditable = false; recreate(); } } ); } function observeEditor() { mutationObserver = new MutationObserver( function( mutationsList ) { for ( var index = 0; index < mutationsList.length; index++ ) { verifyIfAddsNodesWithEditor( mutationsList[ index ] ); } } ); mutationObserver.observe( editor.config.observableParent, { childList: true, subtree: true } ); } function verifyIfAddsNodesWithEditor( mutation ) { if ( mutation.type !== 'childList' || mutation.addedNodes.length === 0 ) { return; } for ( var index = 0; index < mutation.addedNodes.length; index++ ) { checkIfAffectsEditor( mutation.addedNodes[ index ] ); } } function checkIfAffectsEditor( node ) { if ( !node.contains || !node.contains( editor.container.$ ) ) { return; } if ( !isIE11 ) { recreate(); return; } recreateEditable = true; } function recreate() { var cacheData = editor.getData( false ), newEditable; // Remove current editable, but preserve iframe. editor.editable().preserveIframe = true; editor.editable( null ); newEditable = new framedWysiwyg( editor, iframe.getFrameDocument().getBody() ); editor.editable( newEditable ); editor.status = 'recreating'; editor.setData( cacheData, { callback: callback, internal: false, noSnapshot: false } ); } } ); } } ); /** * Adds the path to a stylesheet file to the exisiting {@link CKEDITOR.config#contentsCss} value. * * **Note:** This method is available only with the `wysiwygarea` plugin and only affects * classic editors based on it (so it does not affect inline editors). * * editor.addContentsCss( 'assets/contents.css' ); * * @since 4.4.0 * @param {String} cssPath The path to the stylesheet file which should be added. * @member CKEDITOR.editor */ CKEDITOR.editor.prototype.addContentsCss = function( cssPath ) { var cfg = this.config, curContentsCss = cfg.contentsCss; // Convert current value into array. if ( !CKEDITOR.tools.isArray( curContentsCss ) ) cfg.contentsCss = curContentsCss ? [ curContentsCss ] : []; cfg.contentsCss.push( cssPath ); }; function onDomReady( win ) { var editor = this.editor; if ( !editor || editor.isDetached() ) { return; } var doc = win.document, body = doc.body; // Remove helper scripts from the DOM. var script = doc.getElementById( 'cke_actscrpt' ); script && script.parentNode.removeChild( script ); script = doc.getElementById( 'cke_shimscrpt' ); script && script.parentNode.removeChild( script ); script = doc.getElementById( 'cke_basetagscrpt' ); script && script.parentNode.removeChild( script ); body.contentEditable = true; if ( CKEDITOR.env.ie ) { // Don't display the focus border. body.hideFocus = true; // Disable and re-enable the body to avoid IE from // taking the editing focus at startup. (https://dev.ckeditor.com/ticket/141 / https://dev.ckeditor.com/ticket/523) body.disabled = true; body.removeAttribute( 'disabled' ); } delete this._.isLoadingData; // Play the magic to alter element reference to the reloaded one. this.$ = body; doc = new CKEDITOR.dom.document( doc ); this.setup(); this.fixInitialSelection(); var editable = this; // Without it IE8 has problem with removing selection in nested editable. (https://dev.ckeditor.com/ticket/13785) if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) { doc.getDocumentElement().addClass( doc.$.compatMode ); } // Prevent IE/Edge from leaving a new paragraph/div after deleting all contents in body (https://dev.ckeditor.com/ticket/6966, https://dev.ckeditor.com/ticket/13142). if ( CKEDITOR.env.ie && !CKEDITOR.env.edge && editor.enterMode != CKEDITOR.ENTER_P ) { removeSuperfluousElement( 'p' ); } // Starting from Edge 15 additional `div` is not added to the editor. else if ( CKEDITOR.env.edge && CKEDITOR.env.version < 15 && editor.enterMode != CKEDITOR.ENTER_DIV ) { removeSuperfluousElement( 'div' ); } // Fix problem with cursor not appearing in Webkit and IE11+ when clicking below the body (https://dev.ckeditor.com/ticket/10945, https://dev.ckeditor.com/ticket/10906). // Fix for older IEs (8-10 and QM) is placed inside selection.js. if ( CKEDITOR.env.webkit || ( CKEDITOR.env.ie && CKEDITOR.env.version > 10 ) ) { doc.getDocumentElement().on( 'mousedown', function( evt ) { if ( evt.data.getTarget().is( 'html' ) ) { // IE needs this timeout. Webkit does not, but it does not cause problems too. setTimeout( function() { editor.editable().focus(); } ); } } ); } // Config props: disableObjectResizing and disableNativeTableHandles handler. objectResizeDisabler( editor ); // Enable dragging of position:absolute elements in IE. try { editor.document.$.execCommand( '2D-position', false, true ); } catch ( e ) {} if ( CKEDITOR.env.gecko || CKEDITOR.env.ie && editor.document.$.compatMode == 'CSS1Compat' ) { this.attachListener( this, 'keydown', function( evt ) { var keyCode = evt.data.getKeystroke(); // PageUp OR PageDown if ( keyCode == 33 || keyCode == 34 ) { // PageUp/PageDown scrolling is broken in document // with standard doctype, manually fix it. (https://dev.ckeditor.com/ticket/4736) if ( CKEDITOR.env.ie ) { setTimeout( function() { editor.getSelection().scrollIntoView(); }, 0 ); } // Page up/down cause editor selection to leak // outside of editable thus we try to intercept // the behavior, while it affects only happen // when editor contents are not overflowed. (https://dev.ckeditor.com/ticket/7955) else if ( editor.window.$.innerHeight > this.$.offsetHeight ) { var range = editor.createRange(); range[ keyCode == 33 ? 'moveToElementEditStart' : 'moveToElementEditEnd' ]( this ); range.select(); evt.data.preventDefault(); } } } ); } if ( CKEDITOR.env.ie ) { // [IE] Iframe will still keep the selection when blurred, if // focus is moved onto a non-editing host, e.g. link or button, but // it becomes a problem for the object type selection, since the resizer // handler attached on it will mark other part of the UI, especially // for the dialog. (https://dev.ckeditor.com/ticket/8157) // [IE<8 & Opera] Even worse For old IEs, the cursor will not vanish even if // the selection has been moved to another text input in some cases. (https://dev.ckeditor.com/ticket/4716) // // Now the range restore is disabled, so we simply force IE to clean // up the selection before blur. this.attachListener( doc, 'blur', function() { // Error proof when the editor is not visible. (https://dev.ckeditor.com/ticket/6375) try { doc.$.selection.empty(); } catch ( er ) {} } ); } if ( CKEDITOR.env.iOS ) { // [iOS] If touch is bound to any parent of the iframe blur happens on any touch // event and body becomes the focused element (https://dev.ckeditor.com/ticket/10714). this.attachListener( doc, 'touchend', function() { win.focus(); } ); } var title = editor.document.getElementsByTag( 'title' ).getItem( 0 ); // document.title is malfunctioning on Chrome, so get value from the element (https://dev.ckeditor.com/ticket/12402). title.data( 'cke-title', title.getText() ); // [IE] JAWS will not recognize the aria label we used on the iframe // unless the frame window title string is used as the voice label, // backup the original one and restore it on output. if ( CKEDITOR.env.ie ) editor.document.$.title = this._.docTitle; CKEDITOR.tools.setTimeout( function() { // Editable is ready after first setData. if ( this.status == 'unloaded' ) this.status = 'ready'; editor.fire( 'contentDom' ); if ( this._.isPendingFocus ) { editor.focus(); this._.isPendingFocus = false; } setTimeout( function() { editor.fire( 'dataReady' ); }, 0 ); }, 0, this ); function removeSuperfluousElement( tagName ) { var lockRetain = false; // Superfluous elements appear after keydown // and before keyup, so the procedure is as follows: // 1. On first keydown mark all elements with // a specified tag name as non-superfluous. editable.attachListener( editable, 'keydown', function() { var body = doc.getBody(), retained = body.getElementsByTag( tagName ); if ( !lockRetain ) { for ( var i = 0; i < retained.count(); i++ ) { retained.getItem( i ).setCustomData( 'retain', true ); } lockRetain = true; } }, null, null, 1 ); // 2. On keyup remove all elements that were not marked // as non-superfluous (which means they must have had appeared in the meantime). // Also we should preserve all temporary elements inserted by editor – otherwise we'd likely // leak fake selection's content into editable due to removing hidden selection container (https://dev.ckeditor.com/ticket/14831). editable.attachListener( editable, 'keyup', function() { var elements = doc.getElementsByTag( tagName ); if ( lockRetain ) { if ( elements.count() == 1 && !elements.getItem( 0 ).getCustomData( 'retain' ) && CKEDITOR.tools.isEmpty( elements.getItem( 0 ).getAttributes() ) ) { elements.getItem( 0 ).remove( 1 ); } lockRetain = false; } } ); } } framedWysiwyg = CKEDITOR.tools.createClass( { $: function() { this.base.apply( this, arguments ); this._.frameLoadedHandler = CKEDITOR.tools.addFunction( function( win ) { // Avoid opening design mode in a frame window thread, // which will cause host page scrolling.(https://dev.ckeditor.com/ticket/4397) CKEDITOR.tools.setTimeout( onDomReady, 0, this, win ); }, this ); // In case of lack of the title attribute, use non-breaking space. // It needs to be as a raw character because HTML entity can cause issues in IE. this._.docTitle = this.getWindow().getFrame().getAttribute( 'title' ) || '\xa0'; }, base: CKEDITOR.editable, proto: { preserveIframe: false, setData: function( data, isSnapshot ) { var editor = this.editor; if ( isSnapshot ) { this.setHtml( data ); this.fixInitialSelection(); // Fire dataReady for the consistency with inline editors // and because it makes sense. (https://dev.ckeditor.com/ticket/10370) editor.fire( 'dataReady' ); } else { this._.isLoadingData = true; editor._.dataStore = { id: 1 }; var config = editor.config, fullPage = config.fullPage, docType = config.docType; // Build the additional stuff to be included into . var headExtra = CKEDITOR.tools.buildStyleHtml( iframeCssFixes() ).replace( /' } ] } ], buttons: [ CKEDITOR.dialog.cancelButton ] }; } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/0000755000201500020150000000000014515446705024244 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/zh.js0000644000201500020150000001137714515446705025234 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'zh', { title: '輔助工具指南', contents: '說明內容。若要關閉此對話框請按「ESC」。', legend: [ { name: '一般', items: [ { name: '編輯器工具列', legend: '請按 ${toolbarFocus} 以導覽到工具列。利用 TAB 或 SHIFT+TAB 以便移動到下一個及前一個工具列群組。利用右方向鍵或左方向鍵以便移動到下一個及上一個工具列按鈕。按下空白鍵或 ENTER 鍵啟用工具列按鈕。啟用工作列按鈕時,焦點將會移回至編輯區域。' }, { name: '編輯器對話方塊', legend: '在對話框中,按下 TAB 鍵以導覽到下一個對話框元素,按下 SHIFT+TAB 以移動到上一個對話框元素,按下 ENTER 以遞交對話框,按下 ESC 以取消對話框。當對話框有多個分頁時,可以使用 ALT+F10 或是在對話框分頁順序中的一部份按下 TAB 以使用分頁列表。焦點在分頁列表上時,分別使用右方向鍵及左方向鍵移動到下一個及上一個分頁。按下 ESC 以放棄變更且關閉對話方塊。離開對話方塊時,焦點將會移回至編輯區域。' }, { name: '編輯器內容功能表', legend: '請按下「${contextMenu}」或是「應用程式鍵」以開啟內容選單。以「TAB」或是「↓」鍵移動到下一個選單選項。以「SHIFT + TAB」或是「↑」鍵移動到上一個選單選項。按下「空白鍵」或是「ENTER」鍵以選取選單選項。以「空白鍵」或「ENTER」或「→」開啟目前選項之子選單。以「ESC」或「←」回到父選單。以「ESC」鍵關閉內容選單」。' }, { name: '編輯器清單方塊', legend: '在清單方塊中,使用 TAB 或下方向鍵移動到下一個列表項目。使用 SHIFT+TAB 或上方向鍵移動到上一個列表項目。按下空白鍵或 ENTER 以選取列表選項。按下 ESC 以關閉清單方塊。' }, { name: '編輯器元件路徑工具列', legend: '請按 ${elementsPathFocus} 以瀏覽元素路徑列。利用 TAB 或右方向鍵以便移動到下一個元素按鈕。利用 SHIFT 或左方向鍵以便移動到上一個按鈕。按下空白鍵或 ENTER 鍵來選取在編輯器中的元素。' } ] }, { name: '命令', items: [ { name: '復原命令', legend: '請按下「${undo}」' }, { name: '重複命令', legend: '請按下「 ${redo}」' }, { name: '粗體命令', legend: '請按下「${bold}」' }, { name: '斜體', legend: '請按下「${italic}」' }, { name: '底線命令', legend: '請按下「${underline}」' }, { name: '連結', legend: '請按下「${link}」' }, { name: '隱藏工具列', legend: '請按下「${toolbarCollapse}」' }, { name: '存取前一個焦點空間命令', legend: '請按下 ${accessPreviousSpace} 以存取最近但無法靠近之插字符號前的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。' }, { name: '存取下一個焦點空間命令', legend: '請按下 ${accessNextSpace} 以存取最近但無法靠近之插字符號後的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。' }, { name: '協助工具說明', legend: '請按下「${a11yHelp}」' }, { name: '以純文字貼上', legend: '按 ${pastetext}', legendEdge: '按 ${pastetext},再來是 ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Esc', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: '向左箭號', upArrow: '向上鍵號', rightArrow: '向右鍵號', downArrow: '向下鍵號', insert: '插入', leftWindowKey: '左方 Windows 鍵', rightWindowKey: '右方 Windows 鍵', selectKey: '選擇鍵', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: '乘號', add: '新增', subtract: '減號', decimalPoint: '小數點', divide: '除號', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: '分號', equalSign: '等號', comma: '逗號', dash: '虛線', period: '句點', forwardSlash: '斜線', graveAccent: '抑音符號', openBracket: '左方括號', backSlash: '反斜線', closeBracket: '右方括號', singleQuote: '單引號' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/nb.js0000644000201500020150000001154014515446705025202 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'nb', { title: 'Instruksjoner for tilgjengelighet', contents: 'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.', legend: [ { name: 'Generelt', items: [ { name: 'Verktøylinje for editor', legend: 'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.' }, { name: 'Dialog for editor', legend: 'Mens du er i en dialog, trykk TAB for å navigere til neste dialogelement, trykk SHIFT+TAB for å flytte til forrige dialogelement, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. Når en dialog har flere faner, kan fanelisten nås med enten ALT+F10 eller med TAB. Når fanelisten er fokusert, går man til neste og forrige fane med henholdsvis HØYRE og VENSTRE PILTAST.' }, { name: 'Kontekstmeny for editor', legend: 'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.' }, { name: 'Listeboks for editor', legend: 'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.' }, { name: 'Verktøylinje for elementsti', legend: 'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.' } ] }, { name: 'Hurtigtaster', items: [ { name: 'Angre', legend: 'Trykk ${undo}' }, { name: 'Gjør om', legend: 'Trykk ${redo}' }, { name: 'Fet tekst', legend: 'Trykk ${bold}' }, { name: 'Kursiv tekst', legend: 'Trykk ${italic}' }, { name: 'Understreking', legend: 'Trykk ${underline}' }, { name: 'Lenke', legend: 'Trykk ${link}' }, { name: 'Skjul verktøylinje', legend: 'Trykk ${toolbarCollapse}' }, { name: 'Gå til forrige fokusområde', legend: 'Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' }, { name: 'Gå til neste fokusområde', legend: 'Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' }, { name: 'Hjelp for tilgjengelighet', legend: 'Trykk ${a11yHelp}' }, { name: 'Lim inn som ren tekst', legend: 'Trykk ${pastetext}', legendEdge: 'Trykk ${pastetext}, etterfulgt av ${past}' } ] } ], tab: 'Tabulator', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Venstre piltast', upArrow: 'Opp-piltast', rightArrow: 'Høyre piltast', downArrow: 'Ned-piltast', insert: 'Insert', leftWindowKey: 'Venstre Windows-tast', rightWindowKey: 'Høyre Windows-tast', selectKey: 'Velg nøkkel', numpad0: 'Numerisk tastatur 0', numpad1: 'Numerisk tastatur 1', numpad2: 'Numerisk tastatur 2', numpad3: 'Numerisk tastatur 3', numpad4: 'Numerisk tastatur 4', numpad5: 'Numerisk tastatur 5', numpad6: 'Numerisk tastatur 6', numpad7: 'Numerisk tastatur 7', numpad8: 'Numerisk tastatur 8', numpad9: 'Numerisk tastatur 9', multiply: 'Multipliser', add: 'Legg til', subtract: 'Trekk fra', decimalPoint: 'Desimaltegn', divide: 'Divider', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semikolon', equalSign: 'Likhetstegn', comma: 'Komma', dash: 'Bindestrek', period: 'Punktum', forwardSlash: 'Forover skråstrek', graveAccent: 'Grav aksent', openBracket: 'Åpne parentes', backSlash: 'Bakover skråstrek', closeBracket: 'Lukk parentes', singleQuote: 'Enkelt sitattegn' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/eo.js0000644000201500020150000001226314515446705025211 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'eo', { title: 'Uzindikoj pri atingeblo', contents: 'Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.', legend: [ { name: 'Ĝeneralaĵoj', items: [ { name: 'Ilbreto de la redaktilo', legend: 'Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA+TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon.' }, { name: 'Redaktildialogo', legend: 'En dialogo, premu la TABAN klavon por navigi al la sekva dialogelemento, premu la MAJUSKLIGAN+TABAN klavon por iri al la antaŭa dialogelemento, premu la ENEN klavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Kiam dialogo havas multajn langetojn, eblas atingi la langetliston aŭ per ALT+F10 aŭ per la TABA klavo kiel parton de la dialoga taba ordo. En langetlisto, moviĝu al la sekva kaj antaŭa langeto per la klavoj SAGO DEKSTREN KAJ MALDEKSTREN respektive.' }, { name: 'Kunteksta menuo de la redaktilo', legend: 'Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo.' }, { name: 'Fallisto de la redaktilo', legend: 'En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon.' }, { name: 'Breto indikanta la vojon al la redaktilelementoj', legend: 'Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA+TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo.' } ] }, { name: 'Komandoj', items: [ { name: 'Komando malfari', legend: 'Premu ${undo}' }, { name: 'Komando refari', legend: 'Premu ${redo}' }, { name: 'Komando grasa', legend: 'Premu ${bold}' }, { name: 'Komando kursiva', legend: 'Premu ${italic}' }, { name: 'Komando substreki', legend: 'Premu ${underline}' }, { name: 'Komando ligilo', legend: 'Premu ${link}' }, { name: 'Komando faldi la ilbreton', legend: 'Premu ${toolbarCollapse}' }, { name: 'Komando por atingi la antaŭan fokusan spacon', legend: 'Press ${accessPreviousSpace} por atingi la plej proksiman neatingeblan fokusan spacon antaŭ la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinaĵon por atingi malproksimajn fokusajn spacojn.' }, { name: 'Komando por atingi la sekvan fokusan spacon', legend: 'Press ${accessNextSpace} por atingi la plej proksiman neatingeblan fokusan spacon post la kursoro, ekzemple : du kuntuŝiĝajn HR elementojn. Ripetu la klavkombinajôn por atingi malproksimajn fokusajn spacojn' }, { name: 'Helpilo pri atingeblo', legend: 'Premu ${a11yHelp}' }, { name: 'Algluu kiel platan tekston', legend: 'Presu ${pastetext}', legendEdge: 'Presu ${pastetext}, sekvatan de ${paste}' } ] } ], tab: 'Tabo', pause: 'Paŭzo', capslock: 'Majuskla baskulo', escape: 'Eskapa klavo', pageUp: 'Antaŭa Paĝo', pageDown: 'Sekva Paĝo', leftArrow: 'Sago Maldekstren', upArrow: 'Sago Supren', rightArrow: 'Sago Dekstren', downArrow: 'Sago Suben', insert: 'Enmeti', leftWindowKey: 'Maldekstra Windows-klavo', rightWindowKey: 'Dekstra Windows-klavo', selectKey: 'Selektklavo', numpad0: 'Nombra Klavaro 0', numpad1: 'Nombra Klavaro 1', numpad2: 'Nombra Klavaro 2', numpad3: 'Nombra Klavaro 3', numpad4: 'Nombra Klavaro 4', numpad5: 'Nombra Klavaro 5', numpad6: 'Nombra Klavaro 6', numpad7: 'Nombra Klavaro 7', numpad8: 'Nombra Klavaro 8', numpad9: 'Nombra Klavaro 9', multiply: 'Obligi', add: 'Almeti', subtract: 'Subtrahi', decimalPoint: 'Dekuma Punkto', divide: 'Dividi', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Nombra Baskulo', scrollLock: 'Ruluma Baskulo', semiColon: 'Punktokomo', equalSign: 'Egalsigno', comma: 'Komo', dash: 'Haltostreko', period: 'Punkto', forwardSlash: 'Oblikvo', graveAccent: 'Malakuto', openBracket: 'Malferma Krampo', backSlash: 'Retroklino', closeBracket: 'Ferma Krampo', singleQuote: 'Citilo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/es.js0000644000201500020150000001232614515446705025215 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'es', { title: 'Instrucciones de accesibilidad', contents: 'Ayuda. Para cerrar presione ESC.', legend: [ { name: 'General', items: [ { name: 'Barra de herramientas del editor', legend: 'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY+TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona "espacio" o "intro" para activar la herramienta.' }, { name: 'Editor de diálogo', legend: 'Dentro del diálogo, presione TAB para navegar a los siguientes elementos de diálogo, presione SHIFT+TAB para moverse a los anteriores elementos de diálogo, presione ENTER para enviar el diálogo, presiona ESC para cancelar el diálogo. Cuando el diálogo tiene multiples pestañas, la lista de pestañas puede ser abarcada con ALT + F10 or con TAB como parte del orden de pestañas del diálogo. ECon la pestaña enfocada, puede moverse a la siguiente o anterior pestaña con las FLECHAS IZQUIRDA y DERECHA respectivamente.' }, { name: 'Editor del menú contextual', legend: 'Presiona ${contextMenu} o TECLA MENÚ para abrir el menú contextual. Entonces muévete a la siguiente opción del menú con TAB o FLECHA ABAJO. Muévete a la opción previa con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para seleccionar la opción del menú. Abre el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Regresa al elemento padre del menú con ESC o FLECHA IZQUIERDA. Cierra el menú contextual con ESC.' }, { name: 'Lista del Editor', legend: 'Dentro de una lista, te mueves al siguiente elemento de la lista con TAB o FLECHA ABAJO. Te mueves al elemento previo de la lista con SHIFT+TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para elegir la opción de la lista. Presiona ESC para cerrar la lista.' }, { name: 'Barra de Ruta del Elemento en el Editor', legend: 'Presiona ${elementsPathFocus} para navegar a los elementos de la barra de ruta. Te mueves al siguiente elemento botón con TAB o FLECHA DERECHA. Te mueves al botón previo con SHIFT+TAB o FLECHA IZQUIERDA. Presiona ESPACIO o ENTER para seleccionar el elemento en el editor.' } ] }, { name: 'Comandos', items: [ { name: 'Comando deshacer', legend: 'Presiona ${undo}' }, { name: 'Comando rehacer', legend: 'Presiona ${redo}' }, { name: 'Comando negrita', legend: 'Presiona ${bold}' }, { name: 'Comando itálica', legend: 'Presiona ${italic}' }, { name: 'Comando subrayar', legend: 'Presiona ${underline}' }, { name: 'Comando liga', legend: 'Presiona ${liga}' }, { name: 'Comando colapsar barra de herramientas', legend: 'Presiona ${toolbarCollapse}' }, { name: 'Comando accesar el anterior espacio de foco', legend: 'Presiona ${accessPreviousSpace} para accesar el espacio de foco no disponible más cercano anterior al cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes.' }, { name: 'Comando accesar el siguiente spacio de foco', legend: 'Presiona ${accessNextSpace} para accesar el espacio de foco no disponible más cercano después del cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes.' }, { name: 'Ayuda de Accesibilidad', legend: 'Presiona ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tabulador', pause: 'Pausa', capslock: 'Bloq. Mayús.', escape: 'Escape', pageUp: 'Regresar Página', pageDown: 'Avanzar Página', leftArrow: 'Flecha Izquierda', upArrow: 'Flecha Arriba', rightArrow: 'Flecha Derecha', downArrow: 'Flecha Abajo', insert: 'Insertar', leftWindowKey: 'Tecla Windows Izquierda', rightWindowKey: 'Tecla Windows Derecha', selectKey: 'Tecla de Selección', numpad0: 'Tecla 0 del teclado numérico', numpad1: 'Tecla 1 del teclado numérico', numpad2: 'Tecla 2 del teclado numérico', numpad3: 'Tecla 3 del teclado numérico', numpad4: 'Tecla 4 del teclado numérico', numpad5: 'Tecla 5 del teclado numérico', numpad6: 'Tecla 6 del teclado numérico', numpad7: 'Tecla 7 del teclado numérico', numpad8: 'Tecla 8 del teclado numérico', numpad9: 'Tecla 9 del teclado numérico', multiply: 'Multiplicar', add: 'Sumar', subtract: 'Restar', decimalPoint: 'Punto Decimal', divide: 'Dividir', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Punto y coma', equalSign: 'Signo de Igual', comma: 'Coma', dash: 'Guión', period: 'Punto', forwardSlash: 'Diagonal', graveAccent: 'Acento Grave', openBracket: 'Abrir llave', backSlash: 'Diagonal Invertida', closeBracket: 'Cerrar llave', singleQuote: 'Comillas simples' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ro.js0000644000201500020150000001170614515446705025227 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ro', { title: 'Instrucțiuni Accesibilitate', contents: 'Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.', legend: [ { name: 'General', items: [ { name: 'Editor bară de instrumente.', legend: 'Apasă ${toolbarFocus} pentru a naviga pe de instrumente. Pentru deplasarea la următorul sau anteriorul grup de instrumente se folosesc tastele TAB și SHIFT+TAB. Pentru deplasare pe urmatorul sau anteriorul instrument se folosesc tastele SĂGEATĂ DREAPTA sau SĂGEATĂ STÂNGA. Tasta SPAȚIU sau ENTER activează instrumentul.' }, { name: 'Dialog editor', legend: 'În interiorul unui dialog, se apasă TAB pentru navigarea la următorul element de dialog, SHIFT+TAB pentru deplasarea la anteriorul element de dialog, ENTER pentru validare dialog, ESC pentru anulare dialog. Când un dialog are secțiuni multiple, lista secțiunilor este accesibilă cu ALT+F10 sau cu TAB ca parte a ordonării secționării dialogului. Cu lista secțiunii activată, deplasarea înainte înapoi se face cu tastele SĂGEATĂ DREAPTA și respectiv STÂNGA.' }, { name: 'Editor meniu contextual', legend: 'Apasă ${contextMenu} sau TASTA MENIU pentru a deschide meniul contextual. Se trece la următoarea opțiune din meniu cu TAB sau SĂGEATĂ JOS. La opțiunea anterioară cu SHIFT+TAB sau SĂGEATĂ SUS. Se apasă SPAȚIU sau ENTER pentru a selecta opțiunea. Deschide sub-meniul opțiunii curente cu SPAȚIU sau ENTER sau SĂGEATĂ DREAPTA. Se revine la elementul din meniul părinte cu ESC sau SĂGEATĂ STÂNGA. Închide meniul de context cu ESC.' }, { name: 'Caseta listă a editorului', legend: 'În interiorul unei liste, treci la următorull element cu TAB sau SĂGEATĂ JOS. Treci la elementul anterior din listă cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta opțiunea din listă. Apasă ESC pentru a închide lista.' }, { name: 'Bara căii editorului de elemente', legend: 'Apasă ${elementsPathFocus} pentru navigare pe elementele barei. Mergi la următorul buton cu TAB sau SĂGEATĂ JOS. Treci la butonul anterior din listă cu SHIFT+TAB sau SĂGEATĂ SUS. Apasă SPAȚIU sau ENTER pentru a selecta butonul în editor.' } ] }, { name: 'Comenzi', items: [ { name: 'Revino anterior (Undo)', legend: 'Apasă ${undo}' }, { name: 'Comanda precedentă', legend: 'Apasă ${redo}' }, { name: 'Îngroșat (Bold)', legend: 'Apasă ${bold}' }, { name: 'Înclinat (Italic)', legend: 'Apasă ${italic}' }, { name: 'Subliniere (Underline)', legend: 'Apasă ${underline}' }, { name: 'Legatură (Link)', legend: 'Apasă ${link}' }, { name: 'Desfășurare Bară instrumente', legend: 'Apasă ${toolbarCollapse}' }, { name: 'Accesare spațiu focus anterior', legend: 'Apasă ${accessPreviousSpace} pentru a accesa cel mai apropiat spațiu focus indisponibil înaintea cursorului, de exemplu: 2 elemente adiacente HR. Repetă combinația de taste pentru a accesa spațiile îndepărtate de focus.' }, { name: 'Accesare spațiu focus următor', legend: 'Apasă ${accessNextSpace} pentru a accesa cel mai apropiat spațiu focus indisponibil după cursor, de exemplu: 2 elemente adiacente HR. Repetă combinația de taste pentru a accesa spațiile îndepărtate de focus.' }, { name: 'Ajutor Accesibilitate', legend: 'Apasă ${a11yHelp}' }, { name: 'Adaugă ca Text simplu (Plain Text)', legend: 'Apasă ${pastetext}', legendEdge: 'Apasă ${pastetext}, urmat de ${paste}' } ] } ], tab: 'TAB', pause: 'Pauză', capslock: 'Majuscule', escape: 'Esc - renunță', pageUp: 'Pagină sus', pageDown: 'Săgeată jos', leftArrow: 'Săgeată stânga', upArrow: 'Săgeată sus', rightArrow: 'Săgeată dreapta', downArrow: 'Săgeată jos', insert: 'Inserează', leftWindowKey: 'Windows stânga', rightWindowKey: 'Windows dreapta', selectKey: 'Tasta Selecție', numpad0: '0 Numeric', numpad1: '1 Numeric', numpad2: '2 Numeric', numpad3: '3 Numeric', numpad4: '4 Numeric', numpad5: '5 Numeric', numpad6: '6 Numeric', numpad7: '7 Numeric', numpad8: '8 Numeric', numpad9: '9 Numeric', multiply: 'Înmulțire', add: 'Adunare', subtract: 'Scădere', decimalPoint: 'Punct zecimal', divide: 'Împărțire', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'NumLock', scrollLock: 'Scroll Lock', semiColon: 'Punct și virgulă', equalSign: 'Egal', comma: 'Virgulă', dash: 'Linie', period: 'Punct', forwardSlash: 'Slash', graveAccent: 'Accent grav', openBracket: 'Paranteză dreaptă stânga', backSlash: 'Backslash', closeBracket: 'Paranteză dreaptă dreapta', singleQuote: 'Ghilimea simplă' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/hr.js0000644000201500020150000001126114515446705025214 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'hr', { title: 'Upute dostupnosti', contents: 'Sadržaj pomoći. Za zatvaranje pritisnite ESC.', legend: [ { name: 'Općenito', items: [ { name: 'Alatna traka', legend: 'Pritisni ${toolbarFocus} za navigaciju do alatne trake. Pomicanje do prethodne ili sljedeće alatne grupe vrši se pomoću SHIFT+TAB i TAB. Pomicanje do prethodnog ili sljedećeg gumba u alatnoj traci vrši se pomoću lijeve i desne strelice kursora. Pritisnite SPACE ili ENTER za aktivaciju alatne trake.' }, { name: 'Dijalog', legend: 'Unutar dijaloga, pritisnite TAB kako bi navigirali do sljedećeg elementa dijaloga, pritisnite SHIFT+TAB kako bi se pomaknuli do prethodnog elementa, pritisnite ENTER kako bi poslali dijalog, pritisnite ESC za gašenje dijaloga. Kada dijalog ima više kartica, listi kartica se može pristupiti pomoću ALT+F10 ili sa TAB. Kada je fokusirana lista kartica, pomaknite se naprijed ili nazad pomoću strelica LIJEVO ili DESNO.' }, { name: 'Kontekstni izbornik', legend: 'Pritisnite ${contextMenu} ili APPLICATION tipku za otvaranje kontekstnog izbornika. Pomicanje se vrši TAB ili strelicom kursora prema dolje ili SHIFT+TAB ili strelica kursora prema gore. SPACE ili ENTER odabiru opciju izbornika. Otvorite podizbornik trenutne opcije sa SPACE, ENTER ili desna strelica kursora. Povratak na prethodni izbornik vrši se sa ESC ili lijevom strelicom kursora. Zatvaranje se vrši pritiskom na tipku ESC.' }, { name: 'Lista', legend: 'Unutar list-boxa, pomicanje na sljedeću stavku vrši se sa TAB ili strelica kursora prema dolje. Na prethodnu sa SHIFT+TAB ili strelica prema gore. Pritiskom na SPACE ili ENTER odabire se stavka ili ESC za zatvaranje.' }, { name: 'Traka putanje elemenata', legend: 'Pritisnite ${elementsPathFocus} za navigaciju po putanji elemenata. Pritisnite TAB ili desnu strelicu kursora za pomicanje na sljedeći element ili SHIFT+TAB ili lijeva strelica kursora za pomicanje na prethodni element. Pritiskom na SPACE ili ENTER vrši se odabir elementa.' } ] }, { name: 'Naredbe', items: [ { name: 'Vrati naredbu', legend: 'Pritisni ${undo}' }, { name: 'Ponovi naredbu', legend: 'Pritisni ${redo}' }, { name: 'Bold naredba', legend: 'Pritisni ${bold}' }, { name: 'Italic naredba', legend: 'Pritisni ${italic}' }, { name: 'Underline naredba', legend: 'Pritisni ${underline}' }, { name: 'Link naredba', legend: 'Pritisni ${link}' }, { name: 'Smanji alatnu traku naredba', legend: 'Pritisni ${toolbarCollapse}' }, { name: 'Naredba za pristupi prethodnom prostoru fokusa', legend: 'Pritisni ${accessPreviousSpace} za pristup najbližem nedostupnom razmaku prije kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak.' }, { name: 'Naredba za pristup sljedećem prostoru fokusa', legend: 'Pritisni ${accessNextSpace} za pristup najbližem nedostupnom razmaku nakon kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak.' }, { name: 'Pomoć za dostupnost', legend: 'Pritisni ${a11yHelp}' }, { name: 'Zalijepi kao čisti tekst', legend: 'Pritisnite ${pastetext}', legendEdge: 'Pritisnite ${pastetext}, zatim ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Lijev strelica', upArrow: 'Strelica gore', rightArrow: 'Desna strelica', downArrow: 'Strelica dolje', insert: 'Insert', leftWindowKey: 'Lijeva Windows tipka', rightWindowKey: 'Desna Windows tipka', selectKey: 'Tipka Select', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'umpad 8', numpad9: 'Numpad 9', multiply: 'Množenje', add: 'Zbrajanje', subtract: 'Oduzimanje', decimalPoint: 'Decimalna točka', divide: 'Dijeljenje', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Točka zarez', equalSign: 'Jednako', comma: 'Zarez', dash: 'Crtica', period: 'Točka', forwardSlash: 'Kosa crta', graveAccent: 'Akcent', openBracket: 'Otvorena uglata zagrada', backSlash: 'Obrnuta kosa crta', closeBracket: 'Zatvorena uglata zagrada', singleQuote: 'Jednostruki navodnik' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/it.js0000644000201500020150000001317714515446705025227 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'it', { title: 'Istruzioni di Accessibilità', contents: 'Contenuti di Aiuto. Per chiudere questa finestra premi ESC.', legend: [ { name: 'Generale', items: [ { name: 'Barra degli strumenti Editor', legend: 'Premi ${toolbarFocus} per accedere alla barra degli strumenti. Passa al gruppo di barre degli strumenti successivo o precedente con TAB o MAIUSC+TAB. Passa al pulsante della barra degli strumenti successivo o precedente con FRECCIA DESTRA o FRECCIA SINISTRA. Premi SPAZIO o INVIO per attivare il pulsante della barra degli strumenti. Lo stato attivo verrà riportato all\'area di modifica dopo l\'attivazione del pulsante della barra degli strumenti.' }, { name: 'Finestra Editor', legend: 'All\'interno di una finestra di dialogo, premi TAB per passare all\'elemento della finestra di dialogo successivo, premi MAIUSC+TAB per passare all\'elemento della finestra di dialogo precedente, premi INVIO per inviare la finestra di dialogo, premi ESC per annullare la finestra di dialogo. Quando una finestra di dialogo ha più schede, l\'elenco delle schede può essere raggiunto con ALT+F10 o con TAB come parte dell\'ordine di tabulazione della finestra di dialogo. Mentre l\'elenco delle schede è attivo, passa alla scheda successiva o precedente rispettivamente con FRECCIA DESTRA o SINISTRA. Premi ESC per annullare le modifiche e chiudere la finestra di dialogo. Lo stato attivo verrà spostato nuovamente all\'area di modifica dopo aver lasciato la finestra di dialogo.' }, { name: 'Menù contestuale Editor', legend: 'Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all\'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all\'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l\'opzione di menu. Apri il sottomenu dell\'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC.' }, { name: 'Box Lista Editor', legend: 'All\'interno di un elenco di opzioni, per spostarsi all\'elemento successivo premere TAB oppure FRECCIA GIÙ. Per spostarsi all\'elemento precedente usare SHIFT+TAB oppure FRECCIA SU. Premere SPAZIO o INVIO per selezionare l\'elemento della lista. Premere ESC per chiudere l\'elenco di opzioni.' }, { name: 'Barra percorso elementi editor', legend: 'Premere ${elementsPathFocus} per passare agli elementi della barra del percorso. Usare TAB o FRECCIA DESTRA per passare al pulsante successivo. Per passare al pulsante precedente premere MAIUSC+TAB o FRECCIA SINISTRA. Premere SPAZIO o INVIO per selezionare l\'elemento nell\'editor.' } ] }, { name: 'Comandi', items: [ { name: ' Annulla comando', legend: 'Premi ${undo}' }, { name: ' Ripeti comando', legend: 'Premi ${redo}' }, { name: ' Comando Grassetto', legend: 'Premi ${bold}' }, { name: ' Comando Corsivo', legend: 'Premi ${italic}' }, { name: ' Comando Sottolineato', legend: 'Premi ${underline}' }, { name: ' Comando Link', legend: 'Premi ${link}' }, { name: ' Comando riduci barra degli strumenti', legend: 'Premi ${toolbarCollapse}' }, { name: 'Comando di accesso al precedente spazio di focus', legend: 'Premi ${accessPreviousSpace} per accedere il più vicino spazio di focus non raggiungibile prima del simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti.' }, { name: 'Comando di accesso al prossimo spazio di focus', legend: 'Premi ${accessNextSpace} per accedere il più vicino spazio di focus non raggiungibile dopo il simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti.' }, { name: ' Aiuto Accessibilità', legend: 'Premi ${a11yHelp}' }, { name: 'Incolla come testo semplice', legend: 'Premi ${pastetext}', legendEdge: 'Premi ${pastetext}, seguito da ${paste}' } ] } ], tab: 'Tab', pause: 'Pausa', capslock: 'Bloc Maiusc', escape: 'Esc', pageUp: 'Pagina sù', pageDown: 'Pagina giù', leftArrow: 'Freccia sinistra', upArrow: 'Freccia su', rightArrow: 'Freccia destra', downArrow: 'Freccia giù', insert: 'Ins', leftWindowKey: 'Tasto di Windows sinistro', rightWindowKey: 'Tasto di Windows destro', selectKey: 'Tasto di selezione', numpad0: '0 sul tastierino numerico', numpad1: '1 sul tastierino numerico', numpad2: '2 sul tastierino numerico', numpad3: '3 sul tastierino numerico', numpad4: '4 sul tastierino numerico', numpad5: '5 sul tastierino numerico', numpad6: '6 sul tastierino numerico', numpad7: '7 sul tastierino numerico', numpad8: '8 sul tastierino numerico', numpad9: '9 sul tastierino numerico', multiply: 'Moltiplicazione', add: 'Più', subtract: 'Sottrazione', decimalPoint: 'Punto decimale', divide: 'Divisione', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Bloc Num', scrollLock: 'Bloc Scorr', semiColon: 'Punto-e-virgola', equalSign: 'Segno di uguale', comma: 'Virgola', dash: 'Trattino', period: 'Punto', forwardSlash: 'Barra', graveAccent: 'Accento grave', openBracket: 'Parentesi quadra aperta', backSlash: 'Barra rovesciata', closeBracket: 'Parentesi quadra chiusa', singleQuote: 'Apostrofo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/de-ch.js0000644000201500020150000001213614515446705025565 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'de-ch', { title: 'Barrierefreiheitinformationen', contents: 'Hilfeinhalt. Um den Dialog zu schliessen, die Taste ESC drücken.', legend: [ { name: 'Allgemein', items: [ { name: 'Editorwerkzeugleiste', legend: 'Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste zu aktivieren.' }, { name: 'Editordialog', legend: 'Drücken Sie innerhalb eines Dialogs TAB, um zum nächsten Element zu springen. Drücken Sie SHIFT+TAB, um zum vorigen Element zu springen, drücke ENTER um das Formular im Dialog abzusenden, drücken Sie ESC, um den Dialog zu schliessen. Hat der Dialog mehrere Tabs, dann können Sie durch ALT+F10 die Tab-Liste aufrufen or mittels TAB als Teil der Dialog-Tab-Reihenfolge. Ist die Tab-Liste fokussiert, kann mithilfe der Pfeiltasten (LINKS und RECHTS) zwischen den Tabs gewechselt werden.' }, { name: 'Editor-Kontextmenü', legend: 'Drücken Sie ${contextMenu} oder die Anwendungstaste, um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.' }, { name: 'Editor-Listenbox', legend: 'Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeil-runter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeil-hoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.' }, { name: 'Editor-Elementpfadleiste', legend: 'Drücken Sie ${elementsPathFocus}, um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen, drücken Sie TAB oder die Pfeil-rechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeil-links-Taste. Drücken Sie die Leertaste oder Enter, um das Element auszuwählen.' } ] }, { name: 'Befehle', items: [ { name: 'Rückgängig-Befehl', legend: 'Drücken Sie ${undo}' }, { name: 'Wiederherstellen-Befehl', legend: 'Drücken Sie ${redo}' }, { name: 'Fettschrift-Befehl', legend: 'Drücken Sie ${bold}' }, { name: 'Kursiv-Befehl', legend: 'Drücken Sie ${italic}' }, { name: 'Unterstreichen-Befehl', legend: 'Drücken Sie ${underline}' }, { name: 'Link-Befehl', legend: 'Drücken Sie ${link}' }, { name: 'Werkzeugleiste einklappen-Befehl', legend: 'Drücken Sie ${toolbarCollapse}' }, { name: 'Zugang zum letzten Fokus-Bereich', legend: 'Drücken Sie ${accessPreviousSpace}, um zum nächsten unerreichbaren Fokus-Bereich vor der aktuellen Position zu gelangen. Zum Beispiel: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination, um weitere Fokus-Bereichen zu erreichen. ' }, { name: 'Zugang zum nächsten Fokus-Bereich', legend: 'Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbaren Fokusbereich vor der aktuellen Position zu gelangen. Zum Beispiel: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination, um weitere Fokus-Bereiche zu erreichen. ' }, { name: 'Eingabehilfen', legend: 'Drücken Sie ${a11yHelp}' }, { name: 'Als Klartext einfügen', legend: 'Drücken Sie ${pastetext}', legendEdge: 'Drücken Sie ${pastetext} und anschliessend ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Feststell', escape: 'Escape', pageUp: 'Bild auf', pageDown: 'Bild ab', leftArrow: 'Linke Pfeiltaste', upArrow: 'Obere Pfeiltaste', rightArrow: 'Rechte Pfeiltaste', downArrow: 'Untere Pfeiltaste', insert: 'Einfügen', leftWindowKey: 'Linke Windowstaste', rightWindowKey: 'Rechte Windowstaste', selectKey: 'Taste auswählen', numpad0: 'Ziffernblock 0', numpad1: 'Ziffernblock 1', numpad2: 'Ziffernblock 2', numpad3: 'Ziffernblock 3', numpad4: 'Ziffernblock 4', numpad5: 'Ziffernblock 5', numpad6: 'Ziffernblock 6', numpad7: 'Ziffernblock 7', numpad8: 'Ziffernblock 8', numpad9: 'Ziffernblock 9', multiply: 'Multiplizieren', add: 'Addieren', subtract: 'Subtrahieren', decimalPoint: 'Punkt', divide: 'Dividieren', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Ziffernblock feststellen', scrollLock: 'Rollen', semiColon: 'Semikolon', equalSign: 'Gleichheitszeichen', comma: 'Komma', dash: 'Bindestrich', period: 'Punkt', forwardSlash: 'Schrägstrich', graveAccent: 'Accent grave', openBracket: 'Öffnende eckige Klammer', backSlash: 'Rückwärtsgewandter Schrägstrich', closeBracket: 'Schliessende eckige Klammer', singleQuote: 'Einfaches Anführungszeichen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/sk.js0000644000201500020150000001223114515446705025216 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'sk', { title: 'Inštrukcie prístupnosti', contents: 'Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.', legend: [ { name: 'Všeobecne', items: [ { name: 'Lišta nástrojov editora', legend: 'Stlačením ${toolbarFocus} prejdete na panel nástrojov. Medzi ďalšou a predchádzajúcou skupinou sa pohybujete s TAB a SHIFT+TAB. Medzi ďalším a predchádzajúcim tlačidlom na panelu nástrojov sa pohybujete s ŠÍPKA VPRAVO a ŠÍPKA VĽAVO. Stlačte medzerník alebo ENTER pre aktiváciu tlačidla lišty nástrojov. Po aktivácii tlačidla sa fókus presunie späť do editačnej oblasti.' }, { name: 'Editorový dialóg', legend: 'V dialógovom okne stlačte TAB pre presun na ďalší prvok, SHIFT+TAB pre presun na predchádzajúci prvok, ENTER pre odoslanie, ESC pre zrušenie. Keď má dialógové okno viacero kariet, zoznam kariet dosiahnete buď stlačením ALT+F10 alebo s TAB v príslušnom poradí kariet. So zameraným zoznamom kariet sa pohybujte k ďalšej alebo predchádzajúcej karte cez PRAVÚ a ĽAVÚ ŠÍPKU.' }, { name: 'Editorové kontextové menu', legend: 'Stlačte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ďalšie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodičovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC.' }, { name: 'Editorov box zoznamu', legend: 'V boxe zoznamu, presuňte sa na ďalšiu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT+TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti zoznamu. Stlačte ESC pre zatvorenie boxu zoznamu.' }, { name: 'Editorove pásmo cesty prvku', legend: 'Stlačte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlačidlo ďalšieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlačidlu s SHIFT+TAB alebo ľavou šípkou. Stlačte medzerník alebo ENTER pre výber prvku v editore.' } ] }, { name: 'Príkazy', items: [ { name: 'Vrátiť príkazy', legend: 'Stlačte ${undo}' }, { name: 'Nanovo vrátiť príkaz', legend: 'Stlačte ${redo}' }, { name: 'Príkaz na stučnenie', legend: 'Stlačte ${bold}' }, { name: 'Príkaz na kurzívu', legend: 'Stlačte ${italic}' }, { name: 'Príkaz na podčiarknutie', legend: 'Stlačte ${underline}' }, { name: 'Príkaz na odkaz', legend: 'Stlačte ${link}' }, { name: 'Príkaz na zbalenie lišty nástrojov', legend: 'Stlačte ${toolbarCollapse}' }, { name: 'Prejsť na predchádzajúcu zamerateľnú medzeru príkazu', legend: 'Stlačte ${accessPreviousSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery pred vsuvkuo. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier.' }, { name: 'Prejsť na ďalší ', legend: 'Stlačte ${accessNextSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery po vsuvke. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier.' }, { name: 'Pomoc prístupnosti', legend: 'Stlačte ${a11yHelp}' }, { name: 'Vložiť ako čistý text', legend: 'Stlačte ${pastetext}', legendEdge: 'Stlačte ${pastetext} a potom ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Stránka hore', pageDown: 'Stránka dole', leftArrow: 'Šípka naľavo', upArrow: 'Šípka hore', rightArrow: 'Šípka napravo', downArrow: 'Šípka dole', insert: 'Insert', leftWindowKey: 'Ľavé Windows tlačidlo', rightWindowKey: 'Pravé Windows tlačidlo', selectKey: 'Tlačidlo Select', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Násobenie', add: 'Sčítanie', subtract: 'Odčítanie', decimalPoint: 'Desatinná čiarka', divide: 'Delenie', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Bodkočiarka', equalSign: 'Rovná sa', comma: 'Čiarka', dash: 'Pomĺčka', period: 'Bodka', forwardSlash: 'Lomítko', graveAccent: 'Zdôrazňovanie prízvuku', openBracket: 'Hranatá zátvorka otváracia', backSlash: 'Backslash', closeBracket: 'Hranatá zátvorka zatváracia', singleQuote: 'Jednoduché úvodzovky' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/az.js0000644000201500020150000001134414515446705025217 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'az', { title: 'Əlillərə dəstək üzrə təlimat', contents: 'Kömək. Pəncərəni bağlamaq üçün ESC basın.', legend: [ { name: 'Əsas', items: [ { name: 'Düzəliş edənin alətlər çubuğu', legend: 'Panelə keçmək üçün ${toolbarFocus} basın. Növbəti panelə TAB, əvvəlki panelə isə SHIFT+TAB düyməsi vasitəsi ilə keçə bilərsiz. Paneldəki düymələr arasında sol və sağ ox düyməsi ilə keçid edə bilərsiz. Seçilmiş düyməsi SPACE və ya ENTER ilə işlədə bilərsiniz.' }, { name: 'Redaktorun pəncərəsi', legend: 'Pəncərə içində növbəti element seçmək üçün TAB düyməni basın, əvvəlki isə - SHIFT+TAB. Təsdiq edilməsi üçün ENTER, imtina edilməsi isə ESC diymələri istifadə edin. Pəncərədə bir neçə vərəq olanda olnarın siyahı ALT+F10 ilə aça bilərsiz. Vərəqlərin siyahı fokus altında olanda ox düymələr vasitəsi ilə onların arasında keçid edə bilərsiz.' }, { name: 'Redaktorun seçimlərin menyusu', legend: 'Seçimləri redaktə etmək üçün ${contextMenu} ya da APPLICATION KEY basın. Növbəti seçimə keçmək üçün TAB ya AŞAĞI OX düyməsini basın, əvvəlki isə - SHIFT+TAB ya YUXARI OX. Seçimi arımaq SPACE ya ENTER düymələri istifadə edin. Alt menyunu açmaq üçün SPACE, ENTER ya SAĞA OX basın. ESC ya SOLA OX ilə geriyə qayıda bilərsiz. Bütün menyunu ESC ilə bağlıyın.' }, { name: 'Düzəliş edənin siyahı qutusu', legend: 'Siyahı qutusu içində növbəti bənd seçmək üçün TAB ya AŞAĞI OX, əvvəlki isə SHIFT+TAB ya YUXARI OX basın. Seçimi arımaq SPACE ya ENTER düymələri istifadə edin. Siyahı qutusu ESC ilə bağlıyın.' }, { name: 'Redaktor elementin cığır paneli', legend: 'Elementin cığır paneli seçmək üçün ${elementsPathFocus} basın. Növbəti element seçmək üçün TAB ya SAĞA OX, əvvəlki isə SHIFT+TAB ya SOLA OX istifadə edin. Elementi arımaq SPACE ya ENTER düymələri mövcuddur.' } ] }, { name: 'Əmrlər', items: [ { name: 'Əmri geri qaytar', legend: '${undo} basın' }, { name: 'Geri əmri', legend: '${redo} basın' }, { name: 'Qalın əmri', legend: '${bold} basın' }, { name: 'Kursiv əmri', legend: '${italic} basın' }, { name: 'Altdan xətt əmri', legend: '${underline} basın' }, { name: 'Link əmri', legend: '${link} basın' }, { name: 'Paneli gizlət əmri', legend: '${toolbarCollapse} basın' }, { name: 'Əvvəlki fokus sahəsi seç əmrı', legend: 'Kursordan əvvəl ən yaxın əlçatmaz yerə dəymək üçün ${accessPreviousSpace} basın, misal üçün: iki dal-badal HR teg. Uzaq yerlərə dəymək üçün bir neçə dəfə basın.' }, { name: 'Növbəti fokus sahəsi seç əmrı', legend: 'Kursordan sonra ən yaxın əlçatmaz yerə dəymək üçün ${accessNextSpace} basın, misal üçün: iki dal-badal HR teg. Uzaq yerlərə dəymək üçün bir neçə dəfə basın.' }, { name: 'Hərtərəfli Kömək', legend: '${a11yHelp} basın' }, { name: 'Yalnız mətni əlavə et', legend: '${pastetext} basın', legendEdge: 'Öncə ${pastetext}, sonra ${paste} basın' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Sola ox işarəsi', upArrow: 'Yuxarı ox işarəsi', rightArrow: 'Sağa ox işarəsi', downArrow: 'Aşağı ox işarəsi', insert: 'Insert', leftWindowKey: 'Soldaki Windows düyməsi', rightWindowKey: 'Sağdaki Windows düyməsi', selectKey: 'Düyməni seçin', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Vurma', add: 'Əlavə et', subtract: 'Çıxma', decimalPoint: 'Onluq kəsri tam ədəddən ayıran nöqtə', divide: 'Bölüşdürmə', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Nöqtəli verqül', equalSign: 'Barəbərlik işarəsi', comma: 'Vergül', dash: 'Defis', period: 'Nöqtə', forwardSlash: 'Çəp xətt', graveAccent: 'Vurğu işarəsi', openBracket: 'Açılan mötərizə', backSlash: 'Tərs çəpəki xətt', closeBracket: 'Bağlanan mötərizə', singleQuote: 'Tək dırnaq' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/pt.js0000644000201500020150000001224014515446705025224 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'pt', { title: 'Instruções de acessibilidade', contents: 'Conteúdo de ajuda. Use a tecla ESC para fechar esta janela.', legend: [ { name: 'Geral', items: [ { name: 'Barra de ferramentas do editor', legend: 'Clique em ${toolbarFocus} para navegar na barra de ferramentas. Para navegar entre o grupo da barra de ferramentas anterior e seguinte use TAB e SHIFT+TAB. Para navegar entre o botão da barra de ferramentas seguinte e anterior use a SETA DIREITA ou SETA ESQUERDA. Carregue em ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.' }, { name: 'Janela do editor', legend: 'Dentro de uma janela de diálogo, use TAB para navegar para o campo seguinte; use SHIFT + TAB para mover para o campo anterior, use ENTER para submeter a janela, use ESC para cancelar a janela. Para as janelas que tenham vários separadores, use ALT + F10 para navegar na lista de separadores. Na lista pode mover entre o separador seguinte ou anterior com SETA DIREITA e SETA ESQUERDA, respetivamente' }, { name: 'Menu de contexto do editor', legend: 'Clique em ${contextMenu} ou TECLA APLICAÇÃO para abrir o menu de contexto. Depois vá para a opção do menu seguinte com TAB ou SETA PARA BAIXO. Vá para a opção anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO, ENTER ou SETA DIREITA. Vá para o item do menu contentor com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC.' }, { name: 'Editor de caixa em lista', legend: 'Dentro de uma lista, para navegar para o item seguinte da lista use TAB ou SETA PARA BAIXO. Para o item anterior da lista use SHIFT+TAB ou SETA PARA BAIXO. Carregue em ESPAÇO ou ENTER para selecionar a opção lista. Carregue em ESC para fechar a caixa da lista.' }, { name: 'Editor da barra de caminho dos elementos', legend: 'Clique em ${elementsPathFocus} para navegar na barra de caminho dos elementos. Para o botão do elemento seguinte use TAB ou SETA DIREITA. para o botão anterior use SHIFT+TAB ou SETA ESQUERDA. Carregue em ESPAÇO ou ENTER para selecionar o elemento no editor.' } ] }, { name: 'Comandos', items: [ { name: 'Comando de anular', legend: 'Carregar ${undo}' }, { name: 'Comando de refazer', legend: 'Clique ${redo}' }, { name: 'Comando de negrito', legend: 'Pressione ${bold}' }, { name: 'Comando de itálico', legend: 'Pressione ${italic}' }, { name: 'Comando de sublinhado', legend: 'Pressione ${underline}' }, { name: 'Comando de hiperligação', legend: 'Pressione ${link}' }, { name: 'Comando de ocultar barra de ferramentas', legend: 'Pressione ${toolbarCollapse}' }, { name: 'Aceder ao comando espaço de foco anterior', legend: 'Clique em ${accessPreviousSpace} para aceder ao espaço do focos inalcançável mais perto antes do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes.' }, { name: 'Acesso comando do espaço focus seguinte', legend: 'Pressione ${accessNextSpace} para aceder ao espaço do focos inalcançável mais perto depois do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes.' }, { name: 'Ajuda a acessibilidade', legend: 'Pressione ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Separador', pause: 'Pausa', capslock: 'Maiúsculas', escape: 'Esc', pageUp: 'Subir página', pageDown: 'Descer página', leftArrow: 'Seta esquerda', upArrow: 'Seta para cima', rightArrow: 'Seta direita', downArrow: 'Seta para baixo', insert: 'Inserir', leftWindowKey: 'Tecla esquerda Windows', rightWindowKey: 'Tecla direita Windows', selectKey: 'Selecionar tecla', numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiplicar', add: 'Adicionar', subtract: 'Subtrair', decimalPoint: 'Ponto decimal', divide: 'Separar', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Ponto e vírgula', equalSign: 'Sinald e igual', comma: 'Vírgula', dash: 'Cardinal', period: 'Ponto', forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Acento grave', openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Plica' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/si.js0000644000201500020150000001617014515446705025222 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'si', { title: 'ළඟා වියහැකි ', contents: 'උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න', legend: [ { name: 'පොදු කරුණු', items: [ { name: 'සංස්කරණ මෙවලම් ', legend: 'ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.' }, { name: 'සංස්කරණ ', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'සංස්කරණ අඩංගුවට ', legend: 'ඔබන්න ${අන්තර්ගත මෙනුව} හෝ APPLICATION KEY අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද, දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට ESC හෝ LEFT ARROW බොත්තම ද. අන්තර්ගත-මෙනුව වැසීමට ESC බොත්තම ද ඔබන්න.' }, { name: 'සංස්කරණ තේරුම් ', legend: 'තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට SHIFT+TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට SPACE හෝ ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න.' }, { name: 'සංස්කරණ අංග සහිත ', legend: 'ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT+TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න.' } ] }, { name: 'විධාන', items: [ { name: 'විධානය වෙනස් ', legend: 'ඔබන්න ${වෙනස් කිරීම}' }, { name: 'විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.', legend: 'ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}' }, { name: 'තද අකුරින් විධාන', legend: 'ඔබන්න ${තද }' }, { name: 'බැධී අකුරු විධාන', legend: 'ඔබන්න ${බැධී අකුරු }' }, { name: 'යටින් ඉරි ඇද ඇති විධාන.', legend: 'ඔබන්න ${යටින් ඉරි ඇද ඇති}' }, { name: 'සම්බන්ධිත විධාන', legend: 'ඔබන්න ${සම්බන්ධ }' }, { name: 'මෙවලම් තීරු හැකුලුම් විධාන', legend: 'ඔබන්න ${මෙවලම් තීරු හැකුලුම් }' }, { name: 'යොමුවීමට පෙර වැදගත් විධාන', legend: 'ඔබන්න ${යොමුවීමට ඊළඟ }' }, { name: 'යොමුවීමට ඊළග වැදගත් විධාන', legend: 'ඔබන්න ${යොමුවීමට ඊළඟ }' }, { name: 'ප්‍රවේශ ', legend: 'ඔබන්න ${a11y }' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ko.js0000644000201500020150000001376714515446705025231 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ko', { title: '접근성 설명', contents: '도움말. 이 창을 닫으시려면 ESC 를 누르세요.', legend: [ { name: '일반', items: [ { name: '편집기 툴바', legend: '툴바를 탐색하시려면 ${toolbarFocus} 를 투르세요. 이전/다음 툴바 그룹으로 이동하시려면 TAB 키 또는 SHIFT+TAB 키를 누르세요. 이전/다음 툴바 버튼으로 이동하시려면 오른쪽 화살표 키 또는 왼쪽 화살표 키를 누르세요. 툴바 버튼을 활성화 하려면 SPACE 키 또는 ENTER 키를 누르세요.' }, { name: '편집기 다이얼로그', legend: 'TAB 키를 누르면 다음 대화상자로 이동하고, SHIFT+TAB 키를 누르면 이전 대화상자로 이동합니다. 대화상자를 제출하려면 ENTER 키를 누르고, ESC 키를 누르면 대화상자를 취소합니다. 대화상자에 탭이 여러개 있을 때, ALT+F10 키 또는 TAB 키를 누르면 순서에 따라 탭 목록에 도달할 수 있습니다. 탭 목록에 초점이 맞을 때, 오른쪽과 왼쪽 화살표 키를 이용하면 각각 다음과 이전 탭으로 이동할 수 있습니다.' }, { name: '편집기 환경 메뉴', legend: '${contextMenu} 또는 어플리케이션 키를 누르면 환경-메뉴를 열 수 있습니다. 환경-메뉴에서 TAB 키 또는 아래 화살표 키를 누르면 다음 메뉴 옵션으로 이동할 수 있습니다. 이전 옵션으로 이동은 SHIFT+TAB 키 또는 위 화살표 키를 눌러서 할 수 있습니다. 스페이스 키 또는 ENTER 키를 눌러서 메뉴 옵션을 선택할 수 있습니다. 스페이스 키 또는 ENTER 키 또는 오른쪽 화살표 키를 눌러서 하위 메뉴를 열 수 있습니다. 부모 메뉴 항목으로 돌아가려면 ESC 키 또는 왼쪽 화살표 키를 누릅니다. ESC 키를 눌러서 환경-메뉴를 닫습니다.' }, { name: '편집기 목록 박스', legend: '리스트-박스 내에서, 목록의 다음 항목으로 이동하려면 TAB 키 또는 아래쪽 화살표 키를 누릅니다. 목록의 이전 항목으로 이동하려면 SHIFT+TAB 키 또는 위쪽 화살표 키를 누릅니다. 스페이스 키 또는 ENTER 키를 누르면 목록의 해당 옵션을 선택합니다. ESC 키를 눌러서 리스트-박스를 닫을 수 있습니다.' }, { name: '편집기 요소 경로 막대', legend: '${elementsPathFocus}를 눌러서 요소 경로 막대를 탐색할 수 있습니다. 다음 요소로 이동하려면 TAB 키 또는 오른쪽 화살표 키를 누릅니다. SHIFT+TAB 키 또는 왼쪽 화살표 키를 누르면 이전 버튼으로 이동할 수 있습니다. 스페이스 키나 ENTER 키를 누르면 편집기의 해당 항목을 선택합니다.' } ] }, { name: '명령', items: [ { name: ' 명령 실행 취소', legend: '${undo} 누르시오' }, { name: ' 명령 다시 실행', legend: '${redo} 누르시오' }, { name: ' 굵게 명령', legend: '${bold} 누르시오' }, { name: ' 기울임 꼴 명령', legend: '${italic} 누르시오' }, { name: ' 밑줄 명령', legend: '${underline} 누르시오' }, { name: ' 링크 명령', legend: '${link} 누르시오' }, { name: ' 툴바 줄이기 명령', legend: '${toolbarCollapse} 누르시오' }, { name: ' 이전 포커스 공간 접근 명령', legend: '탈자 기호(^) 이전에 ${accessPreviousSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다.' }, { name: '다음 포커스 공간 접근 명령', legend: '탈자 기호(^) 다음에 ${accessNextSpace} 를 누르면, 접근 불가능하면서 가장 가까운 포커스 영역에 접근합니다. 예를 들면, 두 인접한 HR 요소가 있습니다. 키 조합을 반복해서 멀리있는 포커스 영역들에 도달할 수 있습니다. ' }, { name: ' 접근성 도움말', legend: '${a11yHelp} 누르시오' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: '탭 키', pause: '일시정지 키', capslock: '캡스 록 키', escape: '이스케이프 키', pageUp: '페이지 업 키', pageDown: '페이지 다운 키', leftArrow: '왼쪽 화살표 키', upArrow: '위쪽 화살표 키', rightArrow: '오른쪽 화살표 키', downArrow: '아래쪽 화살표 키', insert: '인서트 키', leftWindowKey: '왼쪽 윈도우 키', rightWindowKey: '오른쪽 윈도우 키', selectKey: '셀렉트 키', numpad0: '숫자 패드 0 키', numpad1: '숫자 패드 1 키', numpad2: '숫자 패드 2 키', numpad3: '숫자 패드 3 키', numpad4: '숫자 패드 4 키', numpad5: '숫자 패드 5 키', numpad6: '숫자 패드 6 키', numpad7: '숫자 패드 7 키', numpad8: '숫자 패드 8 키', numpad9: '숫자 패드 9 키', multiply: '곱셈(*) 키', add: '덧셈(+) 키', subtract: '뺄셈(-) 키', decimalPoint: '온점(.) 키', divide: '나눗셈(/) 키', f1: 'F1 키', f2: 'F2 키', f3: 'F3 키', f4: 'F4 키', f5: 'F5 키', f6: 'F6 키', f7: 'F7 키', f8: 'F8 키', f9: 'F9 키', f10: 'F10 키', f11: 'F11 키', f12: 'F12 키', numLock: 'Num Lock 키', scrollLock: 'Scroll Lock 키', semiColon: '세미콜론(;) 키', equalSign: '등호(=) 키', comma: '쉼표(,) 키', dash: '대시(-) 키', period: '온점(.) 키', forwardSlash: '슬래시(/) 키', graveAccent: '억음 악센트(`) 키', openBracket: '브라켓 열기([) 키', backSlash: '역슬래시(\\\\) 키', closeBracket: '브라켓 닫기(]) 키', singleQuote: '외 따옴표(\') 키' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/mk.js0000644000201500020150000001276614515446705025225 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'mk', { title: 'Инструкции за пристапност', contents: 'Содржина на делот за помош. За да го затворите овој дијалог притиснете ESC.', legend: [ { name: 'Општо', items: [ { name: 'Мени за уредувачот', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Дијалот за едиторот', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Контекст-мени на уредувачот', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Наредби', items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Пауза', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Up', leftArrow: 'Стрелка лево', upArrow: 'Стрелка горе', rightArrow: 'Стрелка десно', downArrow: 'Стрелка доле', insert: 'Insert', leftWindowKey: 'Лево Windows копче', rightWindowKey: 'Десно Windows копче', selectKey: 'Select копче', numpad0: 'Нум. таст. 0', numpad1: 'Нум. таст. 1', numpad2: 'Нум. таст. 2', numpad3: 'Нум. таст. 3', numpad4: 'Нум. таст. 4', numpad5: 'Нум. таст. 5', numpad6: 'Нум. таст. 6', numpad7: 'Нум. таст. 7', numpad8: 'Нум. таст. 8', numpad9: 'Нум. таст. 9', multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/cy.js0000644000201500020150000001242514515446705025221 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'cy', { title: 'Canllawiau Hygyrchedd', contents: 'Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.', legend: [ { name: 'Cyffredinol', items: [ { name: 'Bar Offer y Golygydd', legend: 'Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i\'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT+TAB. Symudwch i\'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol.' }, { name: 'Deialog y Golygydd', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Dewislen Cyd-destun y Golygydd', legend: 'Pwyswch $ {contextMenu} neu\'r ALLWEDD \'APPLICATION\' i agor y ddewislen cyd-destun. Yna symudwch i\'r opsiwn ddewislen nesaf gyda\'r TAB neu\'r SAETH I LAWR. Symudwch i\'r opsiwn blaenorol gyda SHIFT+TAB neu\'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i\'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC.' }, { name: 'Blwch Rhestr y Golygydd', legend: 'Tu mewn y blwch rhestr, ewch i\'r eitem rhestr nesaf gyda TAB neu\'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT+TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o\'r rhestr. Pwyswch ESC i gau\'r rhestr.' }, { name: 'Bar Llwybr Elfen y Golygydd', legend: 'Pwyswch ${elementsPathFocus} i fynd i\'r bar llwybr elfennau. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT+TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd.' } ] }, { name: 'Gorchmynion', items: [ { name: 'Gorchymyn dadwneud', legend: 'Pwyswch ${undo}' }, { name: 'Gorchymyn ailadrodd', legend: 'Pwyswch ${redo}' }, { name: 'Gorchymyn Bras', legend: 'Pwyswch ${bold}' }, { name: 'Gorchymyn italig', legend: 'Pwyswch ${italig}' }, { name: 'Gorchymyn tanlinellu', legend: 'Pwyso ${underline}' }, { name: 'Gorchymyn dolen', legend: 'Pwyswch ${link}' }, { name: 'Gorchymyn Cwympo\'r Dewislen', legend: 'Pwyswch ${toolbarCollapse}' }, { name: 'Myned i orchymyn bwlch ffocws blaenorol', legend: 'Pwyswch ${accessPreviousSpace} i fyned i\'r "blwch ffocws sydd methu ei gyrraedd" cyn y caret, er enghraifft: dwy elfen HR drws nesaf i\'w gilydd. AIladroddwch y cyfuniad allwedd i gyrraedd bylchau ffocws pell.' }, { name: 'Ewch i\'r gorchymyn blwch ffocws nesaf', legend: 'Pwyswch ${accessNextSpace} i fyned i\'r blwch ffocws agosaf nad oes modd ei gyrraedd ar ôl y caret, er enghraifft: dwy elfen HR drws nesaf i\'w gilydd. Ailadroddwch y cyfuniad allwedd i gyrraedd blychau ffocws pell.' }, { name: 'Cymorth Hygyrchedd', legend: 'Pwyswch ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/uk.js0000644000201500020150000001640514515446705025227 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'uk', { title: 'Спеціальні Інструкції', contents: 'Довідка. Натисніть ESC і вона зникне.', legend: [ { name: 'Основне', items: [ { name: 'Панель Редактора', legend: 'Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT+TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів.' }, { name: 'Діалог Редактора', legend: 'Усередині діалогу, натисніть TAB щоб перейти до наступного елементу діалогу, натисніть SHIFT+TAB щоб перейти до попереднього елемента діалогу, натисніть ENTER щоб відправити діалог, натисніть ESC щоб скасувати діалог. Коли діалогове вікно має декілька вкладок, отримати доступ до панелі вкладок як частині діалогу можна натисканням або поєднання ALT+F10 або TAB, при цьому активні елементи діалогу будуть перебиратися з урахуванням порядку табуляції. При активній панелі вкладок, перехід до наступної або попередньої вкладці здійснюється натисканням стрілки "ВПРАВО" або стрілки "ВЛЕВО" відповідно.' }, { name: 'Контекстне Меню Редактора', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC.' }, { name: 'Скринька Списків Редактора', legend: 'Усередині списку, перехід до наступного пункту списку виконується клавішею TAB або СТРІЛКА ВНИЗ. Перехід до попереднього елемента списку клавішею SHIFT+TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список.' }, { name: 'Шлях до елемента редактора', legend: 'Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі.' } ] }, { name: 'Команди', items: [ { name: 'Відмінити команду', legend: 'Натисніть ${undo}' }, { name: 'Повторити', legend: 'Натисніть ${redo}' }, { name: 'Жирний', legend: 'Натисніть ${bold}' }, { name: 'Курсив', legend: 'Натисніть ${italic}' }, { name: 'Підкреслений', legend: 'Натисніть ${underline}' }, { name: 'Посилання', legend: 'Натисніть ${link}' }, { name: 'Згорнути панель інструментів', legend: 'Натисніть ${toolbarCollapse}' }, { name: 'Доступ до попереднього місця фокусування', legend: 'Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.' }, { name: 'Доступ до наступного місця фокусування', legend: 'Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування.' }, { name: 'Допомога з доступності', legend: 'Натисніть ${a11yHelp}' }, { name: 'Вставити як звичайний текст', legend: 'Натисніть ${pastetext}', legendEdge: 'Натисніть ${pastetext}, а потім ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Esc', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Ліва стрілка', upArrow: 'Стрілка вгору', rightArrow: 'Права стрілка', downArrow: 'Стрілка вниз', insert: 'Вставити', leftWindowKey: 'Ліва клавіша Windows', rightWindowKey: 'Права клавіша Windows', selectKey: 'Виберіть клавішу', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Множення', add: 'Додати', subtract: 'Віднімання', decimalPoint: 'Десяткова кома', divide: 'Ділення', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Крапка з комою', equalSign: 'Знак рівності', comma: 'Кома', dash: 'Тире', period: 'Період', forwardSlash: 'Коса риска', graveAccent: 'Гравіс', openBracket: 'Відкрити дужку', backSlash: 'Зворотна коса риска', closeBracket: 'Закрити дужку', singleQuote: 'Одинарні лапки' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/zh-cn.js0000644000201500020150000001105614515446705025624 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'zh-cn', { title: '辅助功能说明', contents: '帮助内容。要关闭此对话框请按 ESC 键。', legend: [ { name: '常规', items: [ { name: '编辑器工具栏', legend: '按 ${toolbarFocus} 切换到工具栏,使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个或下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。' }, { name: '编辑器对话框', legend: '在对话框内,按 TAB 键移动到下一个字段,按 SHIFT + TAB 组合键移动到上一个字段,按 ENTER 键提交对话框,按 ESC 键取消对话框。对于有多选项卡的对话框,可以按 ALT + F10 直接切换到或者按 TAB 键逐步移到选项卡列表,当焦点移到选项卡列表时可以用左右箭头键来移动到前后的选项卡。' }, { name: '编辑器上下文菜单', legend: '用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项;SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键,ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。' }, { name: '编辑器列表框', legend: '在列表框中,移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT+TAB 组合键或者上箭头键,用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。' }, { name: '编辑器元素路径栏', legend: '按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。' } ] }, { name: '命令', items: [ { name: ' 撤消命令', legend: '按 ${undo}' }, { name: ' 重做命令', legend: '按 ${redo}' }, { name: ' 加粗命令', legend: '按 ${bold}' }, { name: ' 倾斜命令', legend: '按 ${italic}' }, { name: ' 下划线命令', legend: '按 ${underline}' }, { name: ' 链接命令', legend: '按 ${link}' }, { name: ' 工具栏折叠命令', legend: '按 ${toolbarCollapse}' }, { name: '访问前一个焦点区域的命令', legend: '按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域,例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。' }, { name: '访问下一个焦点区域命令', legend: '按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。' }, { name: '辅助功能帮助', legend: '按 ${a11yHelp}' }, { name: '粘贴为纯文本', legend: '按 ${pastetext}', legendEdge: '按 ${pastetext},然后再按 ${paste}' } ] } ], tab: 'Tab 键', pause: '暂停键', capslock: '大写锁定键', escape: 'Esc 键', pageUp: '上翻页键', pageDown: '下翻页键', leftArrow: '向左箭头键', upArrow: '向上箭头键', rightArrow: '向右箭头键', downArrow: '向下箭头键', insert: '插入键', leftWindowKey: '左 WIN 键', rightWindowKey: '右 WIN 键', selectKey: '选择键', numpad0: '小键盘 0 键', numpad1: '小键盘 1 键', numpad2: '小键盘 2 键', numpad3: '小键盘 3 键', numpad4: '小键盘 4 键', numpad5: '小键盘 5 键', numpad6: '小键盘 6 键', numpad7: '小键盘 7 键', numpad8: '小键盘 8 键', numpad9: '小键盘 9 键', multiply: '星号键', add: '加号键', subtract: '减号键', decimalPoint: '小数点键', divide: '除号键', f1: 'F1 键', f2: 'F2 键', f3: 'F3 键', f4: 'F4 键', f5: 'F5 键', f6: 'F6 键', f7: 'F7 键', f8: 'F8 键', f9: 'F9 键', f10: 'F10 键', f11: 'F11 键', f12: 'F12 键', numLock: '数字锁定键', scrollLock: '滚动锁定键', semiColon: '分号键', equalSign: '等号键', comma: '逗号键', dash: '短划线键', period: '句号键', forwardSlash: '斜杠键', graveAccent: '重音符键', openBracket: '左中括号键', backSlash: '反斜杠键', closeBracket: '右中括号键', singleQuote: '单引号键' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/sv.js0000644000201500020150000001141114515446705025230 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'sv', { title: 'Hjälpmedelsinstruktioner', contents: 'Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.', legend: [ { name: 'Allmänt', items: [ { name: 'Editor verktygsfält', legend: 'Tryck på ${toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT+TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck SPACE eller ENTER för att aktivera knappen i verktygsfältet.' }, { name: 'Dialogeditor', legend: 'Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan, tryck SKIFT+TAB för att flytta till föregående fält, tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT+F10 eller TAB för att navigera till fliklistan. med fliklistan vald flytta till nästa och föregående flik med HÖGER- eller VÄNSTERPIL.' }, { name: 'Editor för innehållsmeny', legend: 'Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC.' }, { name: 'Editor för list-box', legend: 'Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT+TAB eller UPPIL. Tryck SPACE eller ENTER för att välja listan alternativet. Tryck ESC för att stänga list-boxen.' }, { name: 'Editor för elementens sökväg', legend: 'Tryck på ${elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT+TAB eller VÄNSTERPIL. Tryck SPACE eller ENTER för att välja element i redigeraren.' } ] }, { name: 'Kommandon', items: [ { name: 'Ångra kommando', legend: 'Tryck på ${undo}' }, { name: 'Gör om kommando', legend: 'Tryck på ${redo}' }, { name: 'Kommandot fet stil', legend: 'Tryck på ${bold}' }, { name: 'Kommandot kursiv', legend: 'Tryck på ${italic}' }, { name: 'Kommandot understruken', legend: 'Tryck på ${underline}' }, { name: 'Kommandot länk', legend: 'Tryck på ${link}' }, { name: 'Verktygsfält Dölj kommandot', legend: 'Tryck på ${toolbarCollapse}' }, { name: 'Gå till föregående fokus plats', legend: 'Tryck på ${accessPreviousSpace} för att gå till närmast onåbara utrymme före markören, exempel: två intilliggande HR element. Repetera tangentkombinationen för att gå till nästa.' }, { name: 'Tillgå nästa fokuskommandots utrymme', legend: 'Tryck ${accessNextSpace} på för att komma åt den närmaste onåbar fokus utrymme efter cirkumflex, till exempel: två intilliggande HR element. Upprepa tangentkombinationen för att nå avlägsna fokus utrymmen.' }, { name: 'Hjälp om tillgänglighet', legend: 'Tryck ${a11yHelp}' }, { name: 'Klistra in som vanlig text', legend: 'Tryck ${pastetext}', legendEdge: 'Tryck ${pastetext}, följt av ${paste}' } ] } ], tab: 'Tab', pause: 'Paus', capslock: 'Caps lock', escape: 'Escape', pageUp: 'Sida Up', pageDown: 'Sida Ned', leftArrow: 'Vänsterpil', upArrow: 'Uppil', rightArrow: 'Högerpil', downArrow: 'Nedåtpil', insert: 'Infoga', leftWindowKey: 'Vänster Windowstangent', rightWindowKey: 'Höger Windowstangent', selectKey: 'Välj tangent', numpad0: 'Nummer 0', numpad1: 'Nummer 1', numpad2: 'Nummer 2', numpad3: 'Nummer 3', numpad4: 'Nummer 4', numpad5: 'Nummer 5', numpad6: 'Nummer 6', numpad7: 'Nummer 7', numpad8: 'Nummer 8', numpad9: 'Nummer 9', multiply: 'Multiplicera', add: 'Addera', subtract: 'Minus', decimalPoint: 'Decimalpunkt', divide: 'Dividera', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semikolon', equalSign: 'Lika med tecken', comma: 'Komma', dash: 'Minus', period: 'Punkt', forwardSlash: 'Snedstreck framåt', graveAccent: 'Accent', openBracket: 'Öppningsparentes', backSlash: 'Snedstreck bakåt', closeBracket: 'Slutparentes', singleQuote: 'Enkelt Citattecken' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/lt.js0000644000201500020150000001310614515446705025222 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'lt', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'Bendros savybės', items: [ { name: 'Editor Toolbar', // MISSING legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', // MISSING items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/fr-ca.js0000644000201500020150000001372514515446705025602 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'fr-ca', { title: 'Instructions d\'accessibilité', contents: 'Contenu de l\'aide. Pour fermer cette fenêtre, appuyez sur ESC.', legend: [ { name: 'Général', items: [ { name: 'Barre d\'outil de l\'éditeur', legend: 'Appuyer sur ${toolbarFocus} pour accéder à la barre d\'outils. Se déplacer vers les groupes suivant ou précédent de la barre d\'outil avec les touches TAB et SHIFT+TAB. Se déplacer vers les boutons suivant ou précédent de la barre d\'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d\'espace ou la touche ENTRER pour activer le bouton de barre d\'outils.' }, { name: 'Dialogue de l\'éditeur', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Menu contextuel de l\'éditeur', legend: 'Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l\'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l\'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D\'ESPACE ou la touche ENTREE pour sélectionner l\'option du menu. Oovrir le sous-menu de l\'option courante avec la BARRE D\'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l\'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC.' }, { name: 'Menu déroulant de l\'éditeur', legend: 'A l\'intérieur d\'une liste en menu déroulant, se déplacer vers l\'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l\'élément précédent de la liste avec les touches SHIFT+TAB ou FLECHE HAUT. Appuyer sur la BARRE D\'ESPACE ou sur ENTREE pour sélectionner l\'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant.' }, { name: 'Barre d\'emplacement des éléments de l\'éditeur', legend: 'Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d\'emplacement des éléments de léditeur. Se déplacer vers le bouton d\'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d\'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D\'ESPACE ou sur ENTREE pour sélectionner l\'élément dans l\'éditeur.' } ] }, { name: 'Commandes', items: [ { name: 'Annuler', legend: 'Appuyer sur ${undo}' }, { name: 'Refaire', legend: 'Appuyer sur ${redo}' }, { name: 'Gras', legend: 'Appuyer sur ${bold}' }, { name: 'Italique', legend: 'Appuyer sur ${italic}' }, { name: 'Souligné', legend: 'Appuyer sur ${underline}' }, { name: 'Lien', legend: 'Appuyer sur ${link}' }, { name: 'Enrouler la barre d\'outils', legend: 'Appuyer sur ${toolbarCollapse}' }, { name: 'Accéder à l\'objet de focus précédent', legend: 'Appuyer ${accessPreviousSpace} pour accéder au prochain espace disponible avant le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d\'espaces distantes.' }, { name: 'Accéder au prochain objet de focus', legend: 'Appuyer ${accessNextSpace} pour accéder au prochain espace disponible après le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d\'espaces distantes.' }, { name: 'Aide d\'accessibilité', legend: 'Appuyer sur ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/et.js0000644000201500020150000001147214515446705025217 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'et', { title: 'Hõlbustuste kasutamise juhised', contents: 'Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.', legend: [ { name: 'Üldine', items: [ { name: 'Redaktori tööriistariba', legend: 'Tööriistaribale navigeerimiseks vajuta ${toolbarFocus}. Järgmisele või eelmisele tööriistagrupile liikumiseks vajuta TAB või SHIFT+TAB. Järgmisele või eelmisele tööriistaribale liikumiseks vajuta PAREMALE NOOLT või VASAKULE NOOLT. Vajuta TÜHIKUT või ENTERIT, et tööriistariba nupp aktiveerida.' }, { name: 'Redaktori dialoog', legend: 'Dialoogi sees vajuta TAB, et liikuda järgmisele dialoogi elemendile, SHIFT+TAB, et liikuda tagasi, vajuta ENTER dialoogi kinnitamiseks, ESC dialoogi sulgemiseks. Kui dialoogil on mitu kaarti/sakki, pääseb kaartide nimekirjale ligi ALT+F10 klahvidega või TABi kasutades. Kui kaartide nimekiri on fookuses, saab järgmisele ja eelmisele kaardile vastavalt PAREMALE ja VASAKULE NOOLTEGA.' }, { name: 'Redaktori kontekstimenüü', legend: 'Vajuta ${contextMenu} või RAKENDUSE KLAHVI, et avada kontekstimenüü. Siis saad liikuda järgmisele reale TAB klahvi või ALLA NOOLEGA. Eelmisele valikule saab liikuda SHIFT+TAB klahvidega või ÜLES NOOLEGA. Kirje valimiseks vajuta TÜHIK või ENTER. Alamenüü saab valida kui alammenüü kirje on aktiivne ja valida kas TÜHIK, ENTER või PAREMALE NOOL. Ülemisse menüüsse tagasi saab ESC klahvi või VASAKULE NOOLEGA. Menüü saab sulgeda ESC klahviga.' }, { name: 'Redaktori loetelu kast', legend: 'Loetelu kasti sees saab järgmisele reale liikuda TAB klahvi või ALLANOOLEGA. Eelmisele reale saab liikuda SHIFT+TAB klahvide või ÜLESNOOLEGA. Kirje valimiseks vajuta TÜHIKUT või ENTERIT. Loetelu kasti sulgemiseks vajuta ESC klahvi.' }, { name: 'Redaktori elementide järjestuse riba', legend: 'Vajuta ${elementsPathFocus} et liikuda asukoha ribal asuvatele elementidele. Järgmise elemendi nupule saab liikuda TAB klahviga või PAREMALE NOOLEGA. Eelmisele nupule saab liikuda SHIFT+TAB klahvi või VASAKULE NOOLEGA. Vajuta TÜHIK või ENTER, et valida redaktoris vastav element.' } ] }, { name: 'Käsud', items: [ { name: 'Tühistamise käsk', legend: 'Vajuta ${undo}' }, { name: 'Uuesti tegemise käsk', legend: 'Vajuta ${redo}' }, { name: 'Rasvase käsk', legend: 'Vajuta ${bold}' }, { name: 'Kursiivi käsk', legend: 'Vajuta ${italic}' }, { name: 'Allajoonimise käsk', legend: 'Vajuta ${underline}' }, { name: 'Lingi käsk', legend: 'Vajuta ${link}' }, { name: 'Tööriistariba peitmise käsk', legend: 'Vajuta ${toolbarCollapse}' }, { name: 'Ligipääs eelmisele fookuskohale', legend: 'Vajuta ${accessPreviousSpace}, et pääseda ligi lähimale liigipääsematule fookuskohale enne kursorit, näiteks: kahe järjestikuse HR elemendi vahele. Vajuta kombinatsiooni uuesti, et pääseda ligi kaugematele kohtadele.' }, { name: 'Ligipääs järgmisele fookuskohale', legend: 'Vajuta ${accessNextSpace}, et pääseda ligi lähimale liigipääsematule fookuskohale pärast kursorit, näiteks: kahe järjestikuse HR elemendi vahele. Vajuta kombinatsiooni uuesti, et pääseda ligi kaugematele kohtadele.' }, { name: 'Hõlbustuste abi', legend: 'Vajuta ${a11yHelp}' }, { name: 'Asetamine tavalise tekstina', legend: 'Vajuta ${pastetext}', legendEdge: 'Vajuta ${pastetext}, siis ${paste}' } ] } ], tab: 'Tabulaator', pause: 'Paus', capslock: 'Tõstulukk', escape: 'Paoklahv', pageUp: 'Leht üles', pageDown: 'Leht alla', leftArrow: 'Nool vasakule', upArrow: 'Nool üles', rightArrow: 'Nool paremale', downArrow: 'Nool alla', insert: 'Sisetamine', leftWindowKey: 'Vasak Windowsi klahv', rightWindowKey: 'Parem Windowsi klahv', selectKey: 'Vali klahv', numpad0: 'Numbriala 0', numpad1: 'Numbriala 1', numpad2: 'Numbriala 2', numpad3: 'Numbriala 3', numpad4: 'Numbriala 4', numpad5: 'Numbriala 5', numpad6: 'Numbriala 6', numpad7: 'Numbriala 7', numpad8: 'Numbriala 8', numpad9: 'Numbriala 9', multiply: 'Korrutus', add: 'Pluss', subtract: 'Miinus', decimalPoint: 'Koma', divide: 'Jagamine', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Numbrilukk', scrollLock: 'Kerimislukk', semiColon: 'Semikoolon', equalSign: 'Võrdusmärk', comma: 'Koma', dash: 'Sidekriips', period: 'Punkt', forwardSlash: 'Kaldkriips', graveAccent: 'Rõhumärk', openBracket: 'Algussulg', backSlash: 'Kurakaldkriips', closeBracket: 'Lõpusulg', singleQuote: 'Ülakoma' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/pl.js0000644000201500020150000001303614515446705025220 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'pl', { title: 'Instrukcje dotyczące dostępności', contents: 'Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.', legend: [ { name: 'Informacje ogólne', items: [ { name: 'Pasek narzędzi edytora', legend: 'Naciśnij ${toolbarFocus}, by przejść do paska narzędzi. Przejdź do następnej i poprzedniej grupy narzędzi używając TAB oraz SHIFT+TAB. Przejdź do następnego i poprzedniego przycisku paska narzędzi za pomocą STRZAŁKI W PRAWO lub STRZAŁKI W LEWO. Naciśnij SPACJĘ lub ENTER by aktywować przycisk paska narzędzi.' }, { name: 'Okno dialogowe edytora', legend: 'Wewnątrz okna dialogowego naciśnij TAB, by przejść do kolejnego elementu tego okna lub SHIFT+TAB, by przejść do poprzedniego elementu okna. Naciśnij ENTER w celu zatwierdzenia opcji okna dialogowego lub ESC w celu anulowania zmian. Jeśli okno dialogowe ma kilka zakładek, do listy zakładek można przejść za pomocą ALT+F10 lub TAB. Gdy lista zakładek jest aktywna, możesz przejść do kolejnej i poprzedniej zakładki za pomocą STRZAŁKI W PRAWO i STRZAŁKI W LEWO.' }, { name: 'Menu kontekstowe edytora', legend: 'Wciśnij ${contextMenu} lub PRZYCISK APLIKACJI aby otworzyć menu kontekstowe. Przejdź do następnej pozycji menu wciskając TAB lub STRZAŁKĘ W DÓŁ. Przejdź do poprzedniej pozycji menu wciskając SHIFT + TAB lub STRZAŁKĘ W GÓRĘ. Wciśnij SPACJĘ lub ENTER aby wygrać pozycję menu. Otwórz pod-menu obecnej pozycji wciskając SPACJĘ lub ENTER lub STRZAŁKĘ W PRAWO. Wróć do pozycji nadrzędnego menu wciskając ESC lub STRZAŁKĘ W LEWO. Zamknij menu wciskając ESC.' }, { name: 'Lista w edytorze', legend: 'Wewnątrz listy przejdź do kolejnego elementu listy za pomocą przycisku TAB lub STRZAŁKI W DÓŁ. Przejdź do poprzedniego elementu listy za pomocą SHIFT+TAB lub STRZAŁKI W GÓRĘ. Naciśnij SPACJĘ lub ENTER w celu wybrania opcji z listy. Naciśnij ESC, by zamknąć listę.' }, { name: 'Pasek ścieżki elementów edytora', legend: 'Naciśnij ${elementsPathFocus} w celu przejścia do paska ścieżki elementów edytora. W celu przejścia do kolejnego elementu naciśnij klawisz TAB lub STRZAŁKI W PRAWO. W celu przejścia do poprzedniego elementu naciśnij klawisze SHIFT+TAB lub STRZAŁKI W LEWO. By wybrać element w edytorze, użyj klawisza SPACJI lub ENTER.' } ] }, { name: 'Polecenia', items: [ { name: 'Polecenie Cofnij', legend: 'Naciśnij ${undo}' }, { name: 'Polecenie Ponów', legend: 'Naciśnij ${redo}' }, { name: 'Polecenie Pogrubienie', legend: 'Naciśnij ${bold}' }, { name: 'Polecenie Kursywa', legend: 'Naciśnij ${italic}' }, { name: 'Polecenie Podkreślenie', legend: 'Naciśnij ${underline}' }, { name: 'Polecenie Wstaw/ edytuj odnośnik', legend: 'Naciśnij ${link}' }, { name: 'Polecenie schowaj pasek narzędzi', legend: 'Naciśnij ${toolbarCollapse}' }, { name: 'Przejdź do poprzedniego miejsca, w którym można ustawić focus', legend: 'Naciśnij ${accessPreviousSpace}, aby przejść do najbliższego niedostępnego miejsca przed kursorem, w którym można ustawić focus. Przykład: dwa przylegające elementy HR. Powtórz ten skrót klawiaturowy, by dotrzeć do kolejnych takich miejsc.' }, { name: 'Przejdź do następnego miejsca, w którym można ustawić focus', legend: 'Naciśnij ${accessNextSpace}, aby przejść do najbliższego niedostępnego miejsca po kursorze, w którym można ustawić focus. Przykład: dwa przylegające elementy HR. Powtórz ten skrót klawiaturowy, by dotrzeć do kolejnych takich miejsc.' }, { name: 'Pomoc dotycząca dostępności', legend: 'Naciśnij ${a11yHelp}' }, { name: 'Wklej jako tekst', legend: 'Naciśnij ${pastetext}', legendEdge: 'Naciśnij ${pastetext}, a następnie ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Strzałka w lewo', upArrow: 'Strzałka w górę', rightArrow: 'Strzałka w prawo', downArrow: 'Strzałka w dół', insert: 'Insert', leftWindowKey: 'Lewy klawisz Windows', rightWindowKey: 'Prawy klawisz Windows', selectKey: 'Klawisz wyboru', numpad0: 'Klawisz 0 na klawiaturze numerycznej', numpad1: 'Klawisz 1 na klawiaturze numerycznej', numpad2: 'Klawisz 2 na klawiaturze numerycznej', numpad3: 'Klawisz 3 na klawiaturze numerycznej', numpad4: 'Klawisz 4 na klawiaturze numerycznej', numpad5: 'Klawisz 5 na klawiaturze numerycznej', numpad6: 'Klawisz 6 na klawiaturze numerycznej', numpad7: 'Klawisz 7 na klawiaturze numerycznej', numpad8: 'Klawisz 8 na klawiaturze numerycznej', numpad9: 'Klawisz 9 na klawiaturze numerycznej', multiply: 'Przemnóż', add: 'Plus', subtract: 'Minus', decimalPoint: 'Separator dziesiętny', divide: 'Podziel', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Średnik', equalSign: 'Znak równości', comma: 'Przecinek', dash: 'Pauza', period: 'Kropka', forwardSlash: 'Ukośnik prawy', graveAccent: 'Akcent słaby', openBracket: 'Nawias kwadratowy otwierający', backSlash: 'Ukośnik lewy', closeBracket: 'Nawias kwadratowy zamykający', singleQuote: 'Apostrof' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/bg.js0000644000201500020150000001344614515446705025202 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'bg', { title: 'Инструкции за достъпност', contents: 'Съдържание на помощта. За да затворите този диалогов прозорец, натиснете ESC.', legend: [ { name: 'Общо', items: [ { name: 'Лента с инструменти за редактора', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Диалог на редактора', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Контекстно меню на редактора', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Списъчно меню на редактора', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Лента с път на елемент на редактора', legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Команди', items: [ { name: 'Команда за отмяна', legend: 'Натисни ${undo}' }, { name: 'Команда за пренаправяне', legend: 'Натисни ${redo}' }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/fa.js0000644000201500020150000001500014515446705025164 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'fa', { title: 'دستورالعمل‌های دسترسی', contents: 'راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.', legend: [ { name: 'عمومی', items: [ { name: 'نوار ابزار ویرایشگر', legend: 'برای باز کردن نوار ابزار، {toolbarFocus}$ را بفشارید. با کلید Tab و Shift+Tab به مجموعه نوار ابزار بعدی و یا قبلی بروید. با کلید های جهت نمای راست و چپ روی دکمه های نوار ابزار حرکت کنید. برای فعال کردن دکمه مورد نظر کلید Enter و یا Space را بفشارید. با فعال کردن دکمه مورد نظر، تمرکز به محیط ویرایش باز خواهد گشت.' }, { name: 'پنجره محاورهای ویرایشگر', legend: 'در داخل یک پنجره محاوره‌ای، کلید Tab را بفشارید تا به پنجره‌ی بعدی بروید، Shift+Tab برای حرکت به فیلد قبلی، فشردن Enter برای ثبت اطلاعات پنجره‌، فشردن Esc برای لغو پنجره محاوره‌ای و برای پنجره‌هایی که چندین برگه دارند، فشردن Alt+F10 یا Tab برای حرکت در برگه ها. وقتی بر فهرست برگه ها هستید، به صفحه بعدی و قبلی با کلید های راستی و چپ حرکت کنید.' }, { name: 'منوی متنی ویرایشگر', legend: '${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc.' }, { name: 'جعبه فهرست ویرایشگر', legend: 'در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید.' }, { name: 'ویرایشگر عنصر نوار راه', legend: 'برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر.' } ] }, { name: 'فرمان‌ها', items: [ { name: 'بازگشت به آخرین فرمان', legend: 'فشردن ${undo}' }, { name: 'انجام مجدد فرمان', legend: 'فشردن ${redo}' }, { name: 'فرمان درشت کردن متن', legend: 'فشردن ${bold}' }, { name: 'فرمان کج کردن متن', legend: 'فشردن ${italic}' }, { name: 'فرمان زیرخطدار کردن متن', legend: 'فشردن ${underline}' }, { name: 'فرمان پیوند دادن', legend: 'فشردن ${link}' }, { name: 'بستن نوار ابزار فرمان', legend: 'فشردن ${toolbarCollapse}' }, { name: 'دسترسی به فرمان محل تمرکز قبلی', legend: 'فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور.' }, { name: 'دسترسی به فضای دستور بعدی', legend: 'برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال: دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید.' }, { name: 'راهنمای دسترسی', legend: 'فشردن ${a11yHelp}' }, { name: 'چسباندن به عنوان متن ساده', legend: 'فشردن ${pastetext}', legendEdge: 'فشردن ${pastetext}، همراه با ${paste}' } ] } ], tab: 'برگه', pause: 'توقف', capslock: 'Caps Lock', escape: 'گریز', pageUp: 'صفحه به بالا', pageDown: 'صفحه به پایین', leftArrow: 'پیکان چپ', upArrow: 'پیکان بالا', rightArrow: 'پیکان راست', downArrow: 'پیکان پایین', insert: 'ورود', leftWindowKey: 'کلید چپ ویندوز', rightWindowKey: 'کلید راست ویندوز', selectKey: 'انتخاب کلید', numpad0: 'کلید شماره 0', numpad1: 'کلید شماره 1', numpad2: 'کلید شماره 2', numpad3: 'کلید شماره 3', numpad4: 'کلید شماره 4', numpad5: 'کلید شماره 5', numpad6: 'کلید شماره 6', numpad7: 'کلید شماره 7', numpad8: 'کلید شماره 8', numpad9: 'کلید شماره 9', multiply: 'ضرب', add: 'افزودن', subtract: 'تفریق', decimalPoint: 'نقطه‌ی اعشار', divide: 'جدا کردن', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semicolon', equalSign: 'علامت تساوی', comma: 'کاما', dash: 'خط تیره', period: 'دوره', forwardSlash: 'Forward Slash', graveAccent: 'Grave Accent', openBracket: 'Open Bracket', backSlash: 'Backslash', closeBracket: 'Close Bracket', singleQuote: 'Single Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ku.js0000644000201500020150000001462214515446705025226 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ku', { title: 'ڕێنمای لەبەردەستدابوون', contents: 'پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.', legend: [ { name: 'گشتی', items: [ { name: 'تووڵامرازی دەستكاریكەر', legend: 'کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT+TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز.' }, { name: 'دیالۆگی دەستكاریكەر', legend: 'لەناوەوەی دیالۆگ, کلیکی کلیلی TAB بۆ ڕابەری دیالۆگێکی تر, داگرتنی کلیلی SHIFT + TAB بۆ گواستنەوەی بۆ دیالۆگی پێشووتر, کلیكی کلیلی ENTER بۆ ڕازیکردنی دیالۆگەکە, کلیكی کلیلی ESC بۆ هەڵوەشاندنەوەی دیالۆگەکە. بۆ دیالۆگی بازدەری (تابی) زیاتر, کلیكی کلیلی ALT + F10 بۆ ڕابه‌ری لیستی بازده‌ره‌کان، یان کلیكی کلیلی TAB. بۆچوونه‌ بازده‌ری تابی پێشوو یان دوواتر کلیلی تیری دەستی ڕاست یان چەپ بکە.' }, { name: 'پێڕستی سەرنووسەر', legend: 'کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە.' }, { name: 'لیستی سنووقی سەرنووسەر', legend: 'لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست.' }, { name: 'تووڵامرازی توخم', legend: 'کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه.' } ] }, { name: 'فەرمانەکان', items: [ { name: 'پووچکردنەوەی فەرمان', legend: 'کلیك ${undo}' }, { name: 'هەڵگەڕانەوەی فەرمان', legend: 'کلیك ${redo}' }, { name: 'فەرمانی دەقی قەڵەو', legend: 'کلیك ${bold}' }, { name: 'فەرمانی دەقی لار', legend: 'کلیك ${italic}' }, { name: 'فەرمانی ژێرهێڵ', legend: 'کلیك ${underline}' }, { name: 'فەرمانی به‌ستەر', legend: 'کلیك ${link}' }, { name: 'شاردەنەوەی تووڵامراز', legend: 'کلیك ${toolbarCollapse}' }, { name: 'چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی', legend: 'کلیک ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: 'چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی', legend: 'کلیک ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: 'دەستپێگەیشتنی یارمەتی', legend: 'کلیك ${a11yHelp}' }, { name: 'لکاندنی وەك دەقی ڕوون', legend: 'کلیکی ${pastetext}', legendEdge: 'کلیکی ${pastetext}، شوێنکەوتکراوە بە ${paste}' } ] } ], tab: 'تاب', pause: 'پشوو', capslock: 'قفڵدانی پیتی گەورە', escape: 'چوونە دەرەوە', pageUp: 'پەڕە بەرەوسەر', pageDown: 'پەڕە بەرەوخوار', leftArrow: 'تیری دەستی چەپ', upArrow: 'تیری بەرەوسەر', rightArrow: 'تیری دەستی ڕاست', downArrow: 'تیری بەرەوخوار', insert: 'خستنە ناو', leftWindowKey: 'پەنجەرەی چەپ', rightWindowKey: 'پەنجەرەی ڕاست', selectKey: 'هەڵبژێرە', numpad0: 'Numpad 0', // MISSING numpad1: '1', numpad2: '2', numpad3: '3', numpad4: '4', numpad5: '5', numpad6: '6', numpad7: '7', numpad8: '8', numpad9: '9', multiply: '*', add: '+', subtract: '-', decimalPoint: '.', divide: '/', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'قفڵدانی ژمارە', scrollLock: 'قفڵدانی هێڵی هاتووچۆپێکردن', semiColon: ';', equalSign: '=', comma: ',', dash: '-', period: '.', forwardSlash: '/', graveAccent: '`', openBracket: '[', backSlash: '\\\\', closeBracket: '}', singleQuote: '\'' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/el.js0000644000201500020150000001770514515446705025214 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'el', { title: 'Οδηγίες Προσβασιμότητας', contents: 'Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.', legend: [ { name: 'Γενικά', items: [ { name: 'Εργαλειοθήκη Επεξεργαστή', legend: 'Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και SHIFT+TAB. Μετακινηθείτε ανάμεσα στα κουμπιά εργαλείων με το ΔΕΞΙ ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου.' }, { name: 'Παράθυρο Διαλόγου Επεξεργαστή', legend: 'Μέσα σε έναν διάλογο, πιέσετε TAB για να πλοηγηθείτε στο επόμενο στοιχείο του διαλόγου, πιέστε SHIFT+TAB για αν πλοηγηθείτε στο προηγούμενο στοιχείο του διαλόγου, πιέστε ENTER για να υποβάλετε τον διάλογο, πιέστε ESC για να ακυρώσετε τον διάλογο. Όταν ένας διάλογος έχει πολλαπλές παραγράφους, η λίστα των παραγράφων μπορεί να προσπεραστεί είτε με ALT+F10 είτε με TAB σαν μέρος της σειράς παραγράφων του διαλόγου. Με την λίστα των παραγράφων επιλεγμένη, προχωρήστε στην επόμενη και προηγούμενη παράγραφο με τα βέλη ΔΕΞΙΑ και ΑΡΙΣΤΕΡΑ, αντίστοιχα.' }, { name: 'Αναδυόμενο Μενού Επεξεργαστή', legend: 'Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με το ESC ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC.' }, { name: 'Κουτί Λίστας Επεξεργαστών', legend: 'Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας.' }, { name: 'Μπάρα Διαδρομών Στοιχείων Επεξεργαστή', legend: 'Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή.' } ] }, { name: 'Εντολές', items: [ { name: 'Εντολή αναίρεσης', legend: 'Πατήστε ${undo}' }, { name: 'Εντολή επανάληψης', legend: 'Πατήστε ${redo}' }, { name: 'Εντολή έντονης γραφής', legend: 'Πατήστε ${bold}' }, { name: 'Εντολή πλάγιας γραφής', legend: 'Πατήστε ${italic}' }, { name: 'Εντολή υπογράμμισης', legend: 'Πατήστε ${underline}' }, { name: 'Εντολή συνδέσμου', legend: 'Πατήστε ${link}' }, { name: 'Εντολή Σύμπτηξης Εργαλειοθήκης', legend: 'Πατήστε ${toolbarCollapse}' }, { name: 'Πρόσβαση στην προηγούμενη εντολή του χώρου εστίασης ', legend: 'Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. ' }, { name: 'Πρόσβαση στην επόμενη εντολή του χώρου εστίασης', legend: 'Πατήστε ${accessNextSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. ' }, { name: 'Βοήθεια Προσβασιμότητας', legend: 'Πατήστε ${a11yHelp}' }, { name: 'Επικολλήστε ως απλό κείμενο.', legend: 'Πιέστε $(pastetext)', legendEdge: 'Πιέστε $(pastetext), ακολουθούμενο με (paste)_' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Αριστερό Βέλος', upArrow: 'Πάνω Βέλος', rightArrow: 'Δεξί Βέλος', downArrow: 'Κάτω Βέλος', insert: 'Insert ', leftWindowKey: 'Αριστερό Πλήκτρο Windows', rightWindowKey: 'Δεξί Πλήκτρο Windows', selectKey: 'Πλήκτρο Select', numpad0: 'Αριθμητικό πληκτρολόγιο 0', numpad1: 'Αριθμητικό Πληκτρολόγιο 1', numpad2: 'Αριθμητικό πληκτρολόγιο 2', numpad3: 'Αριθμητικό πληκτρολόγιο 3', numpad4: 'Αριθμητικό πληκτρολόγιο 4', numpad5: 'Αριθμητικό πληκτρολόγιο 5', numpad6: 'Αριθμητικό πληκτρολόγιο 6', numpad7: 'Αριθμητικό πληκτρολόγιο 7', numpad8: 'Αριθμητικό πληκτρολόγιο 8', numpad9: 'Αριθμητικό πληκτρολόγιο 9', multiply: 'Πολλαπλασιασμός', add: 'Πρόσθεση', subtract: 'Αφαίρεση', decimalPoint: 'Υποδιαστολή', divide: 'Διαίρεση', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: '6', f7: '7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Ερωτηματικό', equalSign: 'Σύμβολο Ισότητας', comma: 'Κόμμα', dash: 'Παύλα', period: 'Τελεία', forwardSlash: 'Κάθετος', graveAccent: 'Βαρεία', openBracket: 'Άνοιγμα Παρένθεσης', backSlash: 'Ανάστροφη Κάθετος', closeBracket: 'Κλείσιμο Παρένθεσης', singleQuote: 'Απόστροφος' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/fi.js0000644000201500020150000001277214515446705025211 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'fi', { title: 'Saavutettavuus ohjeet', contents: 'Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.', legend: [ { name: 'Yleinen', items: [ { name: 'Editorin työkalupalkki', legend: 'Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT+TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen.' }, { name: 'Editorin dialogi', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editorin oheisvalikko', legend: 'Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella.' }, { name: 'Editorin listalaatikko', legend: 'Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon.' }, { name: 'Editorin elementtipolun palkki', legend: 'Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa.' } ] }, { name: 'Komennot', items: [ { name: 'Peruuta komento', legend: 'Paina ${undo}' }, { name: 'Tee uudelleen komento', legend: 'Paina ${redo}' }, { name: 'Lihavoi komento', legend: 'Paina ${bold}' }, { name: 'Kursivoi komento', legend: 'Paina ${italic}' }, { name: 'Alleviivaa komento', legend: 'Paina ${underline}' }, { name: 'Linkki komento', legend: 'Paina ${link}' }, { name: 'Pienennä työkalupalkki komento', legend: 'Paina ${toolbarCollapse}' }, { name: 'Siirry aiempaan fokustilaan komento', legend: 'Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin edellä olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin.' }, { name: 'Siirry seuraavaan fokustilaan komento', legend: 'Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin jälkeen olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin.' }, { name: 'Saavutettavuus ohjeet', legend: 'Paina ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numeronäppäimistö 0', numpad1: 'Numeronäppäimistö 1', numpad2: 'Numeronäppäimistö 2', numpad3: 'Numeronäppäimistö 3', numpad4: 'Numeronäppäimistö 4', numpad5: 'Numeronäppäimistö 5', numpad6: 'Numeronäppäimistö 6', numpad7: 'Numeronäppäimistö 7', numpad8: 'Numeronäppäimistö 8', numpad9: 'Numeronäppäimistö 9', multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Puolipiste', equalSign: 'Equal Sign', // MISSING comma: 'Pilkku', dash: 'Dash', // MISSING period: 'Piste', forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ru.js0000644000201500020150000001575614515446705025246 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ru', { title: 'Горячие клавиши', contents: 'Помощь. Для закрытия этого окна нажмите ESC.', legend: [ { name: 'Основное', items: [ { name: 'Панель инструментов', legend: 'Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT+TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов.' }, { name: 'Диалоги', legend: 'Внутри диалога, нажмите TAB чтобы перейти к следующему элементу диалога, нажмите SHIFT+TAB чтобы перейти к предыдущему элементу диалога, нажмите ENTER чтобы отправить диалог, нажмите ESC чтобы отменить диалог. Когда диалоговое окно имеет несколько вкладок, получить доступ к панели вкладок как части диалога можно нажатием или сочетания ALT+F10 или TAB, при этом активные элементы диалога будут перебираться с учетом порядка табуляции. При активной панели вкладок, переход к следующей или предыдущей вкладке осуществляется нажатием стрелки "ВПРАВО" или стрелки "ВЛЕВО" соответственно.' }, { name: 'Контекстное меню', legend: 'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой "ВНИЗ". Переход к предыдущей опции - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой "ВПРАВО". Возврат к родительскому пункту меню - ESC или стрелкой "ВЛЕВО". Закрытие контекстного меню - ESC.' }, { name: 'Редактор списка', legend: 'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой "ВНИЗ". Переход к предыдущему пункту списка - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.' }, { name: 'Путь к элементу', legend: 'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой "ВПРАВО". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой "ВЛЕВО". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.' } ] }, { name: 'Команды', items: [ { name: 'Отменить', legend: 'Нажмите ${undo}' }, { name: 'Повторить', legend: 'Нажмите ${redo}' }, { name: 'Полужирный', legend: 'Нажмите ${bold}' }, { name: 'Курсив', legend: 'Нажмите ${italic}' }, { name: 'Подчеркнутый', legend: 'Нажмите ${underline}' }, { name: 'Гиперссылка', legend: 'Нажмите ${link}' }, { name: 'Свернуть панель инструментов', legend: 'Нажмите ${toolbarCollapse}' }, { name: 'Команды доступа к предыдущему фокусному пространству', legend: 'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом "^", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.' }, { name: 'Команды доступа к следующему фокусному пространству', legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: 'Справка по горячим клавишам', legend: 'Нажмите ${a11yHelp}' }, { name: 'Вставить только текст', legend: 'Нажмите ${pastetext}', legendEdge: 'Нажмите ${pastetext} и затем ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Esc', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Стрелка влево', upArrow: 'Стрелка вверх', rightArrow: 'Стрелка вправо', downArrow: 'Стрелка вниз', insert: 'Insert', leftWindowKey: 'Левая клавиша Windows', rightWindowKey: 'Правая клавиша Windows', selectKey: 'Выбрать', numpad0: 'Цифра 0', numpad1: 'Цифра 1', numpad2: 'Цифра 2', numpad3: 'Цифра 3', numpad4: 'Цифра 4', numpad5: 'Цифра 5', numpad6: 'Цифра 6', numpad7: 'Цифра 7', numpad8: 'Цифра 8', numpad9: 'Цифра 9', multiply: 'Умножить', add: 'Плюс', subtract: 'Вычесть', decimalPoint: 'Десятичная точка', divide: 'Делить', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Точка с запятой', equalSign: 'Равно', comma: 'Запятая', dash: 'Тире', period: 'Точка', forwardSlash: 'Наклонная черта', graveAccent: 'Апостроф', openBracket: 'Открыть скобку', backSlash: 'Обратная наклонная черта', closeBracket: 'Закрыть скобку', singleQuote: 'Одинарная кавычка' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/gl.js0000644000201500020150000001230514515446705025205 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'gl', { title: 'Instrucións de accesibilidade', contents: 'Axuda. Para pechar este diálogo prema ESC.', legend: [ { name: 'Xeral', items: [ { name: 'Barra de ferramentas do editor', legend: 'Prema ${toolbarFocus} para navegar ata a barra de ferramentas. Movase ao grupo de barras de ferramentas seguinte e anterior con TAB e MAYÚS+TAB. Movase ao botón da barra de ferramentas seguinte e anterior coa frecha cara á dereita ou á esquerda. Prema ESPAZO ou INTRO para activar o botón da barra de ferramentas. O foco moverase de novo á área de edición ao activar o botón da barra de ferramentas.' }, { name: 'Editor de diálogo', legend: 'Dentro do diálogo, prema TAB para navegar cara os seguintes elementos de diálogo, prema MAIÚS+TAB para moverse cara os anteriores elementos de diálogo, prema INTRO para enviar o diálogo, prema ESC para cancelar o diálogo. Cando o diálogo ten múltiples lapelas, a lista de lapelas pode cinguirse con ALT+F10 ou con TAB como parte da orde de lapelas do diálogo. Coa lapela en foco, pode moverse cara a seguinte ou a anterior lapela coas FRECHAS ESQUERDA e DEREICHA respectivamente. Prema ESC para descartar os cambios e pechar o diálogo. O foco moverase de novo á área de edición ao saír do diálogo.' }, { name: 'Editor do menú contextual', legend: 'Prema ${contextMenu} ou a TECLA MENÚ para abrir o menú contextual. A seguir móvase á seguinte opción do menú con TAB ou FRECHA ABAIXO. Móvase á opción anterior con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para seleccionar a opción do menú. Abra o submenú da opción actual con ESPAZO ou INTRO ou FRECHA DEREITA. Regrese ao elemento principal do menú con ESC ou FRECHA ESQUERDA. Peche o menú contextual con ESC.' }, { name: 'Lista do editor', legend: 'Dentro dunha lista, móvase ao seguinte elemento da lista con TAB ou FRECHA ABAIXO. Móvase ao elemento anterior da lista con MAIÚS+TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para escoller a opción da lista. Prema ESC para pechar a lista.' }, { name: 'Barra da ruta ao elemento no editor', legend: 'Prema ${elementsPathFocus} para navegar ata os elementos da barra de ruta. Móvase ao seguinte elemento botón con TAB ou FRECHA DEREITA. Móvase ao botón anterior con MAIÚS+TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar o elemento no editor.' } ] }, { name: 'Ordes', items: [ { name: 'Orde «desfacer»', legend: 'Prema ${undo}' }, { name: 'Orde «refacer»', legend: 'Prema ${redo}' }, { name: 'Orde «negra»', legend: 'Prema ${bold}' }, { name: 'Orde «cursiva»', legend: 'Prema ${italic}' }, { name: 'Orde «subliñar»', legend: 'Prema ${underline}' }, { name: 'Orde «ligazón»', legend: 'Prema ${link}' }, { name: 'Orde «contraer a barra de ferramentas»', legend: 'Prema ${toolbarCollapse}' }, { name: 'Orde «acceder ao anterior espazo en foco»', legend: 'Prema ${accessPreviousSpace} para acceder ao espazo máis próximo de foco inalcanzábel anterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes.' }, { name: 'Orde «acceder ao seguinte espazo en foco»', legend: 'Prema ${accessNextSpace} para acceder ao espazo máis próximo de foco inalcanzábel posterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes.' }, { name: 'Axuda da accesibilidade', legend: 'Prema ${a11yHelp}' }, { name: 'Pegar como texto simple', legend: 'Prema ${pastetext}', legendEdge: 'Prema ${pastetext}, seguido de ${paste}' } ] } ], tab: 'Tabulador', pause: 'Pausa', capslock: 'Bloq. Maiús', escape: 'Escape', pageUp: 'Páxina arriba', pageDown: 'Páxina abaixo', leftArrow: 'Frecha esquerda', upArrow: 'Frecha arriba', rightArrow: 'Frecha dereita', downArrow: 'Frecha abaixo', insert: 'Inserir', leftWindowKey: 'Tecla Windows esquerda', rightWindowKey: 'Tecla Windows dereita', selectKey: 'Escolla a tecla', numpad0: 'Tec. numérico 0', numpad1: 'Tec. numérico 1', numpad2: 'Tec. numérico 2', numpad3: 'Tec. numérico 3', numpad4: 'Tec. numérico 4', numpad5: 'Tec. numérico 5', numpad6: 'Tec. numérico 6', numpad7: 'Tec. numérico 7', numpad8: 'Tec. numérico 8', numpad9: 'Tec. numérico 9', multiply: 'Multiplicar', add: 'Sumar', subtract: 'Restar', decimalPoint: 'Punto decimal', divide: 'Dividir', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Bloq. num.', scrollLock: 'Bloq. despraz.', semiColon: 'Punto e coma', equalSign: 'Signo igual', comma: 'Coma', dash: 'Guión', period: 'Punto', forwardSlash: 'Barra inclinada', graveAccent: 'Acento grave', openBracket: 'Abrir corchete', backSlash: 'Barra invertida', closeBracket: 'Pechar corchete', singleQuote: 'Comiña simple' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/sr-latn.js0000644000201500020150000001242614515446705026167 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'sr-latn', { title: 'Uputstva za pomoć', contents: 'Sadržaji za pomoć. Da bi ste zatvorili diјalog pritisnite ESC.', legend: [ { name: 'Opšte', items: [ { name: 'Alatke za uređivanje', legend: 'Pritisnite ${toolbarFocus} da biste prešli na traku sa alatkama. Pređite na sledeću i prethodnu grupu traka sa alatkama pomoću TAB i SHIFT+TAB. Pređite na sledeće i prethodno dugme na traci sa alatkama pomoću STRELICE NADESNO ili STRELICA NALEVO. Pritisnite SPACE ili ENTER da biste aktivirali dugme na traci sa alatkama. Nakon aktiviranja dugmeta na traci sa alatkama, fokus će biti pomeren nazad u oblast za uređivanje.' }, { name: 'Uređivač dijaloga', legend: 'Unutar dijaloga pritisnite TAB da pređjete na sledeći element dijaloga, pritisnite SHIFT+TAB da pređjete na prethodni element dijaloga, pritisnite ENTER da pošaljete dijalog, pritisnite ESC da otkažete dijalog. Kada dijalog ima više kartica, do liste kartica se može doći ili sa ALT+F10 ili sa TAB kao deo redosleda tabulatora dijaloga. Sa fokusiranom listom kartica, pređjite na sledeću i prethodnu karticu pomoću STRELICE NADESNO, odnosno NALEVO. Pritisnite ESC da odbacite promene i zatvorite dijalog. Fokus će se vratiti na oblast za uređivanje nakon napuštanja dijaloga.' }, { name: 'Uređivač lokalnog menija', legend: 'Pritisnite ${contextMenu} ili APPLICATION TASTER za otvaranje lokalnog menija. Zatim sa TAB ili STRELICA DOLE možete preći na sledeću tačku menija. Prethodnu opciju možete postići sa SHIFT+TAB ili STRELICA GORE. Pritisnite SPACE ili ENTER za odabir tačke menija. Pritisnite SPACE ili ENTER da bi ste otvorili podmeni trenutne stavke menija. Za povratak u glavni meni pritisnite ESC ili STRELICA DESNO. Zatvorite lokalni meni pomoću tastera ESC.' }, { name: 'Uređjivač liste', legend: 'Do sledećеg elementa liste možete doći sa TAB ili STERLICA DOLE. Za odabir prethodnog elementa pritisnite SHIFT+TAB ili STREKICA DOLE. Za odabir elementa pritisnite SPACE ili ENTER. Sa pritiskom ESC zatvarate listu. ' }, { name: 'Uredjivač trake puta elemenata', legend: 'Pritisnite $ {elementsPathFocus} da bi ste označili traku puta elenementa. Do sledećеg elementa možete doći sa TAB ili STRELICA DESNO. Do prethodnоg dolazite sa SHIFT+TAB ili STRELICA DESNO. Sa SPACE ili ENTER možete odbrati element u uredjivaču.' } ] }, { name: 'Komanda', items: [ { name: 'Otkaži komandu', legend: 'Pritisni ${undo}' }, { name: 'Prepoznavanje komande', legend: 'Pritisni ${redo}' }, { name: 'Podebljana komanda', legend: 'Pritisni ${bold}' }, { name: 'Kurziv komanda', legend: 'Pritisni ${italic}' }, { name: 'Precrtana komanda', legend: 'Pritisni ${underline}' }, { name: 'Link komanda', legend: 'Pritisni ${link}' }, { name: 'Zatvori traku uredjivača komanda ', legend: 'Pritisni ${toolbarCollapse}' }, { name: 'Pristup prethodnom fokus mestu komanda ', legend: 'Pritisni ${accessNextSpace} da bi pristupio najbližem nedostupnom fokus mestu pre znaka hiányjel, na primer: dva susedna HR elementa.Ponovi kombinaciju tastera da pronadješ fokus mesto koje se nalazi dalje.' }, { name: 'Pristup sledećem fokus mestu komanda ', legend: 'Pritisni ${accessNextSpace} da bi pristupio najbližem nedostupnom fokus mestu posle znaka hiányjel, na primer: dva susedna HR elementa.Ponovi kombinaciju tastera da pronadješ fokus mesto koje se nalazi dalje.' }, { name: 'Pomoć pristupačnosti', legend: 'Pritisni ${a11yHelp}' }, { name: 'Nalepi kao običan tekst', legend: 'Pritisnite: ${pastetext}', legendEdge: 'Pritisnite ${pastetext}-t, zatim ${paste}-t' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Strelica levo', upArrow: 'strelica gore', rightArrow: 'strelica desno', downArrow: 'strelica dole', insert: 'Insert', leftWindowKey: 'levi Windows-taster', rightWindowKey: 'desni Windows-taster', selectKey: 'Odabir tastera', numpad0: 'Tasteri sa brojevima 0', numpad1: 'Tasteri sa brojevima 1', numpad2: 'Tasteri sa brojevima 2', numpad3: 'Tasteri sa brojevima 3', numpad4: 'Tasteri sa brojevima 4', numpad5: 'Tasteri sa brojevima 5', numpad6: 'Tasteri sa brojevima 6', numpad7: 'Tasteri sa brojevima 7', numpad8: 'Tasteri sa brojevima 8', numpad9: 'Tasteri sa brojevima 9', multiply: 'Množenje', add: 'Sabiranje', subtract: 'Oduzimanje', decimalPoint: 'Decimalna tačka', divide: 'Deljenjje', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Tačka zarez', equalSign: 'Znak jednakosti', comma: 'Zarez', dash: 'Crtica', period: 'Tačka', forwardSlash: 'Kosa crta', graveAccent: 'Obrnuti znak akcenta', openBracket: 'Otvorena čoškasta zagrada', backSlash: 'Obrnuta kosa crta', closeBracket: 'Zatvorena ćoškasta zagrada', singleQuote: 'Simpli znak navoda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/oc.js0000644000201500020150000001305214515446705025204 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'oc', { title: 'Instruccions d\'accessibilitat', contents: 'Contengut de l\'ajuda. Per tampar aquesta fenèstra, quichatz sus la tòca Escap.', legend: [ { name: 'General', items: [ { name: 'Barra d\'aisinas de l\'editor', legend: 'Quichar sus ${toolbarFocus} per accedir a la barra d\'aisinas. Se desplaçar cap al groupe seguent o precedent de la barra d\'aisinas amb las tòcas Tab e Maj+Tab. Se desplaçar cap al boton seguent o precedent de la barra d\'aisinas amb las tòcas Sageta dreita e Sageta esquèrra. Quichar sus la barra d\'espaci o la tòca Entrada per activer lo boton de barra d\'aisinas.' }, { name: 'Fenèstra de l\'editor', legend: 'Dins una bóstia de dialòg, quichar sus Tab per passar a l\'element seguent, quichar sus Maj+Tab per passar a l\'element precedent, quichar sus Entrada per validar, quichar sus Escap per anullar. Quand una bóstia de dialòg possedís des onglets, la lista pòt èsser atenta amb Alt+F10 o amb Tab. Dins la lista dels onglets, se desplaçar cap al seguent e lo precedent amb las tòcas Sageta dreita e Sageta esquèrra respectivament.' }, { name: 'Menú contextual de l\'editor', legend: 'Quichar sus ${contextMenu} o sus la tòca Menú per dobrir lo menú contextual. Se desplaçar ensuite cap a l\'opcion seguenta del menú amb las tòcas Tab o Sageta bas. Se desplaçar cap a l\'opcion precedenta amb las tòcas Maj+Tab o Sageta naut. Quichar sus la barra d\'espaci o la tòca Entrada per seleccionar l\'opcion del menu. Quichar sus la barra d\'espaci, la tòca Entrada o Sageta dreita per dobrir lo sosmenú de l\'opcion seleccionada. Tornar a l\'element de menú parent amb la tòca Escap o Sageta esquèrra. Tampar lo menú contextual amb Escap.' }, { name: 'Zòna de lista de l\'editor', legend: 'Dins una lista en menú desenrotlant, se desplaçar cap a l\'element seguent de la lista amb las tòcas Tab o Sageta bas. Se desplaçar cap a l\'element precedent de la lista amb las tòcas Maj+Tab o Sageta naut. Quichar sus la barra d\'espaci o sus Entrada per seleccionar l\'opcion dins la lista. Quichar sus Escap per tampar lo menú desenrotlant.' }, { name: 'Barra del camin d\'elements de l\'editor', legend: 'Quichar sus ${elementsPathFocus} per naviguer cap a la barra del fial d\'Ariana dels elements. Se desplaçar cap al boton de l\'element seguent amb las tòcas Tab o Sageta dreita. Se desplaçar cap al boton precedent amb las tòcas Maj+Tab o Sageta esquèrra. Quichar sus la barra d\'espaci o sus Entrada per seleccionar l\'element dins l\'editor.' } ] }, { name: 'Comandas', items: [ { name: 'Anullar la comanda', legend: 'Quichar sus ${undo}' }, { name: 'Comanda restablir', legend: 'Quichar sus ${redo}' }, { name: ' Comanda gras', legend: 'Quichar sus ${bold}' }, { name: ' Comanda italica', legend: 'Quichar sus ${italic}' }, { name: ' Comanda solinhat', legend: 'Quichar sus ${underline}' }, { name: ' Comanda ligam', legend: 'Quichar sus ${link}' }, { name: 'Comanda enrotlar la barra d\'aisinas', legend: 'Quichar sus ${toolbarCollapse}' }, { name: 'Comanda d\'accès a l\'element seleccionable precedent', legend: 'Quichar sus ${accessNextSpace} per accedir a l\'element seleccionable inategnible lo mai pròche abans lo cursor, per exemple : doas linhas orizontalas adjacentas. Repetir la combinason de tòcas per aténher los elements seleccionables precedents.' }, { name: 'Comanda d\'accès a l\'element seleccionable seguent', legend: 'Quichar sus ${accessNextSpace} per accedir a l\'element seleccionable inatenhible lo mai pròche aprèp lo cursor, per exemple : doas linhas orizontalas adjacentas. Repetir la combinason de tòcas per aténher los elements seleccionables seguents.' }, { name: ' Ajuda sus l\'accessibilitat', legend: 'Quichar sus ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tabulacion', pause: 'Pausa', capslock: 'Verr. Maj.', escape: 'Escap', pageUp: 'Pagina superiora', pageDown: 'Pagina seguenta', leftArrow: 'Sageta esquèrra', upArrow: 'Sageta naut', rightArrow: 'Sageta dreita', downArrow: 'Sageta bassa', insert: 'Inser', leftWindowKey: 'Tòca Windows esquèrra', rightWindowKey: 'Tòca Windows dreita', selectKey: 'Tòca Seleccionar', numpad0: '0 del pavat numeric', numpad1: '1 del pavat numeric', numpad2: '2 del pavat numeric', numpad3: '3 del pavat numeric', numpad4: '4 del pavat numeric', numpad5: '5 del pavat numeric', numpad6: '6 del pavat numeric', numpad7: '7 del pavat numeric', numpad8: 'Pavat numeric 8', numpad9: '9 del pavat numeric', multiply: 'Multiplicar', add: 'Plus', subtract: 'Mens', decimalPoint: 'Punt decimal', divide: 'Devesir', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Verr. Num.', scrollLock: 'Arrèst desfil.', semiColon: 'Punt-virgula', equalSign: 'Signe egal', comma: 'Virgula', dash: 'Jonhent', period: 'Punt', forwardSlash: 'Barra oblica', graveAccent: 'Accent grèu', openBracket: 'Parentèsi dobèrta', backSlash: 'Barra oblica invèrsa', closeBracket: 'Parentèsi tampanta', singleQuote: 'Apostròfa' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/sq.js0000644000201500020150000001247614515446705025237 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'sq', { title: 'Udhëzimet e Qasjes', contents: 'Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.', legend: [ { name: 'Të përgjithshme', items: [ { name: 'Shiriti i Redaktuesit', legend: 'Shtyp ${toolbarFocus} për të shfletuar kokështrirjen. Kalo tek grupi paraprak ose pasues i shiritit përmes kombinacionit TAB dhe SHIFT+TAB, në tastierë. Kalo tek pulla paraprake ose pasuese e kokështrirjes përmes SHIGJETË DJATHTAS ose SHIGJETËS MAJTAS, në tastierë. Shtyp HAPËSIRË ose ENTER Move to the next and previous toolbar button with RIGHT ARROW për të aktivizuar pullën e kokështrirjes.' }, { name: 'Dialogu i Redaktuesit', legend: 'Në brendi të dialogut, shtyp TAB për të kaluar tek elementi tjetër i dialogut, shtyp SHIFT+TAB për të kaluar tek elementi paraprak i dialogut, shtyp ENTER për të shtuar dialogun, shtyp ESC për të anuluar dialogun. Kur një dialog ka më shumë fletë, lista e fletëve mund të hapet përmes ALT+F10 ose përmes TAB si pjesë e radhitjes së fletëve të dialogut. Me listën e fokusuar të fletëve,kalo tek fleta paraprake dhe pasuese përmes SHIGJETËS MAJSA ose DJATHTAS.' }, { name: 'Menyja Kontestuese e Redaktorit', legend: 'Shtyp ${contextMenu} ose APPLICATION KEY për të hapur menynë kontekstuale. Pastaj kalo tek mundësia tjetër e menysë përmes TAB ose SHIGJETËS POSHTË. Kalo tek mundësia paraprake përmes SHIFT+TAB ose SHIGJETA SIPËR. Shtyp SPACE ose ENTER për të përzgjedhur mundësinë e menysë. Hape nënmenynë e mundësisë aktuale përmes tastës HAPËSIRË ose ENTER ose SHIGJETËS DJATHTAS. Kalo prapa tek artikulli i menysë prind përmes ESC ose SHIGJETËS MAJTAS. Mbylle menynë kontekstuale përmes ESC.' }, { name: 'Kutiza e Listës së Redaktuesit', legend: 'Brenda kutisë së listës, kalo tek artikulli pasues i listës përmes TAB ose SHIGJETËS POSHTË. Kalo tek artikulli paraprak i listës përmes SHIFT+TAB ose SHIGJETËS SIPËR. Shtyp tastën HAPËSIRË ose ENTER për të përzgjedhur mundësitë e listës. Shtyp ESC për të mbyllur kutinë e listës.' }, { name: 'Shiriti i Rrugës së Elementeve të Redaktorit', legend: 'Shtyp ${elementsPathFocus} për të lëvizur tek shiriti i elementeve. Kalo tek pulla pasuese e elementit përmes TAB ose SHIGJETËS DJATHTAS. Kalo tek pulla paraprake përmes SHIFT+TAB ose SHIGJETËS MAJTAS. Shtyp tastën HAPËSIRË ose ENTER për të përzgjedhur elementin tek redaktuesi.' } ] }, { name: 'Komandat', items: [ { name: 'Rikthe komandën', legend: 'Shtyp ${undo}' }, { name: 'Ribëj komandën', legend: 'Shtyp ${redo}' }, { name: 'Komanda e trashjes së tekstit', legend: 'Shtyp ${bold}' }, { name: 'Komanda kursive', legend: 'Shtyp ${italic}' }, { name: 'Komanda e nënvijëzimit', legend: 'Shtyp ${underline}' }, { name: 'Komanda e Nyjes', legend: 'Shtyp ${link}' }, { name: 'Komanda e Mbjedhjes së Kokështrirjes', legend: 'Shtyp ${toolbarCollapse}' }, { name: 'Qasu komandës paraprake të hapësirës së fokusimit', legend: 'Shtyp ${accessPreviousSpace} për t\'iu qasur hapësirës më të afërt të paarritshme të fokusimit para simbolit ^, për shembull: dy elemente të afërt HR. Përsërit kombinacionin e tasteve për të arritur hapësirë të largët fokusimi.' }, { name: 'Qasu komandës pasuese të hapësirës së fokusimit', legend: 'Shtyp ${accessNextSpace} për t\'iu qasur hapësirës më të afërt të paarritshme të fokusimit pas shenjës ^, për shembull: dy elemente të afërt HR. Përsërit kombinacionin e tasteve për të arritur hapësirën e largët të fokusimit.' }, { name: 'Ndihmë Qasjeje', legend: 'Shtyp ${a11yHelp}' }, { name: 'Hidhe si tekst të thjeshtë', legend: 'Shtyp ${pastetext}', legendEdge: 'Shtyp ${pastetext}, pasuar nga ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Faqja sipër', pageDown: 'Faqja poshtë', leftArrow: 'Shigjeta majtas', upArrow: 'Shigjeta sipër', rightArrow: 'Shigjeta djathtas', downArrow: 'Shigjeta poshtë', insert: 'Insert', leftWindowKey: 'Pulla Majtas e Windows-it', rightWindowKey: 'Pulla Djathtas e Windows-it', selectKey: 'Pulla Përzgjedhëse', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Shumëzo', add: 'Shto', subtract: 'Zbrit', decimalPoint: 'Pika Decimale', divide: 'Pjesëto', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Pikëpresje', equalSign: 'Shenja e Barazimit', comma: 'Presje', dash: 'minus', period: 'Pikë', forwardSlash: 'Vija e pjerrët përpara', graveAccent: 'Shenja e theksit', openBracket: 'Hape kllapën', backSlash: 'Vija e pjerrët prapa', closeBracket: 'Mbylle kllapën', singleQuote: 'Thonjëz e vetme' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/pt-br.js0000644000201500020150000001211414515446705025625 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'pt-br', { title: 'Instruções de Acessibilidade', contents: 'Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.', legend: [ { name: 'Geral', items: [ { name: 'Barra de Ferramentas do Editor', legend: 'Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT+TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.' }, { name: 'Diálogo do Editor', legend: 'Dentro de um diálogo, pressione TAB para navegar para o próximo elemento. Pressione SHIFT+TAB para mover para o elemento anterior. Pressione ENTER ara enviar o diálogo. pressione ESC para cancelar o diálogo. Quando um diálogo tem múltiplas abas, a lista de abas pode ser acessada com ALT+F10 ou TAB, como parte da ordem de tabulação do diálogo. Com a lista de abas em foco, mova para a próxima aba e para a aba anterior com a SETA DIREITA ou SETA ESQUERDA, respectivamente.' }, { name: 'Menu de Contexto do Editor', legend: 'Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC.' }, { name: 'Caixa de Lista do Editor', legend: 'Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista.' }, { name: 'Barra de Caminho do Elementos do Editor', legend: 'Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.' } ] }, { name: 'Comandos', items: [ { name: ' Comando Desfazer', legend: 'Pressione ${undo}' }, { name: ' Comando Refazer', legend: 'Pressione ${redo}' }, { name: ' Comando Negrito', legend: 'Pressione ${bold}' }, { name: ' Comando Itálico', legend: 'Pressione ${italic}' }, { name: ' Comando Sublinhado', legend: 'Pressione ${underline}' }, { name: ' Comando Link', legend: 'Pressione ${link}' }, { name: ' Comando Fechar Barra de Ferramentas', legend: 'Pressione ${toolbarCollapse}' }, { name: 'Acessar o comando anterior de spaço de foco', legend: 'Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo antes do cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes.' }, { name: 'Acessar próximo fomando de spaço de foco', legend: 'Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo após o cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes.' }, { name: ' Ajuda de Acessibilidade', legend: 'Pressione ${a11yHelp}' }, { name: 'Colar como texto sem formatação', legend: 'Pressione ${pastetext}', legendEdge: 'Pressione ${pastetext}, seguido de ${paste}' } ] } ], tab: 'Tecla Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Seta à Esquerda', upArrow: 'Seta à Cima', rightArrow: 'Seta à Direita', downArrow: 'Seta à Baixo', insert: 'Insert', leftWindowKey: 'Tecla do Windows Esquerda', rightWindowKey: 'Tecla do Windows Direita', selectKey: 'Tecla Selecionar', numpad0: '0 do Teclado Numérico', numpad1: '1 do Teclado Numérico', numpad2: '2 do Teclado Numérico', numpad3: '3 do Teclado Numérico', numpad4: '4 do Teclado Numérico', numpad5: '5 do Teclado Numérico', numpad6: '6 do Teclado Numérico', numpad7: '7 do Teclado Numérico', numpad8: '8 do Teclado Numérico', numpad9: '9 do Teclado Numérico', multiply: 'Multiplicar', add: 'Mais', subtract: 'Subtrair', decimalPoint: 'Ponto', divide: 'Dividir', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Ponto-e-vírgula', equalSign: 'Igual', comma: 'Vírgula', dash: 'Hífen', period: 'Ponto', forwardSlash: 'Barra', graveAccent: 'Acento Grave', openBracket: 'Abrir Conchetes', backSlash: 'Contra-barra', closeBracket: 'Fechar Colchetes', singleQuote: 'Aspas Simples' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/fo.js0000644000201500020150000001240014515446705025203 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'fo', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'General', // MISSING items: [ { name: 'Editor Toolbar', // MISSING legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', // MISSING items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Falda', add: 'Pluss', subtract: 'Frádráttar', decimalPoint: 'Decimal Point', // MISSING divide: 'Býta', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semikolon', equalSign: 'Javnatekn', comma: 'Komma', dash: 'Dash', // MISSING period: 'Punktum', forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/af.js0000644000201500020150000001165214515446705025175 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'af', { title: 'Toeganglikheid instruksies', contents: 'Hulp inhoud. Druk ESC om toe te maak.', legend: [ { name: 'Algemeen', items: [ { name: 'Bewerker balk', legend: 'Druk ${toolbarFocus} om op die werkbalk te land. Beweeg na die volgende en voorige wekrbalkgroep met TAB and SHIFT+TAB. Beweeg na die volgende en voorige werkbalkknop met die regter of linker pyl. Druk SPASIE of ENTER om die knop te bevestig.' }, { name: 'Bewerker dialoog', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Bewerkerinhoudmenu', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', // MISSING items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pouse', capslock: 'Hoofletterslot', escape: 'Ontsnap', pageUp: 'Blaaiop', pageDown: 'Blaaiaf', leftArrow: 'Linkspyl', upArrow: 'Oppyl', rightArrow: 'Regterpyl', downArrow: 'Afpyl', insert: 'Toevoeg', leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Nommerblok 0', numpad1: 'Nommerblok 1', numpad2: 'Nommerblok 2', numpad3: 'Nommerblok 3', numpad4: 'Nommerblok 4', numpad5: 'Nommerblok 5', numpad6: 'Nommerblok 6', numpad7: 'Nommerblok 7', numpad8: 'Nommerblok 8', numpad9: 'Nommerblok 9', multiply: 'Maal', add: 'Plus', subtract: 'Minus', decimalPoint: 'Desimaalepunt', divide: 'Gedeeldeur', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Nommervergrendel', scrollLock: 'Rolvergrendel', semiColon: 'Kommapunt', equalSign: 'Isgelykaan', comma: 'Komma', dash: 'Koppelteken', period: 'Punt', forwardSlash: 'Skuinsstreep', graveAccent: 'Aksentteken', openBracket: 'Oopblokhakkie', backSlash: 'Trustreep', closeBracket: 'Toeblokhakkie', singleQuote: 'Enkelaanhaalingsteken' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/hi.js0000644000201500020150000001311314515446705025201 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'hi', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'सामान्य', items: [ { name: 'Editor Toolbar', // MISSING legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', // MISSING items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/km.js0000644000201500020150000001355414515446705025221 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'km', { title: 'Accessibility Instructions', // MISSING contents: 'មាតិកា​ជំនួយ។ ដើម្បី​បិទ​ផ្ទាំង​នេះ សូម​ចុច ESC ។', legend: [ { name: 'ទូទៅ', items: [ { name: 'របារ​ឧបករណ៍​កម្មវិធី​និពន្ធ', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'ផ្ទាំង​កម្មវិធីនិពន្ធ', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'ម៉ីនុយបរិបទអ្នកកែសម្រួល', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'ប្រអប់បញ្ជីអ្នកកែសម្រួល', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'ពាក្យបញ្ជា', items: [ { name: 'ការ​បញ្ជា​មិនធ្វើវិញ', legend: 'ចុច ${undo}' }, { name: 'ការបញ្ជា​ធ្វើវិញ', legend: 'ចុច ${redo}' }, { name: 'ការបញ្ជា​អក្សរ​ដិត', legend: 'ចុច ${bold}' }, { name: 'ការបញ្ជា​អក្សរ​ទ្រេត', legend: 'ចុច ${italic}' }, { name: 'ពាក្យបញ្ជា​បន្ទាត់​ពីក្រោម', legend: 'ចុច ${underline}' }, { name: 'ពាក្យបញ្ជា​តំណ', legend: 'ចុច ${link}' }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: 'ជំនួយ​ពី​ភាព​ងាយស្រួល', legend: 'ជួយ ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'ផ្អាក', capslock: 'Caps Lock', // MISSING escape: 'ចាកចេញ', pageUp: 'ទំព័រ​លើ', pageDown: 'ទំព័រ​ក្រោម', leftArrow: 'ព្រួញ​ឆ្វេង', upArrow: 'ព្រួញ​លើ', rightArrow: 'ព្រួញ​ស្ដាំ', downArrow: 'ព្រួញ​ក្រោម', insert: 'បញ្ចូល', leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'ជ្រើស​គ្រាប់​ចុច', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'គុណ', add: 'បន្ថែម', subtract: 'ដក', decimalPoint: 'ចំណុចទសភាគ', divide: 'ចែក', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'បិទ​រំកិល', semiColon: 'ចុច​ក្បៀស', equalSign: 'សញ្ញា​អឺរ៉ូ', comma: 'ក្បៀស', dash: 'Dash', // MISSING period: 'ចុច', forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'តង្កៀប​បើក', backSlash: 'Backslash', // MISSING closeBracket: 'តង្កៀប​បិទ', singleQuote: 'បន្តក់​មួយ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/nl.js0000644000201500020150000001165314515446705025221 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'nl', { title: 'Toegankelijkheidsinstructies', contents: 'Help-inhoud. Druk op ESC om dit dialoog te sluiten.', legend: [ { name: 'Algemeen', items: [ { name: 'Werkbalk tekstverwerker', legend: 'Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren.' }, { name: 'Dialoog tekstverwerker', legend: 'In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Bij dialoogvensters met meerdere tabbladen kan de tabset bereikt worden met ALT+F10 of met TAB als onderdeel van de tabvolgorde in het dialoogvenster. Als de tabset focus heeft, kun je schakalen naar het volgende en vorige tabblad met respectievelijk PIJL RECHTS en PIJL LINKS.' }, { name: 'Contextmenu tekstverwerker', legend: 'Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC.' }, { name: 'Keuzelijst tekstverwerker', legend: 'In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten.' }, { name: 'Elementenpad werkbalk tekstverwerker', legend: 'Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker.' } ] }, { name: 'Opdrachten', items: [ { name: 'Ongedaan maken opdracht', legend: 'Druk op ${undo}' }, { name: 'Opnieuw uitvoeren opdracht', legend: 'Druk op ${redo}' }, { name: 'Vetgedrukt opdracht', legend: 'Druk op ${bold}' }, { name: 'Cursief opdracht', legend: 'Druk op ${italic}' }, { name: 'Onderstrepen opdracht', legend: 'Druk op ${underline}' }, { name: 'Link opdracht', legend: 'Druk op ${link}' }, { name: 'Werkbalk inklappen opdracht', legend: 'Druk op ${toolbarCollapse}' }, { name: 'Ga naar vorige focus spatie commando', legend: 'Druk ${accessPreviousSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie voor de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken.' }, { name: 'Ga naar volgende focus spatie commando', legend: 'Druk ${accessNextSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie na de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken.' }, { name: 'Toegankelijkheidshulp', legend: 'Druk op ${a11yHelp}' }, { name: 'Plakken als platte tekst', legend: 'Druk op ${pastetext}', legendEdge: 'Druk op ${pastetext}, gevolgd door ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Pijl naar links', upArrow: 'Pijl omhoog', rightArrow: 'Pijl naar rechts', downArrow: 'Pijl naar beneden', insert: 'Invoegen', leftWindowKey: 'Linker Windows-toets', rightWindowKey: 'Rechter Windows-toets', selectKey: 'Selecteer toets', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Vermenigvuldigen', add: 'Toevoegen', subtract: 'Aftrekken', decimalPoint: 'Decimaalteken', divide: 'Delen', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Puntkomma', equalSign: 'Is gelijk-teken', comma: 'Komma', dash: 'Koppelteken', period: 'Punt', forwardSlash: 'Slash', graveAccent: 'Accent grave', openBracket: 'Vierkant haakje openen', backSlash: 'Backslash', closeBracket: 'Vierkant haakje sluiten', singleQuote: 'Apostrof' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/es-mx.js0000644000201500020150000001246414515446705025642 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'es-mx', { title: 'Instrucciones de accesibilidad', contents: 'Contenidos de ayuda. Para cerrar este cuadro de diálogo presione ESC.', legend: [ { name: 'General', items: [ { name: 'Barra de herramientas del editor', legend: 'Presione ${toolbarFocus} para navegar a la barra de herramientas. Desplácese al grupo de barras de herramientas siguiente y anterior con SHIFT + TAB. Desplácese al botón siguiente y anterior de la barra de herramientas con FLECHA DERECHA o FLECHA IZQUIERDA. Presione SPACE o ENTER para activar el botón de la barra de herramientas.' }, { name: 'Editor de diálogo', legend: 'Dentro de un cuadro de diálogo, pulse TAB para desplazarse hasta el siguiente elemento de diálogo, pulse MAYÚS + TAB para desplazarse al elemento de diálogo anterior, pulse ENTER para enviar el diálogo, pulse ESC para cancelar el diálogo. Cuando un cuadro de diálogo tiene varias pestañas, se puede acceder a la lista de pestañas con ALT + F10 o con TAB como parte del orden de tabulación del diálogo. Con la lista de tabuladores enfocada, mueva a la pestaña siguiente y anterior con las flechas DERECHA y IZQUIERDA, respectivamente.' }, { name: 'Menú contextual del editor', legend: 'Presione ${contextMenu} o CLAVE DE APLICACIÓN para abrir el menú contextual. A continuación, vaya a la siguiente opción del menú con TAB o DOWN ARROW. Desplácese a la opción anterior con SHIFT + TAB o FLECHA ARRIBA. Presione SPACE o ENTER para seleccionar la opción del menú. Abra el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Vuelva al elemento de menú principal con ESC o FLECHA IZQUIERDA. Cerrar el menú contextual con ESC.' }, { name: 'Editor de cuadro de lista', legend: 'Dentro de un cuadro de lista, mueva al siguiente elemento de lista con TAB O FLECHA ABAJO. Mueva al elemento anterior de la lista con MAYÚS + TAB o FLECHA ARRIBA. Presione SPACE o ENTER para seleccionar la opción de lista. Presione ESC para cerrar el cuadro de lista.' }, { name: 'Barra de ruta del elemento del editor', legend: 'Presione ${elementsPathFocus} para navegar a la barra de ruta de elementos. Desplácese al siguiente botón de elemento con TAB o FLECHA DERECHA. Desplácese al botón anterior con SHIFT + TAB o FLECHA IZQUIERDA. Presione SPACE o ENTER para seleccionar el elemento en el editor.' } ] }, { name: 'Comandos', items: [ { name: 'Comando deshacer', legend: 'Presiona ${undo}' }, { name: 'Comando rehacer', legend: 'Presiona ${redo}' }, { name: 'Comando negrita', legend: 'Presiona ${bold}' }, { name: 'Comando cursiva', legend: 'Presiona {italic}' }, { name: 'Comando subrayado', legend: 'Presiona ${underline}' }, { name: 'Comando enlace', legend: 'Presiona ${link}' }, { name: 'Comando colapsar barra de herramientas', legend: 'Presiona ${toolbarCollapse}' }, { name: 'Acceda al comando de espacio de enfoque anterior', legend: 'Presione ${accessPreviousSpace} para acceder al espacio de enfoque inaccesible más cercano antes del cursor, por ejemplo: dos elementos HR adyacentes. Repita la combinación de teclas para alcanzar los espacios de enfoque distantes.' }, { name: 'Acceder al siguiente comando de espacio de enfoque', legend: 'Pulse ${accessNextSpace} para acceder al espacio de enfoque más cercano inaccesible después del cursor, por ejemplo: dos elementos HR adyacentes. Repita la combinación de teclas para alcanzar los espacios de enfoque distantes.' }, { name: 'Ayuda de accesibilidad', legend: 'Presiona ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tabulador', pause: 'Pausa', capslock: 'Mayúsculas', escape: 'Escape', pageUp: 'Página arriba', pageDown: 'Página abajo', leftArrow: 'Flecha izquierda', upArrow: 'Flecha arriba', rightArrow: 'Flecha derecha', downArrow: 'Flecha abajo', insert: 'Insertar', leftWindowKey: 'Tecla izquierda de Windows', rightWindowKey: 'Tecla derecha de Windows', selectKey: 'Tecla de selección', numpad0: 'Teclado numérico 0', numpad1: 'Teclado numérico 1', numpad2: 'Teclado numérico 2', numpad3: 'Teclado numérico 3', numpad4: 'Teclado numérico 4', numpad5: 'Teclado numérico 5', numpad6: 'Teclado numérico 6', numpad7: 'Teclado numérico 7', numpad8: 'Teclado numérico 8', numpad9: 'Teclado numérico 9', multiply: 'Multiplicar', add: 'Sumar', subtract: 'Restar', decimalPoint: 'Punto decimal', divide: 'Dividir', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Números', scrollLock: 'Bloqueo de desplazamiento', semiColon: 'punto y coma', equalSign: 'Signo igual', comma: 'Coma', dash: 'Guión', period: 'Espacio', forwardSlash: 'Diagonal', graveAccent: 'Acento grave', openBracket: 'Abrir paréntesis', backSlash: 'Diagonal invertida', closeBracket: 'Cerrar paréntesis', singleQuote: 'Comillas simple' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/mn.js0000644000201500020150000001310414515446705025213 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'mn', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'Ерөнхий', items: [ { name: 'Editor Toolbar', // MISSING legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', // MISSING items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/da.js0000644000201500020150000001121714515446705025170 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'da', { title: 'Tilgængelighedsinstrukser', contents: 'Onlinehjælp. For at lukke dette vindue klik ESC', legend: [ { name: 'Generelt', items: [ { name: 'Editor værktøjslinje', legend: 'Tryk ${toolbarFocus} for at navigere til værktøjslinjen. Flyt til næste eller forrige værktøjsline gruppe ved hjælp af TAB eller SHIFT+TAB. Flyt til næste eller forrige værktøjslinje knap med venstre- eller højre piltast. Tryk på SPACE eller ENTER for at aktivere værktøjslinje knappen.' }, { name: 'Editor dialogboks', legend: 'Inde i en dialogboks kan du, trykke på TAB for at navigere til næste element, trykke på SHIFT+TAB for at navigere til forrige element, trykke på ENTER for at afsende eller trykke på ESC for at lukke dialogboksen. Når en dialogboks har flere faner, fanelisten kan tilgås med ALT+F10 eller med TAB. Hvis fanelisten er i fokus kan du skifte til næste eller forrige tab, med højre- og venstre piltast.' }, { name: 'Redaktør kontekstmenu', legend: 'Tryk ${contextMenu} eller APPLICATION KEY for at åbne kontekstmenuen. Flyt derefter til næste menuvalg med TAB eller PIL NED. Flyt til forrige valg med SHIFT+TAB eller PIL OP. Tryk MELLEMRUM eller RETUR for at vælge menu-muligheder. Åben under-menu af aktuelle valg med MELLEMRUM eller RETUR eller HØJRE PIL. Gå tilbage til overliggende menu-emne med ESC eller VENSTRE PIL. Luk kontekstmenu med ESC.' }, { name: 'Redaktør listeboks', legend: 'Flyt til næste emne med TAB eller PIL NED inde i en listeboks. Flyt til forrige listeemne med SHIFT+TAB eller PIL OP. Tryk MELLEMRUM eller RETUR for at vælge liste-muligheder. Tryk ESC for at lukke liste-boksen.' }, { name: 'Redaktør elementsti-bar', legend: 'Tryk ${elementsPathFocus} for at navigere til elementernes sti-bar. Flyt til næste element-knap med TAB eller HØJRE PIL. Flyt til forrige knap med SHIFT+TAB eller VENSTRE PIL. Klik MELLEMRUM eller RETUR for at vælge element i editoren.' } ] }, { name: 'Kommandoer', items: [ { name: 'Fortryd kommando', legend: 'Klik på ${undo}' }, { name: 'Gentag kommando', legend: 'Klik ${redo}' }, { name: 'Fed kommando', legend: 'Klik ${bold}' }, { name: 'Kursiv kommando', legend: 'Klik ${italic}' }, { name: 'Understregnings kommando', legend: 'Klik ${underline}' }, { name: 'Link kommando', legend: 'Klik ${link}' }, { name: 'Klap værktøjslinje sammen kommando ', legend: 'Klik ${toolbarCollapse}' }, { name: 'Adgang til forrige fokusområde kommando', legend: 'Klik på ${accessPreviousSpace} for at få adgang til det nærmeste utilgængelige fokusmellemrum før indskudstegnet, for eksempel: To nærliggende HR-elementer. Gentag nøglekombinationen for at nå fjentliggende fokusmellemrum.' }, { name: 'Gå til næste fokusmellemrum kommando', legend: 'Klik på ${accessNextSpace} for at få adgang til det nærmeste utilgængelige fokusmellemrum efter indskudstegnet, for eksempel: To nærliggende HR-elementer. Gentag nøglekombinationen for at nå fjentliggende fokusmellemrum.' }, { name: 'Tilgængelighedshjælp', legend: 'Kilk ${a11yHelp}' }, { name: 'Indsæt som ren tekst', legend: 'Klik ${pastetext}', legendEdge: 'Klik ${pastetext}, efterfult af ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Venstre pil', upArrow: 'Pil op', rightArrow: 'Højre pil', downArrow: 'Pil ned', insert: 'Insert', leftWindowKey: 'Venstre Windows tast', rightWindowKey: 'Højre Windows tast', selectKey: 'Select-knap', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Gange', add: 'Plus', subtract: 'Minus', decimalPoint: 'Komma', divide: 'Divider', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semikolon', equalSign: 'Lighedstegn', comma: 'Komma', dash: 'Bindestreg', period: 'Punktum', forwardSlash: 'Skråstreg', graveAccent: 'Accent grave', openBracket: 'Start klamme', backSlash: 'Omvendt skråstreg', closeBracket: 'Slut klamme', singleQuote: 'Enkelt citationstegn' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/he.js0000644000201500020150000001322214515446705025176 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'he', { title: 'הוראות נגישות', contents: 'הוראות נגישות. לסגירה לחץ אסקייפ (ESC).', legend: [ { name: 'כללי', items: [ { name: 'סרגל הכלים', legend: 'לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר.' }, { name: 'דיאלוגים (חלונות תשאול)', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'תפריט ההקשר (Context Menu)', legend: 'לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC).' }, { name: 'תפריטים צפים (List boxes)', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'עץ אלמנטים (Elements Path)', legend: 'לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך.' } ] }, { name: 'פקודות', items: [ { name: ' ביטול צעד אחרון', legend: 'לחץ ${undo}' }, { name: ' חזרה על צעד אחרון', legend: 'לחץ ${redo}' }, { name: ' הדגשה', legend: 'לחץ ${bold}' }, { name: ' הטייה', legend: 'לחץ ${italic}' }, { name: ' הוספת קו תחתון', legend: 'לחץ ${underline}' }, { name: ' הוספת לינק', legend: 'לחץ ${link}' }, { name: ' כיווץ סרגל הכלים', legend: 'לחץ ${toolbarCollapse}' }, { name: 'גישה למיקום המיקוד הקודם', legend: 'לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.' }, { name: 'גישה למיקום המיקוד הבא', legend: 'לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר.' }, { name: ' הוראות נגישות', legend: 'לחץ ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'חץ שמאלה', upArrow: 'חץ למעלה', rightArrow: 'חץ ימינה', downArrow: 'חץ למטה', insert: 'הכנס', leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'בחר מקש', numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'הוסף', subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'סלאש', graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'סלאש הפוך', closeBracket: 'Close Bracket', // MISSING singleQuote: 'ציטוט יחיד' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ca.js0000644000201500020150000001235414515446705025172 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ca', { title: 'Instruccions d\'Accessibilitat', contents: 'Continguts de l\'Ajuda. Per tancar aquest quadre de diàleg premi ESC.', legend: [ { name: 'General', items: [ { name: 'Editor de barra d\'eines', legend: 'Premi ${toolbarFocus} per desplaçar-se per la barra d\'eines. Vagi en el següent i anterior grup de barra d\'eines amb TAB i SHIFT+TAB. Vagi en el següent i anterior botó de la barra d\'eines amb RIGHT ARROW i LEFT ARROW. Premi SPACE o ENTER per activar el botó de la barra d\'eines.' }, { name: 'Editor de quadre de diàleg', legend: 'Dins d\'un quadre de diàleg, premi la tecla TAB per desplaçar-se fins al següent element del quadre de diàleg, premi la tecla Shift + TAB per desplaçar-se a l\'anterior element del quadre de diàleg, premi la tecla ENTER per confirmar el quadre de diàleg, premi la tecla ESC per cancel·lar el quadre de diàleg. Quan un quadre de diàleg té diverses pestanyes, la llista de pestanyes pot ser assolit ja sigui amb ALT + F10 o TAB, com a part de l\'ordre de tabulació del quadre de diàleg. Amb la llista de pestanyes seleccionada, pot anar a la fitxa següent i anterior amb la tecla FLETXA DRETA i ESQUERRA, respectivament.' }, { name: 'Editor de menú contextual', legend: 'Premi ${contextMenu} o APPLICATION KEY per obrir el menú contextual. Després desplacis a la següent opció del menú amb TAB o DOWN ARROW. Desplacis a l\'anterior opció amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l\'opció del menú. Obri el submenú de l\'actual opció utilitzant SPACE o ENTER o RIGHT ARROW. Pot tornar a l\'opció del menú pare amb ESC o LEFT ARROW. Tanqui el menú contextual amb ESC.' }, { name: 'Editor de caixa de llista', legend: 'Dins d\'un quadre de llista, desplacis al següent element de la llista amb TAB o DOWN ARROW. Desplacis a l\'anterior element de la llista amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l\'opció de la llista. Premi ESC per tancar el quadre de llista.' }, { name: 'Editor de barra de ruta de l\'element', legend: 'Premi ${elementsPathFocus} per anar als elements de la barra de ruta. Desplacis al botó de l\'element següent amb TAB o RIGHT ARROW. Desplacis a l\'anterior botó amb SHIFT+TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar l\'element a l\'editor.' } ] }, { name: 'Ordres', items: [ { name: 'Desfer ordre', legend: 'Premi ${undo}' }, { name: 'Refer ordre', legend: 'Premi ${redo}' }, { name: 'Ordre negreta', legend: 'Premi ${bold}' }, { name: 'Ordre cursiva', legend: 'Premi ${italic}' }, { name: 'Ordre subratllat', legend: 'Premi ${underline}' }, { name: 'Ordre enllaç', legend: 'Premi ${link}' }, { name: 'Ordre amagar barra d\'eines', legend: 'Premi ${toolbarCollapse}' }, { name: 'Ordre per accedir a l\'anterior espai enfocat', legend: 'Premi ${accessPreviousSpace} per accedir a l\'enfocament d\'espai més proper inabastable abans del símbol d\'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d\'espais distants.' }, { name: 'Ordre per accedir al següent espai enfocat', legend: 'Premi ${accessNextSpace} per accedir a l\'enfocament d\'espai més proper inabastable després del símbol d\'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d\'espais distants.' }, { name: 'Ajuda d\'accessibilitat', legend: 'Premi ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tabulació', pause: 'Pausa', capslock: 'Bloqueig de majúscules', escape: 'Escape', pageUp: 'Pàgina Amunt', pageDown: 'Pàgina Avall', leftArrow: 'Fletxa Esquerra', upArrow: 'Fletxa Amunt', rightArrow: 'Fletxa Dreta', downArrow: 'Fletxa Avall', insert: 'Inserir', leftWindowKey: 'Tecla Windows Esquerra', rightWindowKey: 'Tecla Windows Dreta', selectKey: 'Tecla Seleccionar', numpad0: 'Teclat Numèric 0', numpad1: 'Teclat Numèric 1', numpad2: 'Teclat Numèric 2', numpad3: 'Teclat Numèric 3', numpad4: 'Teclat Numèric 4', numpad5: 'Teclat Numèric 5', numpad6: 'Teclat Numèric 6', numpad7: 'Teclat Numèric 7', numpad8: 'Teclat Numèric 8', numpad9: 'Teclat Numèric 9', multiply: 'Multiplicació', add: 'Suma', subtract: 'Resta', decimalPoint: 'Punt Decimal', divide: 'Divisió', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Bloqueig Teclat Numèric', scrollLock: 'Bloqueig de Desplaçament', semiColon: 'Punt i Coma', equalSign: 'Símbol Igual', comma: 'Coma', dash: 'Guió', period: 'Punt', forwardSlash: 'Barra Diagonal', graveAccent: 'Accent Obert', openBracket: 'Claudàtor Obert', backSlash: 'Barra Invertida', closeBracket: 'Claudàtor Tancat', singleQuote: 'Cometa Simple' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/gu.js0000644000201500020150000001322614515446705025221 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'gu', { title: 'એક્ક્ષેબિલિટી ની વિગતો', contents: 'હેલ્પ. આ બંધ કરવા ESC દબાવો.', legend: [ { name: 'જનરલ', items: [ { name: 'એડિટર ટૂલબાર', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'એડિટર ડાયલોગ', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'કમાંડસ', items: [ { name: 'અન્ડું કમાંડ', legend: '$ દબાવો {undo}' }, { name: 'ફરી કરો કમાંડ', legend: '$ દબાવો {redo}' }, { name: 'બોલ્દનો કમાંડ', legend: '$ દબાવો {bold}' }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/_translationstatus.txt0000644000201500020150000000153614515446705030753 0ustar puckpuckCopyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license cs.js Found: 30 Missing: 0 cy.js Found: 30 Missing: 0 da.js Found: 12 Missing: 18 de.js Found: 30 Missing: 0 el.js Found: 25 Missing: 5 eo.js Found: 30 Missing: 0 fa.js Found: 30 Missing: 0 fi.js Found: 30 Missing: 0 fr.js Found: 30 Missing: 0 gu.js Found: 12 Missing: 18 he.js Found: 30 Missing: 0 it.js Found: 30 Missing: 0 mk.js Found: 5 Missing: 25 nb.js Found: 30 Missing: 0 nl.js Found: 30 Missing: 0 no.js Found: 30 Missing: 0 pt-br.js Found: 30 Missing: 0 ro.js Found: 6 Missing: 24 tr.js Found: 30 Missing: 0 ug.js Found: 27 Missing: 3 vi.js Found: 6 Missing: 24 zh-cn.js Found: 30 Missing: 0 rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/th.js0000644000201500020150000001343514515446705025223 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'th', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'ทั่วไป', items: [ { name: 'แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'คำสั่ง', items: [ { name: 'เลิกทำคำสั่ง', legend: 'วาง ${undo}' }, { name: 'คำสั่งสำหรับทำซ้ำ', legend: 'วาง ${redo}' }, { name: 'คำสั่งสำหรับตัวหนา', legend: 'วาง ${bold}' }, { name: 'คำสั่งสำหรับตัวเอียง', legend: 'วาง ${italic}' }, { name: 'คำสั่งสำหรับขีดเส้นใต้', legend: 'วาง ${underline}' }, { name: 'คำสั่งสำหรับลิงก์', legend: 'วาง ${link}' }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/de.js0000644000201500020150000001204614515446705025175 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'de', { title: 'Barrierefreiheitinformationen', contents: 'Hilfeinhalt. Um den Dialog zu schliessen die Taste ESC drücken.', legend: [ { name: 'Allgemein', items: [ { name: 'Editorwerkzeugleiste', legend: 'Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT+TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.' }, { name: 'Editordialog', legend: 'Drücke innerhalb eines Dialogs TAB, um zum nächsten Element zu springen. Drücke SHIFT+TAB, um zum vorigen Element zu springen, drücke ENTER um das Formular im Dialog abzusenden, drücke ESC, um den Dialog zu schließen. Hat der Dialog mehrere Tabs, dann kannst du durch ALT+F10 die Tab-Liste aufrufen or mittels TAB als Teil der Dialog-Tab-Reihenfolge. Ist die Tab-Liste fokussiert, dann mithilfe der Pfeiltasten (LINKS und RECHTS) zwischen den Tabs gewechselt werden.' }, { name: 'Editor-Kontextmenü', legend: 'Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.' }, { name: 'Editor-Listenbox', legend: 'Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der SHIFT+TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.' }, { name: 'Editor-Elementpfadleiste', legend: 'Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT+TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.' } ] }, { name: 'Befehle', items: [ { name: 'Rückgängig-Befehl', legend: 'Drücken Sie ${undo}' }, { name: 'Wiederherstellen-Befehl', legend: 'Drücken Sie ${redo}' }, { name: 'Fettschrift-Befehl', legend: 'Drücken Sie ${bold}' }, { name: 'Kursiv-Befehl', legend: 'Drücken Sie ${italic}' }, { name: 'Unterstreichen-Befehl', legend: 'Drücken Sie ${underline}' }, { name: 'Link-Befehl', legend: 'Drücken Sie ${link}' }, { name: 'Werkzeugleiste einklappen-Befehl', legend: 'Drücken Sie ${toolbarCollapse}' }, { name: 'Zugang bisheriger Fokussierung Raumbefehl ', legend: 'Drücken Sie ${accessPreviousSpace} auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. ' }, { name: 'Zugang nächster Schwerpunkt Raumbefehl ', legend: 'Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. ' }, { name: 'Eingabehilfen', legend: 'Drücken Sie ${a11yHelp}' }, { name: 'Einfügen als unformatierter Text. ', legend: 'Drücke ${pastetext}', legendEdge: 'Drücke ${pastetext} und anschließend ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Feststell', escape: 'Escape', pageUp: 'Bild auf', pageDown: 'Bild ab', leftArrow: 'Linke Pfeiltaste', upArrow: 'Obere Pfeiltaste', rightArrow: 'Rechte Pfeiltaste', downArrow: 'Untere Pfeiltaste', insert: 'Einfügen', leftWindowKey: 'Linke Windowstaste', rightWindowKey: 'Rechte Windowstaste', selectKey: 'Taste auswählen', numpad0: 'Ziffernblock 0', numpad1: 'Ziffernblock 1', numpad2: 'Ziffernblock 2', numpad3: 'Ziffernblock 3', numpad4: 'Ziffernblock 4', numpad5: 'Ziffernblock 5', numpad6: 'Ziffernblock 6', numpad7: 'Ziffernblock 7', numpad8: 'Ziffernblock 8', numpad9: 'Ziffernblock 9', multiply: 'Multiplizieren', add: 'Addieren', subtract: 'Subtrahieren', decimalPoint: 'Punkt', divide: 'Dividieren', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Ziffernblock feststellen', scrollLock: 'Rollen', semiColon: 'Semikolon', equalSign: 'Gleichheitszeichen', comma: 'Komma', dash: 'Bindestrich', period: 'Punkt', forwardSlash: 'Schrägstrich', graveAccent: 'Gravis', openBracket: 'Öffnende eckige Klammer', backSlash: 'Rückwärtsgewandter Schrägstrich', closeBracket: 'Schließende eckige Klammer', singleQuote: 'Einfaches Anführungszeichen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/tt.js0000644000201500020150000001220414515446705025230 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'tt', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'Гомуми', items: [ { name: 'Editor Toolbar', // MISSING legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Командалар', items: [ { name: 'Кайтару', legend: '${undo} басыгыз' }, { name: 'Кабатлау', legend: '${redo} басыгыз' }, { name: 'Калын', legend: '${bold} басыгыз' }, { name: 'Курсив', legend: '${italic} басыгыз' }, { name: 'Астына сызылган', legend: '${underline} басыгыз' }, { name: 'Сылталама', legend: '${link} басыгыз' }, { name: ' Toolbar Collapse command', // MISSING legend: '${toolbarCollapse} басыгыз' }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: '${a11yHelp} басыгыз' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Тыныш', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Сул якка ук', upArrow: 'Өскә таба ук', rightArrow: 'Уң якка ук', downArrow: 'Аска таба ук', insert: 'Өстәү', leftWindowKey: 'Сул Windows төймəсе', rightWindowKey: 'Уң Windows төймəсе', selectKey: 'Select төймəсе', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Тапкырлау', add: 'Кушу', subtract: 'Алу', decimalPoint: 'Унарлы нокта', divide: 'Бүлү', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Нокталы өтер', equalSign: 'Тигезлек билгесе', comma: 'Өтер', dash: 'Сызык', period: 'Дәрәҗә', forwardSlash: 'Кыек сызык', graveAccent: 'Гравис', openBracket: 'Җәя ачу', backSlash: 'Кире кыек сызык', closeBracket: 'Җәя ябу', singleQuote: 'Бер иңле куштырнаклар' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/vi.js0000644000201500020150000001347414515446705025231 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'vi', { title: 'Hướng dẫn trợ năng', contents: 'Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.', legend: [ { name: 'Chung', items: [ { name: 'Thanh công cụ soạn thảo', legend: 'Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT+TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công cụ.' }, { name: 'Hộp thoại Biên t', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Trình đơn Ngữ cảnh cBộ soạn thảo', legend: 'Nhấn ${contextMenu} hoặc PHÍM ỨNG DỤNG để mở thực đơn ngữ cảnh. Sau đó nhấn TAB hoặc MŨI TÊN XUỐNG để di chuyển đến tuỳ chọn tiếp theo của thực đơn. Nhấn SHIFT+TAB hoặc MŨI TÊN LÊN để quay lại tuỳ chọn trước. Nhấn DẤU CÁCH hoặc ENTER để chọn tuỳ chọn của thực đơn. Nhấn DẤU CÁCH hoặc ENTER hoặc MŨI TÊN SANG PHẢI để mở thực đơn con của tuỳ chọn hiện tại. Nhấn ESC hoặc MŨI TÊN SANG TRÁI để quay trở lại thực đơn gốc. Nhấn ESC để đóng thực đơn ngữ cảnh.' }, { name: 'Hộp danh sách trình biên tập', legend: 'Trong một danh sách chọn, di chuyển đối tượng tiếp theo với phím TAB hoặc phím mũi tên hướng xuống. Di chuyển đến đối tượng trước đó bằng cách nhấn tổ hợp phím SHIFT+TAB hoặc mũi tên hướng lên. Phím khoảng cách hoặc phím ENTER để chọn các tùy chọn trong danh sách. Nhấn phím ESC để đóng lại danh sách chọn.' }, { name: 'Thanh đường dẫn các đối tượng', legend: 'Nhấn ${elementsPathFocus} để điều hướng các đối tượng trong thanh đường dẫn. Di chuyển đến đối tượng tiếp theo bằng phím TAB hoặc phím mũi tên bên phải. Di chuyển đến đối tượng trước đó bằng tổ hợp phím SHIFT+TAB hoặc phím mũi tên bên trái. Nhấn phím khoảng cách hoặc ENTER để chọn đối tượng trong trình soạn thảo.' } ] }, { name: 'Lệnh', items: [ { name: 'Làm lại lện', legend: 'Ấn ${undo}' }, { name: 'Làm lại lệnh', legend: 'Ấn ${redo}' }, { name: 'Lệnh in đậm', legend: 'Ấn ${bold}' }, { name: 'Lệnh in nghiêng', legend: 'Ấn ${italic}' }, { name: 'Lệnh gạch dưới', legend: 'Ấn ${underline}' }, { name: 'Lệnh liên kết', legend: 'Nhấn ${link}' }, { name: 'Lệnh hiển thị thanh công cụ', legend: 'Nhấn${toolbarCollapse}' }, { name: 'Truy cập đến lệnh tập trung vào khoảng cách trước đó', legend: 'Ấn ${accessPreviousSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách.' }, { name: 'Truy cập phần đối tượng lệnh khoảng trống', legend: 'Ấn ${accessNextSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách.' }, { name: 'Trợ giúp liên quan', legend: 'Nhấn ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Phím Tab', pause: 'Phím Pause', capslock: 'Phím Caps Lock', escape: 'Phím Escape', pageUp: 'Phím Page Up', pageDown: 'Phím Page Down', leftArrow: 'Phím Left Arrow', upArrow: 'Phím Up Arrow', rightArrow: 'Phím Right Arrow', downArrow: 'Phím Down Arrow', insert: 'Chèn', leftWindowKey: 'Phím Left Windows', rightWindowKey: 'Phím Right Windows ', selectKey: 'Chọn phím', numpad0: 'Phím 0', numpad1: 'Phím 1', numpad2: 'Phím 2', numpad3: 'Phím 3', numpad4: 'Phím 4', numpad5: 'Phím 5', numpad6: 'Phím 6', numpad7: 'Phím 7', numpad8: 'Phím 8', numpad9: 'Phím 9', multiply: 'Nhân', add: 'Thêm', subtract: 'Trừ', decimalPoint: 'Điểm số thập phân', divide: 'Chia', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Dấu chấm phẩy', equalSign: 'Đăng nhập bằng', comma: 'Dấu phẩy', dash: 'Dấu gạch ngang', period: 'Phím .', forwardSlash: 'Phím /', graveAccent: 'Phím `', openBracket: 'Open Bracket', backSlash: 'Dấu gạch chéo ngược', closeBracket: 'Gần giá đỡ', singleQuote: 'Trích dẫn' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/cs.js0000644000201500020150000001250114515446705025206 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'cs', { title: 'Instrukce pro přístupnost', contents: 'Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.', legend: [ { name: 'Obecné', items: [ { name: 'Panel nástrojů editoru', legend: 'Stiskněte ${toolbarFocus} k procházení panelu nástrojů. K přechodu na další nebo předchozí skupinu použijte TAB nebo SHIFT+TAB. Pro přechod na další nebo předchozí tlačítko panelu nástrojů použijte ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete. Po aktivaci tlačítka se fokus přesune zpět do editační oblasti.' }, { name: 'Dialogové okno editoru', legend: 'Uvnitř dialogového okna stiskněte TAB pro přesunutí na další prvek okna, stiskněte SHIFT+TAB pro přesun na předchozí prvek okna, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT+F10 pro zaměření seznamu karet, nebo TAB, pro posun podle pořadí karet.Při zaměření seznamu karet se můžete jimi posouvat pomocí ŠIPKY VPRAVO a VLEVO.' }, { name: 'Kontextové menu editoru', legend: 'Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC.' }, { name: 'Rámeček seznamu editoru', legend: 'Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT+TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu.' }, { name: 'Lišta cesty prvku v editoru', legend: 'Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí tlačítko se přesunete pomocí SHIFT+TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru.' } ] }, { name: 'Příkazy', items: [ { name: ' Příkaz Zpět', legend: 'Stiskněte ${undo}' }, { name: ' Příkaz Znovu', legend: 'Stiskněte ${redo}' }, { name: ' Příkaz Tučné', legend: 'Stiskněte ${bold}' }, { name: ' Příkaz Kurzíva', legend: 'Stiskněte ${italic}' }, { name: ' Příkaz Podtržení', legend: 'Stiskněte ${underline}' }, { name: ' Příkaz Odkaz', legend: 'Stiskněte ${link}' }, { name: ' Příkaz Skrýt panel nástrojů', legend: 'Stiskněte ${toolbarCollapse}' }, { name: 'Příkaz pro přístup k předchozímu prostoru zaměření', legend: 'Stiskněte ${accessPreviousSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření před stříškou, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte.' }, { name: 'Příkaz pro přístup k dalšímu prostoru zaměření', legend: 'Stiskněte ${accessNextSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření po stříšce, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte.' }, { name: ' Nápověda přístupnosti', legend: 'Stiskněte ${a11yHelp}' }, { name: 'Vložit jako čistý text', legend: 'Stiskněte ${pastetext}', legendEdge: 'Stiskněte ${pastetext} a pak ${paste}' } ] } ], tab: 'Tabulátor', pause: 'Pauza', capslock: 'Caps lock', escape: 'Escape', pageUp: 'Stránka nahoru', pageDown: 'Stránka dolů', leftArrow: 'Šipka vlevo', upArrow: 'Šipka nahoru', rightArrow: 'Šipka vpravo', downArrow: 'Šipka dolů', insert: 'Vložit', leftWindowKey: 'Levá klávesa Windows', rightWindowKey: 'Pravá klávesa Windows', selectKey: 'Vyberte klávesu', numpad0: 'Numerická klávesa 0', numpad1: 'Numerická klávesa 1', numpad2: 'Numerická klávesa 2', numpad3: 'Numerická klávesa 3', numpad4: 'Numerická klávesa 4', numpad5: 'Numerická klávesa 5', numpad6: 'Numerická klávesa 6', numpad7: 'Numerická klávesa 7', numpad8: 'Numerická klávesa 8', numpad9: 'Numerická klávesa 9', multiply: 'Numerická klávesa násobení', add: 'Přidat', subtract: 'Numerická klávesa odečítání', decimalPoint: 'Desetinná tečka', divide: 'Numerická klávesa dělení', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num lock', scrollLock: 'Scroll lock', semiColon: 'Středník', equalSign: 'Rovnítko', comma: 'Čárka', dash: 'Pomlčka', period: 'Tečka', forwardSlash: 'Lomítko', graveAccent: 'Přízvuk', openBracket: 'Otevřená hranatá závorka', backSlash: 'Obrácené lomítko', closeBracket: 'Uzavřená hranatá závorka', singleQuote: 'Jednoduchá uvozovka' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/tr.js0000644000201500020150000001173514515446705025236 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'tr', { title: 'Erişilebilirlik Talimatları', contents: 'Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.', legend: [ { name: 'Genel', items: [ { name: 'Düzenleyici Araç Çubuğu', legend: 'Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT+TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın.' }, { name: 'Diyalog Düzenleyici', legend: 'Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın.' }, { name: 'İçerik Menü Editörü', legend: 'İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU\'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın.' }, { name: 'Liste Kutusu Editörü', legend: 'Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT+TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın.' }, { name: 'Element Yol Çubuğu Editörü', legend: 'Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT+TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın.' } ] }, { name: 'Komutlar', items: [ { name: 'Komutu geri al', legend: '$(undo)\'ya basın' }, { name: 'Komutu geri al', legend: '${redo} basın' }, { name: ' Kalın komut', legend: '${bold} basın' }, { name: ' İtalik komutu', legend: '${italic} basın' }, { name: ' Alttan çizgi komutu', legend: '${underline} basın' }, { name: ' Bağlantı komutu', legend: '${link} basın' }, { name: ' Araç çubuğu Toplama komutu', legend: '${toolbarCollapse} basın' }, { name: 'Önceki komut alanına odaklan', legend: 'Düzeltme imleçinden önce, en yakın uzaktaki alana erişmek için ${accessPreviousSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın.' }, { name: 'Sonraki komut alanına odaklan', legend: 'Düzeltme imleçinden sonra, en yakın uzaktaki alana erişmek için ${accessNextSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın.' }, { name: 'Erişilebilirlik Yardımı', legend: '${a11yHelp}\'e basın' }, { name: 'Düz Metin Olarak Yapıştır', legend: '${pastetext} basın', legendEdge: 'Önce ${pastetext} ardından${paste} basın' } ] } ], tab: 'Sekme tuşu', pause: 'Durdurma tuşu', capslock: 'Büyük harf tuşu', escape: 'Vazgeç tuşu', pageUp: 'Sayfa Yukarı', pageDown: 'Sayfa Aşağı', leftArrow: 'Sol ok', upArrow: 'Yukarı ok', rightArrow: 'Sağ ok', downArrow: 'Aşağı ok', insert: 'Araya gir', leftWindowKey: 'Sol windows tuşu', rightWindowKey: 'Sağ windows tuşu', selectKey: 'Seçme tuşu', numpad0: 'Nümerik 0', numpad1: 'Nümerik 1', numpad2: 'Nümerik 2', numpad3: 'Nümerik 3', numpad4: 'Nümerik 4', numpad5: 'Nümerik 5', numpad6: 'Nümerik 6', numpad7: 'Nümerik 7', numpad8: 'Nümerik 8', numpad9: 'Nümerik 9', multiply: 'Çarpma', add: 'Toplama', subtract: 'Çıkarma', decimalPoint: 'Ondalık işareti', divide: 'Bölme', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lk', scrollLock: 'Scr Lk', semiColon: 'Noktalı virgül', equalSign: 'Eşittir', comma: 'Virgül', dash: 'Eksi', period: 'Nokta', forwardSlash: 'İleri eğik çizgi', graveAccent: 'Üst tırnak', openBracket: 'Parantez aç', backSlash: 'Ters eğik çizgi', closeBracket: 'Parantez kapa', singleQuote: 'Tek tırnak' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ja.js0000644000201500020150000001316614515446705025203 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ja', { title: 'ユーザー補助の説明', contents: 'ヘルプ このダイアログを閉じるには ESCを押してください。', legend: [ { name: '全般', items: [ { name: 'エディターツールバー', legend: '${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。' }, { name: '編集ダイアログ', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'エディターのメニュー', legend: '${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。' }, { name: 'エディターリストボックス', legend: 'リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。' }, { name: 'エディター要素パスバー', legend: '${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。' } ] }, { name: 'コマンド', items: [ { name: '元に戻す', legend: '${undo} をクリック' }, { name: 'やり直し', legend: '${redo} をクリック' }, { name: '太字', legend: '${bold} をクリック' }, { name: '斜体 ', legend: '${italic} をクリック' }, { name: '下線', legend: '${underline} をクリック' }, { name: 'リンク', legend: '${link} をクリック' }, { name: 'ツールバーをたたむ', legend: '${toolbarCollapse} をクリック' }, { name: '前のカーソル移動のできないポイントへ', legend: '${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。' }, { name: '次のカーソルポイントへ移動する', legend: '${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。' }, { name: 'ユーザー補助ヘルプ', legend: '${a11yHelp} をクリック' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: '左矢印', upArrow: '上矢印', rightArrow: '右矢印', downArrow: '下矢印', insert: 'Insert', leftWindowKey: '左Windowキー', rightWindowKey: '右のWindowキー', selectKey: 'Select', numpad0: 'Num 0', numpad1: 'Num 1', numpad2: 'Num 2', numpad3: 'Num 3', numpad4: 'Num 4', numpad5: 'Num 5', numpad6: 'Num 6', numpad7: 'Num 7', numpad8: 'Num 8', numpad9: 'Num 9', multiply: '掛ける', add: '足す', subtract: '引く', decimalPoint: '小数点', divide: '割る', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'セミコロン', equalSign: 'イコール記号', comma: 'カンマ', dash: 'ダッシュ', period: 'ピリオド', forwardSlash: 'フォワードスラッシュ', graveAccent: 'グレイヴアクセント', openBracket: '開きカッコ', backSlash: 'バックスラッシュ', closeBracket: '閉じカッコ', singleQuote: 'シングルクォート' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/sl.js0000644000201500020150000001174714515446705025232 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'sl', { title: 'Navodila za dostopnost', contents: 'Vsebina pomoči. Če želite zapreti pogovorno okno, pritisnite ESC.', legend: [ { name: 'Splošno', items: [ { name: 'Orodna vrstica urejevalnika', legend: 'Pritisnite ${toolbarFocus} za pomik v orodno vrstico. Z TAB in SHIFT+TAB se pomikate na naslednjo in prejšnjo skupino orodne vrstice. Z DESNO PUŠČICO ali LEVO PUŠČICO se pomikate na naslednji in prejšnji gumb orodne vrstice. Pritisnite SPACE ali ENTER, da aktivirate gumb orodne vrstice.' }, { name: 'Urejevalno Pogovorno Okno', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Kontekstni meni urejevalnika', legend: 'Pritisnite ${contextMenu} ali APPLICATION KEY, da odprete kontekstni meni. Nato se premaknite na naslednjo možnost menija s tipko TAB ali PUŠČICA DOL. Premakniti se na prejšnjo možnost z SHIFT + TAB ali PUŠČICA GOR. Pritisnite SPACE ali ENTER za izbiro možnosti menija. Odprite podmeni trenutne možnosti menija s tipko SPACE ali ENTER ali DESNA PUŠČICA. Vrnite se na matični element menija s tipko ESC ali LEVA PUŠČICA. Zaprite kontekstni meni z ESC.' }, { name: 'Urejevalno Seznamsko Polje', legend: 'Znotraj seznama, se premaknete na naslednji element seznama s tipko TAB ali PUŠČICO DOL. Z SHIFT+TAB ali PUŠČICO GOR se premaknete na prejšnji element seznama. Pritisnite tipko SPACE ali ENTER za izbiro elementa. Pritisnite tipko ESC, da zaprete seznam.' }, { name: 'Urejevalna vrstica poti elementa', legend: 'Pritisnite ${elementsPathFocus} za pomikanje po vrstici elementnih poti. S TAB ali DESNA PUŠČICA se premaknete na naslednji gumb elementa. Z SHIFT+TAB ali LEVO PUŠČICO se premaknete na prejšnji gumb elementa. Pritisnite SPACE ali ENTER za izbiro elementa v urejevalniku.' } ] }, { name: 'Ukazi', items: [ { name: 'Razveljavi ukaz', legend: 'Pritisnite ${undo}' }, { name: 'Ponovi ukaz', legend: 'Pritisnite ${redo}' }, { name: 'Krepki ukaz', legend: 'Pritisnite ${bold}' }, { name: 'Ležeči ukaz', legend: 'Pritisnite ${italic}' }, { name: 'Poudarni ukaz', legend: 'Pritisnite ${underline}' }, { name: 'Ukaz povezave', legend: 'Pritisnite ${link}' }, { name: 'Skrči Orodno Vrstico Ukaz', legend: 'Pritisnite ${toolbarCollapse}' }, { name: 'Dostop do prejšnjega ukaza ostrenja', legend: 'Pritisnite ${accessPreviousSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora pred strešico, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore.' }, { name: 'Dostop do naslednjega ukaza ostrenja', legend: 'Pritisnite ${accessNextSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora po strešici, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore.' }, { name: 'Pomoč dostopnosti', legend: 'Pritisnite ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Puščica levo', upArrow: 'Puščica gor', rightArrow: 'Puščica desno', downArrow: 'Puščica dol', insert: 'Insert', leftWindowKey: 'Leva tipka Windows', rightWindowKey: 'Desna tipka Windows', selectKey: 'Select tipka', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Zmnoži', add: 'Dodaj', subtract: 'Odštej', decimalPoint: 'Decimalna vejica', divide: 'Deli', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Podpičje', equalSign: 'Enačaj', comma: 'Vejica', dash: 'Vezaj', period: 'Pika', forwardSlash: 'Desna poševnica', graveAccent: 'Krativec', openBracket: 'Oklepaj', backSlash: 'Leva poševnica', closeBracket: 'Zaklepaj', singleQuote: 'Opuščaj' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/lv.js0000644000201500020150000001352414515446705025230 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'lv', { title: 'Pieejamības instrukcija', contents: 'Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.', legend: [ { name: 'Galvenais', items: [ { name: 'Redaktora rīkjosla', legend: 'Nospiediet ${toolbarFocus} lai pārvietotos uz rīkjoslu. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas grupu izmantojiet pogu TAB un SHIFT+TAB. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizētu rīkjosla pogu.' }, { name: 'Redaktora dialoga logs', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Redaktora satura izvēle', legend: 'Nospiediet ${contextMenu} vai APPLICATION KEY lai atvērtu satura izvēlni. Lai pārvietotos uz nākošo izvēlnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pārvietotos uz iepriekšējo opciju izmantojiet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvelētos izvēlnes opciju. Atveriet tekošajā opcija apakšizvēlni ar SAPCE vai ENTER ka ari to var izdarīt ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvēlni nospiediet ESC vai Kreiso bultiņu. Lai aizvērtu ciet izvēlnes saturu nospiediet ESC.' }, { name: 'Redaktora saraksta lauks', legend: 'Saraksta laukā, lai pārvietotos uz nākošo saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pārvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvēlētos saraksta opcijas. Nospiediet ESC lai aizvērtu saraksta lauku.' }, { name: 'Redaktora elementa ceļa josla', legend: 'Nospiediet ${elementsPathFocus} lai pārvietotos uz elementa ceļa joslu. Lai pārvietotos uz nākošo elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo elementa pogu izmantojiet SHIFT+TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos elementu redaktorā.' } ] }, { name: 'Komandas', items: [ { name: 'Komanda atcelt darbību', legend: 'Nospiediet ${undo}' }, { name: 'Komanda atkārtot darbību', legend: 'Nospiediet ${redo}' }, { name: 'Treknraksta komanda', legend: 'Nospiediet ${bold}' }, { name: 'Kursīva komanda', legend: 'Nospiediet ${italic}' }, { name: 'Apakšsvītras komanda ', legend: 'Nospiediet ${underline}' }, { name: 'Saites komanda', legend: 'Nospiediet ${link}' }, { name: 'Rīkjoslas aizvēršanas komanda', legend: 'Nospiediet ${toolbarCollapse}' }, { name: 'Piekļūt iepriekšējai fokusa vietas komandai', legend: 'Nospiediet ${accessPreviousSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pirms kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām.' }, { name: 'Piekļūt nākošā fokusa apgabala komandai', legend: 'Nospiediet ${accessNextSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pēc kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām.' }, { name: 'Pieejamības palīdzība', legend: 'Nospiediet ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/en-au.js0000644000201500020150000001117014515446705025607 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'en-au', { title: 'Accessibility Instructions', contents: 'Help Contents. To close this dialog press ESC.', legend: [ { name: 'General', items: [ { name: 'Editor Toolbar', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' }, { name: 'Editor List Box', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' }, { name: 'Editor Element Path Bar', legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' } ] }, { name: 'Commands', items: [ { name: ' Undo command', legend: 'Press ${undo}' }, { name: ' Redo command', legend: 'Press ${redo}' }, { name: ' Bold command', legend: 'Press ${bold}' }, { name: ' Italic command', legend: 'Press ${italic}' }, { name: ' Underline command', legend: 'Press ${underline}' }, { name: ' Link command', legend: 'Press ${link}' }, { name: ' Toolbar Collapse command', legend: 'Press ${toolbarCollapse}' }, { name: ' Access previous focus space command', legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: ' Access next focus space command', legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: ' Accessibility Help', legend: 'Press ${a11yHelp}' }, { name: ' Paste as plain text', legend: 'Press ${pastetext}', legendEdge: 'Press ${pastetext}, followed by ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Left Arrow', upArrow: 'Up Arrow', rightArrow: 'Right Arrow', downArrow: 'Down Arrow', insert: 'Insert', leftWindowKey: 'Left Windows key', rightWindowKey: 'Right Windows key', selectKey: 'Select key', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Multiply', add: 'Add', subtract: 'Subtract', decimalPoint: 'Decimal Point', divide: 'Divide', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semicolon', equalSign: 'Equal Sign', comma: 'Comma', dash: 'Dash', period: 'Period', forwardSlash: 'Forward Slash', graveAccent: 'Grave Accent', openBracket: 'Open Bracket', backSlash: 'Backslash', closeBracket: 'Close Bracket', singleQuote: 'Single Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/en.js0000644000201500020150000001144414515446705025210 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'en', { title: 'Accessibility Instructions', contents: 'Help Contents. To close this dialog press ESC.', legend: [ { name: 'General', items: [ { name: 'Editor Toolbar', legend: 'Press ${toolbarFocus} to navigate to the toolbar. ' + 'Move to the next and previous toolbar group with TAB and SHIFT+TAB. ' + 'Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. ' + 'Press SPACE or ENTER to activate the toolbar button. ' + 'The focus will be moved back to the editing area upon activating the toolbar button.' }, { name: 'Editor Dialog', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. ' + 'When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. ' + 'With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. ' + 'Press ESC to discard changes and close the dialog. ' + 'The focus will be moved back to the editing area upon leaving the dialog.' }, { name: 'Editor Context Menu', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. ' + 'Then move to next menu option with TAB or DOWN ARROW. ' + 'Move to previous option with SHIFT+TAB or UP ARROW. ' + 'Press SPACE or ENTER to select the menu option. ' + 'Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. ' + 'Go back to parent menu item with ESC or LEFT ARROW. ' + 'Close context menu with ESC.' }, { name: 'Editor List Box', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. ' + 'Move to previous list item with SHIFT+TAB or UP ARROW. ' + 'Press SPACE or ENTER to select the list option. ' + 'Press ESC to close the list-box.' }, { name: 'Editor Element Path Bar', legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. ' + 'Move to next element button with TAB or RIGHT ARROW. ' + 'Move to previous button with SHIFT+TAB or LEFT ARROW. ' + 'Press SPACE or ENTER to select the element in editor.' } ] }, { name: 'Commands', items: [ { name: ' Undo command', legend: 'Press ${undo}' }, { name: ' Redo command', legend: 'Press ${redo}' }, { name: ' Bold command', legend: 'Press ${bold}' }, { name: ' Italic command', legend: 'Press ${italic}' }, { name: ' Underline command', legend: 'Press ${underline}' }, { name: ' Link command', legend: 'Press ${link}' }, { name: ' Toolbar Collapse command', legend: 'Press ${toolbarCollapse}' }, { name: ' Access previous focus space command', legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, ' + 'for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: ' Access next focus space command', legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, ' + 'for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' }, { name: ' Accessibility Help', legend: 'Press ${a11yHelp}' }, { name: ' Paste as plain text', legend: 'Press ${pastetext}', legendEdge: 'Press ${pastetext}, followed by ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Left Arrow', upArrow: 'Up Arrow', rightArrow: 'Right Arrow', downArrow: 'Down Arrow', insert: 'Insert', leftWindowKey: 'Left Windows key', rightWindowKey: 'Right Windows key', selectKey: 'Select key', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Multiply', add: 'Add', subtract: 'Subtract', decimalPoint: 'Decimal Point', divide: 'Divide', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semicolon', equalSign: 'Equal Sign', comma: 'Comma', dash: 'Dash', period: 'Period', forwardSlash: 'Forward Slash', graveAccent: 'Grave Accent', openBracket: 'Open Bracket', backSlash: 'Backslash', closeBracket: 'Close Bracket', singleQuote: 'Single Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/no.js0000644000201500020150000001227514515446705025225 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'no', { title: 'Instruksjoner for tilgjengelighet', contents: 'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.', legend: [ { name: 'Generelt', items: [ { name: 'Verktøylinje for editor', legend: 'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT+TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.' }, { name: 'Dialog for editor', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Kontekstmeny for editor', legend: 'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.' }, { name: 'Listeboks for editor', legend: 'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.' }, { name: 'Verktøylinje for elementsti', legend: 'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.' } ] }, { name: 'Kommandoer', items: [ { name: 'Angre', legend: 'Trykk ${undo}' }, { name: 'Gjør om', legend: 'Trykk ${redo}' }, { name: 'Fet tekst', legend: 'Trykk ${bold}' }, { name: 'Kursiv tekst', legend: 'Trykk ${italic}' }, { name: 'Understreking', legend: 'Trykk ${underline}' }, { name: 'Link', legend: 'Trykk ${link}' }, { name: 'Skjul verktøylinje', legend: 'Trykk ${toolbarCollapse}' }, { name: 'Gå til forrige fokusområde', legend: 'Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' }, { name: 'Gå til neste fokusområde', legend: 'Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet.' }, { name: 'Hjelp for tilgjengelighet', legend: 'Trykk ${a11yHelp}' }, { name: 'Lim inn som ren tekst', legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semikolon', equalSign: 'Likhetstegn', comma: 'Komma', dash: 'Bindestrek', period: 'Punktum', forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Enkelt anførselstegn' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/fr.js0000644000201500020150000001333314515446705025214 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'fr', { title: 'Instructions d\'accessibilité', contents: 'Contenu de l\'aide. Pour fermer cette fenêtre, appuyez sur la touche Échap.', legend: [ { name: 'Général', items: [ { name: 'Barre d\'outils de l\'éditeur', legend: 'Appuyer sur ${toolbarFocus} pour accéder à la barre d\'outils. Se déplacer vers le groupe suivant ou précédent de la barre d\'outils avec les touches Tab et Maj+Tab. Se déplacer vers le bouton suivant ou précédent de la barre d\'outils avec les touches Flèche droite et Flèche gauche. Appuyer sur la barre d\'espace ou la touche Entrée pour activer le bouton de barre d\'outils.' }, { name: 'Fenêtre de l\'éditeur', legend: 'Dans une boîte de dialogue, appuyer sur Tab pour passer à l\'élément suivant, appuyer sur Maj+Tab pour passer à l\'élément précédent, appuyer sur Entrée pour valider, appuyer sur Échap pour annuler. Quand une boîte de dialogue possède des onglets, la liste peut être atteinte avec Alt+F10 ou avec Tab. Dans la liste des onglets, se déplacer vers le suivant et le précédent avec les touches Flèche droite et Flèche gauche respectivement.' }, { name: 'Menu contextuel de l\'éditeur', legend: 'Appuyer sur ${contextMenu} ou sur la touche Menu pour ouvrir le menu contextuel. Se déplacer ensuite vers l\'option suivante du menu avec les touches Tab ou Flèche bas. Se déplacer vers l\'option précédente avec les touches Maj+Tab ou Flèche haut. Appuyer sur la barre d\'espace ou la touche Entrée pour sélectionner l\'option du menu. Appuyer sur la barre d\'espace, la touche Entrée ou Flèche droite pour ouvrir le sous-menu de l\'option sélectionnée. Revenir à l\'élément de menu parent avec la touche Échap ou Flèche gauche. Fermer le menu contextuel avec Échap.' }, { name: 'Zone de liste de l\'éditeur', legend: 'Dans une liste en menu déroulant, se déplacer vers l\'élément suivant de la liste avec les touches Tab ou Flèche bas. Se déplacer vers l\'élément précédent de la liste avec les touches Maj+Tab ou Flèche haut. Appuyer sur la barre d\'espace ou sur Entrée pour sélectionner l\'option dans la liste. Appuyer sur Échap pour fermer le menu déroulant.' }, { name: 'Barre du chemin d\'éléments de l\'éditeur', legend: 'Appuyer sur ${elementsPathFocus} pour naviguer vers la barre du fil d\'Ariane des éléments. Se déplacer vers le bouton de l\'élément suivant avec les touches Tab ou Flèche droite. Se déplacer vers le bouton précédent avec les touches Maj+Tab ou Flèche gauche. Appuyer sur la barre d\'espace ou sur Entrée pour sélectionner l\'élément dans l\'éditeur.' } ] }, { name: 'Commandes', items: [ { name: ' Annuler la commande', legend: 'Appuyer sur ${undo}' }, { name: 'Commande restaurer', legend: 'Appuyer sur ${redo}' }, { name: ' Commande gras', legend: 'Appuyer sur ${bold}' }, { name: ' Commande italique', legend: 'Appuyer sur ${italic}' }, { name: ' Commande souligné', legend: 'Appuyer sur ${underline}' }, { name: ' Commande lien', legend: 'Appuyer sur ${link}' }, { name: ' Commande enrouler la barre d\'outils', legend: 'Appuyer sur ${toolbarCollapse}' }, { name: 'Commande d\'accès à l\'élément sélectionnable précédent', legend: 'Appuyer sur ${accessNextSpace} pour accéder à l\'élément sélectionnable inatteignable le plus proche avant le curseur, par exemple : deux lignes horizontales adjacentes. Répéter la combinaison de touches pour atteindre les éléments sélectionnables précédents.' }, { name: 'Commande d\'accès à l\'élément sélectionnable suivant', legend: 'Appuyer sur ${accessNextSpace} pour accéder à l\'élément sélectionnable inatteignable le plus proche après le curseur, par exemple : deux lignes horizontales adjacentes. Répéter la combinaison de touches pour atteindre les éléments sélectionnables suivants.' }, { name: ' Aide sur l\'accessibilité', legend: 'Appuyer sur ${a11yHelp}' }, { name: 'Coller comme texte sans mise en forme', legend: 'Appuyer sur ${pastetext}', legendEdge: 'Enfoncez ${pastetext}, suivi par ${paste}' } ] } ], tab: 'Tabulation', pause: 'Pause', capslock: 'Verr. Maj.', escape: 'Échap', pageUp: 'Page supérieure', pageDown: 'Page suivante', leftArrow: 'Flèche gauche', upArrow: 'Flèche haut', rightArrow: 'Flèche droite', downArrow: 'Flèche basse', insert: 'Inser', leftWindowKey: 'Touche Windows gauche', rightWindowKey: 'Touche Windows droite', selectKey: 'Touche Sélectionner', numpad0: '0 du pavé numérique', numpad1: '1 du pavé numérique', numpad2: '2 du pavé numérique', numpad3: '3 du pavé numérique', numpad4: '4 du pavé numérique', numpad5: '5 du pavé numérique', numpad6: '6 du pavé numérique', numpad7: '7 du pavé numérique', numpad8: 'Pavé numérique 8', numpad9: '9 du pavé numérique', multiply: 'Multiplier', add: 'Plus', subtract: 'Moins', decimalPoint: 'Point décimal', divide: 'Diviser', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Verr. Num.', scrollLock: 'Arrêt défil.', semiColon: 'Point-virgule', equalSign: 'Signe égal', comma: 'Virgule', dash: 'Tiret', period: 'Point', forwardSlash: 'Barre oblique', graveAccent: 'Accent grave', openBracket: 'Parenthèse ouvrante', backSlash: 'Barre oblique inverse', closeBracket: 'Parenthèse fermante', singleQuote: 'Apostrophe' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/id.js0000644000201500020150000001250514515446705025201 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'id', { title: 'Instruksi Accessibility', contents: 'Bantuan. Tekan ESC untuk menutup dialog ini.', legend: [ { name: 'Umum', items: [ { name: 'Toolbar Editor', legend: 'Tekan ${toolbarFocus} untuk berpindah ke toolbar. Untuk berpindah ke group toolbar selanjutnya dan sebelumnya gunakan TAB dan SHIFT+TAB. Untuk berpindah ke tombol toolbar selanjutnya dan sebelumnya gunakan RIGHT ARROW atau LEFT ARROW. Tekan SPASI atau ENTER untuk mengaktifkan tombol toolbar.' }, { name: 'Dialog Editor', legend: 'Pada jendela dialog, tekan TAB untuk berpindah pada elemen dialog selanjutnya, tekan SHIFT+TAB untuk berpindah pada elemen dialog sebelumnya, tekan ENTER untuk submit dialog, tekan ESC untuk membatalkan dialog. Pada dialog dengan multi tab, daftar tab dapat diakses dengan ALT+F10 ataupun dengan tombol TAB sesuai urutan tab pada dialog. Jika daftar tab aktif terpilih, untuk berpindah tab dapat menggunakan RIGHT dan LEFT ARROW.' }, { name: 'Context Menu Editor', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'List Box Editor', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', // MISSING items: [ { name: ' Undo command', // MISSING legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: ' Bold command', // MISSING legend: 'Press ${bold}' // MISSING }, { name: ' Italic command', // MISSING legend: 'Press ${italic}' // MISSING }, { name: ' Underline command', // MISSING legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'Escape', // MISSING pageUp: 'Page Up', // MISSING pageDown: 'Page Down', // MISSING leftArrow: 'Left Arrow', // MISSING upArrow: 'Up Arrow', // MISSING rightArrow: 'Right Arrow', // MISSING downArrow: 'Down Arrow', // MISSING insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'Multiply', // MISSING add: 'Add', // MISSING subtract: 'Subtract', // MISSING decimalPoint: 'Decimal Point', // MISSING divide: 'Divide', // MISSING f1: 'F1', // MISSING f2: 'F2', // MISSING f3: 'F3', // MISSING f4: 'F4', // MISSING f5: 'F5', // MISSING f6: 'F6', // MISSING f7: 'F7', // MISSING f8: 'F8', // MISSING f9: 'F9', // MISSING f10: 'F10', // MISSING f11: 'F11', // MISSING f12: 'F12', // MISSING numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'Semicolon', // MISSING equalSign: 'Equal Sign', // MISSING comma: 'Comma', // MISSING dash: 'Dash', // MISSING period: 'Period', // MISSING forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'Open Bracket', // MISSING backSlash: 'Backslash', // MISSING closeBracket: 'Close Bracket', // MISSING singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ug.js0000644000201500020150000001644514515446705025227 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ug', { title: 'قوشۇمچە چۈشەندۈرۈش', contents: 'ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.', legend: [ { name: 'ئادەتتىكى', items: [ { name: 'قورال بالداق تەھرىر', legend: '${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ.' }, { name: 'تەھرىرلىگۈچ سۆزلەشكۈسى', legend: 'سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT+TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT+F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛SHIFT+ TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ.' }, { name: 'تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى', legend: '${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ.' }, { name: 'تەھرىرلىگۈچ تىزىمى', legend: 'تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ.' }, { name: 'تەھرىرلىگۈچ ئېلېمېنت يول بالداق', legend: '${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ.' } ] }, { name: 'بۇيرۇق', items: [ { name: 'بۇيرۇقتىن يېنىۋال', legend: '${undo} نى بېسىڭ' }, { name: 'قايتىلاش بۇيرۇقى', legend: '${redo} نى بېسىڭ' }, { name: 'توملىتىش بۇيرۇقى', legend: '${bold} نى بېسىڭ' }, { name: 'يانتۇ بۇيرۇقى', legend: '${italic} نى بېسىڭ' }, { name: 'ئاستى سىزىق بۇيرۇقى', legend: '${underline} نى بېسىڭ' }, { name: 'ئۇلانما بۇيرۇقى', legend: '${link} نى بېسىڭ' }, { name: 'قورال بالداق قاتلاش بۇيرۇقى', legend: '${toolbarCollapse} نى بېسىڭ' }, { name: 'ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق', legend: '${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.' }, { name: 'كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق', legend: '${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ.' }, { name: 'توسالغۇسىز لايىھە چۈشەندۈرۈشى', legend: '${a11yHelp} نى بېسىڭ' }, { name: 'ساپ تېكىست چاپلاش', legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'سول يا ئوق', upArrow: 'ئۈستى يا ئوق', rightArrow: 'ئوڭ يا ئوق', downArrow: 'ئاستى يا ئوق', insert: 'قىستۇر', leftWindowKey: 'سول Windows كۇنۇپكىسى', rightWindowKey: 'ئوڭ Windows كۇنۇپكىسى', selectKey: 'تاللاش كۇنۇپكىسى', numpad0: 'سان تاختا 0', numpad1: 'سان تاختا 1', numpad2: 'سان تاختا 2', numpad3: 'سان تاختا 3', numpad4: 'سان تاختا 4', numpad5: 'سان تاختا 5', numpad6: 'سان تاختا 6', numpad7: 'سان تاختا 7', numpad8: 'سان تاختا 8', numpad9: 'سان تاختا 9', multiply: 'يۇلتۇز كۇنۇپكىسى', add: 'قوشۇش', subtract: 'ئېلىش', decimalPoint: 'كەسىر چېكىت', divide: 'بۆلۈش', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'سان قۇلۇپ كۇنۇپكىسى', scrollLock: 'سۈرگۈچ قۇلۇپ كۇنۇپكىسى', semiColon: 'چېكىتلىك پەش', equalSign: 'تەڭلىك بەلگىسى', comma: 'پەش', dash: 'سىزىقچە', period: 'چېكىت', forwardSlash: 'سولغا يانتۇ سىزىق', graveAccent: 'ئۇرغۇ بەلگىسى', openBracket: 'ئېچىلغان تىرناق', backSlash: 'ئوڭغا يانتۇ سىزىق', closeBracket: 'يېپىلغان تىرناق', singleQuote: 'يالاڭ پەش' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/ar.js0000644000201500020150000001252314515446705025207 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'ar', { title: 'Accessibility Instructions', // MISSING contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'عام', items: [ { name: 'Editor Toolbar', // MISSING legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', // MISSING legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', // MISSING legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', // MISSING legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', // MISSING legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'الاوامر', items: [ { name: 'تراجع', legend: 'Press ${undo}' // MISSING }, { name: ' Redo command', // MISSING legend: 'Press ${redo}' // MISSING }, { name: 'نص غامق', legend: 'Press ${bold}' // MISSING }, { name: 'نص مائل', legend: 'Press ${italic}' // MISSING }, { name: 'نص تحته خط', legend: 'Press ${underline}' // MISSING }, { name: ' Link command', // MISSING legend: 'Press ${link}' // MISSING }, { name: ' Toolbar Collapse command', // MISSING legend: 'Press ${toolbarCollapse}' // MISSING }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', // MISSING legend: 'Press ${a11yHelp}' // MISSING }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', // MISSING pause: 'Pause', // MISSING capslock: 'Caps Lock', // MISSING escape: 'هروب', pageUp: 'اعلى الصفحة', pageDown: 'اسفل الصفحة', leftArrow: 'السهم الايسر', upArrow: 'السهم العلوي', rightArrow: 'السهم الأيمن', downArrow: 'السهم السفلي', insert: 'Insert', // MISSING leftWindowKey: 'Left Windows key', // MISSING rightWindowKey: 'Right Windows key', // MISSING selectKey: 'Select key', // MISSING numpad0: 'Numpad 0', // MISSING numpad1: 'Numpad 1', // MISSING numpad2: 'Numpad 2', // MISSING numpad3: 'Numpad 3', // MISSING numpad4: 'Numpad 4', // MISSING numpad5: 'Numpad 5', // MISSING numpad6: 'Numpad 6', // MISSING numpad7: 'Numpad 7', // MISSING numpad8: 'Numpad 8', // MISSING numpad9: 'Numpad 9', // MISSING multiply: 'مضروب', add: 'إضافة', subtract: 'طرح', decimalPoint: 'Decimal Point', // MISSING divide: 'تقسيم', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', // MISSING scrollLock: 'Scroll Lock', // MISSING semiColon: 'الفاصلة المنقوطة', equalSign: 'علامة "يساوي"', comma: 'فاصلة', dash: 'شرطة', period: 'نقطة', forwardSlash: 'Forward Slash', // MISSING graveAccent: 'Grave Accent', // MISSING openBracket: 'افتح القوس', backSlash: 'Backslash', // MISSING closeBracket: 'اغلق القوس', singleQuote: 'Single Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/sr.js0000644000201500020150000001752014515446705025233 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'sr', { title: 'Упутства за помоћ', contents: 'Садржаји за помоћ. Да би сте затворили дијалог притисните ЕСЦ', legend: [ { name: 'Опште', items: [ { name: 'Алатке за преуређиванје', legend: 'Притисните ${тоолбарФоцус} да бисте прешли на траку са алаткама. Пређите на следећу и претходну групу трака са алаткама помоћу ТАБ и СХИФТ+ТАБ. Пређите на следеће и претходно дугме на траци са алаткама помоћу СТРЕЛИЦЕ НАДЕСНО или СТРЕЛИЦА НАЛЕВО. Притисните СПАЦЕ или ЕНТЕР да бисте активирали дугме на траци са алаткама. Након активирања дугмета на траци са алаткама, фокус ће бити померен назад у област за уређивање.' }, { name: 'Уређивач дијалога', legend: 'Унутар дијалога притисните ТАБ да пређете на следећи елемент дијалога, притисните СХИФТ+ТАБ да пређете на претходни елемент дијалога, притисните ЕНТЕР да пошаљете дијалог, притисните ЕСЦ да откажете дијалог. Када дијалог има више картица, до листе картица се може доћи или са АЛТ+Ф10 или са ТАБ као део редоследа табулатора дијалога. Са фокусираном листом картица, пређите на следећу и претходну картицу помоћу СТРЕЛИЦЕ НАДЕСНО, односно НАЛЕВО. Притисните ЕСЦ да одбаците промене и затворите дијалог. Фокус ће се вратити на област за уређивање након напуштања дијалога.' }, { name: 'Уређивач локалног менија.', legend: 'Притисните ${contextMenu} или APPLICATION ТАСТЕР за отварање локалног менија. Затим са ТАБ или СТРЕЛИЦА ДОЛЕ можете прећи на следећу зачку менија. Претходну опцију можете постићи са ШХИФТ+ТАБ или СТРЕЛИЦА ГОРЕ. Притисните СПАЦЕ или ЕНТЕР за одабир тачке менија. Притисните СПАЦЕ или ЕНТЕР да би се отворио подмени тренутне ставке менија. За повратак у главни мени притисмите ЕСЦ или СТРЕЛИЦА ДЕСНО. Затворите локални мени помоћу тастера ЕСЦ.' }, { name: 'Уређивач листе', legend: 'До следећег елемента листе можете дочи са ТАБ или СТРЕЛИЦА ДОЛЕ. За одабир петходног елемента притисните СХИФТ+TAБ или СТРЕЛИЦА ДОЛЕ. За одабир елемента притисните СПАЦЕ или ЕНТЕР. Са притиско ЕСЦ затварате листу. ' }, { name: 'Уређивач траке пута елемената', legend: 'Притисни ${elementsPathFocus} да би означили траку пута елемената. До следећег елемента можете доћи са TAБ или СТРЕЛИЦА ДЕСНО. До претходног долазите са СХИФТ+TAБ или СТРЕЛИЦА ДЕСНО. Са СПАЦЕ или ЕНТЕР можете одабрати елемент у уређивачу.' } ] }, { name: 'Команда', items: [ { name: 'Откажи команду', legend: 'Притисни ${undo}' }, { name: 'Понови команду', legend: 'Притисни ${redo}' }, { name: 'Подебљана команда', legend: 'Притисни ${bold}' }, { name: 'Курзив команда', legend: 'Притисни ${italic}' }, { name: 'Прецтрана команда', legend: 'Притисни ${underline}' }, { name: 'Линк команда', legend: 'Притисни ${link}' }, { name: 'Затвори траку уређивача команда', legend: 'Притисни ${toolbarCollapse}' }, { name: 'Приступ претходном фокус месту команда', legend: 'Притисни ${accessNextSpace} да би приступио најближем недоступном фокус месту пре знака hiányjel, на пример: дав сусаедна ХР елемента. Понови комбинацију тастера да пронађеш фокус место које се налази даље.' }, { name: 'Приступ следећем фокус месту команда ', legend: 'Притисни ${accessNextSpace} да би приступио најближем недоступном фокус месту после знака hiányjel, на пример: дав сусаедна ХР елемента. Понови комбинацију тастера да пронађеш фокус место које се налази даље.' }, { name: 'Помоћ приступачнсти', legend: 'Притисни ${a11yHelp}' }, { name: ' Налепи као обичан текст', legend: 'Притисните: ${pastetext}', legendEdge: 'Притисните ${pastetext}, затим ${paste}' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Стрелица лево', upArrow: 'Стрелица горе', rightArrow: 'Стрелица десно', downArrow: 'Стрелица доле', insert: 'Insert', leftWindowKey: 'леви Windows-тастер', rightWindowKey: 'десни Windows-тастер', selectKey: 'Одабир тастера', numpad0: 'Тастери са бројевима 0', numpad1: 'Тастери са бројевима 1', numpad2: 'Тастери са бројевима 2', numpad3: 'Тастери са бројевима 3', numpad4: 'Тастери са бројевима 4', numpad5: 'Тастери са бројевима 5', numpad6: 'Тастери са бројевима 6', numpad7: 'Тастери са бројевима 7', numpad8: 'Тастери са бројевима 8', numpad9: ' Тастери са бројевима 9', multiply: 'Множење', add: 'Сабирање', subtract: 'Одузимање', decimalPoint: 'Децимална тачка', divide: 'Дељење', f1: 'Ф1', f2: 'Ф2', f3: 'Ф3', f4: 'Ф4', f5: 'Ф5', f6: 'Ф6', f7: 'Ф7', f8: 'Ф8', f9: 'Ф9', f10: 'Ф10', f11: 'Ф11', f12: 'Ф12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Тачка зарез', equalSign: 'Знак једнакости', comma: 'Зарез', dash: 'Цртица', period: 'Тачка', forwardSlash: 'Коса црта', graveAccent: 'Обрнути знак акцента', openBracket: 'Отворена ћошкаста заграда', backSlash: 'обрнута коса црта', closeBracket: 'Затворена ћошкаста заграда', singleQuote: 'Симпли знак навода' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/eu.js0000644000201500020150000001167414515446705025224 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'eu', { title: 'Erabilerraztasunaren argibideak', contents: 'Laguntzaren edukiak. Elkarrizketa-koadro hau ixteko sakatu ESC.', legend: [ { name: 'Orokorra', items: [ { name: 'Editorearen tresna-barra', legend: 'Sakatu ${toolbarFocus} tresna-barrara nabigatzeko. Tresna-barrako aurreko eta hurrengo taldera joateko erabili TAB eta MAIUS+TAB. Tresna-barrako aurreko eta hurrengo botoira joateko erabili ESKUIN-GEZIA eta EZKER-GEZIA. Sakatu ZURIUNEA edo SARTU tresna-barrako botoia aktibatzeko.' }, { name: 'Editorearen elkarrizketa-koadroa', legend: 'Elkarrizketa-koadro baten barruan sakatu TAB hurrengo elementura nabigatzeko, sakatu MAIUS+TAB aurreko elementura joateko, sakatu SARTU elkarrizketa-koadroa bidaltzeko eta sakatu ESC uzteko. Elkarrizketa-koadro batek hainbat fitxa dituenean, ALT+F10 erabiliz irits daiteke fitxen zerrendara, edo TAB erabiliz. Fokoa fitxen zerrendak duenean, aurreko eta hurrengo fitxetara joateko erabili EZKER-GEZIA eta ESKUIN-GEZIA.' }, { name: 'Editorearen testuinguru-menua', legend: 'Sakatu ${contextMenu} edo APLIKAZIO TEKLA testuinguru-menua irekitzeko. Menuko hurrengo aukerara joateko erabili TAB edo BEHERA GEZIA. Aurreko aukerara nabigatzeko erabili MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU menuko aukera hautatzeko. Ireki uneko aukeraren azpi-menua ZURIUNEA edo SARTU edo ESKUIN-GEZIA erabiliz. Menuko aukera gurasora itzultzeko erabili ESC edo EZKER-GEZIA. Testuinguru-menua ixteko sakatu ESC.' }, { name: 'Editorearen zerrenda-koadroa', legend: 'Zerrenda-koadro baten barruan, zerrendako hurrengo elementura joateko erabili TAB edo BEHERA GEZIA. Zerrendako aurreko elementura nabigatzeko MAIUS+TAB edo GORA GEZIA. Sakatu ZURIUNEA edo SARTU zerrendako aukera hautatzeko. Sakatu ESC zerrenda-koadroa ixteko.' }, { name: 'Editorearen elementuaren bide-barra', legend: 'Sakatu ${elementsPathFocus} elementuaren bide-barrara nabigatzeko. Hurrengo elementuaren botoira joateko erabili TAB edo ESKUIN-GEZIA. Aurreko botoira joateko aldiz erabili MAIUS+TAB edo EZKER-GEZIA. Elementua editorean hautatzeko sakatu ZURIUNEA edo SARTU.' } ] }, { name: 'Komandoak', items: [ { name: 'Desegin komandoa', legend: 'Sakatu ${undo}' }, { name: 'Berregin komandoa', legend: 'Sakatu ${redo}' }, { name: 'Lodia komandoa', legend: 'Sakatu ${bold}' }, { name: 'Etzana komandoa', legend: 'Sakatu ${italic}' }, { name: 'Azpimarratu komandoa', legend: 'Sakatu ${underline}' }, { name: 'Esteka komandoa', legend: 'Sakatu ${link}' }, { name: 'Tolestu tresna-barra komandoa', legend: 'Sakatu ${toolbarCollapse}' }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: 'Erabilerraztasunaren laguntza', legend: 'Sakatu ${a11yHelp}' }, { name: 'Itsatsi testu arrunt bezala', legend: 'Sakatu ${pastetext}', legendEdge: 'Sakatu ${pastetext} eta jarraian ${paste}' } ] } ], tab: 'Tabuladorea', pause: 'Pausatu', capslock: 'Blok Maius', escape: 'Ihes', pageUp: 'Orria gora', pageDown: 'Orria behera', leftArrow: 'Ezker-gezia', upArrow: 'Gora gezia', rightArrow: 'Eskuin-gezia', downArrow: 'Behera gezia', insert: 'Txertatu', leftWindowKey: 'Ezkerreko Windows tekla', rightWindowKey: 'Eskuineko Windows tekla', selectKey: 'Hautatu tekla', numpad0: 'Zenbakizko teklatua 0', numpad1: 'Zenbakizko teklatua 1', numpad2: 'Zenbakizko teklatua 2', numpad3: 'Zenbakizko teklatua 3', numpad4: 'Zenbakizko teklatua 4', numpad5: 'Zenbakizko teklatua 5', numpad6: 'Zenbakizko teklatua 6', numpad7: 'Zenbakizko teklatua 7', numpad8: 'Zenbakizko teklatua 8', numpad9: 'Zenbakizko teklatua 9', multiply: 'Biderkatu', add: 'Gehitu', subtract: 'Kendu', decimalPoint: 'Koma hamartarra', divide: 'Zatitu', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Blok Zenb', scrollLock: 'Blok Korr', semiColon: 'Puntu eta koma', equalSign: 'Berdin zeinua', comma: 'Koma', dash: 'Marratxoa', period: 'Puntua', forwardSlash: 'Barra', graveAccent: 'Azentu kamutsa', openBracket: 'Parentesia ireki', backSlash: 'Alderantzizko barra', closeBracket: 'Itxi parentesia', singleQuote: 'Komatxo bakuna' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/en-gb.js0000644000201500020150000001136114515446705025574 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'en-gb', { title: 'Accessibility Instructions', contents: 'Help Contents. To close this dialog press ESC.', // MISSING legend: [ { name: 'General', items: [ { name: 'Editor Toolbar', legend: 'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT+TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button. The focus will be moved back to the editing area upon activating the toolbar button.' // MISSING }, { name: 'Editor Dialog', legend: 'Inside a dialog, press TAB to navigate to the next dialog element, press SHIFT+TAB to move to the previous dialog element, press ENTER to submit the dialog, press ESC to cancel the dialog. When a dialog has multiple tabs, the tab list can be reached either with ALT+F10 or with TAB as part of the dialog tabbing order. With tab list focused, move to the next and previous tab with RIGHT and LEFT ARROW, respectively. Press ESC to discard changes and close the dialog. The focus will be moved back to the editing area upon leaving the dialog.' // MISSING }, { name: 'Editor Context Menu', legend: 'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.' // MISSING }, { name: 'Editor List Box', legend: 'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.' // MISSING }, { name: 'Editor Element Path Bar', legend: 'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.' // MISSING } ] }, { name: 'Commands', items: [ { name: ' Undo command', legend: 'Press ${undo}' }, { name: ' Redo command', legend: 'Press ${redo}' }, { name: ' Bold command', legend: 'Press ${bold}' }, { name: ' Italic command', legend: 'Press ${italic}' }, { name: ' Underline command', legend: 'Press ${underline}' }, { name: ' Link command', legend: 'Press ${link}' }, { name: ' Toolbar Collapse command', legend: 'Press ${toolbarCollapse}' }, { name: ' Access previous focus space command', // MISSING legend: 'Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Access next focus space command', // MISSING legend: 'Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.' // MISSING }, { name: ' Accessibility Help', legend: 'Press ${a11yHelp}' }, { name: ' Paste as plain text', // MISSING legend: 'Press ${pastetext}', // MISSING legendEdge: 'Press ${pastetext}, followed by ${paste}' // MISSING } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'Left Arrow', upArrow: 'Up Arrow', rightArrow: 'Right Arrow', downArrow: 'Down Arrow', insert: 'Insert', leftWindowKey: 'Left Windows key', rightWindowKey: 'Right Windows key', selectKey: 'Select key', numpad0: 'Numpad 0', numpad1: 'Numpad 1', numpad2: 'Numpad 2', numpad3: 'Numpad 3', numpad4: 'Numpad 4', numpad5: 'Numpad 5', numpad6: 'Numpad 6', numpad7: 'Numpad 7', numpad8: 'Numpad 8', numpad9: 'Numpad 9', multiply: 'Multiply', add: 'Add', subtract: 'Subtract', decimalPoint: 'Decimal Point', divide: 'Divide', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Semicolon', equalSign: 'Equal Sign', comma: 'Comma', dash: 'Dash', period: 'Period', forwardSlash: 'Forward Slash', graveAccent: 'Grave Accent', openBracket: 'Open Bracket', backSlash: 'Backslash', closeBracket: 'Close Bracket', singleQuote: 'Single Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/a11yhelp/dialogs/lang/hu.js0000644000201500020150000001222514515446705025220 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'a11yhelp', 'hu', { title: 'Kisegítő utasítások', contents: 'Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.', legend: [ { name: 'Általános', items: [ { name: 'Szerkesztő Eszköztár', legend: 'Nyomjon ${toolbarFocus} hogy kijelölje az eszköztárat. A következő és előző eszköztár csoporthoz a TAB és SHIFT+TAB-al juthat el. A következő és előző eszköztár gombhoz a BAL NYÍL vagy JOBB NYÍL gombbal juthat el. Nyomjon SPACE-t vagy ENTER-t hogy aktiválja az eszköztár gombot.' }, { name: 'Szerkesző párbeszéd ablak', legend: 'Párbeszédablakban nyomjon TAB-ot a következő párbeszédmezőhöz ugráshoz, nyomjon SHIFT + TAB-ot az előző mezőhöz ugráshoz, nyomjon ENTER-t a párbeszédablak elfogadásához, nyomjon ESC-et a párbeszédablak elvetéséhez. Azokhoz a párbeszédablakokhoz, amik több fület tartalmaznak, nyomjon ALT + F10-et vagy TAB-ot hogy a fülekre ugorjon. Ezután a TAB-al vagy a JOBB NYÍLLAL a következő fülre ugorhat.' }, { name: 'Szerkesztő helyi menü', legend: 'Nyomjon ${contextMenu}-t vagy ALKALMAZÁS BILLENTYŰT a helyi menü megnyitásához. Ezután a következő menüpontra léphet a TAB vagy LEFELÉ NYÍLLAL. Az előző opciót a SHIFT+TAB vagy FELFELÉ NYÍLLAL érheti el. Nyomjon SPACE-t vagy ENTER-t a menüpont kiválasztásához. A jelenlegi menüpont almenüjének megnyitásához nyomjon SPACE-t vagy ENTER-t, vagy JOBB NYILAT. A főmenühöz való visszatéréshez nyomjon ESC-et vagy BAL NYILAT. A helyi menü bezárása az ESC billentyűvel lehetséges.' }, { name: 'Szerkesztő lista', legend: 'A listán belül a következő elemre a TAB vagy LEFELÉ NYÍLLAL mozoghat. Az előző elem kiválasztásához nyomjon SHIFT+TAB-ot vagy FELFELÉ NYILAT. Nyomjon SPACE-t vagy ENTER-t az elem kiválasztásához. Az ESC billentyű megnyomásával bezárhatja a listát.' }, { name: 'Szerkesztő elem utak sáv', legend: 'Nyomj ${elementsPathFocus} hogy kijelöld a elemek út sávját. A következő elem gombhoz a TAB-al vagy a JOBB NYÍLLAL juthatsz el. Az előző gombhoz a SHIFT+TAB vagy BAL NYÍLLAL mehetsz. A SPACE vagy ENTER billentyűvel kiválaszthatod az elemet a szerkesztőben.' } ] }, { name: 'Parancsok', items: [ { name: 'Parancs visszavonása', legend: 'Nyomj ${undo}' }, { name: 'Parancs megismétlése', legend: 'Nyomjon ${redo}' }, { name: 'Félkövér parancs', legend: 'Nyomjon ${bold}' }, { name: 'Dőlt parancs', legend: 'Nyomjon ${italic}' }, { name: 'Aláhúzott parancs', legend: 'Nyomjon ${underline}' }, { name: 'Link parancs', legend: 'Nyomjon ${link}' }, { name: 'Szerkesztősáv összecsukása parancs', legend: 'Nyomjon ${toolbarCollapse}' }, { name: 'Hozzáférés az előző fókusz helyhez parancs', legend: 'Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel előtt, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket.' }, { name: 'Hozzáférés a következő fókusz helyhez parancs', legend: 'Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel után, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket.' }, { name: 'Kisegítő súgó', legend: 'Nyomjon ${a11yHelp}' }, { name: 'Beillesztés egyszerű szövegként', legend: 'Nyomja meg: ${pastetext}', legendEdge: 'Nyomjon ${pastetext}-t, majd ${paste}-t' } ] } ], tab: 'Tab', pause: 'Pause', capslock: 'Caps Lock', escape: 'Escape', pageUp: 'Page Up', pageDown: 'Page Down', leftArrow: 'balra nyíl', upArrow: 'felfelé nyíl', rightArrow: 'jobbra nyíl', downArrow: 'lefelé nyíl', insert: 'Insert', leftWindowKey: 'bal Windows-billentyű', rightWindowKey: 'jobb Windows-billentyű', selectKey: 'Billentyű választása', numpad0: 'Számbillentyűk 0', numpad1: 'Számbillentyűk 1', numpad2: 'Számbillentyűk 2', numpad3: 'Számbillentyűk 3', numpad4: 'Számbillentyűk 4', numpad5: 'Számbillentyűk 5', numpad6: 'Számbillentyűk 6', numpad7: 'Számbillentyűk 7', numpad8: 'Számbillentyűk 8', numpad9: 'Számbillentyűk 9', multiply: 'Szorzás', add: 'Hozzáadás', subtract: 'Kivonás', decimalPoint: 'Tizedespont', divide: 'Osztás', f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11', f12: 'F12', numLock: 'Num Lock', scrollLock: 'Scroll Lock', semiColon: 'Pontosvessző', equalSign: 'Egyenlőségjel', comma: 'Vessző', dash: 'Kötőjel', period: 'Pont', forwardSlash: 'Perjel', graveAccent: 'Visszafelé dőlő ékezet', openBracket: 'Nyitó szögletes zárójel', backSlash: 'fordított perjel', closeBracket: 'Záró szögletes zárójel', singleQuote: 'szimpla idézőjel' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/0000755000201500020150000000000014515446705022425 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/plugin.js0000755000201500020150000002052114515446705024264 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ ( function() { function noBlockLeft( bqBlock ) { for ( var i = 0, length = bqBlock.getChildCount(), child; i < length && ( child = bqBlock.getChild( i ) ); i++ ) { if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() ) return false; } return true; } var commandObject = { exec: function( editor ) { var state = editor.getCommand( 'blockquote' ).state, selection = editor.getSelection(), range = selection && selection.getRanges()[ 0 ]; if ( !range ) return; var bookmarks = selection.createBookmarks(); // Kludge for https://dev.ckeditor.com/ticket/1592: if the bookmark nodes are in the beginning of // blockquote, then move them to the nearest block element in the // blockquote. if ( CKEDITOR.env.ie ) { var bookmarkStart = bookmarks[ 0 ].startNode, bookmarkEnd = bookmarks[ 0 ].endNode, cursor; if ( bookmarkStart && bookmarkStart.getParent().getName() == 'blockquote' ) { cursor = bookmarkStart; while ( ( cursor = cursor.getNext() ) ) { if ( cursor.type == CKEDITOR.NODE_ELEMENT && cursor.isBlockBoundary() ) { bookmarkStart.move( cursor, true ); break; } } } if ( bookmarkEnd && bookmarkEnd.getParent().getName() == 'blockquote' ) { cursor = bookmarkEnd; while ( ( cursor = cursor.getPrevious() ) ) { if ( cursor.type == CKEDITOR.NODE_ELEMENT && cursor.isBlockBoundary() ) { bookmarkEnd.move( cursor ); break; } } } } var iterator = range.createIterator(), block; iterator.enlargeBr = editor.config.enterMode != CKEDITOR.ENTER_BR; if ( state == CKEDITOR.TRISTATE_OFF ) { var paragraphs = []; while ( ( block = iterator.getNextParagraph() ) ) paragraphs.push( block ); // If no paragraphs, create one from the current selection position. if ( paragraphs.length < 1 ) { var para = editor.document.createElement( editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ), firstBookmark = bookmarks.shift(); range.insertNode( para ); para.append( new CKEDITOR.dom.text( '\ufeff', editor.document ) ); range.moveToBookmark( firstBookmark ); range.selectNodeContents( para ); range.collapse( true ); firstBookmark = range.createBookmark(); paragraphs.push( para ); bookmarks.unshift( firstBookmark ); } // Make sure all paragraphs have the same parent. var commonParent = paragraphs[ 0 ].getParent(), tmp = []; for ( var i = 0; i < paragraphs.length; i++ ) { block = paragraphs[ i ]; commonParent = commonParent.getCommonAncestor( block.getParent() ); } // The common parent must not be the following tags: table, tbody, tr, ol, ul. var denyTags = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; while ( denyTags[ commonParent.getName() ] ) commonParent = commonParent.getParent(); // Reconstruct the block list to be processed such that all resulting blocks // satisfy parentNode.equals( commonParent ). var lastBlock = null; while ( paragraphs.length > 0 ) { block = paragraphs.shift(); while ( !block.getParent().equals( commonParent ) ) block = block.getParent(); if ( !block.equals( lastBlock ) ) tmp.push( block ); lastBlock = block; } // If any of the selected blocks is a blockquote, remove it to prevent // nested blockquotes. while ( tmp.length > 0 ) { block = tmp.shift(); if ( block.getName() == 'blockquote' ) { var docFrag = new CKEDITOR.dom.documentFragment( editor.document ); while ( block.getFirst() ) { docFrag.append( block.getFirst().remove() ); paragraphs.push( docFrag.getLast() ); } docFrag.replace( block ); } else { paragraphs.push( block ); } } // Now we have all the blocks to be included in a new blockquote node. var bqBlock = editor.document.createElement( 'blockquote' ); bqBlock.insertBefore( paragraphs[ 0 ] ); while ( paragraphs.length > 0 ) { block = paragraphs.shift(); bqBlock.append( block ); } } else if ( state == CKEDITOR.TRISTATE_ON ) { var moveOutNodes = [], database = {}; while ( ( block = iterator.getNextParagraph() ) ) { var bqParent = null, bqChild = null; while ( block.getParent() ) { if ( block.getParent().getName() == 'blockquote' ) { bqParent = block.getParent(); bqChild = block; break; } block = block.getParent(); } // Remember the blocks that were recorded down in the moveOutNodes array // to prevent duplicates. if ( bqParent && bqChild && !bqChild.getCustomData( 'blockquote_moveout' ) ) { moveOutNodes.push( bqChild ); CKEDITOR.dom.element.setMarker( database, bqChild, 'blockquote_moveout', true ); } } CKEDITOR.dom.element.clearAllMarkers( database ); var movedNodes = [], processedBlockquoteBlocks = []; database = {}; while ( moveOutNodes.length > 0 ) { var node = moveOutNodes.shift(); bqBlock = node.getParent(); // If the node is located at the beginning or the end, just take it out // without splitting. Otherwise, split the blockquote node and move the // paragraph in between the two blockquote nodes. if ( !node.getPrevious() ) node.remove().insertBefore( bqBlock ); else if ( !node.getNext() ) node.remove().insertAfter( bqBlock ); else { node.breakParent( node.getParent() ); processedBlockquoteBlocks.push( node.getNext() ); } // Remember the blockquote node so we can clear it later (if it becomes empty). if ( !bqBlock.getCustomData( 'blockquote_processed' ) ) { processedBlockquoteBlocks.push( bqBlock ); CKEDITOR.dom.element.setMarker( database, bqBlock, 'blockquote_processed', true ); } movedNodes.push( node ); } CKEDITOR.dom.element.clearAllMarkers( database ); // Clear blockquote nodes that have become empty. for ( i = processedBlockquoteBlocks.length - 1; i >= 0; i-- ) { bqBlock = processedBlockquoteBlocks[ i ]; if ( noBlockLeft( bqBlock ) ) bqBlock.remove(); } if ( editor.config.enterMode == CKEDITOR.ENTER_BR ) { var firstTime = true; while ( movedNodes.length ) { node = movedNodes.shift(); if ( node.getName() == 'div' ) { docFrag = new CKEDITOR.dom.documentFragment( editor.document ); var needBeginBr = firstTime && node.getPrevious() && !( node.getPrevious().type == CKEDITOR.NODE_ELEMENT && node.getPrevious().isBlockBoundary() ); if ( needBeginBr ) docFrag.append( editor.document.createElement( 'br' ) ); var needEndBr = node.getNext() && !( node.getNext().type == CKEDITOR.NODE_ELEMENT && node.getNext().isBlockBoundary() ); while ( node.getFirst() ) node.getFirst().remove().appendTo( docFrag ); if ( needEndBr ) docFrag.append( editor.document.createElement( 'br' ) ); docFrag.replace( node ); firstTime = false; } } } } selection.selectBookmarks( bookmarks ); editor.focus(); }, refresh: function( editor, path ) { // Check if inside of blockquote. var firstBlock = path.block || path.blockLimit; this.setState( editor.elementPath( firstBlock ).contains( 'blockquote', 1 ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF ); }, context: 'blockquote', allowedContent: 'blockquote', requiredContent: 'blockquote' }; CKEDITOR.plugins.add( 'blockquote', { // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'blockquote', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { if ( editor.blockless ) return; editor.addCommand( 'blockquote', commandObject ); editor.ui.addButton && editor.ui.addButton( 'Blockquote', { isToggle: true, label: editor.lang.blockquote.toolbar, command: 'blockquote', toolbar: 'blocks,10' } ); } } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/0000755000201500020150000000000014515446705023346 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/zh.js0000644000201500020150000000035714515446705024332 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'zh', { toolbar: '引用段落' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/nb.js0000644000201500020150000000035514515446705024306 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'nb', { toolbar: 'Blokksitat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/eo.js0000644000201500020150000000035214515446705024307 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'eo', { toolbar: 'Citaĵo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/es.js0000644000201500020150000000034714515446705024317 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'es', { toolbar: 'Cita' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ro.js0000644000201500020150000000035014515446705024322 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ro', { toolbar: 'Citat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/hr.js0000644000201500020150000000035014515446705024313 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'hr', { toolbar: 'Citat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/it.js0000644000201500020150000000035414515446705024322 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'it', { toolbar: 'Citazione' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/de-ch.js0000644000201500020150000000036014515446705024663 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'de-ch', { toolbar: 'Zitatblock' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/sk.js0000644000201500020150000000035314515446705024322 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'sk', { toolbar: 'Citácia' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/az.js0000644000201500020150000000035614515446705024322 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'az', { toolbar: 'Sitat bloku' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/pt.js0000644000201500020150000000036514515446705024333 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'pt', { toolbar: 'Bloco de citação' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/si.js0000644000201500020150000000040214515446705024313 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'si', { toolbar: 'උද්ධෘත කොටස' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ko.js0000644000201500020150000000036014515446705024314 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ko', { toolbar: '인용 단락' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/mk.js0000644000201500020150000000037214515446705024315 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'mk', { toolbar: 'Одвоен цитат' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/cy.js0000644000201500020150000000036014515446705024316 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'cy', { toolbar: 'Dyfyniad bloc' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/uk.js0000644000201500020150000000035714515446705024330 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'uk', { toolbar: 'Цитата' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/zh-cn.js0000644000201500020150000000035714515446705024730 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'zh-cn', { toolbar: '块引用' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/sv.js0000644000201500020150000000035514515446705024337 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'sv', { toolbar: 'Blockcitat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/lt.js0000644000201500020150000000035114515446705024322 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'lt', { toolbar: 'Citata' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/is.js0000644000201500020150000000035614515446705024323 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'is', { toolbar: 'Inndráttur' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/fr-ca.js0000644000201500020150000000035614515446705024700 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'fr-ca', { toolbar: 'Citation' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/et.js0000644000201500020150000000035714515446705024321 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'et', { toolbar: 'Blokktsitaat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/bs.js0000644000201500020150000000037114515446705024311 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'bs', { toolbar: 'Block Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/pl.js0000644000201500020150000000035014515446705024315 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'pl', { toolbar: 'Cytat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/bg.js0000644000201500020150000000037314515446705024277 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'bg', { toolbar: 'Блок за цитат' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/fa.js0000644000201500020150000000037114515446705024273 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'fa', { toolbar: 'بلوک نقل قول' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ku.js0000644000201500020150000000042714515446705024326 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ku', { toolbar: 'بەربەستکردنی ووتەی وەرگیراو' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/bn.js0000644000201500020150000000037114515446705024304 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'bn', { toolbar: 'Block Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/el.js0000644000201500020150000000040414515446705024302 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'el', { toolbar: 'Περιοχή Παράθεσης' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/fi.js0000644000201500020150000000035214515446705024302 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'fi', { toolbar: 'Lainaus' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ru.js0000644000201500020150000000035714515446705024337 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ru', { toolbar: 'Цитата' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/gl.js0000644000201500020150000000034714515446705024312 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'gl', { toolbar: 'Cita' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/sr-latn.js0000644000201500020150000000036214515446705025265 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'sr-latn', { toolbar: 'Blok citat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/oc.js0000644000201500020150000000035314515446705024306 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'oc', { toolbar: 'Citacion' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/sq.js0000644000201500020150000000035514515446705024332 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'sq', { toolbar: 'Thonjëzat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/pt-br.js0000644000201500020150000000035714515446705024735 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'pt-br', { toolbar: 'Citação' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/fo.js0000644000201500020150000000035514515446705024313 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'fo', { toolbar: 'Blockquote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/af.js0000644000201500020150000000035514515446705024275 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'af', { toolbar: 'Sitaatblok' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/hi.js0000644000201500020150000000037414515446705024310 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'hi', { toolbar: 'ब्लॉक-कोट' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/km.js0000644000201500020150000000043114515446705024311 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'km', { toolbar: 'ប្លក់​ពាក្យ​សម្រង់' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/nl.js0000644000201500020150000000035514515446705024320 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'nl', { toolbar: 'Citaatblok' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ka.js0000644000201500020150000000036514515446705024303 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ka', { toolbar: 'ციტატა' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/es-mx.js0000644000201500020150000000036414515446705024740 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'es-mx', { toolbar: 'Entrecomillado' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/mn.js0000644000201500020150000000037014515446705024316 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'mn', { toolbar: 'Ишлэл хэсэг' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/da.js0000644000201500020150000000035414515446705024272 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'da', { toolbar: 'Blokcitat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/he.js0000644000201500020150000000036614515446705024305 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'he', { toolbar: 'בלוק ציטוט' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ca.js0000644000201500020150000000035714515446705024274 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ca', { toolbar: 'Bloc de cita' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/gu.js0000644000201500020150000000043714515446705024323 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'gu', { toolbar: 'બ્લૉક-કોટ, અવતરણચિહ્નો' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ms.js0000644000201500020150000000037114515446705024324 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ms', { toolbar: 'Block Quote' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/th.js0000644000201500020150000000035614515446705024323 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'th', { toolbar: 'Block Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/de.js0000644000201500020150000000035514515446705024277 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'de', { toolbar: 'Zitatblock' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/en-ca.js0000644000201500020150000000036114515446705024667 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'en-ca', { toolbar: 'Block Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/tt.js0000644000201500020150000000037214515446705024335 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'tt', { toolbar: 'Өземтә блогы' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/vi.js0000644000201500020150000000036614515446705024327 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'vi', { toolbar: 'Khối trích dẫn' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/cs.js0000644000201500020150000000035114515446705024310 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'cs', { toolbar: 'Citace' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/tr.js0000644000201500020150000000036014515446705024330 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'tr', { toolbar: 'Blok Oluştur' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ja.js0000644000201500020150000000037014515446705024276 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ja', { toolbar: 'ブロック引用文' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/sl.js0000644000201500020150000000035014515446705024320 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'sl', { toolbar: 'Citat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/lv.js0000644000201500020150000000036014515446705024324 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'lv', { toolbar: 'Bloka citāts' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/en-au.js0000644000201500020150000000036114515446705024711 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'en-au', { toolbar: 'Block Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/en.js0000644000201500020150000000035614515446705024312 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'en', { toolbar: 'Block Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/no.js0000644000201500020150000000035514515446705024323 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'no', { toolbar: 'Blokksitat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/fr.js0000644000201500020150000000035314515446705024314 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'fr', { toolbar: 'Citation' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/id.js0000644000201500020150000000035714515446705024305 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'id', { toolbar: 'Kutipan Blok' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ug.js0000644000201500020150000000037014515446705024317 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ug', { toolbar: 'بۆلەك نەقىل' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/ar.js0000644000201500020150000000035714515446705024313 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'ar', { toolbar: 'اقتباس' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/sr.js0000644000201500020150000000036614515446705024335 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'sr', { toolbar: 'Блок цитат' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/eu.js0000644000201500020150000000036114515446705024315 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'eu', { toolbar: 'Aipamen blokea' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/en-gb.js0000644000201500020150000000036114515446705024674 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'en-gb', { toolbar: 'Block Quote' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/lang/hu.js0000644000201500020150000000036014515446705024317 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'blockquote', 'hu', { toolbar: 'Idézet blokk' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/icons/0000755000201500020150000000000014503523375023534 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/icons/hidpi/0000755000201500020150000000000014503523375024631 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/icons/hidpi/blockquote.png0000644000201500020150000000255314503523375027514 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !oIDATXWMh$E^U`Ildr2<BrQxZ.búW5  l@H@AUG/!`HdLVWzfMWW{{UO1Rnݛyo!DM ,Zkcr,Rs =??/I !R&T^d}GE  Ic@C#B"TBhff!t 3!9B|vs@~ډ襔k W.cΊ?ǖy 2uCF3Z_&g<_wtvvq ČEngfdc\9ڷj?:Z\\ a!-c'CDQ*2224MUgYs\Zc* a *XJf-_Ⳣ̎8Wƾˍ1ZWjN:0>raۤzȲe?3R@k]eYe@p =4hl?juT*7@z8zFJjͷؾ "c^7[֡\JyՈ|i$I^mc>!B1~с% &IFmn;Ro `#wq0zP.|}}I\;j)f(Rl&,3OD1Chff!VuYkloo?t%垭۰2,:Ɛ$ t^xP.s2TneDA933vwwܜ8??T.'!~s#(0<Ynivv݈iboAwk eDEֵ݅PLNNB)fi:TUuЧ">H6qrrst]wG\]]0ǓĻD%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/blockquote/icons/blockquote.png0000644000201500020150000000131414503523375026411 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8mA*z&&9EO!HVI$>> ^| 7]xe0DIty$LACw_U]%3@DPUT"BYxOp 3p8͝;{_ٛ"gsӢ(03upY8瞈ryO2NQ 3if\zEQ_38_eyoߗ釐%f0@Y\PEǍ6}s b>$ &"tݚ>S/$ߓɄv+GU!d6լZUUIE'}q,H칈,U`0 Cph%pI<fl"ȲVD_rnKU_~9% QdY*E#3Nsrw"b6H'v>@&)u%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/0000755000201500020150000000000014515446712022616 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/plugin.js0000644000201500020150000001624514515446712024462 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ ( function() { 'use strict'; CKEDITOR.plugins.add( 'stylescombo', { requires: 'richcombo', // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength init: function( editor ) { var config = editor.config, lang = editor.lang.stylescombo, styles = {}, stylesList = [], combo, allowedContent = []; editor.on( 'stylesSet', function( evt ) { var stylesDefinitions = evt.data.styles; if ( !stylesDefinitions ) return; var style, styleName, styleType; // Put all styles into an Array. for ( var i = 0, count = stylesDefinitions.length; i < count; i++ ) { var styleDefinition = stylesDefinitions[ i ]; if ( editor.blockless && ( styleDefinition.element in CKEDITOR.dtd.$block ) || ( typeof styleDefinition.type == 'string' && !CKEDITOR.style.customHandlers[ styleDefinition.type ] ) ) { continue; } styleName = styleDefinition.name; style = new CKEDITOR.style( styleDefinition ); if ( !editor.filter.customConfig || editor.filter.check( style ) ) { style._name = styleName; style._.enterMode = config.enterMode; // Get the type (which will be used to assign style to one of 3 groups) from assignedTo if it's defined. style._.type = styleType = style.assignedTo || style.type; // Weight is used to sort styles (https://dev.ckeditor.com/ticket/9029). style._.weight = i + ( styleType == CKEDITOR.STYLE_OBJECT ? 1 : styleType == CKEDITOR.STYLE_BLOCK ? 2 : 3 ) * 1000; styles[ styleName ] = style; stylesList.push( style ); allowedContent.push( style ); } } // Sorts the Array, so the styles get grouped by type in proper order (https://dev.ckeditor.com/ticket/9029). stylesList.sort( function( styleA, styleB ) { return styleA._.weight - styleB._.weight; } ); } ); // (#3649) editor.on( 'stylesRemove', function( evt ) { var type = evt.data && evt.data.type, allowAll = type === undefined; for ( var styleName in styles ) { var style = styles[ styleName ]; if ( allowAll || style.type === type ) { editor.removeStyle( style ); } } } ); editor.ui.addRichCombo( 'Styles', { label: lang.label, title: lang.panelTitle, toolbar: 'styles,10', allowedContent: allowedContent, panel: { css: [ CKEDITOR.skin.getPath( 'editor' ) ].concat( config.contentsCss ), multiSelect: true, attributes: { 'aria-label': lang.panelTitle } }, init: function() { var style, styleName, lastType, type, i, count; // Loop over the Array, adding all items to the // combo. for ( i = 0, count = stylesList.length; i < count; i++ ) { style = stylesList[ i ]; styleName = style._name; type = style._.type; if ( type != lastType ) { this.startGroup( lang[ 'panelTitle' + String( type ) ] ); lastType = type; } this.add( styleName, style.type == CKEDITOR.STYLE_OBJECT ? styleName : style.buildPreview(), styleName ); } this.commit(); }, onClick: function( value ) { editor.focus(); editor.fire( 'saveSnapshot' ); var style = styles[ value ], elementPath = editor.elementPath(); // When more then one style from the same group is active ( which is not ok ), // remove all other styles from this group and apply selected style. if ( style.group && style.removeStylesFromSameGroup( editor ) ) { editor.applyStyle( style ); } else { editor[ style.checkActive( elementPath, editor ) ? 'removeStyle' : 'applyStyle' ]( style ); } editor.fire( 'saveSnapshot' ); }, onRender: function() { editor.on( 'selectionChange', function( ev ) { var currentValue = this.getValue(), elementPath = ev.data.path, elements = elementPath.elements; // For each element into the elements path. for ( var i = 0, count = elements.length, element; i < count; i++ ) { element = elements[ i ]; // Check if the element is removable by any of // the styles. for ( var value in styles ) { if ( styles[ value ].checkElementRemovable( element, true, editor ) ) { if ( value != currentValue ) this.setValue( value ); return; } } } // If no styles match, just empty it. this.setValue( '' ); }, this ); }, onOpen: function() { var selection = editor.getSelection(), // When editor is focused but is returned `null` as selected element, then return editable (#646). // In case when selection dosen't cover whole element, we try to return element where selection starts (#862). element = selection.getSelectedElement() || selection.getStartElement() || editor.editable(), elementPath = editor.elementPath( element ), counter = [ 0, 0, 0, 0 ]; this.showAll(); this.unmarkAll(); for ( var name in styles ) { var style = styles[ name ], type = style._.type; if ( style.checkApplicable( elementPath, editor, editor.activeFilter ) ) counter[ type ]++; else this.hideItem( name ); if ( style.checkActive( elementPath, editor ) ) this.mark( name ); } if ( !counter[ CKEDITOR.STYLE_BLOCK ] ) this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] ); if ( !counter[ CKEDITOR.STYLE_INLINE ] ) this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] ); if ( !counter[ CKEDITOR.STYLE_OBJECT ] ) this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] ); }, refresh: function() { var elementPath = editor.elementPath(); if ( !elementPath ) return; for ( var name in styles ) { var style = styles[ name ]; if ( style.checkApplicable( elementPath, editor, editor.activeFilter ) ) return; } this.setState( CKEDITOR.TRISTATE_DISABLED ); }, // Force a reload of the data reset: function() { if ( combo ) { delete combo._.panel; delete combo._.list; combo._.committed = 0; combo._.items = {}; combo._.state = CKEDITOR.TRISTATE_OFF; } styles = {}; stylesList = []; } } ); } } ); } )(); /** * Removes styles from the current editor selection. * * Note that you can pass the `type` option to limit removing styles to the given type. * * ```js * editor.fire( 'stylesRemove', { type: CKEDITOR.STYLE_BLOCK } ); * ``` * * @since 4.15.1 * @event stylesRemove * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param data * @param {Number} [data.type] Style type, see {@link CKEDITOR#STYLE_INLINE INLINE}/{@link CKEDITOR#STYLE_BLOCK BLOCK}/{@link CKEDITOR#STYLE_OBJECT OBJECT} style options. */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/0000755000201500020150000000000014515446712023537 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/zh.js0000644000201500020150000000054214515446712024517 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'zh', { label: '樣式', panelTitle: '格式化樣式', panelTitle1: '區塊樣式', panelTitle2: '內嵌樣式', panelTitle3: '物件樣式' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/nb.js0000644000201500020150000000053414515446712024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'nb', { label: 'Stil', panelTitle: 'Stilformater', panelTitle1: 'Blokkstiler', panelTitle2: 'Inlinestiler', panelTitle3: 'Objektstiler' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/eo.js0000644000201500020150000000056414515446712024505 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'eo', { label: 'Stiloj', panelTitle: 'Stiloj pri enpaĝigo', panelTitle1: 'Stiloj de blokoj', panelTitle2: 'Enliniaj Stiloj', panelTitle3: 'Stiloj de objektoj' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/es.js0000644000201500020150000000057514515446712024513 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'es', { label: 'Estilo', panelTitle: 'Estilos para formatear', panelTitle1: 'Estilos de párrafo', panelTitle2: 'Estilos de carácter', panelTitle3: 'Estilos de objeto' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ro.js0000644000201500020150000000055614515446712024523 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ro', { label: 'Stil', panelTitle: 'Formatare stilurilor', panelTitle1: 'Bloc stiluri', panelTitle2: 'Stiluri înșiruite', panelTitle3: 'Stiluri obiect' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/hr.js0000644000201500020150000000055214515446712024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'hr', { label: 'Stil', panelTitle: 'Stilovi formatiranja', panelTitle1: 'Block stilovi', panelTitle2: 'Inline stilovi', panelTitle3: 'Object stilovi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/it.js0000644000201500020150000000056414515446712024516 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'it', { label: 'Stili', panelTitle: 'Stili di formattazione', panelTitle1: 'Stili per blocchi', panelTitle2: 'Stili in linea', panelTitle3: 'Stili per oggetti' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/de-ch.js0000644000201500020150000000054514515446712025061 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'de-ch', { label: 'Stil', panelTitle: 'Formatierungsstile', panelTitle1: 'Blockstile', panelTitle2: 'Inline Stilart', panelTitle3: 'Objektstile' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/sk.js0000644000201500020150000000056214515446712024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'sk', { label: 'Štýly', panelTitle: 'Formátovanie štýlov', panelTitle1: 'Štýly bloku', panelTitle2: 'Znakové štýly', panelTitle3: 'Štýly objektu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/az.js0000644000201500020150000000060514515446712024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'az', { label: 'Üslub', panelTitle: 'Format üslubları', panelTitle1: 'Blokların üslubları', panelTitle2: 'Sözlərin üslubları', panelTitle3: 'Obyektlərin üslubları' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/pt.js0000644000201500020150000000057514515446712024527 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'pt', { label: 'Estilos', panelTitle: 'Estilos de formatação', panelTitle1: 'Estilos de bloco', panelTitle2: 'Estilos nas etiquetas', panelTitle3: 'Estilos em objeto' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/si.js0000644000201500020150000000063614515446712024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'si', { label: 'විලාසය', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ko.js0000644000201500020150000000057414515446712024514 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ko', { label: '스타일', panelTitle: '전체 구성 스타일', panelTitle1: '블록 스타일', panelTitle2: '인라인 스타일', panelTitle3: '객체 스타일' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/mk.js0000644000201500020150000000062214515446712024504 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'mk', { label: 'Styles', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/cy.js0000644000201500020150000000057314515446712024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'cy', { label: 'Arddulliau', panelTitle: 'Arddulliau Fformatio', panelTitle1: 'Arddulliau Bloc', panelTitle2: 'Arddulliau Mewnol', panelTitle3: 'Arddulliau Gwrthrych' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/uk.js0000644000201500020150000000064114515446712024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'uk', { label: 'Стиль', panelTitle: 'Стилі форматування', panelTitle1: 'Блочні стилі', panelTitle2: 'Рядкові стилі', panelTitle3: 'Об\'єктні стилі' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/zh-cn.js0000644000201500020150000000055614515446712025122 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'zh-cn', { label: '样式', panelTitle: '样式', panelTitle1: '块级元素样式', panelTitle2: '内联元素样式', panelTitle3: '对象元素样式' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/sv.js0000644000201500020150000000055114515446712024526 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'sv', { label: 'Stilar', panelTitle: 'Formateringsstilar', panelTitle1: 'Blockstilar', panelTitle2: 'Inbäddade stilar', panelTitle3: 'Objektstilar' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/lt.js0000644000201500020150000000056214515446712024517 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'lt', { label: 'Stilius', panelTitle: 'Stilių formatavimas', panelTitle1: 'Blokų stiliai', panelTitle2: 'Vidiniai stiliai', panelTitle3: 'Objektų stiliai' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/is.js0000644000201500020150000000063014515446712024507 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'is', { label: 'Stílflokkur', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/fr-ca.js0000644000201500020150000000056314515446712025071 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'fr-ca', { label: 'Styles', panelTitle: 'Styles de formattage', panelTitle1: 'Styles de block', panelTitle2: 'Styles en ligne', panelTitle3: 'Styles d\'objet' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/et.js0000644000201500020150000000055214515446712024507 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'et', { label: 'Stiil', panelTitle: 'Vormindusstiilid', panelTitle1: 'Blokkstiilid', panelTitle2: 'Reasisesed stiilid', panelTitle3: 'Objektistiilid' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/bs.js0000644000201500020150000000062014515446712024477 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'bs', { label: 'Stil', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/pl.js0000644000201500020150000000055014515446712024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'pl', { label: 'Styl', panelTitle: 'Style formatujące', panelTitle1: 'Style blokowe', panelTitle2: 'Style liniowe', panelTitle3: 'Style obiektowe' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/bg.js0000644000201500020150000000067214515446712024472 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'bg', { label: 'Стилове', panelTitle: 'Стилове за форматиране', panelTitle1: 'Блокови стилове', panelTitle2: 'Поредови стилове', panelTitle3: 'Обектни стилове' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/fa.js0000644000201500020150000000061714515446712024467 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'fa', { label: 'سبک', panelTitle: 'سبکهای قالببندی', panelTitle1: 'سبکهای بلوک', panelTitle2: 'سبکهای درونخطی', panelTitle3: 'سبکهای شیء' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ku.js0000644000201500020150000000063114515446712024514 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ku', { label: 'شێواز', panelTitle: 'شێوازی ڕازاندنەوە', panelTitle1: 'شێوازی خشت', panelTitle2: 'شێوازی ناوهێڵ', panelTitle3: 'شێوازی بەرکار' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/bn.js0000644000201500020150000000062514515446712024477 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'bn', { label: 'ধরন', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/el.js0000644000201500020150000000065014515446712024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'el', { label: 'Μορφές', panelTitle: 'Στυλ Μορφοποίησης', panelTitle1: 'Στυλ Τμημάτων', panelTitle2: 'Στυλ Εν Σειρά', panelTitle3: 'Στυλ Αντικειμένων' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/fi.js0000644000201500020150000000056414515446712024500 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'fi', { label: 'Tyyli', panelTitle: 'Muotoilujen tyylit', panelTitle1: 'Lohkojen tyylit', panelTitle2: 'Rivinsisäiset tyylit', panelTitle3: 'Objektien tyylit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ru.js0000644000201500020150000000064314515446712024526 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ru', { label: 'Стили', panelTitle: 'Стили форматирования', panelTitle1: 'Стили блока', panelTitle2: 'Стили элемента', panelTitle3: 'Стили объекта' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/gl.js0000644000201500020150000000057014515446712024501 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'gl', { label: 'Estilos', panelTitle: 'Estilos de formatando', panelTitle1: 'Estilos de bloque', panelTitle2: 'Estilos de liña', panelTitle3: 'Estilos de obxecto' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/sr-latn.js0000644000201500020150000000055714515446712025464 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'sr-latn', { label: 'Stil', panelTitle: 'Stilovi formatiranja', panelTitle1: 'Blok stilovi', panelTitle2: 'Inline stilovi', panelTitle3: 'Stilovi objekta' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/oc.js0000644000201500020150000000056714515446712024506 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'oc', { label: 'Estils', panelTitle: 'Estils de mesa en pagina', panelTitle1: 'Estils de blòt', panelTitle2: 'Estils en linha', panelTitle3: 'Estils d\'objècte' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/sq.js0000644000201500020150000000056514515446712024526 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'sq', { label: 'Stilet', panelTitle: 'Formatimi i Stileve', panelTitle1: 'Stilet e Bllokut', panelTitle2: 'Stilet e Brendshme', panelTitle3: 'Stilet e Objektit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/pt-br.js0000644000201500020150000000060214515446712025117 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'pt-br', { label: 'Estilo', panelTitle: 'Estilos de Formatação', panelTitle1: 'Estilos de bloco', panelTitle2: 'Estilos de texto corrido', panelTitle3: 'Estilos de objeto' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/fo.js0000644000201500020150000000056014515446712024502 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'fo', { label: 'Typografi', panelTitle: 'Formatterings stílir', panelTitle1: 'Blokk stílir', panelTitle2: 'Inline stílir', panelTitle3: 'Object stílir' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/af.js0000644000201500020150000000053214515446712024463 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'af', { label: 'Styl', panelTitle: 'Vormaat style', panelTitle1: 'Blok style', panelTitle2: 'Inlyn style', panelTitle3: 'Objek style' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/hi.js0000644000201500020150000000063614515446712024502 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'hi', { label: 'स्टाइल', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/km.js0000644000201500020150000000074614515446712024513 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'km', { label: 'រចនាបថ', panelTitle: 'ទ្រង់ទ្រាយ​រចនាបថ', panelTitle1: 'រចនាបថ​ប្លក់', panelTitle2: 'រចនាបថ​ក្នុង​ជួរ', panelTitle3: 'រចនាបថ​វត្ថុ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/nl.js0000644000201500020150000000054314515446712024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'nl', { label: 'Stijl', panelTitle: 'Opmaakstijlen', panelTitle1: 'Blok stijlen', panelTitle2: 'Inline stijlen', panelTitle3: 'Object stijlen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ka.js0000644000201500020150000000077414515446712024500 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ka', { label: 'სტილები', panelTitle: 'ფორმატირების სტილები', panelTitle1: 'არის სტილები', panelTitle2: 'თანდართული სტილები', panelTitle3: 'ობიექტის სტილები' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/es-mx.js0000644000201500020150000000057314515446712025133 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'es-mx', { label: 'Estilos', panelTitle: 'Estilos de formatos', panelTitle1: 'Estilos de bloques', panelTitle2: 'Estilos de líneas', panelTitle3: 'Estilo de objetos' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/mn.js0000644000201500020150000000064114515446712024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'mn', { label: 'Загвар', panelTitle: 'Загвар хэлбэржүүлэх', panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/da.js0000644000201500020150000000057214515446712024465 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'da', { label: 'Typografi', panelTitle: 'Formatering på stylesheet', panelTitle1: 'Blok typografi', panelTitle2: 'Inline typografi', panelTitle3: 'Objekt typografi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/he.js0000644000201500020150000000062514515446712024474 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'he', { label: 'סגנון', panelTitle: 'סגנונות פורמט', panelTitle1: 'סגנונות בלוק', panelTitle2: 'סגנונות רצף', panelTitle3: 'סגנונות אובייקט' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ca.js0000644000201500020150000000055614515446712024466 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ca', { label: 'Estil', panelTitle: 'Estils de format', panelTitle1: 'Estils de bloc', panelTitle2: 'Estils incrustats', panelTitle3: 'Estils d\'objecte' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/gu.js0000644000201500020150000000064314515446712024513 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'gu', { label: 'શૈલી/રીત', panelTitle: 'ફોર્મેટ ', panelTitle1: 'બ્લોક ', panelTitle2: 'ઈનલાઈન ', panelTitle3: 'ઓબ્જેક્ટ પદ્ધતિ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ms.js0000644000201500020150000000062114515446712024513 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ms', { label: 'Stail', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/th.js0000644000201500020150000000063614515446712024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'th', { label: 'ลักษณะ', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/de.js0000644000201500020150000000054214515446712024466 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'de', { label: 'Stil', panelTitle: 'Formatierungsstile', panelTitle1: 'Blockstile', panelTitle2: 'Inline Stilart', panelTitle3: 'Objektstile' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/en-ca.js0000644000201500020150000000056414515446712025065 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'en-ca', { label: 'Styles', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', panelTitle2: 'Inline Styles', panelTitle3: 'Object Styles' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/tt.js0000644000201500020150000000067514515446712024534 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'tt', { label: 'Стильләр', panelTitle: 'Форматлау стильләре', panelTitle1: 'Блоклар стильләре', panelTitle2: 'Эчке стильләр', panelTitle3: 'Объектлар стильләре' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/vi.js0000644000201500020150000000060014515446712024507 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'vi', { label: 'Kiểu', panelTitle: 'Phong cách định dạng', panelTitle1: 'Kiểu khối', panelTitle2: 'Kiểu trực tiếp', panelTitle3: 'Kiểu đối tượng' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/cs.js0000644000201500020150000000055614515446712024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'cs', { label: 'Styl', panelTitle: 'Formátovací styly', panelTitle1: 'Blokové styly', panelTitle2: 'Řádkové styly', panelTitle3: 'Objektové styly' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/tr.js0000644000201500020150000000055514515446712024527 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'tr', { label: 'Biçem', panelTitle: 'Stilleri Düzenliyor', panelTitle1: 'Blok Stilleri', panelTitle2: 'Inline Stilleri', panelTitle3: 'Nesne Stilleri' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ja.js0000644000201500020150000000062214515446712024467 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ja', { label: 'スタイル', panelTitle: 'スタイル', panelTitle1: 'ブロックスタイル', panelTitle2: 'インラインスタイル', panelTitle3: 'オブジェクトスタイル' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/sl.js0000644000201500020150000000055114515446712024514 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'sl', { label: 'Slog', panelTitle: 'Oblikovalni Stili', panelTitle1: 'Slogi odstavkov', panelTitle2: 'Slogi besedila', panelTitle3: 'Slogi objektov' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/lv.js0000644000201500020150000000055214515446712024520 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'lv', { label: 'Stils', panelTitle: 'Formatēšanas stili', panelTitle1: 'Bloka stili', panelTitle2: 'iekļautie stili', panelTitle3: 'Objekta stili' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/en-au.js0000644000201500020150000000055114515446712025103 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'en-au', { label: 'Styles', panelTitle: 'Formatting Styles', panelTitle1: 'Block Styles', panelTitle2: 'Inline Styles', panelTitle3: 'Object Styles' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/en.js0000644000201500020150000000054614515446712024504 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'en', { label: 'Styles', panelTitle: 'Formatting Styles', panelTitle1: 'Block Styles', panelTitle2: 'Inline Styles', panelTitle3: 'Object Styles' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/no.js0000644000201500020150000000053414515446712024513 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'no', { label: 'Stil', panelTitle: 'Stilformater', panelTitle1: 'Blokkstiler', panelTitle2: 'Inlinestiler', panelTitle3: 'Objektstiler' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/fr.js0000644000201500020150000000056214515446712024507 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'fr', { label: 'Styles', panelTitle: 'Styles de mise en forme', panelTitle1: 'Styles de bloc', panelTitle2: 'Styles en ligne', panelTitle3: 'Styles d\'objet' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/id.js0000644000201500020150000000062014515446712024467 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'id', { label: 'Gaya', panelTitle: 'Formatting Styles', // MISSING panelTitle1: 'Block Styles', // MISSING panelTitle2: 'Inline Styles', // MISSING panelTitle3: 'Object Styles' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ug.js0000644000201500020150000000075614515446712024520 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ug', { label: 'ئۇسلۇب', panelTitle: 'ئۇسلۇب', panelTitle1: 'بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى', panelTitle2: 'ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى', panelTitle3: 'نەڭ (Object) ئېلېمېنت ئۇسلۇبى' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/ar.js0000644000201500020150000000061714515446712024503 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'ar', { label: 'أنماط', panelTitle: 'أنماط التنسيق', panelTitle1: 'أنماط الفقرة', panelTitle2: 'أنماط مضمنة', panelTitle3: 'أنماط الكائن' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/sr.js0000644000201500020150000000064514515446712024526 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'sr', { label: 'Стил', panelTitle: 'Стилови форматирања', panelTitle1: 'Блок стилови', panelTitle2: 'Инлине стилови', panelTitle3: 'Стилови објекта' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/eu.js0000644000201500020150000000055714515446712024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'eu', { label: 'Estiloak', panelTitle: 'Formatu estiloak', panelTitle1: 'Bloke estiloak', panelTitle2: 'Lineako estiloak', panelTitle3: 'Objektu estiloak' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/en-gb.js0000644000201500020150000000055114515446712025066 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'en-gb', { label: 'Styles', panelTitle: 'Formatting Styles', panelTitle1: 'Block Styles', panelTitle2: 'Inline Styles', panelTitle3: 'Object Styles' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/stylescombo/lang/hu.js0000644000201500020150000000056614515446712024520 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'stylescombo', 'hu', { label: 'Stílus', panelTitle: 'Formázási stílusok', panelTitle1: 'Blokk stílusok', panelTitle2: 'Inline stílusok', panelTitle3: 'Objektum stílusok' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/0000755000201500020150000000000014515446707021540 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/plugin.js0000755000201500020150000003730014515446707023402 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview Increase and Decrease Indent commands. */ ( function() { 'use strict'; var TRISTATE_DISABLED = CKEDITOR.TRISTATE_DISABLED, TRISTATE_OFF = CKEDITOR.TRISTATE_OFF; CKEDITOR.plugins.add( 'indent', { // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'indent,indent-rtl,outdent,outdent-rtl', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { var genericDefinition = CKEDITOR.plugins.indent.genericDefinition; // Register generic commands. setupGenericListeners( editor, editor.addCommand( 'indent', new genericDefinition( true ) ) ); setupGenericListeners( editor, editor.addCommand( 'outdent', new genericDefinition() ) ); // Create and register toolbar button if possible. if ( editor.ui.addButton ) { editor.ui.addButton( 'Indent', { label: editor.lang.indent.indent, command: 'indent', directional: true, toolbar: 'indent,20' } ); editor.ui.addButton( 'Outdent', { label: editor.lang.indent.outdent, command: 'outdent', directional: true, toolbar: 'indent,10' } ); } // Register dirChanged listener. editor.on( 'dirChanged', function( evt ) { var range = editor.createRange(), dataNode = evt.data.node; range.setStartBefore( dataNode ); range.setEndAfter( dataNode ); var walker = new CKEDITOR.dom.walker( range ), node; while ( ( node = walker.next() ) ) { if ( node.type == CKEDITOR.NODE_ELEMENT ) { // A child with the defined dir is to be ignored. if ( !node.equals( dataNode ) && node.getDirection() ) { range.setStartAfter( node ); walker = new CKEDITOR.dom.walker( range ); continue; } // Switch alignment classes. var classes = editor.config.indentClasses; if ( classes ) { var suffix = ( evt.data.dir == 'ltr' ) ? [ '_rtl', '' ] : [ '', '_rtl' ]; for ( var i = 0; i < classes.length; i++ ) { if ( node.hasClass( classes[ i ] + suffix[ 0 ] ) ) { node.removeClass( classes[ i ] + suffix[ 0 ] ); node.addClass( classes[ i ] + suffix[ 1 ] ); } } } // Switch the margins. var marginLeft = node.getStyle( 'margin-right' ), marginRight = node.getStyle( 'margin-left' ); marginLeft ? node.setStyle( 'margin-left', marginLeft ) : node.removeStyle( 'margin-left' ); marginRight ? node.setStyle( 'margin-right', marginRight ) : node.removeStyle( 'margin-right' ); } } } ); } } ); /** * Global command class definitions and global helpers. * * @class * @singleton */ CKEDITOR.plugins.indent = { /** * A base class for a generic command definition, responsible mainly for creating * Increase Indent and Decrease Indent toolbar buttons as well as for refreshing * UI states. * * Commands of this class do not perform any indentation by themselves. They * delegate this job to content-specific indentation commands (i.e. indentlist). * * @class CKEDITOR.plugins.indent.genericDefinition * @extends CKEDITOR.commandDefinition * @param {CKEDITOR.editor} editor The editor instance this command will be * applied to. * @param {String} name The name of the command. * @param {Boolean} [isIndent] Defines the command as indenting or outdenting. */ genericDefinition: function( isIndent ) { /** * Determines whether the command belongs to the indentation family. * Otherwise it is assumed to be an outdenting command. * * @readonly * @property {Boolean} [=false] */ this.isIndent = !!isIndent; // Mimic naive startDisabled behavior for outdent. this.startDisabled = !this.isIndent; }, /** * A base class for specific indentation command definitions responsible for * handling a pre-defined set of elements i.e. indentlist for lists or * indentblock for text block elements. * * Commands of this class perform indentation operations and modify the DOM structure. * They listen for events fired by {@link CKEDITOR.plugins.indent.genericDefinition} * and execute defined actions. * * **NOTE**: This is not an {@link CKEDITOR.command editor command}. * Context-specific commands are internal, for indentation system only. * * @class CKEDITOR.plugins.indent.specificDefinition * @param {CKEDITOR.editor} editor The editor instance this command will be * applied to. * @param {String} name The name of the command. * @param {Boolean} [isIndent] Defines the command as indenting or outdenting. */ specificDefinition: function( editor, name, isIndent ) { this.name = name; this.editor = editor; /** * An object of jobs handled by the command. Each job consists * of two functions: `refresh` and `exec` as well as the execution priority. * * * The `refresh` function determines whether a job is doable for * a particular context. These functions are executed in the * order of priorities, one by one, for all plugins that registered * jobs. As jobs are related to generic commands, refreshing * occurs when the global command is firing the `refresh` event. * * **Note**: This function must return either {@link CKEDITOR#TRISTATE_DISABLED} * or {@link CKEDITOR#TRISTATE_OFF}. * * * The `exec` function modifies the DOM if possible. Just like * `refresh`, `exec` functions are executed in the order of priorities * while the generic command is executed. This function is not executed * if `refresh` for this job returned {@link CKEDITOR#TRISTATE_DISABLED}. * * **Note**: This function must return a Boolean value, indicating whether it * was successful. If a job was successful, then no other jobs are being executed. * * Sample definition: * * command.jobs = { * // Priority = 20. * '20': { * refresh( editor, path ) { * if ( condition ) * return CKEDITOR.TRISTATE_OFF; * else * return CKEDITOR.TRISTATE_DISABLED; * }, * exec( editor ) { * // DOM modified! This was OK. * return true; * } * }, * // Priority = 60. This job is done later. * '60': { * // Another job. * } * }; * * For additional information, please check comments for * the `setupGenericListeners` function. * * @readonly * @property {Object} [={}] */ this.jobs = {}; /** * Determines whether the editor that the command belongs to has * {@link CKEDITOR.config#enterMode config.enterMode} set to {@link CKEDITOR#ENTER_BR}. * * @readonly * @see CKEDITOR.config#enterMode * @property {Boolean} [=false] */ this.enterBr = editor.config.enterMode == CKEDITOR.ENTER_BR; /** * Determines whether the command belongs to the indentation family. * Otherwise it is assumed to be an outdenting command. * * @readonly * @property {Boolean} [=false] */ this.isIndent = !!isIndent; /** * The name of the global command related to this one. * * @readonly */ this.relatedGlobal = isIndent ? 'indent' : 'outdent'; /** * A keystroke associated with this command (*Tab* or *Shift+Tab*). * * @readonly */ this.indentKey = isIndent ? 9 : CKEDITOR.SHIFT + 9; /** * Stores created markers for the command so they can eventually be * purged after the `exec` function is run. */ this.database = {}; }, /** * Registers content-specific commands as a part of the indentation system * directed by generic commands. Once a command is registered, * it listens for events of a related generic command. * * CKEDITOR.plugins.indent.registerCommands( editor, { * 'indentlist': new indentListCommand( editor, 'indentlist' ), * 'outdentlist': new indentListCommand( editor, 'outdentlist' ) * } ); * * Content-specific commands listen for the generic command's `exec` and * try to execute their own jobs, one after another. If some execution is * successful, `evt.data.done` is set so no more jobs (commands) are involved. * * Content-specific commands also listen for the generic command's `refresh` * and fill the `evt.data.states` object with states of jobs. A generic command * uses this data to determine its own state and to update the UI. * * @member CKEDITOR.plugins.indent * @param {CKEDITOR.editor} editor The editor instance this command is * applied to. * @param {Object} commands An object of {@link CKEDITOR.command}. */ registerCommands: function( editor, commands ) { editor.on( 'pluginsLoaded', function() { for ( var name in commands ) { ( function( editor, command ) { var relatedGlobal = editor.getCommand( command.relatedGlobal ); for ( var priority in command.jobs ) { // Observe generic exec event and execute command when necessary. // If the command was successfully handled by the command and // DOM has been modified, stop event propagation so no other plugin // will bother. Job is done. relatedGlobal.on( 'exec', function( evt ) { if ( evt.data.done ) return; // Make sure that anything this command will do is invisible // for undoManager. What undoManager only can see and // remember is the execution of the global command (relatedGlobal). editor.fire( 'lockSnapshot' ); if ( command.execJob( editor, priority ) ) evt.data.done = true; editor.fire( 'unlockSnapshot' ); // Clean up the markers. CKEDITOR.dom.element.clearAllMarkers( command.database ); }, this, null, priority ); // Observe generic refresh event and force command refresh. // Once refreshed, save command state in event data // so generic command plugin can update its own state and UI. relatedGlobal.on( 'refresh', function( evt ) { if ( !evt.data.states ) evt.data.states = {}; evt.data.states[ command.name + '@' + priority ] = command.refreshJob( editor, priority, evt.data.path ); }, this, null, priority ); } // Since specific indent commands have no UI elements, // they need to be manually registered as a editor feature. editor.addFeature( command ); } )( this, commands[ name ] ); } } ); } }; CKEDITOR.plugins.indent.genericDefinition.prototype = { context: 'p', exec: function() {} }; CKEDITOR.plugins.indent.specificDefinition.prototype = { /** * Executes the content-specific procedure if the context is correct. * It calls the `exec` function of a job of the given `priority` * that modifies the DOM. * * @param {CKEDITOR.editor} editor The editor instance this command * will be applied to. * @param {Number} priority The priority of the job to be executed. * @returns {Boolean} Indicates whether the job was successful. */ execJob: function( editor, priority ) { var job = this.jobs[ priority ]; if ( job.state != TRISTATE_DISABLED ) return job.exec.call( this, editor ); }, /** * Calls the `refresh` function of a job of the given `priority`. * The function returns the state of the job which can be either * {@link CKEDITOR#TRISTATE_DISABLED} or {@link CKEDITOR#TRISTATE_OFF}. * * @param {CKEDITOR.editor} editor The editor instance this command * will be applied to. * @param {Number} priority The priority of the job to be executed. * @returns {Number} The state of the job. */ refreshJob: function( editor, priority, path ) { var job = this.jobs[ priority ]; if ( !editor.activeFilter.checkFeature( this ) ) job.state = TRISTATE_DISABLED; else job.state = job.refresh.call( this, editor, path ); return job.state; }, /** * Checks if the element path contains the element handled * by this indentation command. * * @param {CKEDITOR.dom.elementPath} node A path to be checked. * @returns {CKEDITOR.dom.element} */ getContext: function( path ) { return path.contains( this.context ); } }; /** * Attaches event listeners for this generic command. Since the indentation * system is event-oriented, generic commands communicate with * content-specific commands using the `exec` and `refresh` events. * * Listener priorities are crucial. Different indentation phases * are executed with different priorities. * * For the `exec` event: * * * 0: Selection and bookmarks are saved by the generic command. * * 1-99: Content-specific commands try to indent the code by executing * their own jobs ({@link CKEDITOR.plugins.indent.specificDefinition#jobs}). * * 100: Bookmarks are re-selected by the generic command. * * The visual interpretation looks as follows: * * +------------------+ * | Exec event fired | * +------ + ---------+ * | * 0 -<----------+ Selection and bookmarks saved. * | * | * 25 -<---+ Exec 1st job of plugin#1 (return false, continuing...). * | * | * 50 -<---+ Exec 1st job of plugin#2 (return false, continuing...). * | * | * 75 -<---+ Exec 2nd job of plugin#1 (only if plugin#2 failed). * | * | * 100 -<-----------+ Re-select bookmarks, clean-up. * | * +-------- v ----------+ * | Exec event finished | * +---------------------+ * * For the `refresh` event: * * * <100: Content-specific commands refresh their job states according * to the given path. Jobs save their states in the `evt.data.states` object * passed along with the event. This can be either {@link CKEDITOR#TRISTATE_DISABLED} * or {@link CKEDITOR#TRISTATE_OFF}. * * 100: Command state is determined according to what states * have been returned by content-specific jobs (`evt.data.states`). * UI elements are updated at this stage. * * **Note**: If there is at least one job with the {@link CKEDITOR#TRISTATE_OFF} state, * then the generic command state is also {@link CKEDITOR#TRISTATE_OFF}. Otherwise, * the command state is {@link CKEDITOR#TRISTATE_DISABLED}. * * @param {CKEDITOR.command} command The command to be set up. * @private */ function setupGenericListeners( editor, command ) { var selection, bookmarks; // Set the command state according to content-specific // command states. command.on( 'refresh', function( evt ) { // If no state comes with event data, disable command. var states = [ TRISTATE_DISABLED ]; for ( var s in evt.data.states ) states.push( evt.data.states[ s ] ); this.setState( CKEDITOR.tools.search( states, TRISTATE_OFF ) ? TRISTATE_OFF : TRISTATE_DISABLED ); }, command, null, 100 ); // Initialization. Save bookmarks and mark event as not handled // by any plugin (command) yet. command.on( 'exec', function( evt ) { selection = editor.getSelection(); bookmarks = selection.createBookmarks( 1 ); // Mark execution as not handled yet. if ( !evt.data ) evt.data = {}; evt.data.done = false; }, command, null, 0 ); // Housekeeping. Make sure selectionChange will be called. // Also re-select previously saved bookmarks. command.on( 'exec', function() { editor.forceNextSelectionCheck(); selection.selectBookmarks( bookmarks ); }, command, null, 100 ); } } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/dev/0000755000201500020150000000000014515446706022315 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/dev/indent.html0000644000201500020150000001325614515446706024473 0ustar puckpuck Indent DEV sample

Indent DEV sample

List & Block

Indent classes

List only

Block only

CKEDITOR.ENTER_BR

rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/0000755000201500020150000000000014515446707022461 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/zh.js0000644000201500020150000000040414515446707023436 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'zh', { indent: '增加縮排', outdent: '減少縮排' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/nb.js0000644000201500020150000000040614515446707023416 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'nb', { indent: 'Øk innrykk', outdent: 'Reduser innrykk' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/eo.js0000644000201500020150000000044114515446707023421 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'eo', { indent: 'Pligrandigi Krommarĝenon', outdent: 'Malpligrandigi Krommarĝenon' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/es.js0000644000201500020150000000041714515446707023430 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'es', { indent: 'Aumentar Sangría', outdent: 'Disminuir Sangría' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ro.js0000644000201500020150000000041614515446707023440 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ro', { indent: 'Creşte indentarea', outdent: 'Scade indentarea' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/hr.js0000644000201500020150000000041114515446707023424 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'hr', { indent: 'Pomakni udesno', outdent: 'Pomakni ulijevo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/it.js0000644000201500020150000000041114515446707023427 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'it', { indent: 'Aumenta rientro', outdent: 'Riduci rientro' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/de-ch.js0000644000201500020150000000042414515446707023777 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'de-ch', { indent: 'Einzug vergrössern', outdent: 'Einzug verkleinern' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/sk.js0000644000201500020150000000042414515446707023434 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'sk', { indent: 'Zväčšiť odsadenie', outdent: 'Zmenšiť odsadenie' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/az.js0000644000201500020150000000042114515446707023426 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'az', { indent: 'Sol boşluqu artır', outdent: 'Sol boşluqu azalt' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/pt.js0000644000201500020150000000041414515446707023441 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'pt', { indent: 'Aumentar avanço', outdent: 'Diminuir avanço' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/si.js0000644000201500020150000000052314515446707023432 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'si', { indent: 'අතර පරතරය වැඩිකරන්න', outdent: 'අතර පරතරය අඩුකරන්න' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ko.js0000644000201500020150000000040414515446707023426 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ko', { indent: '들여쓰기', outdent: '내어쓰기' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/mk.js0000644000201500020150000000044014515446707023424 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'mk', { indent: 'Increase Indent', // MISSING outdent: 'Decrease Indent' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/cy.js0000644000201500020150000000042414515446707023432 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'cy', { indent: 'Cynyddu\'r Mewnoliad', outdent: 'Lleihau\'r Mewnoliad' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/uk.js0000644000201500020150000000045414515446707023441 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'uk', { indent: 'Збільшити відступ', outdent: 'Зменшити відступ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/zh-cn.js0000644000201500020150000000041514515446707024036 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'zh-cn', { indent: '增加缩进量', outdent: '减少缩进量' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/sv.js0000644000201500020150000000040414515446707023445 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'sv', { indent: 'Öka indrag', outdent: 'Minska indrag' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/lt.js0000644000201500020150000000042314515446707023435 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'lt', { indent: 'Padidinti įtrauką', outdent: 'Sumažinti įtrauką' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/is.js0000644000201500020150000000041214515446707023427 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'is', { indent: 'Minnka inndrátt', outdent: 'Auka inndrátt' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/fr-ca.js0000644000201500020150000000042614515446707024011 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'fr-ca', { indent: 'Augmenter le retrait', outdent: 'Diminuer le retrait' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/et.js0000644000201500020150000000042214515446707023425 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'et', { indent: 'Taande suurendamine', outdent: 'Taande vähendamine' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/bs.js0000644000201500020150000000040414515446707023421 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'bs', { indent: 'Poveæaj uvod', outdent: 'Smanji uvod' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/pl.js0000644000201500020150000000041614515446707023433 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'pl', { indent: 'Zwiększ wcięcie', outdent: 'Zmniejsz wcięcie' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/bg.js0000644000201500020150000000047614515446707023416 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'bg', { indent: 'Увеличаване на отстъпа', outdent: 'Намаляване на отстъпа' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/fa.js0000644000201500020150000000043614515446707023410 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'fa', { indent: 'افزایش تورفتگی', outdent: 'کاهش تورفتگی' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ku.js0000644000201500020150000000045614515446707023443 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ku', { indent: 'زیادکردنی بۆشایی', outdent: 'کەمکردنەوەی بۆشایی' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/bn.js0000644000201500020150000000046314515446707023421 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'bn', { indent: 'ইনডেন্ট বাড়াই', outdent: 'ইনডেন্ট কমাও' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/el.js0000644000201500020150000000043614515446707023422 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'el', { indent: 'Αύξηση Εσοχής', outdent: 'Μείωση Εσοχής' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/fi.js0000644000201500020150000000042514515446707023416 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'fi', { indent: 'Suurenna sisennystä', outdent: 'Pienennä sisennystä' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ru.js0000644000201500020150000000045214515446707023446 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ru', { indent: 'Увеличить отступ', outdent: 'Уменьшить отступ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/gl.js0000644000201500020150000000042114515446707023416 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'gl', { indent: 'Aumentar a sangría', outdent: 'Reducir a sangría' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/sr-latn.js0000644000201500020150000000041614515446707024400 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'sr-latn', { indent: 'Uvećaj marginu', outdent: 'Smanji marginu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/oc.js0000644000201500020150000000042014515446707023414 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'oc', { indent: 'Aumentar l\'alinèa', outdent: 'Dmesir l\'alinèa' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/sq.js0000644000201500020150000000041114515446707023436 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'sq', { indent: 'Rrite Identin', outdent: 'Zvogëlo Identin' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/pt-br.js0000644000201500020150000000041314515446707024041 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'pt-br', { indent: 'Aumentar Recuo', outdent: 'Diminuir Recuo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/fo.js0000644000201500020150000000043414515446707023424 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'fo', { indent: 'Økja reglubrotarinntriv', outdent: 'Minka reglubrotarinntriv' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/af.js0000644000201500020150000000041614515446707023406 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'af', { indent: 'Vergroot inspring', outdent: 'Verklein inspring' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/hi.js0000644000201500020150000000050314515446707023415 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'hi', { indent: 'इन्डॅन्ट बढ़ायें', outdent: 'इन्डॅन्ट कम करें' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/km.js0000644000201500020150000000053314515446707023427 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'km', { indent: 'បន្ថែមការចូលបន្ទាត់', outdent: 'បន្ថយការចូលបន្ទាត់' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/nl.js0000644000201500020150000000042714515446707023433 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'nl', { indent: 'Inspringing vergroten', outdent: 'Inspringing verkleinen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ka.js0000644000201500020150000000047114515446707023414 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ka', { indent: 'მეტად შეწევა', outdent: 'ნაკლებად შეწევა' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/es-mx.js0000644000201500020150000000042714515446707024053 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'es-mx', { indent: 'Incrementar sangría', outdent: 'Decrementar sangría' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/mn.js0000644000201500020150000000044414515446707023433 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'mn', { indent: 'Догол мөр хасах', outdent: 'Догол мөр нэмэх' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/da.js0000644000201500020150000000042114515446707023400 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'da', { indent: 'Forøg indrykning', outdent: 'Formindsk indrykning' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/he.js0000644000201500020150000000042214515446707023411 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'he', { indent: 'הגדלת הזחה', outdent: 'הקטנת הזחה' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ca.js0000644000201500020150000000041714515446707023404 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ca', { indent: 'Augmenta el sagnat', outdent: 'Redueix el sagnat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/gu.js0000644000201500020150000000066514515446707023441 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'gu', { indent: 'ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી', outdent: 'ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ms.js0000644000201500020150000000041214515446707023433 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ms', { indent: 'Tambahkan Inden', outdent: 'Kurangkan Inden' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/th.js0000644000201500020150000000050314515446707023430 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'th', { indent: 'เพิ่มระยะย่อหน้า', outdent: 'ลดระยะย่อหน้า' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/de.js0000644000201500020150000000042114515446707023404 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'de', { indent: 'Einzug vergrößern', outdent: 'Einzug verkleinern' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/en-ca.js0000644000201500020150000000041514515446707024002 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'en-ca', { indent: 'Increase Indent', outdent: 'Decrease Indent' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/tt.js0000644000201500020150000000045614515446707023453 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'tt', { indent: 'Отступны арттыру', outdent: 'Отступны кечерәйтү' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/vi.js0000644000201500020150000000041514515446707023435 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'vi', { indent: 'Dịch vào trong', outdent: 'Dịch ra ngoài' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/cs.js0000644000201500020150000000042114515446707023421 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'cs', { indent: 'Zvětšit odsazení', outdent: 'Zmenšit odsazení' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/tr.js0000644000201500020150000000040414515446707023442 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'tr', { indent: 'Sekme Arttır', outdent: 'Sekme Azalt' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ja.js0000644000201500020150000000042014515446707023405 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ja', { indent: 'インデント', outdent: 'インデント解除' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/sl.js0000644000201500020150000000041114515446707023431 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'sl', { indent: 'Povečaj zamik', outdent: 'Zmanjšaj zamik' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/lv.js0000644000201500020150000000042114515446707023435 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'lv', { indent: 'Palielināt atkāpi', outdent: 'Samazināt atkāpi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/en-au.js0000644000201500020150000000041514515446707024024 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'en-au', { indent: 'Increase Indent', outdent: 'Decrease Indent' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/en.js0000644000201500020150000000041214515446707023416 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'en', { indent: 'Increase Indent', outdent: 'Decrease Indent' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/no.js0000644000201500020150000000040614515446707023433 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'no', { indent: 'Øk innrykk', outdent: 'Reduser innrykk' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/fr.js0000644000201500020150000000042314515446707023425 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'fr', { indent: 'Augmenter le retrait', outdent: 'Diminuer le retrait' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/id.js0000644000201500020150000000041114515446707023407 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'id', { indent: 'Tingkatkan Lekuk', outdent: 'Kurangi Lekuk' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ug.js0000644000201500020150000000040414515446707023430 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ug', { indent: 'تارايت', outdent: 'كەڭەيت' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/ar.js0000644000201500020150000000047414515446707023426 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'ar', { indent: 'زيادة المسافة البادئة', outdent: 'إنقاص المسافة البادئة' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/sr.js0000644000201500020150000000045114515446707023443 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'sr', { indent: 'Увећај леву маргину', outdent: 'Смањи маргину' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/eu.js0000644000201500020150000000040614515446707023430 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'eu', { indent: 'Handitu koska', outdent: 'Txikitu koska' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/en-gb.js0000644000201500020150000000041514515446707024007 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'en-gb', { indent: 'Increase Indent', outdent: 'Decrease Indent' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/lang/hu.js0000644000201500020150000000042714515446707023436 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'indent', 'hu', { indent: 'Behúzás növelése', outdent: 'Behúzás csökkentése' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/0000755000201500020150000000000014503523375022645 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/hidpi/0000755000201500020150000000000014503523375023742 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/hidpi/indent.png0000644000201500020150000000175114503523375025735 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXíWMn0 V] Sv#tĪ?ꊮ(G+ pnzĶ7@f#U0I3IV{ jkSx*&d)>dD' ڳ)\D>2d0T笵I ?p8|MιC I\]]]иH5n90e/| Hd21IW,$!"s"BI $]`iTe57;oooDD5= *^0*!):ByL.6-<7DscオjV,{$/o D{(, A"Ï@z1ƅ1(}3<T+::`t'󏷷I{R`尵-Bg|1\Tӷ;:P' +>ݭ :9~<1h4 ( 4GFmc<۲,:$eU$1uss0 B 1\m nOܛEQ)1p8;EV D$x1T-$ʲ@[-Bj@ Z h4֕^NDS y :@7@HZmٲ߃K@)˲g~V@`: PR21&ȓO.x;8. %tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/hidpi/indent-rtl.png0000644000201500020150000000136514503523375026535 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXWKn1 Chش@@B\ t1y]0AR-E~~vT)v4̣nWdx&fQhy5'5\ަ24UQ˟d3\d{]`jl3*]:'"ޏhslQK@,`Yn$i{,NzH5)l8})[Nn@tsR뺑JDKd[Zs4޿ԟߢ!κVt˥R. [ZMh{e t`.>e㜼X6R矶mslQ.',O~|N^5nȝ{@c XOcIe P+ r=u`;^ݦ (\qs8[) Gz7԰45eg~ HI?(@mAe)03s4곳Z:)5l;%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/hidpi/outdent.png0000644000201500020150000000136214503523375026134 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXVn@ /q@i @N8ufP-Ed_xN1 [|YQʟ7f`I leD}C\f$Nכx3K)Hg*fku+&lͺ*AoH!Yn¹QKVc1M=F}D # >5z ttfUyHJznmAR達J!)SD9oeo_(=Sk\C!։9'ιGWTFSЛ d> " 0HNZFSe2}Re4PʸzX5Ou=͐y(9C p$ndt>stXwE{x΃1r[.ku-nr127:#5_e%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/indent.png0000644000201500020150000000075114503523375024637 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8˕RI0 X{#7rCj%Kxɠ{ff@9gCɘnйu] <$"S<-6۶#9/q1y˴/{3dsuΉSvssl][l7xpuAB9p}Kl<+.  P這osp83m|Ѕ0 oxKL%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/indent-rtl.png0000644000201500020150000000066614503523375025443 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8͒ 0 n y)OܤY)Jj`8#̀FSIނcJ 痂e؏~Mdf3Kq<"ao]V]b& n3=ܣK((S*>Zuh38|Qe`B2%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/outdent.png0000644000201500020150000000063514503523375025041 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8˥Q !D{ut6WDV(y޻PUD%pJa5nzˁzJXDDapAkM'2DF)j$c?aUޙW(y+S<ЯȨ¦x@2 ߵ%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/indent/icons/outdent-rtl.png0000644000201500020150000000070214503523375025633 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8˝ D!!8zrƘ<Be磅u]%I4B]'IN~5l{(ivm7?;"u@umq Î.Btn8lVٶ UP>gHzO"usֶm j\șk~{Mop%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/autocomplete/0000755000201500020150000000000014515446705022756 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/autocomplete/plugin.js0000644000201500020150000015163714515446705024627 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ 'use strict'; ( function() { CKEDITOR.plugins.add( 'autocomplete', { requires: 'textwatcher', onLoad: function() { CKEDITOR.document.appendStyleSheet( this.path + 'skins/default.css' ); }, isSupportedEnvironment: function() { return !CKEDITOR.env.ie || CKEDITOR.env.version > 8; } } ); /** * The main class implementing a generic [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) feature in the editor. * It acts as a controller that works with the {@link CKEDITOR.plugins.autocomplete.model model} and * {@link CKEDITOR.plugins.autocomplete.view view} classes. * * It is possible to maintain multiple autocomplete instances for a single editor at a time. * In order to create an autocomplete instance use its {@link #constructor constructor}. * * @class CKEDITOR.plugins.autocomplete * @since 4.10.0 * @constructor Creates a new instance of autocomplete and attaches it to the editor. * * In order to initialize the autocomplete feature it is enough to instantiate this class with * two required callbacks: * * * {@link CKEDITOR.plugins.autocomplete.configDefinition#textTestCallback config.textTestCallback} – A function being called by * the {@link CKEDITOR.plugins.textWatcher text watcher} plugin, as new text is being inserted. * Its purpose is to determine whether a given range should be matched or not. * See {@link CKEDITOR.plugins.textWatcher#constructor} for more details. * There is also {@link CKEDITOR.plugins.textMatch#match} which is a handy helper for that purpose. * * {@link CKEDITOR.plugins.autocomplete.configDefinition#dataCallback config.dataCallback} – A function that should return * (through its callback) suggestion data for the current query string. * * # Creating an autocomplete instance * * Depending on your use case, put this code in the {@link CKEDITOR.pluginDefinition#init} callback of your * plugin or, for example, in the {@link CKEDITOR.editor#instanceReady} event listener. Ensure that you loaded the * {@link CKEDITOR.plugins.textMatch Text Match} plugin. * * ```javascript * var itemsArray = [ { id: 1, name: '@Andrew' }, { id: 2, name: '@Kate' } ]; * * // Called when the user types in the editor or moves the caret. * // The range represents the caret position. * function textTestCallback( range ) { * // You do not want to autocomplete a non-empty selection. * if ( !range.collapsed ) { * return null; * } * * // Use the text match plugin which does the tricky job of doing * // a text search in the DOM. The matchCallback function should return * // a matching fragment of the text. * return CKEDITOR.plugins.textMatch.match( range, matchCallback ); * } * * // Returns the position of the matching text. * // It matches with a word starting from the '@' character * // up to the caret position. * function matchCallback( text, offset ) { * // Get the text before the caret. * var left = text.slice( 0, offset ), * // Will look for an '@' character followed by word characters. * match = left.match( /@\w*$/ ); * * if ( !match ) { * return null; * } * * return { start: match.index, end: offset }; * } * * // Returns (through its callback) the suggestions for the current query. * function dataCallback( matchInfo, callback ) { * // Simple search. * // Filter the entire items array so only the items that start * // with the query remain. * var suggestions = itemsArray.filter( function( item ) { * return item.name.toLowerCase().indexOf( matchInfo.query.toLowerCase() ) == 0; * } ); * * // Note: The callback function can also be executed asynchronously * // so dataCallback can do XHR requests or use any other asynchronous API. * callback( suggestions ); * } * * // Finally, instantiate the autocomplete class. * new CKEDITOR.plugins.autocomplete( editor, { * textTestCallback: textTestCallback, * dataCallback: dataCallback * } ); * ``` * * # Changing the behavior of the autocomplete class by subclassing it * * This plugin will expose a `CKEDITOR.plugins.customAutocomplete` class which uses * a custom view that positions the panel relative to the {@link CKEDITOR.editor#container}. * * ```javascript * CKEDITOR.plugins.add( 'customautocomplete', { * requires: 'autocomplete', * * onLoad: function() { * var View = CKEDITOR.plugins.autocomplete.view, * Autocomplete = CKEDITOR.plugins.autocomplete; * * function CustomView( editor ) { * // Call the parent class constructor. * View.call( this, editor ); * } * // Inherit the view methods. * CustomView.prototype = CKEDITOR.tools.prototypedCopy( View.prototype ); * * // Change the positioning of the panel, so it is stretched * // to 100% of the editor container width and is positioned * // relative to the editor container. * CustomView.prototype.updatePosition = function( range ) { * var caretRect = this.getViewPosition( range ), * container = this.editor.container; * * this.setPosition( { * // Position the panel relative to the editor container. * left: container.$.offsetLeft, * top: caretRect.top, * bottom: caretRect.bottom * } ); * // Stretch the panel to 100% of the editor container width. * this.element.setStyle( 'width', container.getSize( 'width' ) + 'px' ); * }; * * function CustomAutocomplete( editor, configDefinition ) { * // Call the parent class constructor. * Autocomplete.call( this, editor, configDefinition ); * } * // Inherit the autocomplete methods. * CustomAutocomplete.prototype = CKEDITOR.tools.prototypedCopy( Autocomplete.prototype ); * * CustomAutocomplete.prototype.getView = function() { * return new CustomView( this.editor ); * } * * // Expose the custom autocomplete so it can be used later. * CKEDITOR.plugins.customAutocomplete = CustomAutocomplete; * } * } ); * ``` * @param {CKEDITOR.editor} editor The editor to watch. * @param {CKEDITOR.plugins.autocomplete.configDefinition} config Configuration object for this autocomplete instance. */ function Autocomplete( editor, config ) { var configKeystrokes = editor.config.autocomplete_commitKeystrokes || CKEDITOR.config.autocomplete_commitKeystrokes; /** * The editor instance that autocomplete is attached to. * * @readonly * @property {CKEDITOR.editor} */ this.editor = editor; /** * Indicates throttle threshold expressed in milliseconds, reducing text checks frequency. * * @property {Number} [throttle=20] */ this.throttle = config.throttle !== undefined ? config.throttle : 20; /** * Indicates if a following space should be added after inserted match into an editor. * * @since 4.20.0 * @readonly * @property {Boolean} [followingSpace] */ this.followingSpace = config.followingSpace; /** * The autocomplete view instance. * * @readonly * @property {CKEDITOR.plugins.autocomplete.view} */ this.view = this.getView(); /** * The autocomplete model instance. * * @readonly * @property {CKEDITOR.plugins.autocomplete.model} */ this.model = this.getModel( config.dataCallback ); this.model.itemsLimit = config.itemsLimit; /** * The autocomplete text watcher instance. * * @readonly * @property {CKEDITOR.plugins.textWatcher} */ this.textWatcher = this.getTextWatcher( config.textTestCallback ); /** * The autocomplete keystrokes used to finish autocompletion with the selected view item. * The property is using the {@link CKEDITOR.config#autocomplete_commitKeystrokes} configuration option as default keystrokes. * You can change this property to set individual keystrokes for the plugin instance. * * @property {Number[]} * @readonly */ this.commitKeystrokes = CKEDITOR.tools.array.isArray( configKeystrokes ) ? configKeystrokes.slice() : [ configKeystrokes ]; /** * Listeners registered by this autocomplete instance. * * @private */ this._listeners = []; /** * Template of markup to be inserted as the autocomplete item gets committed. * * You can use {@link CKEDITOR.plugins.autocomplete.model.item item} properties to customize the template. * * ```javascript * var outputTemplate = `#{ticket} ({name})`; * ``` * * @readonly * @property {CKEDITOR.template} [outputTemplate=null] */ this.outputTemplate = config.outputTemplate !== undefined ? new CKEDITOR.template( config.outputTemplate ) : null; if ( config.itemTemplate ) { this.view.itemTemplate = new CKEDITOR.template( config.itemTemplate ); } // Attach autocomplete when editor instance is ready (#2114). if ( this.editor.status === 'ready' ) { this.attach(); } else { this.editor.on( 'instanceReady', function() { this.attach(); }, this ); } editor.on( 'destroy', function() { this.destroy(); }, this ); } Autocomplete.prototype = { /** * Attaches the autocomplete to the {@link #editor}. * * * The view is appended to the DOM and the listeners are attached. * * The {@link #textWatcher text watcher} is attached to the editor. * * The listeners on the {@link #model} and {@link #view} events are added. */ attach: function() { var editor = this.editor, win = CKEDITOR.document.getWindow(), editable = editor.editable(), editorScrollableElement = editable.isInline() ? editable : editable.getDocument(); // iOS classic editor listens on frame parent element for editor `scroll` event (#1910). if ( CKEDITOR.env.iOS && !editable.isInline() ) { editorScrollableElement = iOSViewportElement( editor ); } this.view.append(); this.view.attach(); this.textWatcher.attach(); this._listeners.push( this.textWatcher.on( 'matched', this.onTextMatched, this ) ); this._listeners.push( this.textWatcher.on( 'unmatched', this.onTextUnmatched, this ) ); this._listeners.push( this.model.on( 'change-data', this.modelChangeListener, this ) ); this._listeners.push( this.model.on( 'change-selectedItemId', this.onSelectedItemId, this ) ); this._listeners.push( this.view.on( 'change-selectedItemId', this.onSelectedItemId, this ) ); this._listeners.push( this.view.on( 'click-item', this.onItemClick, this ) ); // (#4617) this._listeners.push( this.model.on( 'change-isActive', this.updateAriaAttributesOnEditable, this ) ); // Update view position on viewport change. // Note: CKEditor's event system has a limitation that one function // cannot be used as listener for the same event more than once. Hence, wrapper functions. this._listeners.push( win.on( 'scroll', function() { this.viewRepositionListener(); }, this ) ); this._listeners.push( editorScrollableElement.on( 'scroll', function() { this.viewRepositionListener(); }, this ) ); // Don't let browser to focus dropdown element (#2107). this._listeners.push( this.view.element.on( 'mousedown', function( e ) { e.data.preventDefault(); }, null, null, 9999 ) ); // Register keybindings and add ARIA attributes to the editable right away // if editor is already initialized. if ( editable ) { this.registerPanelNavigation(); this.addAriaAttributesToEditable(); } // Note: CKEditor's event system has a limitation that one function // cannot be used as listener for the same event more than once. Hence, wrapper function. // (#4107) editor.on( 'contentDom', function() { this.registerPanelNavigation(); this.addAriaAttributesToEditable(); }, this ); }, registerPanelNavigation: function() { var editable = this.editor.editable(); // Priority 5 to get before the enterkey. // Note: CKEditor's event system has a limitation that one function (in this case this.onKeyDown) // cannot be used as listener for the same event more than once. Hence, wrapper function. this._listeners.push( editable.attachListener( editable, 'keydown', function( evt ) { this.onKeyDown( evt ); }, this, null, 5 ) ); }, /** * @since 4.16.1 */ addAriaAttributesToEditable: function() { var editable = this.editor.editable(), autocompleteId = this.view.element.getAttribute( 'id' ); if ( !editable.isInline() ) { return; } editable.setAttribute( 'aria-controls', autocompleteId ); editable.setAttribute( 'aria-activedescendant', '' ); editable.setAttribute( 'aria-autocomplete', 'list' ); editable.setAttribute( 'aria-expanded', 'false' ); }, /** * @since 4.16.1 */ updateAriaAttributesOnEditable: function( evt ) { var editable = this.editor.editable(), isActive = evt.data; if ( !editable || !editable.isInline() ) { return; } editable.setAttribute( 'aria-expanded', isActive ? 'true' : 'false' ); if ( !isActive ) { editable.setAttribute( 'aria-activedescendant', '' ); } }, /** * @since 4.16.1 */ updateAriaActiveDescendantAttributeOnEditable: function( id ) { var editable = this.editor.editable(); if ( !editable.isInline() ) { return; } editable.setAttribute( 'aria-activedescendant', id ); }, /** * @since 4.16.1 */ removeAriaAttributesFromEditable: function() { var editable = this.editor.editable(); if ( !editable || !editable.isInline() ) { return; } editable.removeAttributes( [ 'aria-controls', 'aria-expanded', 'aria-activedescendant' ] ); editable.setAttribute( 'aria-autocomplete', 'none' ); }, /** * Closes the view and sets its {@link CKEDITOR.plugins.autocomplete.model#isActive state} to inactive. */ close: function() { this.model.setActive( false ); this.view.close(); }, /** * Commits the currently chosen or given item. HTML is generated for this item using the * {@link #getHtmlToInsert} method and then it is inserted into the editor. The item is inserted * into the {@link CKEDITOR.plugins.autocomplete.model#range query's range}, so the query text is * replaced by the inserted HTML. * * @param {Number/String} [itemId] If given, then the specified item will be inserted into the editor * instead of the currently chosen one. */ commit: function( itemId ) { if ( !this.model.isActive ) { return; } this.close(); if ( itemId == null ) { itemId = this.model.selectedItemId; // If non item is selected abort commit. if ( itemId == null ) { return; } } var item = this.model.getItemById( itemId ), editor = this.editor, html = this.getHtmlToInsert( item ); // Insert space after accepting match (#2008). html += this.followingSpace ? ' ' : ''; editor.fire( 'saveSnapshot' ); editor.getSelection().selectRanges( [ this.model.range ] ); editor.insertHtml( html, 'text' ); if ( this.followingSpace ) { removeLeadingSpace( editor ); } editor.fire( 'saveSnapshot' ); }, /** * Destroys the autocomplete instance. * View element and event listeners will be removed from the DOM. */ destroy: function() { CKEDITOR.tools.array.forEach( this._listeners, function( obj ) { obj.removeListener(); } ); this._listeners = []; this.view.element && this.view.element.remove(); this.removeAriaAttributesFromEditable(); }, /** * Returns HTML that should be inserted into the editor when the item is committed. * * See also the {@link #commit} method. * * @param {CKEDITOR.plugins.autocomplete.model.item} item * @returns {String} The HTML to insert. */ getHtmlToInsert: function( item ) { var encodedItem = encodeItem( item ); return this.outputTemplate ? this.outputTemplate.output( encodedItem ) : encodedItem.name; }, /** * Creates and returns the model instance. This method is used when * initializing the autocomplete and can be overwritten in order to * return an instance of a different class than the default model. * * @param {Function} dataCallback See {@link CKEDITOR.plugins.autocomplete.configDefinition#dataCallback configDefinition.dataCallback}. * @returns {CKEDITOR.plugins.autocomplete.model} The model instance. */ getModel: function( dataCallback ) { var that = this; return new Model( function( matchInfo, callback ) { return dataCallback.call( this, CKEDITOR.tools.extend( { // Make sure autocomplete instance is available in the callback (#2108). autocomplete: that }, matchInfo ), callback ); } ); }, /** * Creates and returns the text watcher instance. This method is used while * initializing the autocomplete and can be overwritten in order to * return an instance of a different class than the default text watcher. * * @param {Function} textTestCallback See the {@link CKEDITOR.plugins.autocomplete} arguments. * @returns {CKEDITOR.plugins.textWatcher} The text watcher instance. */ getTextWatcher: function( textTestCallback ) { return new CKEDITOR.plugins.textWatcher( this.editor, textTestCallback, this.throttle ); }, /** * Creates and returns the view instance. This method is used while * initializing the autocomplete and can be overwritten in order to * return an instance of a different class than the default view. * * @returns {CKEDITOR.plugins.autocomplete.view} The view instance. */ getView: function() { return new View( this.editor ); }, /** * Opens the panel if {@link CKEDITOR.plugins.autocomplete.model#hasData there is any data available}. */ open: function() { if ( this.model.hasData() ) { this.model.setActive( true ); this.view.open(); this.model.selectFirst(); this.view.updatePosition( this.model.range ); } }, // LISTENERS ------------------ /** * The function that should be called when the view has to be repositioned, e.g on scroll. * * @private */ viewRepositionListener: function() { if ( this.model.isActive ) { this.view.updatePosition( this.model.range ); } }, /** * The function that should be called once the model data has changed. * * @param {CKEDITOR.eventInfo} evt * @private */ modelChangeListener: function( evt ) { if ( this.model.hasData() ) { this.view.updateItems( evt.data ); this.open(); } else { this.close(); } }, /** * The function that should be called once a view item was clicked. * * @param {CKEDITOR.eventInfo} evt * @private */ onItemClick: function( evt ) { this.commit( evt.data ); }, /** * The function that should be called on every `keydown` event occurred within the {@link CKEDITOR.editable editable} element. * * @param {CKEDITOR.dom.event} evt * @private */ onKeyDown: function( evt ) { if ( !this.model.isActive ) { return; } var keyCode = evt.data.getKey(), handled = false; // Esc key. if ( keyCode == 27 ) { this.close(); this.textWatcher.unmatch(); handled = true; // Down Arrow. } else if ( keyCode == 40 ) { this.model.selectNext(); handled = true; // Up Arrow. } else if ( keyCode == 38 ) { this.model.selectPrevious(); handled = true; // Completion keys. } else if ( CKEDITOR.tools.indexOf( this.commitKeystrokes, keyCode ) != -1 ) { this.commit(); this.textWatcher.unmatch(); handled = true; } if ( handled ) { evt.cancel(); evt.data.preventDefault(); this.textWatcher.consumeNext(); } }, /** * The function that should be called once an item was selected. * * @param {CKEDITOR.eventInfo} evt * @private */ onSelectedItemId: function( evt ) { var itemId = evt.data, selectedItem = this.view.getItemById( itemId ); this.model.setItem( itemId ); this.view.selectItem( itemId ); this.updateAriaActiveDescendantAttributeOnEditable( selectedItem.getAttribute( 'id' ) ); }, /** * The function that should be called once a text was matched by the {@link CKEDITOR.plugins.textWatcher text watcher} * component. * * @param {CKEDITOR.eventInfo} evt * @private */ onTextMatched: function( evt ) { this.model.setActive( false ); this.model.setQuery( evt.data.text, evt.data.range ); }, /** * The function that should be called once a text was unmatched by the {@link CKEDITOR.plugins.textWatcher text watcher} * component. * * @param {CKEDITOR.eventInfo} evt * @private */ onTextUnmatched: function() { // Remove query and request ID to avoid opening view for invalid callback (#1984). this.model.query = null; this.model.lastRequestId = null; this.close(); } }; /** * Class representing the autocomplete view. * * In order to use a different view, implement a new view class and override * the {@link CKEDITOR.plugins.autocomplete#getView} method. * * ```javascript * myAutocomplete.prototype.getView = function() { * return new myView( this.editor ); * }; * ``` * * You can also modify this autocomplete instance on the fly. * * ```javascript * myAutocomplete.prototype.getView = function() { * // Call the original getView method. * var view = CKEDITOR.plugins.autocomplete.prototype.getView.call( this ); * * // Override one property. * view.itemTemplate = new CKEDITOR.template( '
  • ... {name}
  • ' ); * * return view; * }; * ``` * * **Note:** This class is marked as private, which means that its API might be subject to change in order to * provide further enhancements. * * @class CKEDITOR.plugins.autocomplete.view * @since 4.10.0 * @private * @mixins CKEDITOR.event * @constructor Creates the autocomplete view instance. * @param {CKEDITOR.editor} editor The editor instance. */ function View( editor ) { /** * The panel's item template used to render matches in the dropdown. * * You can use {@link CKEDITOR.plugins.autocomplete.model#data data item} properties to customize the template. * * A minimal template must be wrapped with a HTML `li` element containing the `data-id="{id}"` attribute. * * ```javascript * var itemTemplate = '
  • {name}{name}
  • '; * ``` * * @readonly * @property {CKEDITOR.template} */ this.itemTemplate = new CKEDITOR.template( '
  • {name}
  • ' ); /** * The editor instance. * * @readonly * @property {CKEDITOR.editor} */ this.editor = editor; /** * The ID of the selected item. * * @readonly * @property {Number/String} selectedItemId */ /** * The document to which the view is attached. It is set by the {@link #append} method. * * @readonly * @property {CKEDITOR.dom.document} document */ /** * The view's main element. It is set by the {@link #append} method. * * @readonly * @property {CKEDITOR.dom.element} element */ /** * Event fired when an item in the panel is clicked. * * @event click-item * @param {String} The clicked item {@link CKEDITOR.plugins.autocomplete.model.item#id}. Note: the ID * is stringified due to the way how it is stored in the DOM. */ /** * Event fired when the {@link #selectedItemId} property changes. * * @event change-selectedItemId * @param {Number/String} data The new value. */ } View.prototype = { /** * Appends the {@link #element main element} to the DOM. */ append: function() { this.document = CKEDITOR.document; this.element = this.createElement(); this.document.getBody().append( this.element ); }, /** * Removes existing items and appends given items to the {@link #element}. * * @param {CKEDITOR.dom.documentFragment} itemsFragment The document fragment with item elements. */ appendItems: function( itemsFragment ) { this.element.setHtml( '' ); this.element.append( itemsFragment ); }, /** * Attaches the view's listeners to the DOM elements. */ attach: function() { this.element.on( 'click', function( evt ) { var target = evt.data.getTarget(), itemElement = target.getAscendant( this.isItemElement, true ); if ( itemElement ) { this.fire( 'click-item', itemElement.data( 'id' ) ); } }, this ); this.element.on( 'mouseover', function( evt ) { var target = evt.data.getTarget(); if ( this.element.contains( target ) ) { // Find node containing data-id attribute inside target node tree (#2187). target = target.getAscendant( function( element ) { return element.hasAttribute( 'data-id' ); }, true ); if ( !target ) { return; } var itemId = target.data( 'id' ); this.fire( 'change-selectedItemId', itemId ); } }, this ); }, /** * Closes the panel. */ close: function() { this.element.removeClass( 'cke_autocomplete_opened' ); }, /** * Creates and returns the view's main element. * * @private * @returns {CKEDITOR.dom.element} */ createElement: function() { var el = new CKEDITOR.dom.element( 'ul', this.document ), id = CKEDITOR.tools.getNextId(); // Id is needed to correctly bind autocomplete with the editable (#4617). el.setAttribute( 'id', id ); el.addClass( 'cke_autocomplete_panel' ); // Below float panels and context menu, but above maximized editor (-5). el.setStyle( 'z-index', this.editor.config.baseFloatZIndex - 3 ); // Add also appropriate role (#4617). el.setAttribute( 'role', 'listbox' ); return el; }, /** * Creates the item element based on the {@link #itemTemplate}. * * @param {CKEDITOR.plugins.autocomplete.model.item} item The item for which an element will be created. * @returns {CKEDITOR.dom.element} */ createItem: function( item ) { var encodedItem = encodeItem( item ), itemElement = CKEDITOR.dom.element.createFromHtml( this.itemTemplate.output( encodedItem ), this.document ), id = CKEDITOR.tools.getNextId(); // Add attributes needed for a11y support (#4617). itemElement.setAttribute( 'id', id ); itemElement.setAttribute( 'role', 'option' ); return itemElement; }, /** * Returns the view position based on a given `range`. * * Indicates the start position of the autocomplete dropdown. * The value returned by this function is passed to the {@link #setPosition} method * by the {@link #updatePosition} method. * * @param {CKEDITOR.dom.range} range The range of the text match. * @returns {Object} Represents the position of the caret. The value is relative to the panel's offset parent. * @returns {Number} rect.left * @returns {Number} rect.top * @returns {Number} rect.bottom */ getViewPosition: function( range ) { // Use the last rect so the view will be // correctly positioned with a word split into few lines. var rects = range.getClientRects(), viewPositionRect = rects[ rects.length - 1 ], offset, editable = this.editor.editable(); if ( editable.isInline() ) { offset = CKEDITOR.document.getWindow().getScrollPosition(); } else { offset = editable.getParent().getDocumentPosition( CKEDITOR.document ); } // Consider that offset host might be repositioned on its own. // Similar to #1048. See https://github.com/ckeditor/ckeditor4/pull/1732#discussion_r182790235. var hostElement = CKEDITOR.document.getBody(); if ( hostElement.getComputedStyle( 'position' ) === 'static' ) { hostElement = hostElement.getParent(); } var offsetCorrection = hostElement.getDocumentPosition(); offset.x -= offsetCorrection.x; offset.y -= offsetCorrection.y; return { top: ( viewPositionRect.top + offset.y ), bottom: ( viewPositionRect.top + viewPositionRect.height + offset.y ), left: ( viewPositionRect.left + offset.x ) }; }, /** * Gets the item element by the item ID. * * @param {Number/String} itemId * @returns {CKEDITOR.dom.element} The item element. */ getItemById: function( itemId ) { return this.element.findOne( 'li[data-id="' + itemId + '"]' ); }, /** * Checks whether a given node is the item element. * * @param {CKEDITOR.dom.node} node * @returns {Boolean} */ isItemElement: function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && Boolean( node.data( 'id' ) ); }, /** * Opens the panel. */ open: function() { this.element.addClass( 'cke_autocomplete_opened' ); }, /** * Selects the item in the panel and scrolls the list to show it if needed. * The {@link #selectedItemId currently selected item} is deselected first. * * @param {Number/String} itemId The ID of the item that should be selected. */ selectItem: function( itemId ) { if ( this.selectedItemId != null ) { this.getItemById( this.selectedItemId ).removeClass( 'cke_autocomplete_selected' ); } var itemElement = this.getItemById( itemId ); itemElement.addClass( 'cke_autocomplete_selected' ); this.selectedItemId = itemId; this.scrollElementTo( itemElement ); }, /** * Sets the position of the panel. This method only performs the check * for the available space below and above the specified `rect` and * positions the panel in the best place. * * This method is used by the {@link #updatePosition} method which * controls how the panel should be positioned on the screen, for example * based on the caret position and/or the editor position. * * @param {Object} rect Represents the position of a vertical (e.g. a caret) line relative to which * the panel should be positioned. * @param {Number} rect.left The position relative to the panel's offset parent in pixels. * For example, the position of the caret. * @param {Number} rect.top The position relative to the panel's offset parent in pixels. * For example, the position of the upper end of the caret. * @param {Number} rect.bottom The position relative to the panel's offset parent in pixels. * For example, the position of the bottom end of the caret. */ setPosition: function( rect ) { var documentWindow = this.element.getWindow(), windowRect = documentWindow.getViewPaneSize(), top = getVerticalPosition( { editorViewportRect: getEditorViewportRect( this.editor ), caretRect: rect, viewHeight: this.element.getSize( 'height' ), scrollPositionY: documentWindow.getScrollPosition().y, windowHeight: windowRect.height } ), left = getHorizontalPosition( { leftPosition: rect.left, viewWidth: this.element.getSize( 'width' ), windowWidth: windowRect.width } ); this.element.setStyles( { left: left + 'px', top: top + 'px' } ); function getVerticalPosition( options ) { var editorViewportRect = options.editorViewportRect, caretRect = options.caretRect, viewHeight = options.viewHeight, scrollPositionY = options.scrollPositionY, windowHeight = options.windowHeight; // If the caret position is below the view - keep it at the bottom edge. // +---------------------------------------------+ // | editor viewport | // | | // | +--------------+ | // | | | | // | | view | | // | | | | // +-----+==============+------------------------+ // | | // | █ - caret position | // | | // +---------------------------------------------+ if ( editorViewportRect.bottom < caretRect.bottom ) { return Math.min( caretRect.top, editorViewportRect.bottom ) - viewHeight; } // If the view doesn't fit below the caret position and fits above, set it there. // This means that the position below the caret is preferred. // +---------------------------------------------+ // | | // | editor viewport | // | +--------------+ | // | | | | // | | view | | // | | | | // | +--------------+ | // | █ - caret position | // | | // | | // +---------------------------------------------+ // How much space is there for the view above and below the specified rect. var spaceAbove = caretRect.top - editorViewportRect.top, spaceBelow = editorViewportRect.bottom - caretRect.bottom, viewExceedsTopViewport = ( caretRect.top - viewHeight ) < scrollPositionY; if ( viewHeight > spaceBelow && viewHeight < spaceAbove && !viewExceedsTopViewport ) { return caretRect.top - viewHeight; } // If the caret position is above the view - keep it at the top edge. // +---------------------------------------------+ // | | // | █ - caret position | // | | // +-----+==============+------------------------+ // | | | | // | | view | | // | | | | // | +--------------+ | // | | // | editor viewport | // +---------------------------------------------+ if ( editorViewportRect.top > caretRect.top ) { return Math.max( caretRect.bottom, editorViewportRect.top ); } // (#3582) // If the view goes beyond bottom window border - reverse view position, even if it fits editor viewport. // +---------------------------------------------+ // | editor viewport | // | | // | | // | +--------------+ | // | | view | | // | +--------------+ | // | caret position - █ | // | | // =============================================== - bottom window border // | | // | | // +---------------------------------------------+ var viewExceedsBottomViewport = ( caretRect.bottom + viewHeight ) > ( windowHeight + scrollPositionY ); if ( !( viewHeight > spaceBelow && viewHeight < spaceAbove ) && viewExceedsBottomViewport ) { return caretRect.top - viewHeight; } // As a default, keep the view inside the editor viewport. // +---------------------------------------------+ // | editor viewport | // | | // | | // | | // | █ - caret position | // | +--------------+ | // | | view | | // | +--------------+ | // | | // | | // +---------------------------------------------+ return Math.min( editorViewportRect.bottom, caretRect.bottom ); } function getHorizontalPosition( options ) { var caretLeftPosition = options.leftPosition, viewWidth = options.viewWidth, windowWidth = options.windowWidth; // (#3582) // If the view goes beyond right window border - stick it to the edge of the available viewport. // +---------------------------------------------+ || // | editor viewport | || // | | || // | | || // | caret position - █ | || - right window border // | +--------------+|| // | | ||| // | | view ||| // | | ||| // | +--------------+|| // | | || // +---------------------------------------------+ || if ( caretLeftPosition + viewWidth > windowWidth ) { return windowWidth - viewWidth; } // Otherwise inherit the horizontal position from caret. return caretLeftPosition; } // Bounding rect where the view should fit (visible editor viewport). function getEditorViewportRect( editor ) { var editable = editor.editable(); // iOS classic editor has different viewport element (#1910). if ( CKEDITOR.env.iOS && !editable.isInline() ) { return iOSViewportElement( editor ).getClientRect( true ); } else { return editable.isInline() ? editable.getClientRect( true ) : editor.window.getFrame().getClientRect( true ); } } }, /** * Scrolls the list so the item element is visible in it. * * @param {CKEDITOR.dom.element} itemElement */ scrollElementTo: function( itemElement ) { itemElement.scrollIntoParent( this.element ); }, /** * Updates the list of items in the panel. * * @param {CKEDITOR.plugins.autocomplete.model.item[]} items. */ updateItems: function( items ) { var i, frag = new CKEDITOR.dom.documentFragment( this.document ); for ( i = 0; i < items.length; ++i ) { frag.append( this.createItem( items[ i ] ) ); } this.appendItems( frag ); this.selectedItemId = null; }, /** * Updates the position of the panel. * * By default this method finds the position of the caret and uses * {@link #setPosition} to move the panel to the best position close * to the caret. * * @param {CKEDITOR.dom.range} range The range of the text match. */ updatePosition: function( range ) { this.setPosition( this.getViewPosition( range ) ); } }; CKEDITOR.event.implementOn( View.prototype ); /** * Class representing the autocomplete model. * * In case you want to modify the model behavior, check out the * {@link CKEDITOR.plugins.autocomplete.view} documentation. It contains * examples of how to easily override the default behavior. * * A model instance is created by the {@link CKEDITOR.plugins.autocomplete#getModel} method. * * **Note:** This class is marked as private, which means that its API might be subject to change in order to * provide further enhancements. * * @class CKEDITOR.plugins.autocomplete.model * @since 4.10.0 * @private * @mixins CKEDITOR.event * @constructor Creates the autocomplete model instance. * @param {Function} dataCallback See {@link CKEDITOR.plugins.autocomplete} arguments. */ function Model( dataCallback ) { /** * The callback executed by the model when requesting data. * See {@link CKEDITOR.plugins.autocomplete} arguments. * * @readonly * @property {Function} */ this.dataCallback = dataCallback; /** * Whether the autocomplete is active (i.e. can receive user input like click, key press). * Should be modified by the {@link #setActive} method which fires the {@link #change-isActive} event. * * @readonly */ this.isActive = false; /** * Indicates the limit of items rendered in the dropdown. * * For falsy values like `0` or `null` all items will be rendered. * * @property {Number} [itemsLimit=0] */ this.itemsLimit = 0; /** * The ID of the last request for data. Used by the {@link #setQuery} method. * * @readonly * @private * @property {Number} lastRequestId */ /** * The query string set by the {@link #setQuery} method. * * The query string always has a corresponding {@link #range}. * * @readonly * @property {String} query */ /** * The range in the DOM where the {@link #query} text is. * * The range always has a corresponding {@link #query}. Both can be set by the {@link #setQuery} method. * * @readonly * @property {CKEDITOR.dom.range} range */ /** * The query results — the items to be displayed in the autocomplete panel. * * @readonly * @property {CKEDITOR.plugins.autocomplete.model.item[]} data */ /** * The ID of the item currently selected in the panel. * * @readonly * @property {Number/String} selectedItemId */ /** * Event fired when the {@link #data} array changes. * * @event change-data * @param {CKEDITOR.plugins.autocomplete.model.item[]} data The new value. */ /** * Event fired when the {@link #selectedItemId} property changes. * * @event change-selectedItemId * @param {Number/String} data The new value. */ /** * Event fired when the {@link #isActive} property changes. * * @event change-isActive * @param {Boolean} data The new value. */ } Model.prototype = { /** * Gets an index from the {@link #data} array of the item by its ID. * * @param {Number/String} itemId * @returns {Number} */ getIndexById: function( itemId ) { if ( !this.hasData() ) { return -1; } for ( var data = this.data, i = 0, l = data.length; i < l; i++ ) { if ( data[ i ].id == itemId ) { return i; } } return -1; }, /** * Gets the item from the {@link #data} array by its ID. * * @param {Number/String} itemId * @returns {CKEDITOR.plugins.autocomplete.model.item} */ getItemById: function( itemId ) { var index = this.getIndexById( itemId ); return ~index && this.data[ index ] || null; }, /** * Whether the model contains non-empty {@link #data}. * * @returns {Boolean} */ hasData: function() { return Boolean( this.data && this.data.length ); }, /** * Sets the {@link #selectedItemId} property. * * @param {Number/String} itemId */ setItem: function( itemId ) { if ( this.getIndexById( itemId ) < 0 ) { throw new Error( 'Item with given id does not exist' ); } this.selectedItemId = itemId; }, /** * Fires the {@link #change-selectedItemId} event. * * @param {Number/String} itemId */ select: function( itemId ) { this.fire( 'change-selectedItemId', itemId ); }, /** * Selects the first item. See also the {@link #select} method. */ selectFirst: function() { if ( this.hasData() ) { this.select( this.data[ 0 ].id ); } }, /** * Selects the last item. See also the {@link #select} method. */ selectLast: function() { if ( this.hasData() ) { this.select( this.data[ this.data.length - 1 ].id ); } }, /** * Selects the next item in the {@link #data} array. If no item is selected, * it selects the first one. If the last one is selected, it selects the first one. * * See also the {@link #select} method. */ selectNext: function() { if ( this.selectedItemId == null ) { this.selectFirst(); return; } var index = this.getIndexById( this.selectedItemId ); if ( index < 0 || index + 1 == this.data.length ) { this.selectFirst(); } else { this.select( this.data[ index + 1 ].id ); } }, /** * Selects the previous item in the {@link #data} array. If no item is selected, * it selects the last one. If the first one is selected, it selects the last one. * * See also the {@link #select} method. */ selectPrevious: function() { if ( this.selectedItemId == null ) { this.selectLast(); return; } var index = this.getIndexById( this.selectedItemId ); if ( index <= 0 ) { this.selectLast(); } else { this.select( this.data[ index - 1 ].id ); } }, /** * Sets the {@link #isActive} property and fires the {@link #change-isActive} event. * * @param {Boolean} isActive */ setActive: function( isActive ) { this.isActive = isActive; this.fire( 'change-isActive', isActive ); }, /** * Sets the {@link #query} and {@link #range} and makes a request for the query results * by executing the {@link #dataCallback} function. When the data is returned (synchronously or * asynchronously, because {@link #dataCallback} exposes a callback function), the {@link #data} * property is set and the {@link #change-data} event is fired. * * This method controls that only the response for the current query is handled. * * @param {String} query * @param {CKEDITOR.dom.range} range */ setQuery: function( query, range ) { var that = this, requestId = CKEDITOR.tools.getNextId(); this.lastRequestId = requestId; this.query = query; this.range = range; this.data = null; this.selectedItemId = null; this.dataCallback( { query: query, range: range }, handleData ); // Note: don't put any executable code here because the callback passed to // this.dataCallback may be executed synchronously or asynchronously // so execution order will differ. function handleData( data ) { // Handle only the response for the most recent setQuery call. if ( requestId == that.lastRequestId ) { // Limit number of items (#2030). if ( that.itemsLimit ) { that.data = data.slice( 0, that.itemsLimit ); } else { that.data = data; } that.fire( 'change-data', that.data ); } } } }; CKEDITOR.event.implementOn( Model.prototype ); /** * An abstract class representing one {@link CKEDITOR.plugins.autocomplete.model#data data item}. * A item can be understood as one entry in the autocomplete panel. * * An item must have a unique {@link #id} and may have more properties which can then be used, for example, * in the {@link CKEDITOR.plugins.autocomplete.view#itemTemplate} template or the * {@link CKEDITOR.plugins.autocomplete#getHtmlToInsert} method. * * Example items: * * ```javascript * { id: 345, name: 'CKEditor' } * { id: 'smile1', alt: 'smile', emojiSrc: 'emojis/smile.png' } * ``` * * @abstract * @class CKEDITOR.plugins.autocomplete.model.item * @since 4.10.0 */ /** * The unique ID of the item. The ID should not change with time, so two * {@link CKEDITOR.plugins.autocomplete.model#dataCallback} * calls should always result in the same ID for the same logical item. * This can, for example, allow to keep the same item selected when * the data changes. * * **Note:** When using a string as an item, make sure that the string does not * contain any special characters (above all `"[]` characters). This limitation is * due to the simplified way the {@link CKEDITOR.plugins.autocomplete.view} * stores IDs in the DOM. * * @readonly * @property {Number/String} id */ CKEDITOR.plugins.autocomplete = Autocomplete; Autocomplete.view = View; Autocomplete.model = Model; /** * The autocomplete keystrokes used to finish autocompletion with the selected view item. * This setting will set completing keystrokes for each autocomplete plugin respectively. * * To change completing keystrokes individually use the {@link CKEDITOR.plugins.autocomplete#commitKeystrokes} plugin property. * * ```javascript * // Default configuration (9 = Tab, 13 = Enter). * config.autocomplete_commitKeystrokes = [ 9, 13 ]; * ``` * * Commit keystroke can also be disabled by setting it to an empty array. * * ```javascript * // Disable autocomplete commit keystroke. * config.autocomplete_commitKeystrokes = []; * ``` * * @since 4.10.0 * @cfg {Number/Number[]} [autocomplete_commitKeystrokes=[9, 13]] * @member CKEDITOR.config */ CKEDITOR.config.autocomplete_commitKeystrokes = [ 9, 13 ]; // Viewport on iOS is moved into iframe parent element because of https://bugs.webkit.org/show_bug.cgi?id=149264 issue. // Once upstream issue is resolved this function should be removed and its concurrences should be refactored to // follow the default code path. function iOSViewportElement( editor ) { return editor.window.getFrame().getParent(); } function encodeItem( item ) { return CKEDITOR.tools.array.reduce( CKEDITOR.tools.object.keys( item ), function( cur, key ) { cur[ key ] = CKEDITOR.tools.htmlEncode( item[ key ] ); return cur; }, {} ); } function removeLeadingSpace( editor ) { var selection = editor.getSelection(), nextNode = selection.getRanges()[ 0 ].getNextNode( function( node ) { return Boolean( node.type == CKEDITOR.NODE_TEXT && node.getText() ); } ); if ( nextNode && nextNode.getText().match( /^\s+/ ) ) { var range = editor.createRange(); range.setStart( nextNode, 0 ); range.setEnd( nextNode, 1 ); range.deleteContents(); } } /** * Abstract class describing the definition of the [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) plugin configuration. * * It lists properties used to define and create autocomplete configuration definition. * * Simple usage: * * ```javascript * var definition = { * dataCallback: dataCallback, * textTestCallback: textTestCallback, * throttle: 200 * }; * ``` * * @class CKEDITOR.plugins.autocomplete.configDefinition * @abstract * @since 4.10.0 */ /** * Callback executed to get suggestion data based on the search query. The returned data will be * displayed in the autocomplete view. * * ```javascript * // Returns (through its callback) the suggestions for the current query. * // Note: The itemsArray variable is the example "database". * function dataCallback( matchInfo, callback ) { * // Simple search. * // Filter the entire items array so only the items that start * // with the query remain. * var suggestions = itemsArray.filter( function( item ) { * return item.name.indexOf( matchInfo.query ) === 0; * } ); * * // Note: The callback function can also be executed asynchronously * // so dataCallback can do an XHR request or use any other asynchronous API. * callback( suggestions ); * } * * ``` * * @method dataCallback * @param {CKEDITOR.plugins.autocomplete.matchInfo} matchInfo * @param {Function} callback The callback which should be executed with the matched data. * @param {CKEDITOR.plugins.autocomplete.model.item[]} callback.data The suggestion data that should be * displayed in the autocomplete view for a given query. The data items should implement the * {@link CKEDITOR.plugins.autocomplete.model.item} interface. */ /** * Callback executed to check if a text next to the selection should open * the autocomplete. See the {@link CKEDITOR.plugins.textWatcher}'s `callback` argument. * * ```javascript * // Called when the user types in the editor or moves the caret. * // The range represents the caret position. * function textTestCallback( range ) { * // You do not want to autocomplete a non-empty selection. * if ( !range.collapsed ) { * return null; * } * * // Use the text match plugin which does the tricky job of doing * // a text search in the DOM. The matchCallback function should return * // a matching fragment of the text. * return CKEDITOR.plugins.textMatch.match( range, matchCallback ); * } * * // Returns a position of the matching text. * // It matches with a word starting from the '@' character * // up to the caret position. * function matchCallback( text, offset ) { * // Get the text before the caret. * var left = text.slice( 0, offset ), * // Will look for an '@' character followed by word characters. * match = left.match( /@\w*$/ ); * * if ( !match ) { * return null; * } * return { start: match.index, end: offset }; * } * ``` * * @method textTestCallback * @param {CKEDITOR.dom.range} range Range representing the caret position. */ /** * @inheritdoc CKEDITOR.plugins.autocomplete#throttle * @property {Number} [throttle] */ /** * @inheritdoc CKEDITOR.plugins.autocomplete.model#itemsLimit * @property {Number} [itemsLimit] */ /** * @inheritdoc CKEDITOR.plugins.autocomplete.view#itemTemplate * @property {String} [itemTemplate] */ /** * @inheritdoc CKEDITOR.plugins.autocomplete#outputTemplate * @property {String} [outputTemplate] */ /** * @inheritdoc CKEDITOR.plugins.autocomplete#followingSpace * @since 4.20.0 * @property {Boolean} [followingSpace] */ /** * Abstract class describing a set of properties that can be used to produce more adequate suggestion data based on the matched query. * * @class CKEDITOR.plugins.autocomplete.matchInfo * @abstract * @since 4.10.0 */ /** * The query string that was accepted by the * {@link CKEDITOR.plugins.autocomplete.configDefinition#textTestCallback config.textTestCallback}. * * @property {String} query */ /** * The range in the DOM indicating the position of the {@link #query}. * * @property {CKEDITOR.dom.range} range */ /** * The {@link CKEDITOR.plugins.autocomplete Autocomplete} instance that matched the query. * * @property {CKEDITOR.plugins.autocomplete} autocomplete */ } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/autocomplete/skins/0000755000201500020150000000000014515446705024105 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/autocomplete/skins/default.css0000644000201500020150000000135514515446705026247 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ .cke_autocomplete_panel { position: absolute; display: none; box-sizing: border-box; width: 200px; max-height: 300px; overflow: auto; padding: 0; margin: 0; list-style: none; background: #FFF; border: 1px solid #b6b6b6; border-bottom-color: #999; border-radius: 3px; font: 12px Arial, Helvetica, Tahoma, Verdana, Sans-Serif; } .cke_autocomplete_opened { display: block; } .cke_autocomplete_panel > li { padding: 5px; } .cke_autocomplete_panel > li:hover { cursor: pointer; } .cke_autocomplete_selected, .cke_autocomplete_panel > li:hover { background-color: #EFF0EF; } rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/0000755000201500020150000000000014515446713021221 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/plugin.js0000644000201500020150000012165014515446713023062 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview Undo/Redo system for saving a snapshot for document modification * and other recordable changes. */ 'use strict'; ( function() { var keystrokes = [ CKEDITOR.CTRL + 90 /*Z*/, CKEDITOR.CTRL + 89 /*Y*/, CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/ ], backspaceOrDelete = { 8: 1, 46: 1 }; CKEDITOR.plugins.add( 'undo', { // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'redo,redo-rtl,undo,undo-rtl', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { var undoManager = editor.undoManager = new UndoManager( editor ), editingHandler = undoManager.editingHandler = new NativeEditingHandler( undoManager ); var undoCommand = editor.addCommand( 'undo', { exec: function() { if ( undoManager.undo() ) { editor.selectionChange(); this.fire( 'afterUndo' ); } }, startDisabled: true, canUndo: false } ); var redoCommand = editor.addCommand( 'redo', { exec: function() { if ( undoManager.redo() ) { editor.selectionChange(); this.fire( 'afterRedo' ); } }, startDisabled: true, canUndo: false } ); editor.setKeystroke( [ [ keystrokes[ 0 ], 'undo' ], [ keystrokes[ 1 ], 'redo' ], [ keystrokes[ 2 ], 'redo' ] ] ); undoManager.onChange = function() { undoCommand.setState( undoManager.undoable() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); redoCommand.setState( undoManager.redoable() ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); }; function recordCommand( event ) { // If the command hasn't been marked to not support undo. if ( undoManager.enabled && event.data.command.canUndo !== false ) undoManager.save(); } // We'll save snapshots before and after executing a command. editor.on( 'beforeCommandExec', recordCommand ); editor.on( 'afterCommandExec', recordCommand ); // Save snapshots before doing custom changes. editor.on( 'saveSnapshot', function( evt ) { undoManager.save( evt.data && evt.data.contentOnly ); } ); // Event manager listeners should be attached on contentDom. editor.on( 'contentDom', editingHandler.attachListeners, editingHandler ); editor.on( 'instanceReady', function() { // Saves initial snapshot. editor.fire( 'saveSnapshot' ); } ); // Always save an undo snapshot - the previous mode might have // changed editor contents. editor.on( 'beforeModeUnload', function() { editor.mode == 'wysiwyg' && undoManager.save( true ); } ); function toggleUndoManager() { undoManager.enabled = editor.readOnly ? false : editor.mode == 'wysiwyg'; undoManager.onChange(); } // Make the undo manager available only in wysiwyg mode. editor.on( 'mode', toggleUndoManager ); // Disable undo manager when in read-only mode. editor.on( 'readOnly', toggleUndoManager ); if ( editor.ui.addButton ) { editor.ui.addButton( 'Undo', { label: editor.lang.undo.undo, command: 'undo', toolbar: 'undo,10' } ); editor.ui.addButton( 'Redo', { label: editor.lang.undo.redo, command: 'redo', toolbar: 'undo,20' } ); } /** * Resets the undo stack. * * @member CKEDITOR.editor */ editor.resetUndo = function() { // Reset the undo stack. undoManager.reset(); // Create the first image. editor.fire( 'saveSnapshot' ); }; /** * Amends the top of the undo stack (last undo image) with the current DOM changes. * * function() { * editor.fire( 'saveSnapshot' ); * editor.document.body.append(...); * // Makes new changes following the last undo snapshot a part of it. * editor.fire( 'updateSnapshot' ); * .. * } * * @event updateSnapshot * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. */ editor.on( 'updateSnapshot', function() { if ( undoManager.currentImage ) undoManager.update(); } ); /** * Locks the undo manager to prevent any save/update operations. * * It is convenient to lock the undo manager before performing DOM operations * that should not be recorded (e.g. auto paragraphing). * * See {@link CKEDITOR.plugins.undo.UndoManager#lock} for more details. * * **Note:** In order to unlock the undo manager, {@link #unlockSnapshot} has to be fired * the same number of times that `lockSnapshot` has been fired. * * @since 4.0.0 * @event lockSnapshot * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param data * @param {Boolean} [data.dontUpdate] When set to `true`, the last snapshot will not be updated * with the current content and selection. Read more in the {@link CKEDITOR.plugins.undo.UndoManager#lock} method. * @param {Boolean} [data.forceUpdate] When set to `true`, the last snapshot will always be updated * with the current content and selection. Read more in the {@link CKEDITOR.plugins.undo.UndoManager#lock} method. */ editor.on( 'lockSnapshot', function( evt ) { var data = evt.data; undoManager.lock( data && data.dontUpdate, data && data.forceUpdate ); } ); /** * Unlocks the undo manager and updates the latest snapshot. * * @since 4.0.0 * @event unlockSnapshot * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. */ editor.on( 'unlockSnapshot', undoManager.unlock, undoManager ); } } ); CKEDITOR.plugins.undo = {}; /** * Main logic for the Redo/Undo feature. * * @private * @class CKEDITOR.plugins.undo.UndoManager * @constructor Creates an UndoManager class instance. * @param {CKEDITOR.editor} editor */ var UndoManager = CKEDITOR.plugins.undo.UndoManager = function( editor ) { /** * An array storing the number of key presses, count in a row. Use {@link #keyGroups} members as index. * * **Note:** The keystroke count will be reset after reaching the limit of characters per snapshot. * * @since 4.4.4 */ this.strokesRecorded = [ 0, 0 ]; /** * When the `locked` property is not `null`, the undo manager is locked, so * operations like `save` or `update` are forbidden. * * The manager can be locked and unlocked by the {@link #lock} and {@link #unlock} * methods, respectively. * * @readonly * @property {Object} [locked=null] */ this.locked = null; /** * Contains the previously processed key group, based on {@link #keyGroups}. * `-1` means an unknown group. * * @since 4.4.4 * @readonly * @property {Number} [previousKeyGroup=-1] */ this.previousKeyGroup = -1; /** * The maximum number of snapshots in the stack. Configurable via {@link CKEDITOR.config#undoStackSize}. * * @readonly * @property {Number} [limit] */ this.limit = editor.config.undoStackSize || 20; /** * The maximum number of characters typed/deleted in one undo step. * * @since 4.4.5 * @readonly */ this.strokesLimit = 25; /** * An array of filter rules. * * @since 4.13.0 * @private * @property {Function[]} */ this._filterRules = []; this.editor = editor; // Reset the undo stack. this.reset(); // In IE, we need to remove the expando attributes. if ( CKEDITOR.env.ie ) { this.addFilterRule( function( data ) { return data.replace( /\s+data-cke-expando=".*?"/g, '' ); } ); } }; UndoManager.prototype = { /** * Handles keystroke support for the undo manager. It is called on the `keyup` event for * keystrokes that can change the editor content. * * @param {Number} keyCode The key code. * @param {Boolean} [strokesPerSnapshotExceeded] When set to `true`, the method will * behave as if the strokes limit was exceeded regardless of the {@link #strokesRecorded} value. */ type: function( keyCode, strokesPerSnapshotExceeded ) { var keyGroup = UndoManager.getKeyGroup( keyCode ), // Count of keystrokes in current a row. // Note if strokesPerSnapshotExceeded will be exceeded, it'll be restarted. strokesRecorded = this.strokesRecorded[ keyGroup ] + 1; strokesPerSnapshotExceeded = ( strokesPerSnapshotExceeded || strokesRecorded >= this.strokesLimit ); if ( !this.typing ) onTypingStart( this ); if ( strokesPerSnapshotExceeded ) { // Reset the count of strokes, so it'll be later assigned to this.strokesRecorded. strokesRecorded = 0; this.editor.fire( 'saveSnapshot' ); } else { // Fire change event. this.editor.fire( 'change' ); } // Store recorded strokes count. this.strokesRecorded[ keyGroup ] = strokesRecorded; // This prop will tell in next iteration what kind of group was processed previously. this.previousKeyGroup = keyGroup; }, /** * Whether the new `keyCode` belongs to a different group than the previous one ({@link #previousKeyGroup}). * * @since 4.4.5 * @param {Number} keyCode * @returns {Boolean} */ keyGroupChanged: function( keyCode ) { return UndoManager.getKeyGroup( keyCode ) != this.previousKeyGroup; }, /** * Resets the undo stack. */ reset: function() { // Stack for all the undo and redo snapshots, they're always created/removed // in consistency. this.snapshots = []; // Current snapshot history index. this.index = -1; this.currentImage = null; this.hasUndo = false; this.hasRedo = false; this.locked = null; this.resetType(); }, /** * Resets all typing variables. * * @see #type */ resetType: function() { this.strokesRecorded = [ 0, 0 ]; this.typing = false; this.previousKeyGroup = -1; }, /** * Refreshes the state of the {@link CKEDITOR.plugins.undo.UndoManager undo manager} * as well as the state of the `undo` and `redo` commands. */ refreshState: function() { // These lines can be handled within onChange() too. this.hasUndo = !!this.getNextImage( true ); this.hasRedo = !!this.getNextImage( false ); // Reset typing this.resetType(); this.onChange(); }, /** * Saves a snapshot of the document image for later retrieval. * * @param {Boolean} onContentOnly If set to `true`, the snapshot will be saved only if the content has changed. * @param {CKEDITOR.plugins.undo.Image} image An optional image to save. If skipped, current editor will be used. * @param {Boolean} [autoFireChange=true] If set to `false`, will not trigger the {@link CKEDITOR.editor#change} event to editor. */ save: function( onContentOnly, image, autoFireChange ) { var editor = this.editor; // Do not change snapshots stack when locked, editor is not ready, // editable is not ready or when editor is in mode difference than 'wysiwyg'. if ( this.locked || editor.status != 'ready' || editor.mode != 'wysiwyg' ) return false; var editable = editor.editable(); if ( !editable || editable.status != 'ready' ) return false; var snapshots = this.snapshots; // Get a content image. if ( !image ) image = new Image( editor ); // Do nothing if it was not possible to retrieve an image. if ( image.contents === false ) return false; // Check if this is a duplicate. In such case, do nothing. if ( this.currentImage ) { if ( image.equalsContent( this.currentImage ) ) { if ( onContentOnly ) return false; if ( image.equalsSelection( this.currentImage ) ) return false; } else if ( autoFireChange !== false ) { editor.fire( 'change' ); } } // Drop future snapshots. snapshots.splice( this.index + 1, snapshots.length - this.index - 1 ); // If we have reached the limit, remove the oldest one. if ( snapshots.length == this.limit ) snapshots.shift(); // Add the new image, updating the current index. this.index = snapshots.push( image ) - 1; this.currentImage = image; if ( autoFireChange !== false ) this.refreshState(); return true; }, /** * Sets editor content/selection to the one stored in `image`. * * @param {CKEDITOR.plugins.undo.Image} image */ restoreImage: function( image ) { // Bring editor focused to restore selection. var editor = this.editor, sel; if ( image.bookmarks ) { editor.focus(); // Retrieve the selection beforehand. (https://dev.ckeditor.com/ticket/8324) sel = editor.getSelection(); } // Start transaction - do not allow any mutations to the // snapshots stack done when selecting bookmarks (much probably // by selectionChange listener). this.locked = { level: 999 }; this.editor.loadSnapshot( image.contents ); if ( image.bookmarks ) sel.selectBookmarks( image.bookmarks ); else if ( CKEDITOR.env.ie ) { // IE BUG: If I don't set the selection to *somewhere* after setting // document contents, then IE would create an empty paragraph at the bottom // the next time the document is modified. var $range = this.editor.document.getBody().$.createTextRange(); $range.collapse( true ); $range.select(); } this.locked = null; this.index = image.index; this.currentImage = this.snapshots[ this.index ]; // Update current image with the actual editor // content, since actually content may differ from // the original snapshot due to dom change. (https://dev.ckeditor.com/ticket/4622) this.update(); this.refreshState(); editor.fire( 'change' ); }, /** * Gets the closest available image. * * @param {Boolean} isUndo If `true`, it will return the previous image. * @returns {CKEDITOR.plugins.undo.Image} Next image or `null`. */ getNextImage: function( isUndo ) { var snapshots = this.snapshots, currentImage = this.currentImage, image, i; if ( currentImage ) { if ( isUndo ) { for ( i = this.index - 1; i >= 0; i-- ) { image = snapshots[ i ]; if ( !currentImage.equalsContent( image ) ) { image.index = i; return image; } } } else { for ( i = this.index + 1; i < snapshots.length; i++ ) { image = snapshots[ i ]; if ( !currentImage.equalsContent( image ) ) { image.index = i; return image; } } } } return null; }, /** * Checks the current redo state. * * @returns {Boolean} Whether the document has a previous state to retrieve. */ redoable: function() { return this.enabled && this.hasRedo; }, /** * Checks the current undo state. * * @returns {Boolean} Whether the document has a future state to restore. */ undoable: function() { return this.enabled && this.hasUndo; }, /** * Performs an undo operation on current index. */ undo: function() { if ( this.undoable() ) { this.save( true ); var image = this.getNextImage( true ); if ( image ) return this.restoreImage( image ), true; } return false; }, /** * Performs a redo operation on current index. */ redo: function() { if ( this.redoable() ) { // Try to save. If no changes have been made, the redo stack // will not change, so it will still be redoable. this.save( true ); // If instead we had changes, we can't redo anymore. if ( this.redoable() ) { var image = this.getNextImage( false ); if ( image ) return this.restoreImage( image ), true; } } return false; }, /** * Updates the last snapshot of the undo stack with the current editor content. * * @param {CKEDITOR.plugins.undo.Image} [newImage] The image which will replace the current one. * If it is not set, it defaults to the image taken from the editor. */ update: function( newImage ) { // Do not change snapshots stack is locked. if ( this.locked ) return; if ( !newImage ) newImage = new Image( this.editor ); var i = this.index, snapshots = this.snapshots; // Find all previous snapshots made for the same content (which differ // only by selection) and replace all of them with the current image. while ( i > 0 && this.currentImage.equalsContent( snapshots[ i - 1 ] ) ) i -= 1; snapshots.splice( i, this.index - i + 1, newImage ); this.index = i; this.currentImage = newImage; }, /** * Amends the last snapshot and changes its selection (only in case when content * is equal between these two). * * @since 4.4.4 * @param {CKEDITOR.plugins.undo.Image} newSnapshot New snapshot with new selection. * @returns {Boolean} Returns `true` if selection was amended. */ updateSelection: function( newSnapshot ) { if ( !this.snapshots.length ) return false; var snapshots = this.snapshots, lastImage = snapshots[ snapshots.length - 1 ]; if ( lastImage.equalsContent( newSnapshot ) ) { if ( !lastImage.equalsSelection( newSnapshot ) ) { snapshots[ snapshots.length - 1 ] = newSnapshot; this.currentImage = newSnapshot; return true; } } return false; }, /** * Locks the snapshot stack to prevent any save/update operations and when necessary, * updates the tip of the snapshot stack with the DOM changes introduced during the * locked period, after the {@link #unlock} method is called. * * It is mainly used to ensure any DOM operations that should not be recorded * (e.g. auto paragraphing) are not added to the stack. * * **Note:** For every `lock` call you must call {@link #unlock} once to unlock the undo manager. * * @since 4.0.0 * @param {Boolean} [dontUpdate] When set to `true`, the last snapshot will not be updated * with current content and selection. By default, if undo manager was up to date when the lock started, * the last snapshot will be updated to the current state when unlocking. This means that all changes * done during the lock will be merged into the previous snapshot or the next one. Use this option to gain * more control over this behavior. For example, it is possible to group changes done during the lock into * a separate snapshot. * @param {Boolean} [forceUpdate] When set to `true`, the last snapshot will always be updated with the * current content and selection regardless of the current state of the undo manager. * When not set, the last snapshot will be updated only if the undo manager was up to date when locking. * Additionally, this option makes it possible to lock the snapshot when the editor is not in the `wysiwyg` mode, * because when it is passed, the snapshots will not need to be compared. */ lock: function( dontUpdate, forceUpdate ) { if ( !this.locked ) { if ( dontUpdate ) this.locked = { level: 1 }; else { var update = null; if ( forceUpdate ) update = true; else { // Make a contents image. Don't include bookmarks, because: // * we don't compare them, // * there's a chance that DOM has been changed since // locked (e.g. fake) selection was made, so createBookmark2 could fail. // https://dev.ckeditor.com/ticket/11027#comment:3 var imageBefore = new Image( this.editor, true ); // If current editor content matches the tip of snapshot stack, // the stack tip must be updated by unlock, to include any changes made // during this period. if ( this.currentImage && this.currentImage.equalsContent( imageBefore ) ) update = imageBefore; } this.locked = { update: update, level: 1 }; } // Increase the level of lock. } else { this.locked.level++; } }, /** * Unlocks the snapshot stack and checks to amend the last snapshot. * * See {@link #lock} for more details. * * @since 4.0.0 */ unlock: function() { if ( this.locked ) { // Decrease level of lock and check if equals 0, what means that undoM is completely unlocked. if ( !--this.locked.level ) { var update = this.locked.update; this.locked = null; // forceUpdate was passed to lock(). if ( update === true ) this.update(); // update is instance of Image. else if ( update ) { var newImage = new Image( this.editor, true ); if ( !update.equalsContent( newImage ) ) this.update(); } } } }, /** * Registers a filtering rule. * * @since 4.13.0 * @param {Function} rule Callback function that returns filtered data. * @param {String} rule.data The data passed to the callback. */ addFilterRule: function( rule ) { this._filterRules.push( rule ); } }; /** * Codes for navigation keys like *Arrows*, *Page Up/Down*, etc. * Used by the {@link #isNavigationKey} method. * * @since 4.4.5 * @readonly * @static */ UndoManager.navigationKeyCodes = { 37: 1, 38: 1, 39: 1, 40: 1, // Arrows. 36: 1, 35: 1, // Home, End. 33: 1, 34: 1 // PgUp, PgDn. }; /** * Key groups identifier mapping. Used for accessing members in * {@link #strokesRecorded}. * * * `FUNCTIONAL` – identifier for the *Backspace* / *Delete* key. * * `PRINTABLE` – identifier for printable keys. * * Example usage: * * undoManager.strokesRecorded[ undoManager.keyGroups.FUNCTIONAL ]; * * @since 4.4.5 * @readonly * @static */ UndoManager.keyGroups = { PRINTABLE: 0, FUNCTIONAL: 1 }; /** * Checks whether a key is one of navigation keys (*Arrows*, *Page Up/Down*, etc.). * See also the {@link #navigationKeyCodes} property. * * @since 4.4.5 * @static * @param {Number} keyCode * @returns {Boolean} */ UndoManager.isNavigationKey = function( keyCode ) { return !!UndoManager.navigationKeyCodes[ keyCode ]; }; /** * Returns the group to which the passed `keyCode` belongs. * * @since 4.4.5 * @static * @param {Number} keyCode * @returns {Number} */ UndoManager.getKeyGroup = function( keyCode ) { var keyGroups = UndoManager.keyGroups; return backspaceOrDelete[ keyCode ] ? keyGroups.FUNCTIONAL : keyGroups.PRINTABLE; }; /** * @since 4.4.5 * @static * @param {Number} keyGroup * @returns {Number} */ UndoManager.getOppositeKeyGroup = function( keyGroup ) { var keyGroups = UndoManager.keyGroups; return ( keyGroup == keyGroups.FUNCTIONAL ? keyGroups.PRINTABLE : keyGroups.FUNCTIONAL ); }; /** * Whether we need to use a workaround for functional (*Backspace*, *Delete*) keys not firing * the `keypress` event in Internet Explorer in this environment and for the specified `keyCode`. * * @since 4.4.5 * @static * @param {Number} keyCode * @returns {Boolean} */ UndoManager.ieFunctionalKeysBug = function( keyCode ) { return CKEDITOR.env.ie && UndoManager.getKeyGroup( keyCode ) == UndoManager.keyGroups.FUNCTIONAL; }; // Helper method called when undoManager.typing val was changed to true. function onTypingStart( undoManager ) { // It's safe to now indicate typing state. undoManager.typing = true; // Manually mark snapshot as available. undoManager.hasUndo = true; undoManager.hasRedo = false; undoManager.onChange(); } /** * Contains a snapshot of the editor content and selection at a given point in time. * * @private * @class CKEDITOR.plugins.undo.Image * @constructor Creates an Image class instance. * @param {CKEDITOR.editor} editor The editor instance on which the image is created. * @param {Boolean} [contentsOnly] If set to `true`, the image will only contain content without the selection. */ var Image = CKEDITOR.plugins.undo.Image = function( editor, contentsOnly ) { this.editor = editor; editor.fire( 'beforeUndoImage' ); var contents = editor.getSnapshot(); if ( contents ) { this.contents = applyRules( contents, editor.undoManager._filterRules ); } if ( !contentsOnly ) { var selection = contents && editor.getSelection(); this.bookmarks = selection && selection.createBookmarks2( true ); } editor.fire( 'afterUndoImage' ); }; // Attributes that browser may changing them when setting via innerHTML. var protectedAttrs = /\b(?:href|src|name)="[^"]*?"/gi; function applyRules( data, rules ) { return CKEDITOR.tools.array.reduce( rules, function( currentData, rule ) { return rule( currentData ); }, data ); } Image.prototype = { /** * @param {CKEDITOR.plugins.undo.Image} otherImage Image to compare to. * @returns {Boolean} Returns `true` if content in `otherImage` is the same. */ equalsContent: function( otherImage ) { var thisContents = this.contents, otherContents = otherImage.contents; // For IE7 and IE QM: Comparing only the protected attribute values but not the original ones.(https://dev.ckeditor.com/ticket/4522) if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ) { thisContents = thisContents.replace( protectedAttrs, '' ); otherContents = otherContents.replace( protectedAttrs, '' ); } if ( thisContents != otherContents ) return false; return true; }, /** * @param {CKEDITOR.plugins.undo.Image} otherImage Image to compare to. * @returns {Boolean} Returns `true` if selection in `otherImage` is the same. */ equalsSelection: function( otherImage ) { var bookmarksA = this.bookmarks, bookmarksB = otherImage.bookmarks; if ( bookmarksA || bookmarksB ) { if ( !bookmarksA || !bookmarksB || bookmarksA.length != bookmarksB.length ) return false; for ( var i = 0; i < bookmarksA.length; i++ ) { var bookmarkA = bookmarksA[ i ], bookmarkB = bookmarksB[ i ]; if ( bookmarkA.startOffset != bookmarkB.startOffset || bookmarkA.endOffset != bookmarkB.endOffset || !CKEDITOR.tools.arrayCompare( bookmarkA.start, bookmarkB.start ) || !CKEDITOR.tools.arrayCompare( bookmarkA.end, bookmarkB.end ) ) { return false; } } } return true; } /** * Editor content. * * @readonly * @property {String} contents */ /** * Bookmarks representing the selection in an image. * * @readonly * @property {Object[]} bookmarks Array of bookmark2 objects, see {@link CKEDITOR.dom.range#createBookmark2} for definition. */ }; /** * A class encapsulating all native event listeners which have to be used in * order to handle undo manager integration for native editing actions (excluding drag and drop and paste support * handled by the Clipboard plugin). * * @since 4.4.4 * @private * @class CKEDITOR.plugins.undo.NativeEditingHandler * @member CKEDITOR.plugins.undo Undo manager owning the handler. * @constructor * @param {CKEDITOR.plugins.undo.UndoManager} undoManager */ var NativeEditingHandler = CKEDITOR.plugins.undo.NativeEditingHandler = function( undoManager ) { // We'll use keyboard + input events to determine if snapshot should be created. // Since `input` event is fired before `keyup`. We can tell in `keyup` event if input occurred. // That will tell us if any printable data was inserted. // On `input` event we'll increase input fired counter for proper key code. // Eventually it might be canceled by paste/drop using `ignoreInputEvent` flag. // Order of events can be found in http://www.w3.org/TR/DOM-Level-3-Events/ /** * An undo manager instance owning the editing handler. * * @property {CKEDITOR.plugins.undo.UndoManager} undoManager */ this.undoManager = undoManager; /** * See {@link #ignoreInputEventListener}. * * @since 4.4.5 * @private */ this.ignoreInputEvent = false; /** * A stack of pressed keys. * * @since 4.4.5 * @property {CKEDITOR.plugins.undo.KeyEventsStack} keyEventsStack */ this.keyEventsStack = new KeyEventsStack(); /** * An image of the editor during the `keydown` event (therefore without DOM modification). * * @property {CKEDITOR.plugins.undo.Image} lastKeydownImage */ this.lastKeydownImage = null; }; NativeEditingHandler.prototype = { /** * The `keydown` event listener. * * @param {CKEDITOR.dom.event} evt */ onKeydown: function( evt ) { var keyCode = evt.data.getKey(); // The composition is in progress - ignore the key. (https://dev.ckeditor.com/ticket/12597) if ( keyCode === 229 ) { return; } // Block undo/redo keystrokes when at the bottom/top of the undo stack (https://dev.ckeditor.com/ticket/11126 and https://dev.ckeditor.com/ticket/11677). if ( CKEDITOR.tools.indexOf( keystrokes, evt.data.getKeystroke() ) > -1 ) { evt.data.preventDefault(); return; } // Cleaning tab functional keys. this.keyEventsStack.cleanUp( evt ); var undoManager = this.undoManager; // Gets last record for provided keyCode. If not found will create one. var last = this.keyEventsStack.getLast( keyCode ); if ( !last ) { this.keyEventsStack.push( keyCode ); } // We need to store an image which will be used in case of key group // change. this.lastKeydownImage = new Image( undoManager.editor ); if ( UndoManager.isNavigationKey( keyCode ) || this.undoManager.keyGroupChanged( keyCode ) ) { if ( undoManager.strokesRecorded[ 0 ] || undoManager.strokesRecorded[ 1 ] ) { // We already have image, so we'd like to reuse it. // https://dev.ckeditor.com/ticket/12300 undoManager.save( false, this.lastKeydownImage, false ); undoManager.resetType(); } } }, /** * The `input` event listener. */ onInput: function() { // Input event is ignored if paste/drop event were fired before. if ( this.ignoreInputEvent ) { // Reset flag - ignore only once. this.ignoreInputEvent = false; return; } var lastInput = this.keyEventsStack.getLast(); // Nothing in key events stack, but input event called. Interesting... // That's because on Android order of events is buggy and also keyCode is set to 0. if ( !lastInput ) { lastInput = this.keyEventsStack.push( 0 ); } // Increment inputs counter for provided key code. this.keyEventsStack.increment( lastInput.keyCode ); // Exceeded limit. if ( this.keyEventsStack.getTotalInputs() >= this.undoManager.strokesLimit ) { this.undoManager.type( lastInput.keyCode, true ); this.keyEventsStack.resetInputs(); } }, /** * The `keyup` event listener. * * @param {CKEDITOR.dom.event} evt */ onKeyup: function( evt ) { var undoManager = this.undoManager, keyCode = evt.data.getKey(), totalInputs = this.keyEventsStack.getTotalInputs(); // Remove record from stack for provided key code. this.keyEventsStack.remove( keyCode ); // Second part of the workaround for IEs functional keys bug. We need to check whether something has really // changed because we blindly mocked the keypress event. // Also we need to be aware that lastKeydownImage might not be available (https://dev.ckeditor.com/ticket/12327). if ( UndoManager.ieFunctionalKeysBug( keyCode ) && this.lastKeydownImage && this.lastKeydownImage.equalsContent( new Image( undoManager.editor, true ) ) ) { return; } if ( totalInputs > 0 ) { undoManager.type( keyCode ); } else if ( UndoManager.isNavigationKey( keyCode ) ) { // Note content snapshot has been checked in keydown. this.onNavigationKey( true ); } }, /** * Method called for navigation change. At first it will check if current content does not differ * from the last saved snapshot. * * * If the content is different, the method creates a standard, extra snapshot. * * If the content is not different, the method will compare the selection, and will * amend the last snapshot selection if it changed. * * @param {Boolean} skipContentCompare If set to `true`, it will not compare content, and only do a selection check. */ onNavigationKey: function( skipContentCompare ) { var undoManager = this.undoManager; // We attempt to save content snapshot, if content didn't change, we'll // only amend selection. if ( skipContentCompare || !undoManager.save( true, null, false ) ) undoManager.updateSelection( new Image( undoManager.editor ) ); undoManager.resetType(); }, /** * Makes the next `input` event to be ignored. */ ignoreInputEventListener: function() { this.ignoreInputEvent = true; }, /** * Stops ignoring `input` events. * @since 4.7.3 */ activateInputEventListener: function() { this.ignoreInputEvent = false; }, /** * Attaches editable listeners required to provide the undo functionality. */ attachListeners: function() { var editor = this.undoManager.editor, editable = editor.editable(), that = this; // We'll create a snapshot here (before DOM modification), because we'll // need unmodified content when we got keygroup toggled in keyup. editable.attachListener( editable, 'keydown', function( evt ) { that.onKeydown( evt ); // On IE keypress isn't fired for functional (backspace/delete) keys. // Let's pretend that something's changed. if ( UndoManager.ieFunctionalKeysBug( evt.data.getKey() ) ) { that.onInput(); } }, null, null, 999 ); // Only IE can't use input event, because it's not fired in contenteditable. editable.attachListener( editable, ( CKEDITOR.env.ie ? 'keypress' : 'input' ), that.onInput, that, null, 999 ); // Keyup executes main snapshot logic. editable.attachListener( editable, 'keyup', that.onKeyup, that, null, 999 ); // On paste and drop we need to ignore input event. // It would result with calling undoManager.type() on any following key. editable.attachListener( editable, 'paste', that.ignoreInputEventListener, that, null, 999 ); editable.attachListener( editable, 'drop', that.ignoreInputEventListener, that, null, 999 ); // After paste we need to re-enable input event listener (#554). editor.on( 'afterPaste', that.activateInputEventListener, that, null, 999 ); // Click should create a snapshot if needed, but shouldn't cause change event. // Don't pass onNavigationKey directly as a listener because it accepts one argument which // will conflict with evt passed to listener. // https://dev.ckeditor.com/ticket/12324 comment:4 editable.attachListener( editable.isInline() ? editable : editor.document.getDocumentElement(), 'click', function() { that.onNavigationKey(); }, null, null, 999 ); // When pressing `Tab` key while editable is focused, `keyup` event is not fired. // Which means that record for `tab` key stays in key events stack. // We assume that when editor is blurred `tab` key is already up. editable.attachListener( this.undoManager.editor, 'blur', function() { that.keyEventsStack.remove( 9 /*Tab*/ ); }, null, null, 999 ); } }; /** * This class represents a stack of pressed keys and stores information * about how many `input` events each key press has caused. * * @since 4.4.5 * @private * @class CKEDITOR.plugins.undo.KeyEventsStack * @constructor */ var KeyEventsStack = CKEDITOR.plugins.undo.KeyEventsStack = function() { /** * @readonly */ this.stack = []; }; KeyEventsStack.prototype = { /** * Pushes a literal object with two keys: `keyCode` and `inputs` (whose initial value is set to `0`) to stack. * It is intended to be called on the `keydown` event. * * @param {Number} keyCode */ push: function( keyCode ) { var length = this.stack.push( { keyCode: keyCode, inputs: 0 } ); return this.stack[ length - 1 ]; }, /** * Returns the index of the last registered `keyCode` in the stack. * If no `keyCode` is provided, then the function will return the index of the last item. * If an item is not found, it will return `-1`. * * @param {Number} [keyCode] * @returns {Number} */ getLastIndex: function( keyCode ) { if ( typeof keyCode != 'number' ) { return this.stack.length - 1; // Last index or -1. } else { var i = this.stack.length; while ( i-- ) { if ( this.stack[ i ].keyCode == keyCode ) { return i; } } return -1; } }, /** * Returns the last key recorded in the stack. If `keyCode` is provided, then it will return * the last record for this `keyCode`. * * @param {Number} [keyCode] * @returns {Object} Last matching record or `null`. */ getLast: function( keyCode ) { var index = this.getLastIndex( keyCode ); if ( index != -1 ) { return this.stack[ index ]; } else { return null; } }, /** * Increments registered input events for stack record for a given `keyCode`. * * @param {Number} keyCode */ increment: function( keyCode ) { var found = this.getLast( keyCode ); if ( !found ) { // %REMOVE_LINE% throw new Error( 'Trying to increment, but could not found by keyCode: ' + keyCode + '.' ); // %REMOVE_LINE% } // %REMOVE_LINE% found.inputs++; }, /** * Removes the last record from the stack for the provided `keyCode`. * * @param {Number} keyCode */ remove: function( keyCode ) { var index = this.getLastIndex( keyCode ); if ( index != -1 ) { this.stack.splice( index, 1 ); } }, /** * Resets the `inputs` value to `0` for a given `keyCode` or in entire stack if a * `keyCode` is not specified. * * @param {Number} [keyCode] */ resetInputs: function( keyCode ) { if ( typeof keyCode == 'number' ) { var last = this.getLast( keyCode ); if ( !last ) { // %REMOVE_LINE% throw new Error( 'Trying to reset inputs count, but could not found by keyCode: ' + keyCode + '.' ); // %REMOVE_LINE% } // %REMOVE_LINE% last.inputs = 0; } else { var i = this.stack.length; while ( i-- ) { this.stack[ i ].inputs = 0; } } }, /** * Sums up inputs number for each key code and returns it. * * @returns {Number} */ getTotalInputs: function() { var i = this.stack.length, total = 0; while ( i-- ) { total += this.stack[ i ].inputs; } return total; }, /** * Cleans the stack based on a provided `keydown` event object. The rationale behind this method * is that some keystrokes cause the `keydown` event to be fired in the editor, but not the `keyup` event. * For instance, *Alt+Tab* will fire `keydown`, but since the editor is blurred by it, then there is * no `keyup`, so the keystroke is not removed from the stack. * * @param {CKEDITOR.dom.event} event */ cleanUp: function( event ) { var nativeEvent = event.data.$; if ( !( nativeEvent.ctrlKey || nativeEvent.metaKey ) ) { this.remove( 17 ); } if ( !nativeEvent.shiftKey ) { this.remove( 16 ); } if ( !nativeEvent.altKey ) { this.remove( 18 ); } } }; } )(); /** * The number of undo steps to be saved. The higher value is set, the more * memory is used for it. * * config.undoStackSize = 50; * * @cfg {Number} [undoStackSize=20] * @member CKEDITOR.config */ /** * Fired when the editor is about to save an undo snapshot. This event can be * fired by plugins and customizations to make the editor save undo snapshots. * * @event saveSnapshot * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. */ /** * Fired before an undo image is to be created. An *undo image* represents the * editor state at some point. It is saved into the undo store, so the editor is * able to recover the editor state on undo and redo operations. * * @since 3.5.3 * @event beforeUndoImage * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @see CKEDITOR.editor#afterUndoImage */ /** * Fired after an undo image is created. An *undo image* represents the * editor state at some point. It is saved into the undo store, so the editor is * able to recover the editor state on undo and redo operations. * * @since 3.5.3 * @event afterUndoImage * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @see CKEDITOR.editor#beforeUndoImage */ /** * Fired when the content of the editor is changed. * * Due to performance reasons, it is not verified if the content really changed. * The editor instead watches several editing actions that usually result in * changes. This event may thus in some cases be fired when no changes happen * or may even get fired twice. * * If it is important not to get the `change` event fired too often, you should compare the * previous and the current editor content inside the event listener. It is * not recommended to do that on every `change` event. * * Please note that the `change` event is only fired in the {@link #property-mode wysiwyg mode}. * In order to implement similar functionality in the source mode, you can listen for example to the {@link #key} * event or the native [`input`](https://developer.mozilla.org/en-US/docs/Web/Reference/Events/input) * event (not supported by Internet Explorer 8). * * editor.on( 'mode', function() { * if ( this.mode == 'source' ) { * var editable = editor.editable(); * editable.attachListener( editable, 'input', function() { * // Handle changes made in the source mode. * } ); * } * } ); * * @since 4.2.0 * @event change * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/dev/0000755000201500020150000000000014515446713021777 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/dev/snapshot.html0000644000201500020150000000550714515446713024533 0ustar puckpuck Replace Textarea by Code — CKEditor Sample

    CKEditor Samples » Replace Textarea Elements Using JavaScript Code

    This editor is using an <iframe> element-based editing area, provided by the Wysiwygarea plugin.

    CKEDITOR.replace( 'textarea_id' )
    

    Snapshots: 0
    Typing: false
    rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/0000755000201500020150000000000014515446713022142 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/zh.js0000644000201500020150000000036714515446713023127 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'zh', { redo: '取消復原', undo: '復原' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/nb.js0000644000201500020150000000036214515446713023100 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'nb', { redo: 'Gjør om', undo: 'Angre' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/eo.js0000644000201500020150000000036214515446713023104 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'eo', { redo: 'Refari', undo: 'Malfari' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/es.js0000644000201500020150000000036414515446713023112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'es', { redo: 'Rehacer', undo: 'Deshacer' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ro.js0000644000201500020150000000042714515446713023123 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ro', { redo: 'Starea ulterioară (redo)', undo: 'Starea anterioară (undo)' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/hr.js0000644000201500020150000000036314515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'hr', { redo: 'Ponovi', undo: 'Poništi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/it.js0000644000201500020150000000036614515446713023121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'it', { redo: 'Ripristina', undo: 'Annulla' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/de-ch.js0000644000201500020150000000040414515446713023456 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'de-ch', { redo: 'Wiederherstellen', undo: 'Rückgängig' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/sk.js0000644000201500020150000000036014515446713023114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'sk', { redo: 'Znovu', undo: 'Späť' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/az.js0000644000201500020150000000037114515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'az', { redo: 'Təkrar et', undo: 'İmtina et' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/pt.js0000644000201500020150000000036214515446713023124 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'pt', { redo: 'Refazer', undo: 'Anular' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/si.js0000644000201500020150000000044014515446713023111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'si', { redo: 'නැවත කිරීම', undo: 'වෙනස් කිරීම' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ko.js0000644000201500020150000000037714515446713023120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ko', { redo: '다시 실행', undo: '실행 취소' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/mk.js0000644000201500020150000000037014515446713023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'mk', { redo: 'Redo', // MISSING undo: 'Undo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/cy.js0000644000201500020150000000036514515446713023117 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'cy', { redo: 'Ailwneud', undo: 'Dadwneud' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/uk.js0000644000201500020150000000041114515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'uk', { redo: 'Повторити', undo: 'Повернути' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/zh-cn.js0000644000201500020150000000036414515446713023522 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'zh-cn', { redo: '重做', undo: '撤消' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/sv.js0000644000201500020150000000036214515446713023131 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'sv', { redo: 'Gör om', undo: 'Ångra' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/lt.js0000644000201500020150000000036714515446713023125 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'lt', { redo: 'Atstatyti', undo: 'Atšaukti' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/is.js0000644000201500020150000000040714515446713023114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'is', { redo: 'Hætta við afturköllun', undo: 'Afturkalla' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/fr-ca.js0000644000201500020150000000036614515446713023475 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'fr-ca', { redo: 'Refaire', undo: 'Annuler' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/et.js0000644000201500020150000000040514515446713023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'et', { redo: 'Toimingu kordamine', undo: 'Tagasivõtmine' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/bs.js0000644000201500020150000000036014515446713023103 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'bs', { redo: 'Ponovi', undo: 'Vrati' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/pl.js0000644000201500020150000000036114515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'pl', { redo: 'Ponów', undo: 'Cofnij' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/bg.js0000644000201500020150000000040514515446713023067 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'bg', { redo: 'Пренаправи', undo: 'Отмени' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/fa.js0000644000201500020150000000037714515446713023075 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'fa', { redo: 'بازچیدن', undo: 'واچیدن' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ku.js0000644000201500020150000000042514515446713023120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ku', { redo: 'هەڵگەڕاندنەوە', undo: 'پووچکردنەوە' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/bn.js0000644000201500020150000000041614515446713023100 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'bn', { redo: 'পুনরায় করি', undo: 'আনডু' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/el.js0000644000201500020150000000040714515446713023101 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'el', { redo: 'Επανάληψη', undo: 'Αναίρεση' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/fi.js0000644000201500020150000000036014515446713023075 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'fi', { redo: 'Toista', undo: 'Kumoa' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ru.js0000644000201500020150000000040714515446713023127 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ru', { redo: 'Повторить', undo: 'Отменить' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/gl.js0000644000201500020150000000036414515446713023105 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'gl', { redo: 'Refacer', undo: 'Desfacer' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/sr-latn.js0000644000201500020150000000036614515446713024065 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'sr-latn', { redo: 'Ponovi ', undo: 'Vrati' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/oc.js0000644000201500020150000000036314515446713023103 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'oc', { redo: 'Refar', undo: 'Restablir' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/sq.js0000644000201500020150000000036514515446713023127 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'sq', { redo: 'Ribëje', undo: 'Rizhbëje' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/pt-br.js0000644000201500020150000000036714515446713023532 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'pt-br', { redo: 'Refazer', undo: 'Desfazer' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/fo.js0000644000201500020150000000036414515446713023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'fo', { redo: 'Vend aftur', undo: 'Angra' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/af.js0000644000201500020150000000036314515446713023070 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'af', { redo: 'Oordoen', undo: 'Ontdoen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/hi.js0000644000201500020150000000040014515446713023072 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'hi', { redo: 'रीडू', undo: 'अन्डू' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/km.js0000644000201500020150000000045514515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'km', { redo: 'ធ្វើ​ឡើង​វិញ', undo: 'មិន​ធ្វើ​វិញ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/nl.js0000644000201500020150000000040414515446713023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'nl', { redo: 'Opnieuw uitvoeren', undo: 'Ongedaan maken' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ka.js0000644000201500020150000000043014515446713023070 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ka', { redo: 'გამეორება', undo: 'გაუქმება' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/es-mx.js0000644000201500020150000000036714515446713023537 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'es-mx', { redo: 'Rehacer', undo: 'Deshacer' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/mn.js0000644000201500020150000000045214515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'mn', { redo: 'Өмнөх үйлдлээ сэргээх', undo: 'Хүчингүй болгох' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/da.js0000644000201500020150000000037514515446713023071 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'da', { redo: 'Annullér fortryd', undo: 'Fortryd' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/he.js0000644000201500020150000000044014515446713023072 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'he', { redo: 'חזרה על צעד אחרון', undo: 'ביטול צעד אחרון' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ca.js0000644000201500020150000000036214515446713023064 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ca', { redo: 'Refés', undo: 'Desfés' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/gu.js0000644000201500020150000000065614515446713023122 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'gu', { redo: 'રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી', undo: 'રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ms.js0000644000201500020150000000036514515446713023123 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ms', { redo: 'Ulangkan', undo: 'Batalkan' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/th.js0000644000201500020150000000045214515446713023114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'th', { redo: 'ทำซ้ำคำสั่ง', undo: 'ยกเลิกคำสั่ง' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/de.js0000644000201500020150000000040114515446713023063 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'de', { redo: 'Wiederherstellen', undo: 'Rückgängig' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/en-ca.js0000644000201500020150000000036014515446713023462 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'en-ca', { redo: 'Redo', undo: 'Undo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/tt.js0000644000201500020150000000040314515446713023124 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'tt', { redo: 'Кабатлау', undo: 'Кайтару' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/vi.js0000644000201500020150000000041714515446713023120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'vi', { redo: 'Làm lại thao tác', undo: 'Khôi phục thao tác' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/cs.js0000644000201500020150000000035714515446713023112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'cs', { redo: 'Znovu', undo: 'Zpět' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/tr.js0000644000201500020150000000036414515446713023130 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'tr', { redo: 'Tekrarla', undo: 'Geri Al' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ja.js0000644000201500020150000000037514515446713023077 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ja', { redo: 'やり直す', undo: '元に戻す' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/sl.js0000644000201500020150000000036714515446713023124 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'sl', { redo: 'Uveljavi', undo: 'Razveljavi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/lv.js0000644000201500020150000000036414515446713023124 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'lv', { redo: 'Atkārtot', undo: 'Atcelt' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/en-au.js0000644000201500020150000000036014515446713023504 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'en-au', { redo: 'Redo', undo: 'Undo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/en.js0000644000201500020150000000035514515446713023105 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'en', { redo: 'Redo', undo: 'Undo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/no.js0000644000201500020150000000036214515446713023115 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'no', { redo: 'Gjør om', undo: 'Angre' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/fr.js0000644000201500020150000000036514515446713023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'fr', { redo: 'Rétablir', undo: 'Annuler' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/id.js0000644000201500020150000000040614515446713023074 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'id', { redo: 'Kembali lakukan', undo: 'Batalkan perlakuan' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ug.js0000644000201500020150000000040214515446713023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ug', { redo: 'قايتىلا ', undo: 'يېنىۋال' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/ar.js0000644000201500020150000000037114515446713023103 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'ar', { redo: 'إعادة', undo: 'تراجع' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/sr.js0000644000201500020150000000037414515446713023130 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'sr', { redo: 'Понови ', undo: 'Врати' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/eu.js0000644000201500020150000000036414515446713023114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'eu', { redo: 'Berregin', undo: 'Desegin' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/en-gb.js0000644000201500020150000000036014515446713023467 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'en-gb', { redo: 'Redo', undo: 'Undo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/lang/hu.js0000644000201500020150000000037314515446713023117 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'undo', 'hu', { redo: 'Ismétlés', undo: 'Visszavonás' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/icons/0000755000201500020150000000000014503523375022331 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/icons/undo.png0000644000201500020150000000117214503523375024005 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->iIDAT8˥NAEϝaeKxL  S!oe|"1%.(DiIDAT8˥NAEϝaeKxL  S!oe|"1%.(Dc$2$I2Uepرvkܷf YW 8nonZz#":~$I(#Zke!|Lt^iP`0@v A"S% K0;;;hX[q2Y?U%/v,S_(zpJ(.;|>_>Kԑ777pΡt[ۊ>S\/..0L_&-6yc e0 R6>Re3ުW&픸%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/icons/hidpi/redo-rtl.png0000644000201500020150000000221214503523375025661 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXVo+EfvwVR"A'~zh]!QPPРS<F)Bpv] x}`${3|;]hS4M˱sVoMNOOAD Ƣ-v]f3c޹'`<kT MSs?;D;88ç6UN$Y|J3k@Y)Zr=n,0ϗvs0@)u`.o Df.篮Vxc$2$I2Uepرvkܷf YW 8nonZz#":~$I(#Zke!|Lt^iP`0@v A"S% K0;;;hX[q2Y?U%/v,S_(zpJ(.;|>_>Kԑ777pΡt[ۊ>S\/..0L_&-6yc e0 R6>Re3ުW&픸%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/icons/hidpi/redo.png0000644000201500020150000000217014503523375025065 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !|IDATXW;o#UΙgdGx_[! ID\h@MK#tm b&h<3 |wgAGhx,fn`bW$K e+"frL& ݝN{"Rjܸ"kMdl"["m Zk(y; Umo|(~f=MU[>˲ga.߹fI""/R_Y旙afa(>| b-3Mo"~ûZl ]ʉZr-UB<ϻϲYbm4.; Vֺ|n{f߉荈̯RWDڥ膹0 w<ᄅ22q|`S_|ED?ڌh[ KRIU( _|PSNڭmeiQϷef@m@{G]΀#L&4 EQ-y0 8QJt:`< Eч`yR-lOw͔k7fBm?W-EQ0EQic Tu [no b<bR /f榑ALklS̴lx,fn`bW$K e+"frL& ݝN{"Rjܸ"kMdl"["m Zk(y; Umo|(~f=MU[>˲ga.߹fI""/R_Y旙afa(>| b-3Mo"~ûZl ]ʉZr-UB<ϻϲYbm4.; Vֺ|n{f߉荈̯RWDڥ膹0 w<ᄅ22q|`S_|ED?ڌh[ KRIU( _|PSNڭmeiQϷef@m@{G]΀#L&4 EQ-y0 8QJt:`< Eч`yR-lOw͔k7fBm?W-EQ0EQic Tu [no b<bR /f榑ALklS̴lQIDAT8˥1N0߳u@-- ;@lbaF,- ;e⥒gi"cJO"^g"t:1UUXkez =GATjI솪 Um:iM1DUaT"LIFK:@ڪioU}_C yM$u]w8Z{8G(!%NSxvu]yy++=]|&EQtշgpkyO9imK@y_}$wۤs O1<遂$10QߍS|' X,wCvTh%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/undo/icons/undo-rtl.png0000644000201500020150000000114214503523375024601 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->QIDAT8˥1N0߳u@-- ;@lbaF,- ;e⥒gi"cJO"^g"t:1UUXkez =GATjI솪 Um:iM1DUaT"LIFK:@ڪioU}_C yM$u]w8Z{8G(!%NSxvu]yy++=]|&EQtշgpkyO9imK@y_}$wۤs O1<遂$10QߍS|' X,wCvTh%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/0000755000201500020150000000000014515446705022255 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/plugin.js0000644000201500020150000007351114515446705024120 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ 'use strict'; ( function() { CKEDITOR.plugins.add( 'filetools', { lang: 'az,bg,ca,cs,da,de,de-ch,el,en,en-au,eo,es,es-mx,et,eu,fa,fr,gl,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,oc,pl,pt,pt-br,ro,ru,sk,sq,sr,sr-latn,sv,tr,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% beforeInit: function( editor ) { /** * An instance of the {@link CKEDITOR.fileTools.uploadRepository upload repository}. * It allows you to create and get {@link CKEDITOR.fileTools.fileLoader file loaders}. * * var loader = editor.uploadRepository.create( file ); * loader.loadAndUpload( 'http://foo/bar' ); * * @since 4.5.0 * @readonly * @property {CKEDITOR.fileTools.uploadRepository} uploadRepository * @member CKEDITOR.editor */ editor.uploadRepository = new UploadRepository( editor ); /** * Event fired when the {@link CKEDITOR.fileTools.fileLoader file loader} should send XHR. If the event is not * {@link CKEDITOR.eventInfo#stop stopped} or {@link CKEDITOR.eventInfo#cancel canceled}, the default request * will be sent. Refer to the {@glink guide/dev_file_upload Uploading Dropped or Pasted Files} article for more information. * * @since 4.5.0 * @event fileUploadRequest * @member CKEDITOR.editor * @param data * @param {CKEDITOR.fileTools.fileLoader} data.fileLoader A file loader instance. * @param {Object} data.requestData An object containing all data to be sent to the server. */ editor.on( 'fileUploadRequest', function( evt ) { var fileLoader = evt.data.fileLoader; fileLoader.xhr.open( 'POST', fileLoader.uploadUrl, true ); // Adding file to event's data by default - allows overwriting it by user's event listeners. (https://dev.ckeditor.com/ticket/13518) evt.data.requestData.upload = { file: fileLoader.file, name: fileLoader.fileName }; }, null, null, 5 ); editor.on( 'fileUploadRequest', function( evt ) { var fileLoader = evt.data.fileLoader, $formData = new FormData(), requestData = evt.data.requestData, configXhrHeaders = editor.config.fileTools_requestHeaders, header; for ( var name in requestData ) { var value = requestData[ name ]; // Treating files in special way if ( typeof value === 'object' && value.file ) { $formData.append( name, value.file, value.name ); } else { $formData.append( name, value ); } } // Append token preventing CSRF attacks. $formData.append( 'ckCsrfToken', CKEDITOR.tools.getCsrfToken() ); if ( configXhrHeaders ) { for ( header in configXhrHeaders ) { fileLoader.xhr.setRequestHeader( header, configXhrHeaders[ header ] ); } } fileLoader.xhr.send( $formData ); }, null, null, 999 ); /** * Event fired when the {@link CKEDITOR.fileTools.fileLoader file upload} response is received and needs to be parsed. * If the event is not {@link CKEDITOR.eventInfo#stop stopped} or {@link CKEDITOR.eventInfo#cancel canceled}, * the default response handler will be used. Refer to the * {@glink guide/dev_file_upload Uploading Dropped or Pasted Files} article for more information. * * @since 4.5.0 * @event fileUploadResponse * @member CKEDITOR.editor * @param data All data will be passed to {@link CKEDITOR.fileTools.fileLoader#responseData}. * @param {CKEDITOR.fileTools.fileLoader} data.fileLoader A file loader instance. * @param {String} data.message The message from the server. Needs to be set in the listener — see the example above. * @param {String} data.fileName The file name on server. Needs to be set in the listener — see the example above. * @param {String} data.url The URL to the uploaded file. Needs to be set in the listener — see the example above. */ editor.on( 'fileUploadResponse', function( evt ) { var fileLoader = evt.data.fileLoader, xhr = fileLoader.xhr, data = evt.data; try { var response = JSON.parse( xhr.responseText ); // Error message does not need to mean that upload finished unsuccessfully. // It could mean that ex. file name was changes during upload due to naming collision. if ( response.error && response.error.message ) { data.message = response.error.message; } // But !uploaded means error. if ( !response.uploaded ) { evt.cancel(); } else { for ( var i in response ) { data[ i ] = response[ i ]; } } } catch ( err ) { // Response parsing error. data.message = fileLoader.lang.filetools.responseError; CKEDITOR.warn( 'filetools-response-error', { responseText: xhr.responseText } ); evt.cancel(); } }, null, null, 999 ); } } ); /** * File loader repository. It allows you to create and get {@link CKEDITOR.fileTools.fileLoader file loaders}. * * An instance of the repository is available as the {@link CKEDITOR.editor#uploadRepository}. * * var loader = editor.uploadRepository.create( file ); * loader.loadAndUpload( 'http://foo/bar' ); * * To find more information about handling files see the {@link CKEDITOR.fileTools.fileLoader} class. * * @since 4.5.0 * @class CKEDITOR.fileTools.uploadRepository * @mixins CKEDITOR.event * @constructor Creates an instance of the repository. * @param {CKEDITOR.editor} editor Editor instance. Used only to get the language data. */ function UploadRepository( editor ) { this.editor = editor; this.loaders = []; } UploadRepository.prototype = { /** * Creates a {@link CKEDITOR.fileTools.fileLoader file loader} instance with a unique ID. * The instance can be later retrieved from the repository using the {@link #loaders} array. * * Fires the {@link CKEDITOR.fileTools.uploadRepository#instanceCreated instanceCreated} event. * * @param {Blob/String} fileOrData See {@link CKEDITOR.fileTools.fileLoader}. * @param {String} fileName See {@link CKEDITOR.fileTools.fileLoader}. * @param {Function} [loaderType] Loader type to be created. If skipped, the default {@link CKEDITOR.fileTools.fileLoader} * type will be used. * @returns {CKEDITOR.fileTools.fileLoader} The created file loader instance. */ create: function( fileOrData, fileName, loaderType ) { loaderType = loaderType || FileLoader; var id = this.loaders.length, loader = new loaderType( this.editor, fileOrData, fileName ); loader.id = id; this.loaders[ id ] = loader; this.fire( 'instanceCreated', loader ); return loader; }, /** * Returns `true` if all loaders finished their jobs. * * @returns {Boolean} `true` if all loaders finished their job, `false` otherwise. */ isFinished: function() { for ( var id = 0; id < this.loaders.length; ++id ) { if ( !this.loaders[ id ].isFinished() ) { return false; } } return true; } /** * Array of loaders created by the {@link #create} method. Loaders' {@link CKEDITOR.fileTools.fileLoader#id IDs} * are indexes. * * @readonly * @property {CKEDITOR.fileTools.fileLoader[]} loaders */ /** * Event fired when the {@link CKEDITOR.fileTools.fileLoader file loader} is created. * * @event instanceCreated * @param {CKEDITOR.fileTools.fileLoader} data Created file loader. */ }; /** * The `FileLoader` class is a wrapper which handles two file operations: loading the content of the file stored on * the user's device into the memory and uploading the file to the server. * * There are two possible ways to crate a `FileLoader` instance: with a [Blob](https://developer.mozilla.org/en/docs/Web/API/Blob) * (e.g. acquired from the {@link CKEDITOR.plugins.clipboard.dataTransfer#getFile} method) or with data as a Base64 string. * Note that if the constructor gets the data as a Base64 string, there is no need to load the data, the data is already loaded. * * The `FileLoader` is created for a single load and upload process so if you abort the process, * you need to create a new `FileLoader`. * * All process parameters are stored in public properties. * * `FileLoader` implements events so you can listen to them to react to changes. There are two types of events: * events to notify the listeners about changes and an event that lets the listeners synchronize with current {@link #status}. * * The first group of events contains {@link #event-loading}, {@link #event-loaded}, {@link #event-uploading}, * {@link #event-uploaded}, {@link #event-error} and {@link #event-abort}. These events are called only once, * when the {@link #status} changes. * * The second type is the {@link #event-update} event. It is fired every time the {@link #status} changes, the progress changes * or the {@link #method-update} method is called. Is is created to synchronize the visual representation of the loader with * its status. For example if the dialog window shows the upload progress, it should be refreshed on * the {@link #event-update} listener. Then when the user closes and reopens this dialog, the {@link #method-update} method should * be called to refresh the progress. * * Default request and response formats will work with CKFinder 2.4.3 and above. If you need a custom request * or response handling you need to overwrite the default behavior using the {@link CKEDITOR.editor#fileUploadRequest} and * {@link CKEDITOR.editor#fileUploadResponse} events. For more information see their documentation. * * To create a `FileLoader` instance, use the {@link CKEDITOR.fileTools.uploadRepository} class. * * Here is a simple `FileLoader` usage example: * * editor.on( 'paste', function( evt ) { * for ( var i = 0; i < evt.data.dataTransfer.getFilesCount(); i++ ) { * var file = evt.data.dataTransfer.getFile( i ); * * if ( CKEDITOR.fileTools.isTypeSupported( file, /image\/png/ ) ) { * var loader = editor.uploadRepository.create( file ); * * loader.on( 'update', function() { * document.getElementById( 'uploadProgress' ).innerHTML = loader.status; * } ); * * loader.on( 'error', function() { * alert( 'Error!' ); * } ); * * loader.loadAndUpload( 'http://upload.url/' ); * * evt.data.dataValue += 'loading...' * } * } * } ); * * Note that `FileLoader` uses the native file API which is supported **since Internet Explorer 10**. * * @since 4.5.0 * @class CKEDITOR.fileTools.fileLoader * @mixins CKEDITOR.event * @constructor Creates an instance of the class and sets initial values for all properties. * @param {CKEDITOR.editor} editor The editor instance. Used only to get language data. * @param {Blob/String} fileOrData A [blob object](https://developer.mozilla.org/en/docs/Web/API/Blob) or a data * string encoded with Base64. * @param {String} [fileName] The file name. If not set and the second parameter is a file, then its name will be used. * If not set and the second parameter is a Base64 data string, then the file name will be created based on * the {@link CKEDITOR.config#fileTools_defaultFileName} option. */ function FileLoader( editor, fileOrData, fileName ) { var mimeParts, defaultFileName = editor.config.fileTools_defaultFileName; this.editor = editor; this.lang = editor.lang; if ( typeof fileOrData === 'string' ) { // Data is already loaded from disc. this.data = fileOrData; this.file = dataToFile( this.data ); this.total = this.file.size; this.loaded = this.total; } else { this.data = null; this.file = fileOrData; this.total = this.file.size; this.loaded = 0; } if ( fileName ) { this.fileName = fileName; } else if ( this.file.name ) { this.fileName = this.file.name; } else { mimeParts = this.file.type.split( '/' ); if ( defaultFileName ) { mimeParts[ 0 ] = defaultFileName; } this.fileName = mimeParts.join( '.' ); } this.uploaded = 0; this.uploadTotal = null; this.responseData = null; this.status = 'created'; this.abort = function() { this.changeStatus( 'abort' ); }; } /** * The loader status. Possible values: * * * `created` – The loader was created, but neither load nor upload started. * * `loading` – The file is being loaded from the user's storage. * * `loaded` – The file was loaded, the process is finished. * * `uploading` – The file is being uploaded to the server. * * `uploaded` – The file was uploaded, the process is finished. * * `error` – The process stops because of an error, more details are available in the {@link #message} property. * * `abort` – The process was stopped by the user. * * @property {String} status */ /** * String data encoded with Base64. If the `FileLoader` is created with a Base64 string, the `data` is that string. * If a file was passed to the constructor, the data is `null` until loading is completed. * * @readonly * @property {String} data */ /** * File object which represents the handled file. This property is set for both constructor options (file or data). * * @readonly * @property {Blob} file */ /** * The name of the file. If there is no file name, it is created by using the * {@link CKEDITOR.config#fileTools_defaultFileName} option. * * @readonly * @property {String} fileName */ /** * The number of loaded bytes. If the `FileLoader` was created with a data string, * the loaded value equals the {@link #total} value. * * @readonly * @property {Number} loaded */ /** * The number of uploaded bytes. * * @readonly * @property {Number} uploaded */ /** * The total file size in bytes. * * @readonly * @property {Number} total */ /** * All data received in the response from the server. If the server returns additional data, it will be available * in this property. * * It contains all data set in the {@link CKEDITOR.editor#fileUploadResponse} event listener. * * @readonly * @property {Object} responseData */ /** * The total size of upload data in bytes. * If the `xhr.upload` object is present, this value will indicate the total size of the request payload, not only the file * size itself. If the `xhr.upload` object is not available and the real upload size cannot be obtained, this value will * be equal to {@link #total}. It has a `null` value until the upload size is known. * * loader.on( 'update', function() { * // Wait till uploadTotal is present. * if ( loader.uploadTotal ) { * console.log( 'uploadTotal: ' + loader.uploadTotal ); * } * }); * * @readonly * @property {Number} uploadTotal */ /** * The error message or additional information received from the server. * * @readonly * @property {String} message */ /** * The URL to the file when it is uploaded or received from the server. * * @readonly * @property {String} url */ /** * The target of the upload. * * @readonly * @property {String} uploadUrl */ /** * * Native `FileReader` reference used to load the file. * * @readonly * @property {FileReader} reader */ /** * Native `XMLHttpRequest` reference used to upload the file. * * @readonly * @property {XMLHttpRequest} xhr */ /** * If `FileLoader` was created using {@link CKEDITOR.fileTools.uploadRepository}, * it gets an identifier which is stored in this property. * * @readonly * @property {Number} id */ /** * Aborts the process. * * This method has a different behavior depending on the current {@link #status}. * * * If the {@link #status} is `loading` or `uploading`, current operation will be aborted. * * If the {@link #status} is `created`, `loading` or `uploading`, the {@link #status} will be changed to `abort` * and the {@link #event-abort} event will be called. * * If the {@link #status} is `loaded`, `uploaded`, `error` or `abort`, this method will do nothing. * * @method abort */ FileLoader.prototype = { /** * Loads a file from the storage on the user's device to the `data` attribute and uploads it to the server. * * The order of {@link #status statuses} for a successful load and upload is: * * * `created`, * * `loading`, * * `uploading`, * * `uploaded`. * * @param {String} url The upload URL. * @param {Object} [additionalRequestParameters] Additional parameters that would be passed to * the {@link CKEDITOR.editor#fileUploadRequest} event. */ loadAndUpload: function( url, additionalRequestParameters ) { var loader = this; this.once( 'loaded', function( evt ) { // Cancel both 'loaded' and 'update' events, // because 'loaded' is terminated state. evt.cancel(); loader.once( 'update', function( evt ) { evt.cancel(); }, null, null, 0 ); // Start uploading. loader.upload( url, additionalRequestParameters ); }, null, null, 0 ); this.load(); }, /** * Loads a file from the storage on the user's device to the `data` attribute. * * The order of the {@link #status statuses} for a successful load is: * * * `created`, * * `loading`, * * `loaded`. */ load: function() { var loader = this; this.reader = new FileReader(); var reader = this.reader; loader.changeStatus( 'loading' ); this.abort = function() { loader.reader.abort(); }; reader.onabort = function() { loader.changeStatus( 'abort' ); }; reader.onerror = function() { loader.message = loader.lang.filetools.loadError; loader.changeStatus( 'error' ); }; reader.onprogress = function( evt ) { loader.loaded = evt.loaded; loader.update(); }; reader.onload = function() { loader.loaded = loader.total; loader.data = reader.result; loader.changeStatus( 'loaded' ); }; reader.readAsDataURL( this.file ); }, /** * Uploads a file to the server. * * The order of the {@link #status statuses} for a successful upload is: * * * `created`, * * `uploading`, * * `uploaded`. * * @param {String} url The upload URL. * @param {Object} [additionalRequestParameters] Additional data that would be passed to * the {@link CKEDITOR.editor#fileUploadRequest} event. */ upload: function( url, additionalRequestParameters ) { var requestData = additionalRequestParameters || {}; if ( !url ) { this.message = this.lang.filetools.noUrlError; this.changeStatus( 'error' ); } else { this.uploadUrl = url; this.xhr = new XMLHttpRequest(); this.attachRequestListeners(); if ( this.editor.fire( 'fileUploadRequest', { fileLoader: this, requestData: requestData } ) ) { this.changeStatus( 'uploading' ); } } }, /** * Attaches listeners to the XML HTTP request object. * * @private * @param {XMLHttpRequest} xhr XML HTTP request object. */ attachRequestListeners: function() { var loader = this, xhr = this.xhr; loader.abort = function() { xhr.abort(); onAbort(); }; xhr.onerror = onError; xhr.onabort = onAbort; // https://dev.ckeditor.com/ticket/13533 - When xhr.upload is present attach onprogress, onerror and onabort functions to get actual upload // information. if ( xhr.upload ) { xhr.upload.onprogress = function( evt ) { if ( evt.lengthComputable ) { // Set uploadTotal with correct data. if ( !loader.uploadTotal ) { loader.uploadTotal = evt.total; } loader.uploaded = evt.loaded; loader.update(); } }; xhr.upload.onerror = onError; xhr.upload.onabort = onAbort; } else { // https://dev.ckeditor.com/ticket/13533 - If xhr.upload is not supported - fire update event anyway and set uploadTotal to file size. loader.uploadTotal = loader.total; loader.update(); } xhr.onload = function() { // https://dev.ckeditor.com/ticket/13433 - Call update at the end of the upload. When xhr.upload object is not supported there will be // no update events fired during the whole process. loader.update(); // https://dev.ckeditor.com/ticket/13433 - Check if loader was not aborted during last update. if ( loader.status == 'abort' ) { return; } loader.uploaded = loader.uploadTotal; if ( xhr.status < 200 || xhr.status > 299 ) { loader.message = loader.lang.filetools[ 'httpError' + xhr.status ]; if ( !loader.message ) { loader.message = loader.lang.filetools.httpError.replace( '%1', xhr.status ); } loader.changeStatus( 'error' ); } else { var data = { fileLoader: loader }, // Values to copy from event to FileLoader. valuesToCopy = [ 'message', 'fileName', 'url' ], success = loader.editor.fire( 'fileUploadResponse', data ); for ( var i = 0; i < valuesToCopy.length; i++ ) { var key = valuesToCopy[ i ]; if ( typeof data[ key ] === 'string' ) { loader[ key ] = data[ key ]; } } // The whole response is also hold for use by uploadwidgets (https://dev.ckeditor.com/ticket/13519). loader.responseData = data; // But without reference to the loader itself. delete loader.responseData.fileLoader; if ( success === false ) { loader.changeStatus( 'error' ); } else { loader.changeStatus( 'uploaded' ); } } }; function onError() { // Prevent changing status twice, when XHR.error and XHR.upload.onerror could be called together. if ( loader.status == 'error' ) { return; } loader.message = loader.lang.filetools.networkError; loader.changeStatus( 'error' ); } function onAbort() { // Prevent changing status twice, when XHR.onabort and XHR.upload.onabort could be called together. if ( loader.status == 'abort' ) { return; } loader.changeStatus( 'abort' ); } }, /** * Changes {@link #status} to the new status, updates the {@link #method-abort} method if needed and fires two events: * new status and {@link #event-update}. * * @private * @param {String} newStatus New status to be set. */ changeStatus: function( newStatus ) { this.status = newStatus; if ( newStatus == 'error' || newStatus == 'abort' || newStatus == 'loaded' || newStatus == 'uploaded' ) { this.abort = function() {}; } this.fire( newStatus ); this.update(); }, /** * Updates the state of the `FileLoader` listeners. This method should be called if the state of the visual representation * of the upload process is out of synchronization and needs to be refreshed (e.g. because of an undo operation or * because the dialog window with the upload is closed and reopened). Fires the {@link #event-update} event. */ update: function() { this.fire( 'update' ); }, /** * Returns `true` if the loading and uploading finished (successfully or not), so the {@link #status} is * `loaded`, `uploaded`, `error` or `abort`. * * @returns {Boolean} `true` if the loading and uploading finished. */ isFinished: function() { return !!this.status.match( /^(?:loaded|uploaded|error|abort)$/ ); } /** * Event fired when the {@link #status} changes to `loading`. It will be fired once for the `FileLoader`. * * @event loading */ /** * Event fired when the {@link #status} changes to `loaded`. It will be fired once for the `FileLoader`. * * @event loaded */ /** * Event fired when the {@link #status} changes to `uploading`. It will be fired once for the `FileLoader`. * * @event uploading */ /** * Event fired when the {@link #status} changes to `uploaded`. It will be fired once for the `FileLoader`. * * @event uploaded */ /** * Event fired when the {@link #status} changes to `error`. It will be fired once for the `FileLoader`. * * @event error */ /** * Event fired when the {@link #status} changes to `abort`. It will be fired once for the `FileLoader`. * * @event abort */ /** * Event fired every time the `FileLoader` {@link #status} or progress changes or the {@link #method-update} method is called. * This event was designed to allow showing the visualization of the progress and refresh that visualization * every time the status changes. Note that multiple `update` events may be fired with the same status. * * @event update */ }; CKEDITOR.event.implementOn( UploadRepository.prototype ); CKEDITOR.event.implementOn( FileLoader.prototype ); var base64HeaderRegExp = /^data:(\S*?);base64,/; // Transforms Base64 string data into file and creates name for that file based on the mime type. // // @private // @param {String} data Base64 string data. // @returns {Blob} File. function dataToFile( data ) { var contentType = data.match( base64HeaderRegExp )[ 1 ], base64Data = data.replace( base64HeaderRegExp, '' ), byteCharacters = atob( base64Data ), byteArrays = [], sliceSize = 512, offset, slice, byteNumbers, i, byteArray; for ( offset = 0; offset < byteCharacters.length; offset += sliceSize ) { slice = byteCharacters.slice( offset, offset + sliceSize ); byteNumbers = new Array( slice.length ); for ( i = 0; i < slice.length; i++ ) { byteNumbers[ i ] = slice.charCodeAt( i ); } byteArray = new Uint8Array( byteNumbers ); byteArrays.push( byteArray ); } return new Blob( byteArrays, { type: contentType } ); } // // PUBLIC API ------------------------------------------------------------- // // Two plugins extend this object. if ( !CKEDITOR.fileTools ) { /** * Helpers to load and upload a file. * * @since 4.5.0 * @singleton * @class CKEDITOR.fileTools */ CKEDITOR.fileTools = {}; } CKEDITOR.tools.extend( CKEDITOR.fileTools, { uploadRepository: UploadRepository, fileLoader: FileLoader, /** * Gets the upload URL from the {@link CKEDITOR.config configuration}. Because of backward compatibility * the URL can be set using multiple configuration options. * * If the `type` is defined, then four configuration options will be checked in the following order * (examples for `type='image'`): * * * `[type]UploadUrl`, e.g. {@link CKEDITOR.config#imageUploadUrl}, * * {@link CKEDITOR.config#uploadUrl}, * * `filebrowser[uppercased type]uploadUrl`, e.g. {@link CKEDITOR.config#filebrowserImageUploadUrl}, * * {@link CKEDITOR.config#filebrowserUploadUrl}. * * If the `type` is not defined, two configuration options will be checked: * * * {@link CKEDITOR.config#uploadUrl}, * * {@link CKEDITOR.config#filebrowserUploadUrl}. * * `filebrowser[type]uploadUrl` and `filebrowserUploadUrl` are checked for backward compatibility with the * `filebrowser` plugin. * * For both `filebrowser[type]uploadUrl` and `filebrowserUploadUrl` `&responseType=json` is added to the end of the URL. * * @param {Object} config The configuration file. * @param {String} [type] Upload file type. * @returns {String/null} Upload URL or `null` if none of the configuration options were defined. */ getUploadUrl: function( config, type ) { var capitalize = CKEDITOR.tools.capitalize; if ( type && config[ type + 'UploadUrl' ] ) { return config[ type + 'UploadUrl' ]; } else if ( config.uploadUrl ) { return config.uploadUrl; } else if ( type && config[ 'filebrowser' + capitalize( type, 1 ) + 'UploadUrl' ] ) { return config[ 'filebrowser' + capitalize( type, 1 ) + 'UploadUrl' ] + '&responseType=json'; } else if ( config.filebrowserUploadUrl ) { return config.filebrowserUploadUrl + '&responseType=json'; } return null; }, /** * Checks if the MIME type of the given file is supported. * * CKEDITOR.fileTools.isTypeSupported( { type: 'image/png' }, /image\/(png|jpeg)/ ); // true * CKEDITOR.fileTools.isTypeSupported( { type: 'image/png' }, /image\/(gif|jpeg)/ ); // false * * @param {Blob} file The file to check. * @param {RegExp} supportedTypes A regular expression to check the MIME type of the file. * @returns {Boolean} `true` if the file type is supported. */ isTypeSupported: function( file, supportedTypes ) { return !!file.type.match( supportedTypes ); }, /** * Feature detection indicating whether the current browser supports methods essential to send files over an XHR request. * * @since 4.9.0 * @property {Boolean} isFileUploadSupported */ isFileUploadSupported: ( function() { return typeof FileReader === 'function' && typeof ( new FileReader() ).readAsDataURL === 'function' && typeof FormData === 'function' && typeof ( new FormData() ).append === 'function' && typeof XMLHttpRequest === 'function' && typeof Blob === 'function'; } )() } ); } )(); /** * The URL where files should be uploaded. * * An empty string means that the option is disabled. * * @since 4.5.0 * @cfg {String} [uploadUrl=''] * @member CKEDITOR.config */ /** * The default file name (without extension) that will be used for files created from a Base64 data string * (for example for files pasted into the editor). * This name will be combined with the MIME type to create the full file name with the extension. * * If `fileTools_defaultFileName` is set to `default-name` and data's MIME type is `image/png`, * the resulting file name will be `default-name.png`. * * If `fileTools_defaultFileName` is not set, the file name will be created using only its MIME type. * For example for `image/png` the file name will be `image.png`. * * @since 4.5.3 * @cfg {String} [fileTools_defaultFileName=''] * @member CKEDITOR.config */ /** * Allows to add extra headers for every request made using the {@link CKEDITOR.fileTools} API. * * Note that headers can still be customized per a single request, using the * [`fileUploadRequest`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-fileUploadRequest) * event. * * config.fileTools_requestHeaders = { * 'X-Requested-With': 'XMLHttpRequest', * 'Custom-Header': 'header value' * }; * * @since 4.9.0 * @cfg {Object} [fileTools_requestHeaders] * @member CKEDITOR.config */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/dev/0000755000201500020150000000000014515446705023033 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/dev/uploaddebugger.js0000644000201500020150000000241314515446705026362 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ 'use strict'; // Slow down the upload process. // This trick works only on Chrome. ( function() { XMLHttpRequest.prototype.baseSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function( data ) { var baseOnProgress = this.onprogress, baseOnLoad = this.onload; this.onprogress = function() {}; this.onload = function( evt ) { // Total file size. var total = 1163, step = Math.round( total / 10 ), loaded = 0, xhr = this; function progress() { setTimeout( function() { if ( xhr.aborted ) { return; } loaded += step; if ( loaded > total ) { loaded = total; } if ( loaded > step * 4 && xhr.responseText.indexOf( 'incorrectFile' ) > 0 ) { xhr.aborted = true; xhr.onerror(); } else if ( loaded < total ) { evt.loaded = loaded; baseOnProgress( { loaded: loaded } ); progress(); } else { baseOnLoad( evt ); } }, 300 ); } progress(); }; this.abort = function() { this.aborted = true; this.onabort(); }; this.baseSend( data ); }; } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/0000755000201500020150000000000014515446705023176 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/zh.js0000644000201500020150000000123714515446705024160 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'zh', { loadError: '在讀取檔案時發生錯誤。', networkError: '在上傳檔案時發生網路錯誤。', httpError404: '在上傳檔案時發生 HTTP 錯誤(404:檔案找不到)。', httpError403: '在上傳檔案時發生 HTTP 錯誤(403:禁止)。', httpError: '在上傳檔案時發生 HTTP 錯誤(錯誤狀態:%1)。', noUrlError: '上傳的 URL 未被定義。', responseError: '不正確的伺服器回應。' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/nb.js0000644000201500020150000000122414515446705024132 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'nb', { loadError: 'Feil oppsto under filinnlesing.', networkError: 'Nettverksfeil oppsto under filopplasting.', httpError404: 'HTTP-feil oppsto under filopplasting (404: Fant ikke filen).', httpError403: 'HTTP-feil oppsto under filopplasting (403: Ikke tillatt).', httpError: 'HTTP-feil oppsto under filopplasting (feilstatus: %1).', noUrlError: 'URL for opplasting er ikke oppgitt.', responseError: 'Ukorrekt svar fra serveren.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/eo.js0000644000201500020150000000125114515446705024136 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'eo', { loadError: 'Eraro okazis dum la dosiera legado.', networkError: 'Reta eraro okazis dum la dosiera alŝuto.', httpError404: 'HTTP eraro okazis dum la dosiera alŝuto (404: dosiero ne trovita).', httpError403: 'HTTP eraro okazis dum la dosiera alŝuto (403: malpermesita).', httpError: 'HTTP eraro okazis dum la dosiera alŝuto (erara stato: %1).', noUrlError: 'Alŝuta URL ne estas difinita.', responseError: 'Malĝusta respondo de la servilo.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/es.js0000644000201500020150000000135114515446705024143 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'es', { loadError: 'Ha ocurrido un error durante la lectura del archivo.', networkError: 'Error de red ocurrido durante carga de archivo.', httpError404: 'Un error HTTP ha ocurrido durante la carga del archivo (404: Archivo no encontrado).', httpError403: 'Un error HTTP ha ocurrido durante la carga del archivo (403: Prohibido).', httpError: 'Error HTTP ocurrido durante la carga del archivo (Estado del error: %1).', noUrlError: 'URL cargada no está definida.', responseError: 'Respueta del servidor incorrecta.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ro.js0000644000201500020150000000133414515446705024155 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ro', { loadError: 'Eroare în timpul citirii fișierului.', networkError: 'Eroare de rețea în timpul încărcării fișierului.', httpError404: 'Eroare HTTP în timpul încărcării fișierului (404: Fișier negăsit).', httpError403: 'Eroare HTTP în timpul încărcării fișierului (403: Operașie nepermisă).', httpError: 'Eroare HTTP în timpul încărcării fișierului (stare eroiare: %1).', noUrlError: 'URL-ul de ăncărcare nu este specificat.', responseError: 'Răspuns server incorect.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/hr.js0000644000201500020150000000123514515446705024146 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'hr', { loadError: 'Greška prilikom čitanja datoteke.', networkError: 'Mrežna greška prilikom slanja datoteke.', httpError404: 'HTTP greška tijekom slanja datoteke (404: datoteka nije pronađena).', httpError403: 'HTTP greška tijekom slanja datoteke (403: Zabranjeno).', httpError: 'HTTP greška tijekom slanja datoteke (greška status: %1).', noUrlError: 'URL za slanje nije podešen.', responseError: 'Neispravni odgovor servera.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/it.js0000644000201500020150000000147314515446705024155 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'it', { loadError: 'Si è verificato un errore durante la lettura del file.', networkError: 'Si è verificato un errore di rete durante il caricamento del file.', httpError404: 'Si è verificato un errore HTTP durante il caricamento del file (404: file non trovato).', httpError403: 'Si è verificato un errore HTTP durante il caricamento del file (403: accesso negato).', httpError: 'Si è verificato un errore HTTP durante il caricamento del file (stato dell\'errore: %1).', noUrlError: 'L\'URL per il caricamento non è stato definito.', responseError: 'La risposta del server non è corretta.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/de-ch.js0000644000201500020150000000144114515446705024514 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'de-ch', { loadError: 'Während dem Lesen der Datei ist ein Fehler aufgetreten.', networkError: 'Während dem Hochladen der Datei ist ein Netzwerkfehler aufgetreten.', httpError404: 'Während dem Hochladen der Datei ist ein HTTP-Fehler aufgetreten (404: Datei nicht gefunden).', httpError403: 'Während dem Hochladen der Datei ist ein HTTP-Fehler aufgetreten (403: Verboten).', httpError: 'Während dem Hochladen der Datei ist ein HTTP-Fehler aufgetreten (Fehlerstatus: %1).', noUrlError: 'Hochlade-URL ist nicht definiert.', responseError: 'Falsche Antwort des Servers.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/sk.js0000644000201500020150000000130514515446705024150 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'sk', { loadError: 'Počas čítania súboru nastala chyba.', networkError: 'Počas nahrávania súboru nastala chyba siete.', httpError404: 'Počas nahrávania súboru nastala HTTP chyba (404: Súbor nebol nájdený).', httpError403: 'Počas nahrávania súboru nastala HTTP chyba (403: Zakázaný).', httpError: 'Počas nahrávania súboru nastala HTTP chyba (error status: %1).', noUrlError: 'URL nahrávania nie je definovaný.', responseError: 'Nesprávna odpoveď servera.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/az.js0000644000201500020150000000126514515446705024152 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'az', { loadError: 'Faylını oxumaq mümkün deyil', networkError: 'Xəta baş verdi.', httpError404: 'Serverə göndərilməsinin zamanı xəta baş verdi (404 - fayl tapılmayıb)', httpError403: 'Serverə göndərilməsinin zamanı xəta baş verdi (403 - gadağandır)', httpError: 'Serverə göndərilməsinin zamanı xəta baş verdi (xətanın ststusu: %1)', noUrlError: 'Yükləmə linki təyin edilməyib', responseError: 'Serverin cavabı yanlışdır' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/pt.js0000644000201500020150000000131514515446705024157 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'pt', { loadError: 'Ocorreu um erro ao ler o ficheiro', networkError: 'Ocorreu um erro de rede ao carregar o ficheiro.', httpError404: 'HTTP error occurred during file upload (404: File not found).', // MISSING httpError403: 'HTTP error occurred during file upload (403: Forbidden).', // MISSING httpError: 'HTTP error occurred during file upload (error status: %1).', // MISSING noUrlError: 'Upload URL is not defined.', // MISSING responseError: 'Incorrect server response.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ko.js0000644000201500020150000000141214515446705024143 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ko', { loadError: '파일을 읽는 중 오류가 발생했습니다.', networkError: '파일 업로드 중 네트워크 오류가 발생했습니다.', httpError404: '파일 업로드중 HTTP 오류가 발생했습니다 (404: 파일 찾을수 없음).', httpError403: '파일 업로드중 HTTP 오류가 발생했습니다 (403: 권한 없음).', httpError: '파일 업로드중 HTTP 오류가 발생했습니다 (오류 코드 %1).', noUrlError: '업로드 주소가 정의되어 있지 않습니다.', responseError: '잘못된 서버 응답.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/uk.js0000644000201500020150000000173014515446705024154 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'uk', { loadError: 'Виникла помилка під час читання файлу', networkError: 'Під час завантаження файлу виникла помилка мережі.', httpError404: 'Під час завантаження файлу виникла помилка HTTP (404: Файл не знайдено).', httpError403: 'Під час завантаження файлу виникла помилка HTTP (403: Доступ заборонено).', httpError: 'Під час завантаження файлу виникла помилка (статус помилки: %1).', noUrlError: 'URL завантаження не визначений.', responseError: 'Невірна відповідь сервера.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/zh-cn.js0000644000201500020150000000120414515446705024550 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'zh-cn', { loadError: '读取文件时发生错误', networkError: '上传文件时发生网络错误', httpError404: '上传文件时发生 HTTP 错误(404:无法找到文件)', httpError403: '上传文件时发生 HTTP 错误(403:禁止访问)', httpError: '上传文件时发生 HTTP 错误(错误代码:%1)', noUrlError: '上传的 URL 未定义', responseError: '不正确的服务器响应' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/sv.js0000644000201500020150000000120714515446705024164 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'sv', { loadError: 'Fel uppstod vid filläsning', networkError: 'Nätverksfel uppstod vid filuppladdning.', httpError404: 'HTTP-fel uppstod vid filuppladdning (404: Fil hittades inte).', httpError403: 'HTTP-fel uppstod vid filuppladdning (403: Förbjuden).', httpError: 'HTTP-fel uppstod vid filuppladdning (felstatus: %1).', noUrlError: 'URL för uppladdning inte definierad.', responseError: 'Felaktigt serversvar.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/et.js0000644000201500020150000000121514515446705024143 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'et', { loadError: 'Faili lugemisel esines viga.', networkError: 'Faili üleslaadimisel esines võrgu viga.', httpError404: 'Faili üleslaadimisel esines HTTP viga (404: faili ei leitud).', httpError403: 'Faili üleslaadimisel esines HTTP viga (403: keelatud).', httpError: 'Faili üleslaadimisel esines HTTP viga (veakood: %1).', noUrlError: 'Üleslaadimise URL ei ole määratud.', responseError: 'Vigane serveri vastus.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/pl.js0000644000201500020150000000130114515446705024142 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'pl', { loadError: 'Błąd podczas odczytu pliku.', networkError: 'W trakcie wysyłania pliku pojawił się błąd sieciowy.', httpError404: 'Błąd HTTP w trakcie wysyłania pliku (404: Nie znaleziono pliku).', httpError403: 'Błąd HTTP w trakcie wysyłania pliku (403: Zabroniony).', httpError: 'Błąd HTTP w trakcie wysyłania pliku (status błędu: %1).', noUrlError: 'Nie zdefiniowano adresu URL do przesłania pliku.', responseError: 'Niepoprawna odpowiedź serwera.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/bg.js0000644000201500020150000000167714515446705024137 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'bg', { loadError: 'Възникна грешка при четене на файла.', networkError: 'Възникна мрежова грешка при качването на файла.', httpError404: 'Възникна HTTP грешка при качване на файла (404: Файлът не е намерен).', httpError403: 'Възникна HTTP грешка при качване на файла (403: Забранено).', httpError: 'Възникна HTTP грешка при качване на файла (статус на грешката: %1).', noUrlError: 'URL адресът за качване не е дефиниран.', responseError: 'Неправилен отговор на сървъра.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/fa.js0000644000201500020150000000144314515446705024124 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'fa', { loadError: 'هنگام خواندن فایل، خطایی رخ داد.', networkError: 'هنگام آپلود فایل خطای شبکه رخ داد.', httpError404: 'هنگام آپلود فایل خطای HTTP رخ داد (404: فایل یافت نشد).', httpError403: 'هنگام آپلود فایل، خطای HTTP رخ داد (403: ممنوع).', httpError: 'خطای HTTP در آپلود فایل رخ داده است (وضعیت خطا: %1).', noUrlError: 'آدرس آپلود تعریف نشده است.', responseError: 'پاسخ نادرست سرور.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ku.js0000644000201500020150000000167114515446705024160 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ku', { loadError: 'هەڵەیەک ڕوویدا لە ماوەی خوێندنەوەی پەڕگەکە.', networkError: 'هەڵەیەکی ڕایەڵە ڕوویدا لە ماوەی بارکردنی پەڕگەکە.', httpError404: 'هەڵەیەک ڕوویدا لە ماوەی بارکردنی پەڕگەکە (404: پەڕگەکە نەدۆزراوە).', httpError403: 'هەڵەیەک ڕوویدا لە ماوەی بارکردنی پەڕگەکە (403: قەدەغەکراو).', httpError: 'هەڵەیەک ڕوویدا لە ماوەی بارکردنی پەڕگەکە (دۆخی هەڵە: %1).', noUrlError: 'بەستەری پەڕگەکە پێناسە نەکراوە.', responseError: 'وەڵامێکی نادروستی سێرڤەر.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/el.js0000644000201500020150000000205014515446705024131 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'el', { loadError: 'Παρουσιάστηκε αφάλμα κατά την ανάγνωση αρχείου.', networkError: 'Παρουσιάστηκε σφάλμα δικτύου κατά την αποστολή αρχείου.', httpError404: 'Παρουσιάστηκε σφάλμα HTTP κατά την αποστολή αρχείου (404: Το αρχείο δεν βρέθηκε).', httpError403: 'Παρουσιάστηκε σφάλμα HTTP κατά την αποστολή αρχείου (403: Απαγορευμένο).', httpError: 'Παρουσιάστηκε σφάλμα HTTP κατά την αποστολή αρχείου (κατάσταση σφάλματος: %1).', noUrlError: 'Η διεύθυνση URL δεν έχει οριστεί.', responseError: 'Λανθασμένη απάντηση διακομιστή.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ru.js0000644000201500020150000000143314515446705024163 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ru', { loadError: 'Ошибка при чтении файла', networkError: 'Сетевая ошибка при загрузке файла', httpError404: 'HTTP ошибка при загрузке файла (404: Файл не найден)', httpError403: 'HTTP ошибка при загрузке файла (403: Запрещено)', httpError: 'HTTP ошибка при загрузке файла (%1)', noUrlError: 'Не определен URL для загрузки файлов', responseError: 'Некорректный ответ сервера' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/gl.js0000644000201500020150000000137014515446705024137 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'gl', { loadError: 'Produciuse un erro durante a lectura do ficheiro.', networkError: 'Produciuse un erro na rede durante o envío do ficheiro.', httpError404: 'Produciuse un erro HTTP durante o envío do ficheiro (404: Ficheiro non atopado).', httpError403: 'Produciuse un erro HTTP durante o envío do ficheiro (403: Acceso denegado).', httpError: 'Produciuse un erro HTTP durante o envío do ficheiro (erro de estado: %1).', noUrlError: 'Non foi definido o URL para o envío.', responseError: 'Resposta incorrecta do servidor.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/sr-latn.js0000644000201500020150000000137014515446705025115 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'sr-latn', { loadError: 'Došlo je do greške pri čitanju datoteke.', networkError: 'Tokom postavljanja datoteke došlo je do mrežne greške', httpError404: 'Tokom postavljanja datoteke došlo je do HTTP greške (404: Datoteka nije pronadjena).', httpError403: 'Tokom postavljanja datoteke došlo je do HTTP greške (403: Zabranjena).', httpError: 'Tokom postavljanja datoteke došlo je do HTTP greške (status greške: %1).', noUrlError: 'URL adresa za postavljanje nije navedena.', responseError: 'Neispravan odgovor servera.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/oc.js0000644000201500020150000000145014515446705024135 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'oc', { loadError: 'Una error s\'es produita pendent la lectura del fichièr.', networkError: 'Una error de ret s\'es produita pendent lo mandadís del fichièr.', httpError404: 'Una error HTTP s\'es produita pendent lo mandadís del fichièr (404 : fichièr pas trobat).', httpError403: 'Una error HTTP s\'es produita pendent lo mandadís del fichièr (403 : accès refusat).', httpError: 'Una error HTTP s\'es produita pendent lo mandadís del fichièr (error : %1).', noUrlError: 'L\'URL de mandadís es pas especificada.', responseError: 'Responsa del servidor incorrècta.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/sq.js0000644000201500020150000000137114515446705024161 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'sq', { loadError: 'Gabimi u paraqit gjatë leximit të skedës.', networkError: 'Gabimi në rrjetë u paraqitë gjatë ngarkimit të skedës.', httpError404: 'Gabimi në HTTP u paraqit gjatë ngarkimit të skedës (404: Skeda nuk u gjetë).', httpError403: 'Gabimi në HTTP u paraqitë gjatë ngarkimit të skedës (403: E ndaluar).', httpError: 'Gabimi në HTTP u paraqit gjatë ngarkimit të skedës (gjendja e gabimit: %1).', noUrlError: 'URL e ngarkimit nuk është vendosur.', responseError: 'Përgjigje e gabuar e serverit.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/pt-br.js0000644000201500020150000000133414515446705024561 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'pt-br', { loadError: 'Um erro ocorreu durante a leitura do arquivo.', networkError: 'Um erro de rede ocorreu durante o envio do arquivo.', httpError404: 'Um erro HTTP ocorreu durante o envio do arquivo (404: Arquivo não encontrado).', httpError403: 'Um erro HTTP ocorreu durante o envio do arquivo (403: Proibido).', httpError: 'Um erro HTTP ocorreu durante o envio do arquivo (status do erro: %1)', noUrlError: 'A URL de upload não está definida.', responseError: 'Resposta incorreta do servidor.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/km.js0000644000201500020150000000252514515446705024147 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'km', { loadError: 'មាន​បញ្ហា​កើតឡើង​ក្នុង​ពេល​អាន​ឯកសារ។', networkError: 'មាន​បញ្ហា​បណ្ដាញ​កើត​ឡើង​ក្នុង​ពេល​ផ្ទុកឡើង​ឯកសារ។', httpError404: 'មាន​បញ្ហា HTTP កើត​ឡើង​ក្នុង​ពេល​ផ្ទុកឡើង​ឯកសារ (404៖ រក​ឯកសារ​មិន​ឃើញ)។', httpError403: 'មាន​បញ្ហា HTTP កើត​ឡើង​ក្នុង​ពេល​ផ្ទុកឡើង​ឯកសារ (403៖ ហាមឃាត់)។', httpError: 'មាន​បញ្ហា HTTP កើត​ឡើង​ក្នុង​ពេល​ផ្ទុកឡើង​ឯកសារ (ស្ថានភាព​កំហុស៖ %1)។', noUrlError: 'មិន​មាន​បញ្ជាក់ URL ផ្ទុក​ឡើង។', responseError: 'ការ​ឆ្លើយតប​របស់​ម៉ាស៊ីនបម្រើ មិន​ត្រឹមត្រូវ។' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/nl.js0000644000201500020150000000123414515446705024145 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'nl', { loadError: 'Fout tijdens lezen van bestand.', networkError: 'Netwerkfout tijdens uploaden van bestand.', httpError404: 'HTTP fout tijdens uploaden van bestand (404: Bestand niet gevonden).', httpError403: 'HTTP fout tijdens uploaden van bestand (403: Verboden).', httpError: 'HTTP fout tijdens uploaden van bestand (fout status: %1).', noUrlError: 'Upload URL is niet gedefinieerd.', responseError: 'Ongeldig antwoord van server.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/es-mx.js0000644000201500020150000000137114515446705024567 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'es-mx', { loadError: 'Ha ocurrido un error al leer el archivo', networkError: 'Ha ocurrido un error de red durante la carga del archivo.', httpError404: 'Se ha producido un error HTTP durante la subida de archivos (404: archivo no encontrado).', httpError403: 'Se ha producido un error HTTP durante la subida de archivos (403: Prohibido).', httpError: 'Se ha producido un error HTTP durante la subida de archivos (error: %1).', noUrlError: 'La URL de subida no está definida.', responseError: 'Respuesta incorrecta del servidor.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/da.js0000644000201500020150000000125114515446705024117 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'da', { loadError: 'Der skete en fejl ved indlæsningen af filen.', networkError: 'Der skete en netværks fejl under uploadingen.', httpError404: 'Der skete en HTTP fejl under uploadingen (404: File not found).', httpError403: 'Der skete en HTTP fejl under uploadingen (403: Forbidden).', httpError: 'Der skete en HTTP fejl under uploadingen (error status: %1).', noUrlError: 'Upload URL er ikke defineret.', responseError: 'Ikke korrekt server svar.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ca.js0000644000201500020150000000142114515446705024115 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ca', { loadError: 'S\'ha produït un error durant la lectura del fitxer.', networkError: 'S\'ha produït un error de xarxa durant la càrrega del fitxer.', httpError404: 'S\'ha produït un error HTTP durant la càrrega del fitxer (404: Fitxer no trobat).', httpError403: 'S\'ha produït un error HTTP durant la càrrega del fitxer (403: Permís denegat).', httpError: 'S\'ha produït un error HTTP durant la càrrega del fitxer (estat d\'error: %1).', noUrlError: 'La URL de càrrega no està definida.', responseError: 'Resposta incorrecte del servidor' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/de.js0000644000201500020150000000144314515446705024126 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'de', { loadError: 'Während des Lesens der Datei ist ein Fehler aufgetreten.', networkError: 'Während des Hochladens der Datei ist ein Netzwerkfehler aufgetreten.', httpError404: 'Während des Hochladens der Datei ist ein HTTP-Fehler aufgetreten (404: Datei nicht gefunden).', httpError403: 'Während des Hochladens der Datei ist ein HTTP-Fehler aufgetreten (403: Verboten).', httpError: 'Während des Hochladens der Datei ist ein HTTP-Fehler aufgetreten (Fehlerstatus: %1).', noUrlError: 'Hochlade-URL ist nicht definiert.', responseError: 'Falsche Antwort des Servers.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/vi.js0000644000201500020150000000133114515446705024150 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'vi', { loadError: 'Lỗi xảy ra khi đang đọc file', networkError: 'Lỗi kết nối xảy ra khi đang tải file lên', httpError404: 'Lỗi HTTP xảy ra khi đang tải file lên (404: Không tìm thấy file)', httpError403: 'Lỗi HTTP xảy ra khi đang tải file lên (403: Bị cấm)', httpError: 'Lỗi HTTP xảy ra khi đang tải file lên (tình trạng lỗi: %1)', noUrlError: 'Đường dẫn tải lên không hoạt động', responseError: 'Phản hồi từ server sai' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/cs.js0000644000201500020150000000130314515446705024136 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'cs', { loadError: 'Při čtení souboru došlo k chybě.', networkError: 'Při nahrávání souboru došlo k chybě v síti.', httpError404: 'Při nahrávání souboru došlo k chybě HTTP (404: Soubor nenalezen).', httpError403: 'Při nahrávání souboru došlo k chybě HTTP (403: Zakázáno).', httpError: 'Při nahrávání souboru došlo k chybě HTTP (chybový stav: %1).', noUrlError: 'URL pro nahrání není zadána.', responseError: 'Nesprávná odpověď serveru.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/tr.js0000644000201500020150000000122714515446705024163 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'tr', { loadError: 'Dosya okunurken hata oluştu.', networkError: 'Dosya gönderilirken ağ hatası oluştu.', httpError404: 'Dosya gönderilirken HTTP hatası oluştu (404: Dosya bulunamadı).', httpError403: 'Dosya gönderilirken HTTP hatası oluştu (403: Yasaklı).', httpError: 'Dosya gönderilirken HTTP hatası oluştu (hata durumu: %1).', noUrlError: 'Gönderilecek URL belirtilmedi.', responseError: 'Sunucu cevap veremedi.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ja.js0000644000201500020150000000156714515446705024137 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ja', { loadError: 'ファイルの読み込み中にエラーが発生しました。', networkError: 'ファイルのアップロード中にネットワークエラーが発生しました。', httpError404: 'ファイルのアップロード中にHTTPエラーが発生しました。(404: File not found)', httpError403: 'ファイルのアップロード中にHTTPエラーが発生しました。(403: Forbidden)', httpError: 'ファイルのアップロード中にHTTPエラーが発生しました。(error status: %1)', noUrlError: 'アップロードURLが定義されていません。', responseError: 'サーバーの応答が不正です。' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/lv.js0000644000201500020150000000125314515446705024156 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'lv', { loadError: 'Radās kļūda nolasot failu.', networkError: 'Radās tīkla kļūda, kamēr tika ielādēts fails.', httpError404: 'Ielādējot failu, radās HTTP kļūda (404: Fails nav atrasts)', httpError403: 'Ielādējot failu, radās HTTP kļūda (403: Pieeja liegta)', httpError: 'Ielādējot failu, radās HTTP kļūda (kļūdas statuss: %1)', noUrlError: 'Augšupielādes adrese nav norādīta.', responseError: 'Nekorekta servera atbilde.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/en-au.js0000644000201500020150000000122314515446705024537 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'en-au', { loadError: 'Error occurred during file read.', networkError: 'Network error occurred during file upload.', httpError404: 'HTTP error occurred during file upload (404: File not found).', httpError403: 'HTTP error occurred during file upload (403: Forbidden).', httpError: 'HTTP error occurred during file upload (error status: %1).', noUrlError: 'Upload URL is not defined.', responseError: 'Incorrect server response.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/en.js0000644000201500020150000000122014515446705024131 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'en', { loadError: 'Error occurred during file read.', networkError: 'Network error occurred during file upload.', httpError404: 'HTTP error occurred during file upload (404: File not found).', httpError403: 'HTTP error occurred during file upload (403: Forbidden).', httpError: 'HTTP error occurred during file upload (error status: %1).', noUrlError: 'Upload URL is not defined.', responseError: 'Incorrect server response.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/no.js0000644000201500020150000000130614515446705024150 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'no', { loadError: 'Det oppstod en feil under lesing av filen.', networkError: 'Det oppstod en nettverksfeil under opplasting av filen.', httpError404: 'En HTTP-feil oppstod under opplasting av filen (404: Filen finnes ikke).', httpError403: 'En HTTP-feil oppstod under opplasting av filen (403: Ingen tilgang).', httpError: 'En HTTP-feil oppstod under opplasting av filen (feilkode: %1).', noUrlError: 'Opplastings-URL er ikke definert.', responseError: 'Feil svar fra serveren.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/fr.js0000644000201500020150000000146614515446705024152 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'fr', { loadError: 'Une erreur est survenue lors de la lecture du fichier.', networkError: 'Une erreur réseau est survenue lors du téléversement du fichier.', httpError404: 'Une erreur HTTP est survenue durant le téléversement du fichier (404 : fichier non trouvé).', httpError403: 'Une erreur HTTP est survenue durant le téléversement du fichier (403 : accès refusé).', httpError: 'Une erreur HTTP est survenue durant le téléversement du fichier (erreur : %1).', noUrlError: 'L\'URL de téléversement n\'est pas spécifiée.', responseError: 'Réponse du serveur incorrecte.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/id.js0000644000201500020150000000125614515446705024134 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'id', { loadError: 'Error terjadi ketika berkas dibaca', networkError: 'Jaringan error terjadi ketika mengunggah berkas', httpError404: 'HTTP error terjadi ketika mengunggah berkas (404: Berkas tidak ditemukan)', httpError403: 'HTTP error terjadi ketika mengunggah berkas (403: Gangguan)', httpError: 'HTTP error terjadi ketika mengunggah berkas (status error: %1)', noUrlError: 'Unggahan URL tidak terdefinisi', responseError: 'Respon server tidak sesuai' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/ug.js0000644000201500020150000000161414515446705024151 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'ug', { loadError: 'ھۆججەت ئوقۇشتا خاتالىق كۆرۈلدى', networkError: 'ھۆججەت يۈكلەشتە تور خاتالىقى كۆرۈلدى.', httpError404: 'ھۆججەت يۈكلىگەندە HTTP خاتالىقى كۆرۈلدى (404: ھۆججەت تېپىلمىدى).', httpError403: 'ھۆججەت يۈكلىگەندە HTTP خاتالىقى كۆرۈلدى (403: چەكلەنگەن).', httpError: 'ھۆججەت يۈكلىگەندە HTTP خاتالىقى كۆرۈلدى (404: خاتالىق نىسپىتى: 1%).', noUrlError: 'چىقىردىغان ئۇلانما تەڭشەلمىگەن .', responseError: 'مۇلازىمىتىردا ئىنكاس يوق .' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/sr.js0000644000201500020150000000201014515446705024151 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'sr', { loadError: 'Дошло је до грешке при читању датотеке.', networkError: 'Током постављања датотеке дошло је до мрежне грешке.', httpError404: 'Током постављања датотеке дошло је до ХТТП грешке (404: Датотека није пронађена).', httpError403: 'Током постављања датотеке дошло је до ХТТП грешке (403: Забрањена).', httpError: 'Током постављања датотеке дошло је до ХТТП грешке (статус грешке: %1).', noUrlError: 'УРЛ адреса за постављање није наведена.', responseError: 'Неисправан одговор сервера.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/eu.js0000644000201500020150000000131214515446705024142 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'eu', { loadError: 'Errorea gertatu da fitxategia irakurtzean.', networkError: 'Sareko errorea gertatu da fitxategia kargatzean.', httpError404: 'HTTP errorea gertatu da fitxategia kargatzean (404: Fitxategia ez da aurkitu).', httpError403: 'HTTP errorea gertatu da fitxategia kargatzean (403: Debekatuta).', httpError: 'HTTP errorea gertatu da fitxategia kargatzean (errore-egoera: %1).', noUrlError: 'Kargatzeko URLa definitu gabe.', responseError: 'Zerbitzariaren erantzun okerra.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/filetools/lang/hu.js0000644000201500020150000000131314515446705024146 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'filetools', 'hu', { loadError: 'Hiba történt a fájl olvasása közben.', networkError: 'Hálózati hiba történt a fájl feltöltése közben.', httpError404: 'HTTP hiba történt a fájl feltöltése alatt (404: A fájl nem található).', httpError403: 'HTTP hiba történt a fájl feltöltése alatt (403: Tiltott).', httpError: 'HTTP hiba történt a fájl feltöltése alatt (hiba státusz: %1).', noUrlError: 'Feltöltési URL nincs megadva.', responseError: 'Helytelen szerver válasz.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadimage/0000755000201500020150000000000014515446713022543 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadimage/plugin.js0000644000201500020150000001160014515446713024375 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ 'use strict'; ( function() { var uniqueNameCounter = 0, // Black rectangle which is shown before the image is loaded. loadingImage = 'data:image/gif;base64,R0lGODlhDgAOAIAAAAAAAP///yH5BAAAAAAALAAAAAAOAA4AAAIMhI+py+0Po5y02qsKADs='; // Returns number as a string. If a number has 1 digit only it returns it prefixed with an extra 0. function padNumber( input ) { if ( input <= 9 ) { input = '0' + input; } return String( input ); } // Returns a unique image file name. function getUniqueImageFileName( type ) { var date = new Date(), dateParts = [ date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds() ]; uniqueNameCounter += 1; return 'image-' + CKEDITOR.tools.array.map( dateParts, padNumber ).join( '' ) + '-' + uniqueNameCounter + '.' + type; } CKEDITOR.plugins.add( 'uploadimage', { requires: 'uploadwidget', onLoad: function() { CKEDITOR.addCss( '.cke_upload_uploading img{' + 'opacity: 0.3' + '}' ); }, isSupportedEnvironment: function() { return CKEDITOR.plugins.clipboard.isFileApiSupported; }, init: function( editor ) { // Do not execute this paste listener if it will not be possible to upload file. if ( !this.isSupportedEnvironment() ) { return; } var fileTools = CKEDITOR.fileTools, uploadUrl = fileTools.getUploadUrl( editor.config, 'image' ); if ( !uploadUrl ) { return; } // (#5333) if ( editor.config.clipboard_handleImages ) { editor.config.clipboard_handleImages = false; CKEDITOR.warn( 'clipboard-image-handling-disabled', { editor: editor.name, plugin: 'uploadimage' } ); } // Handle images which are available in the dataTransfer. fileTools.addUploadWidget( editor, 'uploadimage', { supportedTypes: /image\/(jpeg|png|gif|bmp)/, uploadUrl: uploadUrl, fileToElement: function() { var img = new CKEDITOR.dom.element( 'img' ); img.setAttribute( 'src', loadingImage ); return img; }, parts: { img: 'img' }, onUploading: function( upload ) { // Show the image during the upload. this.parts.img.setAttribute( 'src', upload.data ); }, onUploaded: function( upload ) { // Width and height could be returned by server (https://dev.ckeditor.com/ticket/13519). var $img = this.parts.img.$, width = upload.responseData.width || $img.naturalWidth, height = upload.responseData.height || $img.naturalHeight; // Set width and height to prevent blinking. this.replaceWith( '' ); } } ); // Handle images which are not available in the dataTransfer. // This means that we need to read them from the elements. editor.on( 'paste', function( evt ) { // For performance reason do not parse data if it does not contain img tag and data attribute. if ( !evt.data.dataValue.match( / this fires another 'paste' event, so cancel it // * fire 'paste' on editor // * !canceled && fire 'afterPaste' on editor // // // PASTE EVENT - PREPROCESSING: // -- Possible dataValue types: auto, text, html. // -- Possible dataValue contents: // * text (possible \n\r) // * htmlified text (text + br,div,p - no presentational markup & attrs - depends on browser) // * html // -- Possible flags: // * htmlified - if true then content is a HTML even if no markup inside. This flag is set // for content from editable pastebins, because they 'htmlify' pasted content. // // -- Type: auto: // * content: htmlified text -> filter, unify text markup (brs, ps, divs), set type: text // * content: html -> filter, set type: html // -- Type: text: // * content: htmlified text -> filter, unify text markup // * content: html -> filter, strip presentational markup, unify text markup // -- Type: html: // * content: htmlified text -> filter, unify text markup // * content: html -> filter // // -- Phases: // * if dataValue is empty copy data from dataTransfer to dataValue (priority 1) // * filtering (priorities 3-5) - e.g. pastefromword filters // * content type sniffing (priority 6) // * markup transformations for text (priority 6) // // DRAG & DROP EXECUTION FLOWS: // -- Drag // * save to the global object: // * drag timestamp (with 'cke-' prefix), // * selected html, // * drag range, // * editor instance. // * put drag timestamp into event.dataTransfer.text // -- Drop // * if events text == saved timestamp && editor == saved editor // internal drag & drop occurred // * getRangeAtDropPosition // * create bookmarks for drag and drop ranges starting from the end of the document // * dragRange.deleteContents() // * fire 'paste' with saved html and drop range // * if events text == saved timestamp && editor != saved editor // cross editor drag & drop occurred // * getRangeAtDropPosition // * fire 'paste' with saved html // * dragRange.deleteContents() // * FF: refreshCursor on afterPaste // * if events text != saved timestamp // drop form external source occurred // * getRangeAtDropPosition // * if event contains html data then fire 'paste' with html // * else if event contains text data then fire 'paste' with encoded text // * FF: refreshCursor on afterPaste 'use strict'; ( function() { var clipboardIdDataType; // Register the plugin. CKEDITOR.plugins.add( 'clipboard', { requires: 'dialog,notification,toolbar', // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'copy,copy-rtl,cut,cut-rtl,paste,paste-rtl', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% // File matchers registered by CKEDITOR.plugins.clipboard#addFileMatcher method. _supportedFileMatchers: [], init: function( editor ) { var filterType, filtersFactory = filtersFactoryFactory( editor ); if ( editor.config.forcePasteAsPlainText ) { filterType = 'plain-text'; } else if ( editor.config.pasteFilter ) { filterType = editor.config.pasteFilter; } // On Webkit the pasteFilter defaults 'semantic-content' because pasted data is so terrible // that it must be always filtered. else if ( CKEDITOR.env.webkit && !( 'pasteFilter' in editor.config ) ) { filterType = 'semantic-content'; } editor.pasteFilter = filtersFactory.get( filterType ); initPasteClipboard( editor ); initDragDrop( editor ); CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) ); // Handle file paste for modern browsers except IE<10, as it does not support // custom MIME types in clipboard (#4612). var isFilePasteSupported = CKEDITOR.plugins.clipboard.isCustomDataTypesSupported || CKEDITOR.plugins.clipboard.isFileApiSupported, latestId; // Display notification for unsupported file types (#5095). CKEDITOR.plugins.clipboard.addFileMatcher( editor, testImageBase64Support ); editor.on( 'paste', function( evt ) { if ( !isFilePasteSupported ) { return; } var dataObj = evt.data, data = dataObj.dataValue, dataTransfer = dataObj.dataTransfer; // Only handle files if there is no data value provided that should take precedence over files. if ( data ) { return; } var unsupportedFileTypes = []; for ( var i = 0; i < dataTransfer.getFilesCount(); i++ ) { var file = dataTransfer.getFile( i ); if ( !isFileTypeSupported( file ) ) { unsupportedFileTypes.push( file.type ); } } displayUnsupportedFileTypesNotification( unsupportedFileTypes ); }, null, null, 1 ); // Convert image file (if present) to base64 string. // Do it as the first step as the conversion is asynchronous and should hold all further paste processing. editor.on( 'paste', function( evt ) { if ( !isFilePasteSupported || !editor.config.clipboard_handleImages ) { return; } var dataObj = evt.data, data = dataObj.dataValue, dataTransfer = dataObj.dataTransfer; // If data empty check for image content inside data transfer. https://dev.ckeditor.com/ticket/16705 // Allow both dragging and dropping and pasting images as base64 (#4681). if ( data || !isFileData( evt, dataTransfer ) ) { return; } var file = dataTransfer.getFile( 0 ); if ( !testImageBase64Support( file ) ) { return; } var fileReader = new FileReader(); // Convert image file to img tag with base64 image. fileReader.addEventListener( 'load', function() { evt.data.dataValue = ''; editor.fire( 'paste', evt.data ); }, false ); // Proceed with normal flow if reading file was aborted. fileReader.addEventListener( 'abort', function() { // (#4681) setCustomIEEventAttribute( evt ); editor.fire( 'paste', evt.data ); }, false ); // Proceed with normal flow if reading file failed. fileReader.addEventListener( 'error', function() { // (#4681) setCustomIEEventAttribute( evt ); editor.fire( 'paste', evt.data ); }, false ); fileReader.readAsDataURL( file ); latestId = dataObj.dataTransfer.id; evt.stop(); }, null, null, 1 ); function testImageBase64Support( file ) { var supportedImageTypes = [ 'image/png', 'image/jpeg', 'image/gif' ]; return CKEDITOR.tools.indexOf( supportedImageTypes, file.type ) !== -1; } function isFileTypeSupported( file ) { var clipboardMatchers = editor.plugins.clipboard._supportedFileMatchers; return CKEDITOR.tools.array.some( clipboardMatchers, function( matcher ) { return matcher( file ); } ); } function displayUnsupportedFileTypesNotification( fileTypes ) { if ( !fileTypes.length ) { return; } fileTypes = CKEDITOR.tools.array.unique( fileTypes ); // Make sure to remove unknown file types. fileTypes = CKEDITOR.tools.array.filter( fileTypes, function( fileType ) { return !!CKEDITOR.tools.trim( fileType ); } ); var unsupportedTypeMsg = createNotificationMessage( fileTypes.join( ', ' ) ); editor.showNotification( unsupportedTypeMsg, 'info', editor.config.clipboard_notificationDuration ); } // Prepare content for unsupported file extension notification (#4750). function createNotificationMessage( fileType ) { if ( !fileType ) { return editor.lang.clipboard.fileWithoutFormatNotSupportedNotification; } return editor.lang.clipboard.fileFormatNotSupportedNotification. replace( /\${formats\}/g, '' + fileType + '' ); } // Only dataTransfer objects containing only file should be considered // to image pasting (#3585, #3625). function isFileData( evt, dataTransfer ) { // Checking for fileTransferCancel on IE to prevent comparing empty string // from dataTransfer.id and falling into infinite loop (#4681). if ( CKEDITOR.env.ie && evt.data.fileTransferCancel ) { return false; } if ( !CKEDITOR.env.ie && ( !dataTransfer || latestId === dataTransfer.id ) ) { return false; } return dataTransfer.isFileTransfer() && dataTransfer.getFilesCount() === 1; } // To avoid falling into an infinite loop on IE10+ when the image loading state is other than `load` // add a custom data attribute. function setCustomIEEventAttribute( evt ) { if ( CKEDITOR.env.ie ) { evt.data.fileTransferCancel = true; } } editor.on( 'paste', function( evt ) { // Init `dataTransfer` if `paste` event was fired without it, so it will be always available. if ( !evt.data.dataTransfer ) { evt.data.dataTransfer = new CKEDITOR.plugins.clipboard.dataTransfer(); } // If dataValue is already set (manually or by paste bin), so do not override it. if ( evt.data.dataValue ) { return; } var dataTransfer = evt.data.dataTransfer, // IE support only text data and throws exception if we try to get html data. // This html data object may also be empty if we drag content of the textarea. value = dataTransfer.getData( 'text/html' ); if ( value ) { evt.data.dataValue = value; evt.data.type = 'html'; } else { // Try to get text data otherwise. value = dataTransfer.getData( 'text/plain' ); if ( value ) { evt.data.dataValue = editor.editable().transformPlainTextToHtml( value ); evt.data.type = 'text'; } } }, null, null, 1 ); editor.on( 'paste', function( evt ) { var data = evt.data.dataValue, blockElements = CKEDITOR.dtd.$block; // Filter webkit garbage. if ( data.indexOf( 'Apple-' ) > -1 ) { // Replace special webkit's   with simple space, because webkit // produces them even for normal spaces. data = data.replace( / <\/span>/gi, ' ' ); // Strip around white-spaces when not in forced 'html' content type. // This spans are created only when pasting plain text into Webkit, // but for safety reasons remove them always. if ( evt.data.type != 'html' ) { data = data.replace( /]*>([^<]*)<\/span>/gi, function( all, spaces ) { // Replace tabs with 4 spaces like Fx does. return spaces.replace( /\t/g, '    ' ); } ); } // This br is produced only when copying & pasting HTML content. if ( data.indexOf( '
    ' ) > -1 ) { evt.data.startsWithEOL = 1; evt.data.preSniffing = 'html'; // Mark as not text. data = data.replace( /
    /, '' ); } // Remove all other classes. data = data.replace( /(<[^>]+) class="Apple-[^"]*"/gi, '$1' ); } // Strip editable that was copied from inside. (https://dev.ckeditor.com/ticket/9534) if ( data.match( /^<[^<]+cke_(editable|contents)/i ) ) { var tmp, editable_wrapper, wrapper = new CKEDITOR.dom.element( 'div' ); wrapper.setHtml( data ); // Verify for sure and check for nested editor UI parts. (https://dev.ckeditor.com/ticket/9675) while ( wrapper.getChildCount() == 1 && ( tmp = wrapper.getFirst() ) && tmp.type == CKEDITOR.NODE_ELEMENT && // Make sure first-child is element. ( tmp.hasClass( 'cke_editable' ) || tmp.hasClass( 'cke_contents' ) ) ) { wrapper = editable_wrapper = tmp; } // If editable wrapper was found strip it and bogus
    (added on FF). if ( editable_wrapper ) data = editable_wrapper.getHtml().replace( /
    $/i, '' ); } if ( CKEDITOR.env.ie ) { //  

    ->

    (br.cke-pasted-remove will be removed later) data = data.replace( /^ (?: |\r\n)?<(\w+)/g, function( match, elementName ) { if ( elementName.toLowerCase() in blockElements ) { evt.data.preSniffing = 'html'; // Mark as not a text. return '<' + elementName; } return match; } ); } else if ( CKEDITOR.env.webkit ) { //


    ->


    // We don't mark br, because this situation can happen for htmlified text too. data = data.replace( /<\/(\w+)>

    <\/div>$/, function( match, elementName ) { if ( elementName in blockElements ) { evt.data.endsWithEOL = 1; return ''; } return match; } ); } else if ( CKEDITOR.env.gecko ) { // Firefox adds bogus
    when user pasted text followed by space(s). data = data.replace( /(\s)
    $/, '$1' ); } evt.data.dataValue = data; }, null, null, 3 ); editor.on( 'paste', function( evt ) { var dataObj = evt.data, type = editor._.nextPasteType || dataObj.type, data = dataObj.dataValue, trueType, // Default is 'html'. defaultType = editor.config.clipboard_defaultContentType || 'html', transferType = dataObj.dataTransfer.getTransferType( editor ), isExternalPaste = transferType == CKEDITOR.DATA_TRANSFER_EXTERNAL, isActiveForcePAPT = editor.config.forcePasteAsPlainText === true; // If forced type is 'html' we don't need to know true data type. if ( type == 'html' || dataObj.preSniffing == 'html' ) { trueType = 'html'; } else { trueType = recogniseContentType( data ); } delete editor._.nextPasteType; // Unify text markup. if ( trueType == 'htmlifiedtext' ) { data = htmlifiedTextHtmlification( editor.config, data ); } // Strip presentational markup & unify text markup. // Forced plain text (dialog or forcePAPT). // Note: we do not check dontFilter option in this case, because forcePAPT was implemented // before pasteFilter and pasteFilter is automatically used on Webkit&Blink since 4.5, so // forcePAPT should have priority as it had before 4.5. if ( type == 'text' && trueType == 'html' ) { data = filterContent( editor, data, filtersFactory.get( 'plain-text' ) ); } // External paste and pasteFilter exists and filtering isn't disabled. // Or force filtering even for internal and cross-editor paste, when forcePAPT is active (#620). else if ( isExternalPaste && editor.pasteFilter && !dataObj.dontFilter || isActiveForcePAPT ) { data = filterContent( editor, data, editor.pasteFilter ); } if ( dataObj.startsWithEOL ) { data = '
    ' + data; } if ( dataObj.endsWithEOL ) { data += '
    '; } if ( type == 'auto' ) { type = ( trueType == 'html' || defaultType == 'html' ) ? 'html' : 'text'; } dataObj.type = type; dataObj.dataValue = data; delete dataObj.preSniffing; delete dataObj.startsWithEOL; delete dataObj.endsWithEOL; }, null, null, 6 ); // Inserts processed data into the editor at the end of the // events chain. editor.on( 'paste', function( evt ) { var data = evt.data; if ( data.dataValue ) { editor.insertHtml( data.dataValue, data.type, data.range ); // Defer 'afterPaste' so all other listeners for 'paste' will be fired first. // Fire afterPaste only if paste inserted some HTML. setTimeout( function() { editor.fire( 'afterPaste' ); }, 0 ); } }, null, null, 1000 ); editor.on( 'pasteDialog', function( evt ) { // TODO it's possible that this setTimeout is not needed any more, // because of changes introduced in the same commit as this comment. // Editor.getClipboardData adds listener to the dialog's events which are // fired after a while (not like 'showDialog'). setTimeout( function() { // Open default paste dialog. editor.openDialog( 'paste', evt.data ); }, 0 ); } ); } } ); function firePasteEvents( editor, data, withBeforePaste ) { if ( !data.type ) { data.type = 'auto'; } if ( withBeforePaste ) { // Fire 'beforePaste' event so clipboard flavor get customized // by other plugins. if ( editor.fire( 'beforePaste', data ) === false ) return false; // Event canceled } // Do not fire paste if there is no data (dataValue and dataTranfser are empty). // This check should be done after firing 'beforePaste' because for native paste // 'beforePaste' is by default fired even for empty clipboard. if ( !data.dataValue && data.dataTransfer.isEmpty() ) { return false; } if ( !data.dataValue ) { data.dataValue = ''; } // Because of FF bug we need to use this hack, otherwise cursor is hidden // or it is not possible to move it (https://dev.ckeditor.com/ticket/12420). // Also, check that editor.toolbox exists, because the toolbar plugin might not be loaded (https://dev.ckeditor.com/ticket/13305). // And don't forget to put focus back into the editor (#4855)! if ( CKEDITOR.env.gecko && data.method == 'drop' && editor.toolbox ) { editor.once( 'afterPaste', function() { editor.toolbox.focus(); editor.focus(); } ); } return editor.fire( 'paste', data ); } function initPasteClipboard( editor ) { var clipboard = CKEDITOR.plugins.clipboard, preventBeforePasteEvent = 0, preventPasteEvent = 0; addListeners(); addButtonsCommands(); /** * Gets clipboard data by directly accessing the clipboard (IE only) or opening the paste dialog window. * * editor.getClipboardData( function( data ) { * if ( data ) * alert( data.type + ' ' + data.dataValue ); * } ); * * @member CKEDITOR.editor * @param {Function/Object} callbackOrOptions For function, see the `callback` parameter documentation. The object was used before 4.7.0 with the `title` property, to set the paste dialog's title. * @param {Function} callback A function that will be executed with the `data` property of the * {@link CKEDITOR.editor#event-paste paste event} or `null` if none of the capturing methods succeeded. * Since 4.7.0 the `callback` should be provided as a first argument, just like in the example above. This parameter will be removed in * an upcoming major release. */ editor.getClipboardData = function( callbackOrOptions, callback ) { var beforePasteNotCanceled = false, dataType = 'auto'; // Options are optional - args shift. if ( !callback ) { callback = callbackOrOptions; callbackOrOptions = null; } // Listen at the end of listeners chain to see if event wasn't canceled // and to retrieve modified data.type. editor.on( 'beforePaste', onBeforePaste, null, null, 1000 ); // Listen with maximum priority to handle content before everyone else. // This callback will handle paste event that will be fired if direct // access to the clipboard succeed in IE. editor.on( 'paste', onPaste, null, null, 0 ); // If command didn't succeed (only IE allows to access clipboard and only if // user agrees) invoke callback with null, meaning that paste is not blocked. if ( getClipboardDataDirectly() === false ) { // Direct access to the clipboard wasn't successful so remove listener. editor.removeListener( 'paste', onPaste ); // If beforePaste was canceled do not open dialog. // Add listeners only if dialog really opened. 'pasteDialog' can be canceled. if ( editor._.forcePasteDialog && beforePasteNotCanceled && editor.fire( 'pasteDialog' ) ) { editor.on( 'pasteDialogCommit', onDialogCommit ); // 'dialogHide' will be fired after 'pasteDialogCommit'. editor.on( 'dialogHide', function( evt ) { evt.removeListener(); evt.data.removeListener( 'pasteDialogCommit', onDialogCommit ); // Notify even if user canceled dialog (clicked 'cancel', ESC, etc). if ( !evt.data._.committed ) { callback( null ); } } ); } else { callback( null ); } } function onPaste( evt ) { evt.removeListener(); evt.cancel(); callback( evt.data ); } function onBeforePaste( evt ) { evt.removeListener(); beforePasteNotCanceled = true; dataType = evt.data.type; } function onDialogCommit( evt ) { evt.removeListener(); // Cancel pasteDialogCommit so paste dialog won't automatically fire // 'paste' evt by itself. evt.cancel(); callback( { type: dataType, dataValue: evt.data.dataValue, dataTransfer: evt.data.dataTransfer, method: 'paste' } ); } }; function addButtonsCommands() { addButtonCommand( 'Cut', 'cut', createCutCopyCmd( 'cut' ), 10, 1 ); addButtonCommand( 'Copy', 'copy', createCutCopyCmd( 'copy' ), 20, 4 ); addButtonCommand( 'Paste', 'paste', createPasteCmd(), 30, 8 ); // Force adding touchend handler to paste button (#595). if ( !editor._.pasteButtons ) { editor._.pasteButtons = []; } editor._.pasteButtons.push( 'Paste' ); function addButtonCommand( buttonName, commandName, command, toolbarOrder, ctxMenuOrder ) { var lang = editor.lang.clipboard[ commandName ]; editor.addCommand( commandName, command ); editor.ui.addButton && editor.ui.addButton( buttonName, { label: lang, command: commandName, toolbar: 'clipboard,' + toolbarOrder } ); // If the "menu" plugin is loaded, register the menu item. if ( editor.addMenuItems ) { editor.addMenuItem( commandName, { label: lang, command: commandName, group: 'clipboard', order: ctxMenuOrder } ); } } } function addListeners() { editor.on( 'key', onKey ); editor.on( 'contentDom', addPasteListenersToEditable ); // For improved performance, we're checking the readOnly state on selectionChange instead of hooking a key event for that. editor.on( 'selectionChange', setToolbarStates ); // If the "contextmenu" plugin is loaded, register the listeners. if ( editor.contextMenu ) { editor.contextMenu.addListener( function() { return { cut: stateFromNamedCommand( 'cut' ), copy: stateFromNamedCommand( 'copy' ), paste: stateFromNamedCommand( 'paste' ) }; } ); // Adds 'touchend' integration with context menu paste item (#1347). var pasteListener = null; editor.on( 'menuShow', function() { // Remove previous listener. if ( pasteListener ) { pasteListener.removeListener(); pasteListener = null; } // Attach new 'touchend' listeners to context menu paste items. var item = editor.contextMenu.findItemByCommandName( 'paste' ); if ( item && item.element ) { pasteListener = item.element.on( 'touchend', function() { editor._.forcePasteDialog = true; } ); } } ); } // Detect if any of paste buttons was touched. In such case we assume that user is using // touch device and force displaying paste dialog (#595). if ( editor.ui.addButton ) { // Waiting for editor instance to be ready seems to be the most reliable way to // be sure that paste buttons are already created. editor.once( 'instanceReady', function() { if ( !editor._.pasteButtons ) { return; } CKEDITOR.tools.array.forEach( editor._.pasteButtons, function( name ) { var pasteButton = editor.ui.get( name ); // Check if button was not removed by `removeButtons` config. if ( pasteButton ) { var buttonElement = CKEDITOR.document.getById( pasteButton._.id ); if ( buttonElement ) { buttonElement.on( 'touchend', function() { editor._.forcePasteDialog = true; } ); } } } ); } ); } } // Add events listeners to editable. function addPasteListenersToEditable() { var editable = editor.editable(); if ( CKEDITOR.plugins.clipboard.isCustomCopyCutSupported ) { var initOnCopyCut = function( evt ) { // There shouldn't be anything to copy/cut when selection is collapsed (#869). if ( editor.getSelection().isCollapsed() ) { return; } // If user tries to cut in read-only editor, we must prevent default action (https://dev.ckeditor.com/ticket/13872). if ( !editor.readOnly || evt.name != 'cut' ) { clipboard.initPasteDataTransfer( evt, editor ); } evt.data.preventDefault(); }; editable.on( 'copy', initOnCopyCut ); editable.on( 'cut', initOnCopyCut ); // Delete content with the low priority so one can overwrite cut data. editable.on( 'cut', function() { // If user tries to cut in read-only editor, we must prevent default action. (https://dev.ckeditor.com/ticket/13872) if ( !editor.readOnly ) { editor.extractSelectedHtml(); } }, null, null, 999 ); } // We'll be catching all pasted content in one line, regardless of whether // it's introduced by a document command execution (e.g. toolbar buttons) or // user paste behaviors (e.g. CTRL+V). editable.on( clipboard.mainPasteEvent, function( evt ) { if ( clipboard.mainPasteEvent == 'beforepaste' && preventBeforePasteEvent ) { return; } // If you've just asked yourself why preventPasteEventNow() is not here, but // in listener for CTRL+V and exec method of 'paste' command // you've asked the same question we did. // // THE ANSWER: // // First thing to notice - this answer makes sense only for IE, // because other browsers don't listen for 'paste' event. // // What would happen if we move preventPasteEventNow() here? // For: // * CTRL+V - IE fires 'beforepaste', so we prevent 'paste' and pasteDataFromClipboard(). OK. // * editor.execCommand( 'paste' ) - we fire 'beforepaste', so we prevent // 'paste' and pasteDataFromClipboard() and doc.execCommand( 'Paste' ). OK. // * native context menu - IE fires 'beforepaste', so we prevent 'paste', but unfortunately // on IE we fail with pasteDataFromClipboard() here, because of... we don't know why, but // we just fail, so... we paste nothing. FAIL. // * native menu bar - the same as for native context menu. // // But don't you know any way to distinguish first two cases from last two? // Only one - special flag set in CTRL+V handler and exec method of 'paste' // command. And that's what we did using preventPasteEventNow(). pasteDataFromClipboard( evt ); } ); // It's not possible to clearly handle all four paste methods (ctrl+v, native menu bar // native context menu, editor's command) in one 'paste/beforepaste' event in IE. // // For ctrl+v & editor's command it's easy to handle pasting in 'beforepaste' listener, // so we do this. For another two methods it's better to use 'paste' event. // // 'paste' is always being fired after 'beforepaste' (except of weird one on opening native // context menu), so for two methods handled in 'beforepaste' we're canceling 'paste' // using preventPasteEvent state. // // 'paste' event in IE is being fired before getClipboardDataByPastebin executes its callback. // // QUESTION: Why didn't you handle all 4 paste methods in handler for 'paste'? // Wouldn't this just be simpler? // ANSWER: Then we would have to evt.data.preventDefault() only for native // context menu and menu bar pastes. The same with execIECommand(). // That would force us to mark CTRL+V and editor's paste command with // special flag, other than preventPasteEvent. But we still would have to // have preventPasteEvent for the second event fired by execIECommand. // Code would be longer and not cleaner. if ( clipboard.mainPasteEvent == 'beforepaste' ) { editable.on( 'paste', function( evt ) { if ( preventPasteEvent ) { return; } // Cancel next 'paste' event fired by execIECommand( 'paste' ) // at the end of this callback. preventPasteEventNow(); // Prevent native paste. evt.data.preventDefault(); pasteDataFromClipboard( evt ); // Force IE to paste content into pastebin so pasteDataFromClipboard will work. execIECommand( 'paste' ); } ); // If mainPasteEvent is 'beforePaste' (IE before Edge), // dismiss the (wrong) 'beforepaste' event fired on context/toolbar menu open. (https://dev.ckeditor.com/ticket/7953) editable.on( 'contextmenu', preventBeforePasteEventNow, null, null, 0 ); editable.on( 'beforepaste', function( evt ) { // Do not prevent event on CTRL+V and SHIFT+INS because it blocks paste (https://dev.ckeditor.com/ticket/11970). if ( evt.data && !evt.data.$.ctrlKey && !evt.data.$.shiftKey ) preventBeforePasteEventNow(); }, null, null, 0 ); } editable.on( 'beforecut', function() { !preventBeforePasteEvent && fixCut( editor ); } ); var mouseupTimeout; // Use editor.document instead of editable in non-IEs for observing mouseup // since editable won't fire the event if selection process started within // iframe and ended out of the editor (https://dev.ckeditor.com/ticket/9851). editable.attachListener( CKEDITOR.env.ie ? editable : editor.document.getDocumentElement(), 'mouseup', function() { mouseupTimeout = setTimeout( setToolbarStates, 0 ); } ); // Make sure that deferred mouseup callback isn't executed after editor instance // had been destroyed. This may happen when editor.destroy() is called in parallel // with mouseup event (i.e. a button with onclick callback) (https://dev.ckeditor.com/ticket/10219). editor.on( 'destroy', function() { clearTimeout( mouseupTimeout ); } ); editable.on( 'keyup', setToolbarStates ); } // Create object representing Cut or Copy commands. function createCutCopyCmd( type ) { return { type: type, canUndo: type == 'cut', // We can't undo copy to clipboard. startDisabled: true, fakeKeystroke: type == 'cut' ? CKEDITOR.CTRL + 88 /*X*/ : CKEDITOR.CTRL + 67 /*C*/, exec: function() { // Attempts to execute the Cut and Copy operations. function tryToCutCopy( type ) { if ( CKEDITOR.env.ie ) return execIECommand( type ); // non-IEs part try { // Other browsers throw an error if the command is disabled. return editor.document.$.execCommand( type, false, null ); } catch ( e ) { return false; } } this.type == 'cut' && fixCut(); var success = tryToCutCopy( this.type ); if ( !success ) { // Show cutError or copyError. editor.showNotification( editor.lang.clipboard[ this.type + 'Error' ] ); // jshint ignore:line } return success; } }; } function createPasteCmd() { return { // Snapshots are done manually by editable.insertXXX methods. canUndo: false, async: true, fakeKeystroke: CKEDITOR.CTRL + 86 /*V*/, /** * The default implementation of the paste command. * * @private * @param {CKEDITOR.editor} editor An instance of the editor where the command is being executed. * @param {Object/String} data If `data` is a string, then it is considered content that is being pasted. * Otherwise it is treated as an object with options. * @param {Boolean/String} [data.notification=true] Content for a notification shown after an unsuccessful * paste attempt. If `false`, the notification will not be displayed. This parameter was added in 4.7.0. * @param {String} [data.type='html'] The type of pasted content. There are two allowed values: * * 'html' * * 'text' * @param {String/Object} data.dataValue Content being pasted. If this parameter is an object, it * is supposed to be a `data` property of the {@link CKEDITOR.editor#paste} event. * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer Data transfer instance connected * with the current paste action. * @member CKEDITOR.editor.commands.paste */ exec: function( editor, data ) { data = typeof data !== 'undefined' && data !== null ? data : {}; var cmd = this, notification = typeof data.notification !== 'undefined' ? data.notification : true, forcedType = data.type, keystroke = CKEDITOR.tools.keystrokeToString( editor.lang.common.keyboard, editor.getCommandKeystroke( this ) ), msg = typeof notification === 'string' ? notification : editor.lang.clipboard.pasteNotification .replace( /%1/, '' + keystroke.display + '' ), pastedContent = typeof data === 'string' ? data : data.dataValue; function callback( data, withBeforePaste ) { withBeforePaste = typeof withBeforePaste !== 'undefined' ? withBeforePaste : true; if ( data ) { data.method = 'paste'; if ( !data.dataTransfer ) { data.dataTransfer = clipboard.initPasteDataTransfer(); } firePasteEvents( editor, data, withBeforePaste ); } else if ( notification && !editor._.forcePasteDialog ) { editor.showNotification( msg, 'info', editor.config.clipboard_notificationDuration ); } // Reset dialog mode (#595). editor._.forcePasteDialog = false; editor.fire( 'afterCommandExec', { name: 'paste', command: cmd, returnValue: !!data } ); } // Force type for the next paste. Do not force if `config.forcePasteAsPlainText` set to true or 'allow-word' (#1013). if ( forcedType && editor.config.forcePasteAsPlainText !== true && editor.config.forcePasteAsPlainText !== 'allow-word' ) { editor._.nextPasteType = forcedType; } else { delete editor._.nextPasteType; } if ( typeof pastedContent === 'string' ) { callback( { dataValue: pastedContent } ); } else { editor.getClipboardData( callback ); } } }; } function preventPasteEventNow() { preventPasteEvent = 1; // For safety reason we should wait longer than 0/1ms. // We don't know how long execution of quite complex getClipboardData will take // and in for example 'paste' listener execCommand() (which fires 'paste') is called // after getClipboardData finishes. // Luckily, it's impossible to immediately fire another 'paste' event we want to handle, // because we only handle there native context menu and menu bar. setTimeout( function() { preventPasteEvent = 0; }, 100 ); } function preventBeforePasteEventNow() { preventBeforePasteEvent = 1; setTimeout( function() { preventBeforePasteEvent = 0; }, 10 ); } // Tries to execute any of the paste, cut or copy commands in IE. Returns a // boolean indicating that the operation succeeded. // @param {String} command *LOWER CASED* name of command ('paste', 'cut', 'copy'). function execIECommand( command ) { var doc = editor.document, body = doc.getBody(), enabled = false, onExec = function() { enabled = true; }; // The following seems to be the only reliable way to detect that // clipboard commands are enabled in IE. It will fire the // onpaste/oncut/oncopy events only if the security settings allowed // the command to execute. body.on( command, onExec ); // IE7: document.execCommand has problem to paste into positioned element. if ( CKEDITOR.env.version > 7 ) { doc.$.execCommand( command ); } else { doc.$.selection.createRange().execCommand( command ); } body.removeListener( command, onExec ); return enabled; } // Cutting off control type element in IE standards breaks the selection entirely. (https://dev.ckeditor.com/ticket/4881) function fixCut() { if ( !CKEDITOR.env.ie || CKEDITOR.env.quirks ) return; var sel = editor.getSelection(), control, range, dummy; if ( ( sel.getType() == CKEDITOR.SELECTION_ELEMENT ) && ( control = sel.getSelectedElement() ) ) { range = sel.getRanges()[ 0 ]; dummy = editor.document.createText( '' ); dummy.insertBefore( control ); range.setStartBefore( dummy ); range.setEndAfter( control ); sel.selectRanges( [ range ] ); // Clear up the fix if the paste wasn't succeeded. setTimeout( function() { // Element still online? if ( control.getParent() ) { dummy.remove(); sel.selectElement( control ); } }, 0 ); } } // Allow to peek clipboard content by redirecting the // pasting content into a temporary bin and grab the content of it. function getClipboardDataByPastebin( evt, callback ) { var doc = editor.document, editable = editor.editable(), cancel = function( evt ) { evt.cancel(); }, blurListener; // Avoid recursions on 'paste' event or consequent paste too fast. (https://dev.ckeditor.com/ticket/5730) if ( doc.getById( 'cke_pastebin' ) ) return; var sel = editor.getSelection(); var bms = sel.createBookmarks(); // https://dev.ckeditor.com/ticket/11384. On IE9+ we use native selectionchange (i.e. editor#selectionCheck) to cache the most // recent selection which we then lock on editable blur. See selection.js for more info. // selectionchange fired before getClipboardDataByPastebin() cached selection // before creating bookmark (cached selection will be invalid, because bookmarks modified the DOM), // so we need to fire selectionchange one more time, to store current seleciton. // Selection will be locked when we focus pastebin. if ( CKEDITOR.env.ie ) sel.root.fire( 'selectionchange' ); // Create container to paste into. // For rich content we prefer to use "body" since it holds // the least possibility to be splitted by pasted content, while this may // breaks the text selection on a frame-less editable, "div" would be // the best one in that case. // In another case on old IEs moving the selection into a "body" paste bin causes error panic. // Body can't be also used for Opera which fills it with
    // what is indistinguishable from pasted
    (copying
    in Opera isn't possible, // but it can be copied from other browser). var pastebin = new CKEDITOR.dom.element( ( CKEDITOR.env.webkit || editable.is( 'body' ) ) && !CKEDITOR.env.ie ? 'body' : 'div', doc ); pastebin.setAttributes( { id: 'cke_pastebin', 'data-cke-temp': '1' } ); var containerOffset = 0, offsetParent, win = doc.getWindow(); if ( CKEDITOR.env.webkit ) { // It's better to paste close to the real paste destination, so inherited styles // (which Webkits will try to compensate by styling span) differs less from the destination's one. editable.append( pastebin ); // Style pastebin like .cke_editable, to minimize differences between origin and destination. (https://dev.ckeditor.com/ticket/9754) pastebin.addClass( 'cke_editable' ); // Compensate position of offsetParent. if ( !editable.is( 'body' ) ) { // We're not able to get offsetParent from pastebin (body element), so check whether // its parent (editable) is positioned. if ( editable.getComputedStyle( 'position' ) != 'static' ) offsetParent = editable; // And if not - safely get offsetParent from editable. else offsetParent = CKEDITOR.dom.element.get( editable.$.offsetParent ); containerOffset = offsetParent.getDocumentPosition().y; } } else { // Opera and IE doesn't allow to append to html element. editable.getAscendant( CKEDITOR.env.ie ? 'body' : 'html', 1 ).append( pastebin ); } pastebin.setStyles( { position: 'absolute', // Position the bin at the top (+10 for safety) of viewport to avoid any subsequent document scroll. top: ( win.getScrollPosition().y - containerOffset + 10 ) + 'px', width: '1px', // Caret has to fit in that height, otherwise browsers like Chrome & Opera will scroll window to show it. // Set height equal to viewport's height - 20px (safety gaps), minimum 1px. height: Math.max( 1, win.getViewPaneSize().height - 20 ) + 'px', overflow: 'hidden', // Reset styles that can mess up pastebin position. margin: 0, padding: 0 } ); // Paste fails in Safari when the body tag has 'user-select: none'. (https://dev.ckeditor.com/ticket/12506) if ( CKEDITOR.env.safari ) pastebin.setStyles( CKEDITOR.tools.cssVendorPrefix( 'user-select', 'text' ) ); // Check if the paste bin now establishes new editing host. var isEditingHost = pastebin.getParent().isReadOnly(); if ( isEditingHost ) { // Hide the paste bin. pastebin.setOpacity( 0 ); // And make it editable. pastebin.setAttribute( 'contenteditable', true ); } // Transparency is not enough since positioned non-editing host always shows // resize handler, pull it off the screen instead. else { pastebin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-10000px' ); } editor.on( 'selectionChange', cancel, null, null, 0 ); // Webkit fill fire blur on editable when moving selection to // pastebin (if body is used). Cancel it because it causes incorrect // selection lock in case of inline editor (https://dev.ckeditor.com/ticket/10644). // The same seems to apply to Firefox (https://dev.ckeditor.com/ticket/10787). if ( CKEDITOR.env.webkit || CKEDITOR.env.gecko ) blurListener = editable.once( 'blur', cancel, null, null, -100 ); // Temporarily move selection to the pastebin. isEditingHost && pastebin.focus(); var range = new CKEDITOR.dom.range( pastebin ); range.selectNodeContents( pastebin ); var selPastebin = range.select(); // If non-native paste is executed, IE will open security alert and blur editable. // Editable will then lock selection inside itself and after accepting security alert // this selection will be restored. We overwrite stored selection, so it's restored // in pastebin. (https://dev.ckeditor.com/ticket/9552) if ( CKEDITOR.env.ie ) { blurListener = editable.once( 'blur', function() { editor.lockSelection( selPastebin ); } ); } var scrollTop = CKEDITOR.document.getWindow().getScrollPosition().y; // Wait a while and grab the pasted contents. setTimeout( function() { // Restore main window's scroll position which could have been changed // by browser in cases described in https://dev.ckeditor.com/ticket/9771. if ( CKEDITOR.env.webkit ) CKEDITOR.document.getBody().$.scrollTop = scrollTop; // Blur will be fired only on non-native paste. In other case manually remove listener. blurListener && blurListener.removeListener(); // Restore properly the document focus. (https://dev.ckeditor.com/ticket/8849) if ( CKEDITOR.env.ie ) editable.focus(); // IE7: selection must go before removing pastebin. (https://dev.ckeditor.com/ticket/8691) sel.selectBookmarks( bms ); pastebin.remove(); // Grab the HTML contents. // We need to look for a apple style wrapper on webkit it also adds // a div wrapper if you copy/paste the body of the editor. // Remove hidden div and restore selection. var bogusSpan; if ( CKEDITOR.env.webkit && ( bogusSpan = pastebin.getFirst() ) && ( bogusSpan.is && bogusSpan.hasClass( 'Apple-style-span' ) ) ) pastebin = bogusSpan; editor.removeListener( 'selectionChange', cancel ); callback( pastebin.getHtml() ); }, 0 ); } // Try to get content directly on IE from clipboard, without native event // being fired before. In other words - synthetically get clipboard data, if it's possible. // mainPasteEvent will be fired, so if forced native paste: // * worked, getClipboardDataByPastebin will grab it, // * didn't work, dataValue and dataTransfer will be empty and editor#paste won't be fired. // Clipboard data can be accessed directly only on IEs older than Edge. // On other browsers we should fire beforePaste event and return false. function getClipboardDataDirectly() { if ( clipboard.mainPasteEvent == 'paste' ) { editor.fire( 'beforePaste', { type: 'auto', method: 'paste' } ); return false; } // Prevent IE from pasting at the begining of the document. editor.focus(); // Command will be handled by 'beforepaste', but as // execIECommand( 'paste' ) will fire also 'paste' event // we're canceling it. preventPasteEventNow(); // https://dev.ckeditor.com/ticket/9247: Lock focus to prevent IE from hiding toolbar for inline editor. var focusManager = editor.focusManager; focusManager.lock(); if ( editor.editable().fire( clipboard.mainPasteEvent ) && !execIECommand( 'paste' ) ) { focusManager.unlock(); return false; } focusManager.unlock(); return true; } // Listens for some clipboard related keystrokes, so they get customized. // Needs to be bind to keydown event. function onKey( event ) { if ( editor.mode != 'wysiwyg' ) return; switch ( event.data.keyCode ) { // Paste case CKEDITOR.CTRL + 86: // CTRL+V case CKEDITOR.SHIFT + 45: // SHIFT+INS var editable = editor.editable(); // Cancel 'paste' event because ctrl+v is for IE handled // by 'beforepaste'. preventPasteEventNow(); // Simulate 'beforepaste' event for all browsers using 'paste' as main event. if ( clipboard.mainPasteEvent == 'paste' ) { editable.fire( 'beforepaste' ); } return; // Cut case CKEDITOR.CTRL + 88: // CTRL+X case CKEDITOR.SHIFT + 46: // SHIFT+DEL // Save Undo snapshot. editor.fire( 'saveSnapshot' ); // Save before cut setTimeout( function() { editor.fire( 'saveSnapshot' ); // Save after cut }, 50 ); // OSX is slow (https://dev.ckeditor.com/ticket/11416). } } function pasteDataFromClipboard( evt ) { // Default type is 'auto', but can be changed by beforePaste listeners. var eventData = { type: 'auto', method: 'paste', dataTransfer: clipboard.initPasteDataTransfer( evt ) }; eventData.dataTransfer.cacheData(); // Fire 'beforePaste' event so clipboard flavor get customized by other plugins. // If 'beforePaste' is canceled continue executing getClipboardDataByPastebin and then do nothing // (do not fire 'paste', 'afterPaste' events). This way we can grab all - synthetically // and natively pasted content and prevent its insertion into editor // after canceling 'beforePaste' event. var beforePasteNotCanceled = editor.fire( 'beforePaste', eventData ) !== false; // Do not use paste bin if the browser let us get HTML or files from dataTranfer. if ( beforePasteNotCanceled && clipboard.canClipboardApiBeTrusted( eventData.dataTransfer, editor ) ) { evt.data.preventDefault(); setTimeout( function() { firePasteEvents( editor, eventData ); }, 0 ); } else { getClipboardDataByPastebin( evt, function( data ) { // Clean up. eventData.dataValue = data.replace( /]+data-cke-bookmark[^<]*?<\/span>/ig, '' ); // Fire remaining events (without beforePaste) beforePasteNotCanceled && firePasteEvents( editor, eventData ); } ); } } function setToolbarStates() { if ( editor.mode != 'wysiwyg' ) { return; } var pasteState = stateFromNamedCommand( 'paste' ); editor.getCommand( 'cut' ).setState( stateFromNamedCommand( 'cut' ) ); editor.getCommand( 'copy' ).setState( stateFromNamedCommand( 'copy' ) ); editor.getCommand( 'paste' ).setState( pasteState ); editor.fire( 'pasteState', pasteState ); } function stateFromNamedCommand( command ) { var selection = editor.getSelection(), range = selection && selection.getRanges()[ 0 ], // We need to correctly update toolbar states on readOnly (#2775). inReadOnly = editor.readOnly || ( range && range.checkReadOnly() ); if ( inReadOnly && command in { paste: 1, cut: 1 } ) { return CKEDITOR.TRISTATE_DISABLED; } if ( command == 'paste' ) { return CKEDITOR.TRISTATE_OFF; } // Cut, copy - check if the selection is not empty. var sel = editor.getSelection(), ranges = sel.getRanges(), selectionIsEmpty = sel.getType() == CKEDITOR.SELECTION_NONE || ( ranges.length == 1 && ranges[ 0 ].collapsed ); return selectionIsEmpty ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_OFF; } } // Returns: // * 'htmlifiedtext' if content looks like transformed by browser from plain text. // See clipboard/paste.html TCs for more info. // * 'html' if it is not 'htmlifiedtext'. function recogniseContentType( data ) { if ( CKEDITOR.env.webkit ) { // Plain text or (

    and text inside
    ). if ( !data.match( /^[^<]*$/g ) && !data.match( /^(
    <\/div>|
    [^<]*<\/div>)*$/gi ) ) return 'html'; } else if ( CKEDITOR.env.ie ) { // Text and
    or ( text and
    in

    - paragraphs can be separated by new \r\n ). if ( !data.match( /^([^<]|)*$/gi ) && !data.match( /^(

    ([^<]|)*<\/p>|(\r\n))*$/gi ) ) return 'html'; } else if ( CKEDITOR.env.gecko ) { // Text or
    . if ( !data.match( /^([^<]|)*$/gi ) ) return 'html'; } else { return 'html'; } return 'htmlifiedtext'; } // This function transforms what browsers produce when // pasting plain text into editable element (see clipboard/paste.html TCs // for more info) into correct HTML (similar to that produced by text2Html). function htmlifiedTextHtmlification( config, data ) { function repeatParagraphs( repeats ) { // Repeat blocks floor((n+1)/2) times. // Even number of repeats - add
    at the beginning of last

    . return CKEDITOR.tools.repeat( '

    ', ~~( repeats / 2 ) ) + ( repeats % 2 == 1 ? '
    ' : '' ); } // Replace adjacent white-spaces (EOLs too - Fx sometimes keeps them) with one space. // We have to skip \u3000 (IDEOGRAPHIC SPACE) character - it's special space character correctly rendered by the browsers (#1321). data = data.replace( /(?!\u3000)\s+/g, ' ' ) // Remove spaces from between tags. .replace( /> +<' ) // Normalize XHTML syntax and upper cased
    tags. .replace( /
    /gi, '
    ' ); // IE - lower cased tags. data = data.replace( /<\/?[A-Z]+>/g, function( match ) { return match.toLowerCase(); } ); // Don't touch single lines (no ) - nothing to do here. if ( data.match( /^[^<]$/ ) ) return data; // Webkit. if ( CKEDITOR.env.webkit && data.indexOf( '

    ' ) > -1 ) { // One line break at the beginning - insert
    data = data.replace( /^(
    (
    |)<\/div>)(?!$|(
    (
    |)<\/div>))/g, '
    ' ) // Two or more - reduce number of new lines by one. .replace( /^(
    (
    |)<\/div>){2}(?!$)/g, '
    ' ); // Two line breaks create one paragraph in Webkit. if ( data.match( /
    (
    |)<\/div>/ ) ) { data = '

    ' + data.replace( /(

    (
    |)<\/div>)+/g, function( match ) { return repeatParagraphs( match.split( '
    ' ).length + 1 ); } ) + '

    '; } // One line break create br. data = data.replace( /<\/div>
    /g, '
    ' ); // Remove remaining divs. data = data.replace( /<\/?div>/g, '' ); } // Opera and Firefox and enterMode != BR. if ( CKEDITOR.env.gecko && config.enterMode != CKEDITOR.ENTER_BR ) { // Remove bogus
    - Fx generates two for one line break. // For two line breaks it still produces two , but it's better to ignore this case than the first one. if ( CKEDITOR.env.gecko ) data = data.replace( /^

    $/, '
    ' ); // This line satisfy edge case when for Opera we have two line breaks //data = data.replace( /) if ( data.indexOf( '

    ' ) > -1 ) { // Two line breaks create one paragraph, three - 2, four - 3, etc. data = '

    ' + data.replace( /(
    ){2,}/g, function( match ) { return repeatParagraphs( match.length / 4 ); } ) + '

    '; } } return switchEnterMode( config, data ); } function filtersFactoryFactory( editor ) { var filters = {}; function setUpTags() { var tags = {}; for ( var tag in CKEDITOR.dtd ) { if ( tag.charAt( 0 ) != '$' && tag != 'div' && tag != 'span' ) { tags[ tag ] = 1; } } return tags; } function createSemanticContentFilter() { var filter = new CKEDITOR.filter( editor, {} ); filter.allow( { $1: { elements: setUpTags(), attributes: true, styles: false, classes: false } } ); return filter; } return { get: function( type ) { if ( type == 'plain-text' ) { // Does this look confusing to you? Did we forget about enter mode? // It is a trick that let's us creating one filter for edidtor, regardless of its // activeEnterMode (which as the name indicates can change during runtime). // // How does it work? // The active enter mode is passed to the filter.applyTo method. // The filter first marks all elements except
    as disallowed and then tries to remove // them. However, it cannot remove e.g. a

    element completely, because it's a basic structural element, // so it tries to replace it with an element created based on the active enter mode, eventually doing nothing. // // Now you can sleep well. return filters.plainText || ( filters.plainText = new CKEDITOR.filter( editor, 'br' ) ); } else if ( type == 'semantic-content' ) { return filters.semanticContent || ( filters.semanticContent = createSemanticContentFilter() ); } else if ( type ) { // Create filter based on rules (string or object). return new CKEDITOR.filter( editor, type ); } return null; } }; } function filterContent( editor, data, filter ) { var fragment = CKEDITOR.htmlParser.fragment.fromHtml( data ), writer = new CKEDITOR.htmlParser.basicWriter(); filter.applyTo( fragment, true, false, editor.activeEnterMode ); fragment.writeHtml( writer ); return writer.getHtml(); } function switchEnterMode( config, data ) { if ( config.enterMode == CKEDITOR.ENTER_BR ) { data = data.replace( /(<\/p>

    )+/g, function( match ) { return CKEDITOR.tools.repeat( '
    ', match.length / 7 * 2 ); } ).replace( /<\/?p>/g, '' ); } else if ( config.enterMode == CKEDITOR.ENTER_DIV ) { data = data.replace( /<(\/)?p>/g, '<$1div>' ); } return data; } function preventDefaultSetDropEffectToNone( evt ) { evt.data.preventDefault(); evt.data.$.dataTransfer.dropEffect = 'none'; } function initDragDrop( editor ) { var clipboard = CKEDITOR.plugins.clipboard; editor.on( 'contentDom', function() { var editable = editor.editable(), dropTarget = CKEDITOR.plugins.clipboard.getDropTarget( editor ), top = editor.ui.space( 'top' ), bottom = editor.ui.space( 'bottom' ); // -------------- DRAGOVER TOP & BOTTOM -------------- // Not allowing dragging on toolbar and bottom (https://dev.ckeditor.com/ticket/12613). clipboard.preventDefaultDropOnElement( top ); clipboard.preventDefaultDropOnElement( bottom ); // -------------- DRAGSTART -------------- // Listed on dragstart to mark internal and cross-editor drag & drop // and save range and selected HTML. editable.attachListener( dropTarget, 'dragstart', fireDragEvent ); // Make sure to reset data transfer (in case dragend was not called or was canceled). editable.attachListener( editor, 'dragstart', clipboard.resetDragDataTransfer, clipboard, null, 1 ); // Create a dataTransfer object and save it globally. editable.attachListener( editor, 'dragstart', function( evt ) { clipboard.initDragDataTransfer( evt, editor ); }, null, null, 2 ); editable.attachListener( editor, 'dragstart', function() { // Save drag range globally for cross editor D&D. var dragRange = clipboard.dragRange = editor.getSelection().getRanges()[ 0 ]; // Store number of children, so we can later tell if any text node was split on drop. (https://dev.ckeditor.com/ticket/13011, https://dev.ckeditor.com/ticket/13447) if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) { clipboard.dragStartContainerChildCount = dragRange ? getContainerChildCount( dragRange.startContainer ) : null; clipboard.dragEndContainerChildCount = dragRange ? getContainerChildCount( dragRange.endContainer ) : null; } }, null, null, 100 ); // -------------- DRAGEND -------------- // Clean up on dragend. editable.attachListener( dropTarget, 'dragend', fireDragEvent ); // Init data transfer if someone wants to use it in dragend. editable.attachListener( editor, 'dragend', clipboard.initDragDataTransfer, clipboard, null, 1 ); // When drag & drop is done we need to reset dataTransfer so the future // external drop will be not recognize as internal. editable.attachListener( editor, 'dragend', clipboard.resetDragDataTransfer, clipboard, null, 100 ); // -------------- DRAGOVER -------------- // We need to call preventDefault on dragover because otherwise if // we drop image it will overwrite document. editable.attachListener( dropTarget, 'dragover', function( evt ) { // Edge requires this handler to have `preventDefault()` regardless of the situation. if ( CKEDITOR.env.edge ) { evt.data.preventDefault(); return; } var target = evt.data.getTarget(); // Prevent reloading page when dragging image on empty document (https://dev.ckeditor.com/ticket/12619). if ( target && target.is && target.is( 'html' ) ) { evt.data.preventDefault(); return; } // If we do not prevent default dragover on IE the file path // will be loaded and we will lose content. On the other hand // if we prevent it the cursor will not we shown, so we prevent // dragover only on IE, on versions which support file API and only // if the event contains files. if ( CKEDITOR.env.ie && CKEDITOR.plugins.clipboard.isFileApiSupported && evt.data.$.dataTransfer.types.contains( 'Files' ) ) { evt.data.preventDefault(); } } ); // -------------- DROP -------------- editable.attachListener( dropTarget, 'drop', function( evt ) { // Do nothing if event was already prevented. (https://dev.ckeditor.com/ticket/13879) if ( evt.data.$.defaultPrevented ) { return; } // Cancel native drop. evt.data.preventDefault(); // We shouldn't start drop action when editor is in read only mode (#808). if ( editor.readOnly ) { return; } var target = evt.data.getTarget(), readOnly = target.isReadOnly(); // Do nothing if drop on non editable element (https://dev.ckeditor.com/ticket/13015). // The tag isn't editable (body is), but we want to allow drop on it // (so it is possible to drop below editor contents). if ( readOnly && !( target.type == CKEDITOR.NODE_ELEMENT && target.is( 'html' ) ) ) { return; } // Getting drop position is one of the most complex parts. var dropRange = clipboard.getRangeAtDropPosition( evt, editor ), dragRange = clipboard.dragRange; // Do nothing if it was not possible to get drop range. if ( !dropRange ) { return; } // Fire drop. fireDragEvent( evt, dragRange, dropRange ); }, null, null, 9999 ); // Create dataTransfer or get it, if it was created before. editable.attachListener( editor, 'drop', clipboard.initDragDataTransfer, clipboard, null, 1 ); // Execute drop action, fire paste. editable.attachListener( editor, 'drop', function( evt ) { var data = evt.data; if ( !data ) { return; } // Let user modify drag and drop range. var dropRange = data.dropRange, dragRange = data.dragRange, dataTransfer = data.dataTransfer; if ( dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_INTERNAL ) { // Execute drop with a timeout because otherwise selection, after drop, // on IE is in the drag position, instead of drop position. setTimeout( function() { clipboard.internalDrop( dragRange, dropRange, dataTransfer, editor ); }, 0 ); } else if ( dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_CROSS_EDITORS ) { crossEditorDrop( dragRange, dropRange, dataTransfer ); } else { externalDrop( dropRange, dataTransfer ); } }, null, null, 9999 ); // Cross editor drag and drop (drag in one Editor and drop in the other). function crossEditorDrop( dragRange, dropRange, dataTransfer ) { // Paste event should be fired before delete contents because otherwise // Chrome have a problem with drop range (Chrome split the drop // range container so the offset is bigger then container length). dropRange.select(); firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop' }, 1 ); // Remove dragged content and make a snapshot. dataTransfer.sourceEditor.fire( 'saveSnapshot' ); dataTransfer.sourceEditor.editable().extractHtmlFromRange( dragRange ); // Make some selection before saving snapshot, otherwise error will be thrown, because // there will be no valid selection after content is removed. dataTransfer.sourceEditor.getSelection().selectRanges( [ dragRange ] ); dataTransfer.sourceEditor.fire( 'saveSnapshot' ); } // Drop from external source. function externalDrop( dropRange, dataTransfer ) { // Paste content into the drop position. dropRange.select(); firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop' }, 1 ); // Usually we reset DataTranfer on dragend, // but dragend is called on the same element as dragstart // so it will not be called on on external drop. clipboard.resetDragDataTransfer(); } // Fire drag/drop events (dragstart, dragend, drop). function fireDragEvent( evt, dragRange, dropRange ) { var eventData = { $: evt.data.$, target: evt.data.getTarget() }; if ( dragRange ) { eventData.dragRange = dragRange; } if ( dropRange ) { eventData.dropRange = dropRange; } if ( editor.fire( evt.name, eventData ) === false ) { evt.data.preventDefault(); } } function getContainerChildCount( container ) { if ( container.type != CKEDITOR.NODE_ELEMENT ) { container = container.getParent(); } return container.getChildCount(); } } ); } /** * @singleton * @class CKEDITOR.plugins.clipboard */ CKEDITOR.plugins.clipboard = { /** * Adds a file matcher verifying whether a file should be supported via clipboard operations. * * In case of pasting or dragging and dropping unsupported files, * the clipboard plugin will show a notification informing a user that a given file type is not supported. * * ```javascript * CKEDITOR.plugins.clipboard.addFileMatcher( editor, function( file ) { * var supportedImageTypes = [ 'image/png', 'image/jpeg', 'image/gif' ]; * return CKEDITOR.tools.indexOf( supportedImageTypes, file.type ) !== -1; * } ); * ``` * * **Note:** This feature will not cancel the `paste` event in case of an unsupported file. * It is the integrator's responsibility to properly handle incorrect files * (e.g. by verifying if the file should be indeed uploaded via upload integrations). * * @since 4.19.0 * @param {CKEDITOR.editor} editor The editor instance. * @param {Function} matcher File matcher. */ addFileMatcher: function( editor, matcher ) { editor.plugins.clipboard._supportedFileMatchers.push( matcher ); }, /** * It returns `true` if the environment allows setting the data on copy or cut manually. This value is `false` in: * * Internet Explorer — because this browser shows the security dialog window when the script tries to set clipboard data. * * Older iOS (below version 13) — because custom data is not saved to clipboard there. * * @since 4.5.0 * @readonly * @property {Boolean} */ isCustomCopyCutSupported: ( function() { if ( CKEDITOR.env.ie && CKEDITOR.env.version < 16 ) { return false; } // There might be lower version supported as well. However, we don't have possibility to test it (#3354). if ( CKEDITOR.env.iOS && CKEDITOR.env.version < 605 ) { return false; } return true; } )(), /** * True if the environment supports MIME types and custom data types in dataTransfer/cliboardData getData/setData methods. * * @since 4.5.0 * @readonly * @property {Boolean} */ isCustomDataTypesSupported: !CKEDITOR.env.ie || CKEDITOR.env.version >= 16, /** * True if the environment supports File API. * * @since 4.5.0 * @readonly * @property {Boolean} */ isFileApiSupported: !CKEDITOR.env.ie || CKEDITOR.env.version > 9, /** * Main native paste event editable should listen to. * * **Note:** Safari does not like the {@link CKEDITOR.editor#beforePaste} event — it sometimes does not * handle Ctrl+C properly. This is probably caused by some race condition between events. * Chrome, Firefox and Edge work well with both events, so it is better to use {@link CKEDITOR.editor#paste} * which will handle pasting from e.g. browsers' menu bars. * IE7/8 does not like the {@link CKEDITOR.editor#paste} event for which it is throwing random errors. * * @since 4.5.0 * @readonly * @property {String} */ mainPasteEvent: ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ? 'beforepaste' : 'paste', /** * Adds a new paste button to the editor. * * This method should be called for buttons that should display the Paste Dialog fallback in mobile environments. * See [the rationale](https://github.com/ckeditor/ckeditor4/issues/595#issuecomment-345971174) for more * details. * * @since 4.9.0 * @param {CKEDITOR.editor} editor The editor instance. * @param {String} name Name of the button. * @param {Object} definition Definition of the button. */ addPasteButton: function( editor, name, definition ) { if ( !editor.ui.addButton ) { return; } editor.ui.addButton( name, definition ); if ( !editor._.pasteButtons ) { editor._.pasteButtons = []; } editor._.pasteButtons.push( name ); }, /** * Returns `true` if it is expected that a browser provides HTML data through the Clipboard API. * If not, this method returns `false` and as a result CKEditor will use the paste bin. Read more in * the [Clipboard Integration](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_clipboard.html#clipboard-api) guide. * * @since 4.5.2 * @returns {Boolean} */ canClipboardApiBeTrusted: function( dataTransfer, editor ) { // If it's an internal or cross-editor data transfer, then it means that custom cut/copy/paste support works // and that the data were put manually on the data transfer so we can be sure that it's available. if ( dataTransfer.getTransferType( editor ) != CKEDITOR.DATA_TRANSFER_EXTERNAL ) { return true; } // In Chrome we can trust Clipboard API, with the exception of Chrome on Android (in both - mobile and desktop modes), where // clipboard API is not available so we need to check it (https://dev.ckeditor.com/ticket/13187). if ( CKEDITOR.env.chrome && !dataTransfer.isEmpty() ) { return true; } // Because of a Firefox bug HTML data are not available in some cases (e.g. paste from Word), in such cases we // need to use the pastebin (https://dev.ckeditor.com/ticket/13528, https://bugzilla.mozilla.org/show_bug.cgi?id=1183686). if ( CKEDITOR.env.gecko && ( dataTransfer.getData( 'text/html' ) || dataTransfer.getFilesCount() ) ) { return true; } // Safari fixed clipboard in 10.1 (https://bugs.webkit.org/show_bug.cgi?id=19893) (https://dev.ckeditor.com/ticket/16982). if ( CKEDITOR.env.safari && CKEDITOR.env.version >= 603 && !CKEDITOR.env.iOS ) { return true; } // Issue doesn't occur any longer in new iOS version (https://bugs.webkit.org/show_bug.cgi?id=19893#c34) (#3354). if ( CKEDITOR.env.iOS && CKEDITOR.env.version >= 605 ) { return true; } // Edge 15 added support for Clipboard API // (https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer/suggestions/6515107-clipboard-api), however it is // usable for our case starting from Edge 16 (#468). if ( CKEDITOR.env.edge && CKEDITOR.env.version >= 16 ) { return true; } // In older Safari and IE HTML data is not available through the Clipboard API. // In older Edge version things are also a bit messy - // https://connect.microsoft.com/IE/feedback/details/1572456/edge-clipboard-api-text-html-content-messed-up-in-event-clipboarddata // It is safer to use the paste bin in unknown cases. return false; }, /** * Returns the element that should be used as the target for the drop event. * * @since 4.5.0 * @param {CKEDITOR.editor} editor The editor instance. * @returns {CKEDITOR.dom.domObject} the element that should be used as the target for the drop event. */ getDropTarget: function( editor ) { var editable = editor.editable(); // https://dev.ckeditor.com/ticket/11123 Firefox needs to listen on document, because otherwise event won't be fired. // https://dev.ckeditor.com/ticket/11086 IE8 cannot listen on document. if ( ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) || editable.isInline() ) { return editable; } else { return editor.document; } }, /** * IE 8 & 9 split text node on drop so the first node contains the * text before the drop position and the second contains the rest. If you * drag the content from the same node you will be not be able to get * it (the range becomes invalid), so you need to join them back. * * Note that the first node in IE 8 & 9 is the original node object * but with shortened content. * * Before: * --- Text Node A ---------------------------------- * /\ * Drag position * * After (IE 8 & 9): * --- Text Node A ----- --- Text Node B ----------- * /\ /\ * Drop position Drag position * (invalid) * * After (other browsers): * --- Text Node A ---------------------------------- * /\ /\ * Drop position Drag position * * **Note:** This function is in the public scope for tests usage only. * * @since 4.5.0 * @private * @param {CKEDITOR.dom.range} dragRange The drag range. * @param {CKEDITOR.dom.range} dropRange The drop range. * @param {Number} preDragStartContainerChildCount The number of children of the drag range start container before the drop. * @param {Number} preDragEndContainerChildCount The number of children of the drag range end container before the drop. */ fixSplitNodesAfterDrop: function( dragRange, dropRange, preDragStartContainerChildCount, preDragEndContainerChildCount ) { var dropContainer = dropRange.startContainer; if ( typeof preDragEndContainerChildCount != 'number' || typeof preDragStartContainerChildCount != 'number' ) { return; } // We are only concerned about ranges anchored in elements. if ( dropContainer.type != CKEDITOR.NODE_ELEMENT ) { return; } if ( handleContainer( dragRange.startContainer, dropContainer, preDragStartContainerChildCount ) ) { return; } if ( handleContainer( dragRange.endContainer, dropContainer, preDragEndContainerChildCount ) ) { return; } function handleContainer( dragContainer, dropContainer, preChildCount ) { var dragElement = dragContainer; if ( dragElement.type == CKEDITOR.NODE_TEXT ) { dragElement = dragContainer.getParent(); } if ( dragElement.equals( dropContainer ) && preChildCount != dropContainer.getChildCount() ) { applyFix( dropRange ); return true; } } function applyFix( dropRange ) { var nodeBefore = dropRange.startContainer.getChild( dropRange.startOffset - 1 ), nodeAfter = dropRange.startContainer.getChild( dropRange.startOffset ); if ( nodeBefore && nodeBefore.type == CKEDITOR.NODE_TEXT && nodeAfter && nodeAfter.type == CKEDITOR.NODE_TEXT ) { var offset = nodeBefore.getLength(); nodeBefore.setText( nodeBefore.getText() + nodeAfter.getText() ); nodeAfter.remove(); dropRange.setStart( nodeBefore, offset ); dropRange.collapse( true ); } } }, /** * Checks whether turning the drag range into bookmarks will invalidate the drop range. * This usually happens when the drop range shares the container with the drag range and is * located after the drag range, but there are countless edge cases. * * This function is stricly related to {@link #internalDrop} which toggles * order in which it creates bookmarks for both ranges based on a value returned * by this method. In some cases this method returns a value which is not necessarily * true in terms of what it was meant to check, but it is convenient, because * we know how it is interpreted in {@link #internalDrop}, so the correct * behavior of the entire algorithm is assured. * * **Note:** This function is in the public scope for tests usage only. * * @since 4.5.0 * @private * @param {CKEDITOR.dom.range} dragRange The first range to compare. * @param {CKEDITOR.dom.range} dropRange The second range to compare. * @returns {Boolean} `true` if the first range is before the second range. */ isDropRangeAffectedByDragRange: function( dragRange, dropRange ) { var dropContainer = dropRange.startContainer, dropOffset = dropRange.endOffset; // Both containers are the same and drop offset is at the same position or later. // " A L] A " " M A " // ^ ^ if ( dragRange.endContainer.equals( dropContainer ) && dragRange.endOffset <= dropOffset ) { return true; } // Bookmark for drag start container will mess up with offsets. // " O [L A " " M A " // ^ ^ if ( dragRange.startContainer.getParent().equals( dropContainer ) && dragRange.startContainer.getIndex() < dropOffset ) { return true; } // Bookmark for drag end container will mess up with offsets. // " O] L A " " M A " // ^ ^ if ( dragRange.endContainer.getParent().equals( dropContainer ) && dragRange.endContainer.getIndex() < dropOffset ) { return true; } return false; }, /** * Internal drag and drop (drag and drop in the same editor instance). * * **Note:** This function is in the public scope for tests usage only. * * @since 4.5.0 * @private * @param {CKEDITOR.dom.range} dragRange The first range to compare. * @param {CKEDITOR.dom.range} dropRange The second range to compare. * @param {CKEDITOR.plugins.clipboard.dataTransfer} dataTransfer * @param {CKEDITOR.editor} editor */ internalDrop: function( dragRange, dropRange, dataTransfer, editor ) { var clipboard = CKEDITOR.plugins.clipboard, editable = editor.editable(), dragBookmark, dropBookmark, isDropRangeAffected; // Save and lock snapshot so there will be only // one snapshot for both remove and insert content. editor.fire( 'saveSnapshot' ); editor.fire( 'lockSnapshot', { dontUpdate: 1 } ); if ( CKEDITOR.env.ie && CKEDITOR.env.version < 10 ) { this.fixSplitNodesAfterDrop( dragRange, dropRange, clipboard.dragStartContainerChildCount, clipboard.dragEndContainerChildCount ); } // Because we manipulate multiple ranges we need to do it carefully, // changing one range (event creating a bookmark) may make other invalid. // We need to change ranges into bookmarks so we can manipulate them easily in the future. // We can change the range which is later in the text before we change the preceding range. // We call isDropRangeAffectedByDragRange to test the order of ranges. isDropRangeAffected = this.isDropRangeAffectedByDragRange( dragRange, dropRange ); if ( !isDropRangeAffected ) { dragBookmark = dragRange.createBookmark( false ); } dropBookmark = dropRange.clone().createBookmark( false ); if ( isDropRangeAffected ) { dragBookmark = dragRange.createBookmark( false ); } // Check if drop range is inside range. // This is an edge case when we drop something on editable's margin/padding. // That space is not treated as a part of the range we drag, so it is possible to drop there. // When we drop, browser tries to find closest drop position and it finds it inside drag range. (https://dev.ckeditor.com/ticket/13453) var startNode = dragBookmark.startNode, endNode = dragBookmark.endNode, dropNode = dropBookmark.startNode, dropInsideDragRange = // Must check endNode because dragRange could be collapsed in some edge cases (simulated DnD). endNode && ( startNode.getPosition( dropNode ) & CKEDITOR.POSITION_PRECEDING ) && ( endNode.getPosition( dropNode ) & CKEDITOR.POSITION_FOLLOWING ); // If the drop range happens to be inside drag range change it's position to the beginning of the drag range. if ( dropInsideDragRange ) { // We only change position of bookmark span that is connected with dropBookmark. // dropRange will be overwritten and set to the dropBookmark later. dropNode.insertBefore( startNode ); } // No we can safely delete content for the drag range... dragRange = editor.createRange(); dragRange.moveToBookmark( dragBookmark ); editable.extractHtmlFromRange( dragRange, 1 ); // ...and paste content into the drop position. dropRange = editor.createRange(); // Get actual selection with bookmarks if drop's bookmark are not in editable any longer. // This might happen after extracting content from range (#2292). if ( !dropBookmark.startNode.getCommonAncestor( editable ) ) { dropBookmark = editor.getSelection().createBookmarks()[ 0 ]; } dropRange.moveToBookmark( dropBookmark ); // We do not select drop range, because of may be in the place we can not set the selection // (e.g. between blocks, in case of block widget D&D). We put range to the paste event instead. firePasteEvents( editor, { dataTransfer: dataTransfer, method: 'drop', range: dropRange }, 1 ); editor.fire( 'unlockSnapshot' ); }, /** * Gets the range from the `drop` event. * * @since 4.5.0 * @param {Object} domEvent A native DOM drop event object. * @param {CKEDITOR.editor} editor The source editor instance. * @returns {CKEDITOR.dom.range} range at drop position. */ getRangeAtDropPosition: function( dropEvt, editor ) { var $evt = dropEvt.data.$, x = $evt.clientX, y = $evt.clientY, $range, defaultRange = editor.getSelection( true ).getRanges()[ 0 ], range = editor.createRange(); // Make testing possible. if ( dropEvt.data.testRange ) return dropEvt.data.testRange; // Webkits. if ( document.caretRangeFromPoint && editor.document.$.caretRangeFromPoint( x, y ) ) { $range = editor.document.$.caretRangeFromPoint( x, y ); range.setStart( CKEDITOR.dom.node( $range.startContainer ), $range.startOffset ); range.collapse( true ); } // FF. else if ( $evt.rangeParent ) { range.setStart( CKEDITOR.dom.node( $evt.rangeParent ), $evt.rangeOffset ); range.collapse( true ); } // IEs 9+. // We check if editable is focused to make sure that it's an internal DnD. External DnD must use the second // mechanism because of https://dev.ckeditor.com/ticket/13472#comment:6. else if ( CKEDITOR.env.ie && CKEDITOR.env.version > 8 && defaultRange && editor.editable().hasFocus ) { // On IE 9+ range by default is where we expected it. // defaultRange may be undefined if dragover was canceled (file drop). return defaultRange; } // IE 8 and all IEs if !defaultRange or external DnD. else if ( document.body.createTextRange ) { // To use this method we need a focus (which may be somewhere else in case of external drop). editor.focus(); $range = editor.document.getBody().$.createTextRange(); try { var sucess = false; // If user drop between text line IEs moveToPoint throws exception: // // Lorem ipsum pulvinar purus et euismod // // dolor sit amet,| consectetur adipiscing // * // vestibulum tincidunt augue eget tempus. // // * - drop position // | - expected cursor position // // So we try to call moveToPoint with +-1px up to +-20px above or // below original drop position to find nearest good drop position. for ( var i = 0; i < 20 && !sucess; i++ ) { if ( !sucess ) { try { $range.moveToPoint( x, y - i ); sucess = true; } catch ( err ) { } } if ( !sucess ) { try { $range.moveToPoint( x, y + i ); sucess = true; } catch ( err ) { } } } if ( sucess ) { var id = 'cke-temp-' + ( new Date() ).getTime(); $range.pasteHTML( '\u200b' ); var span = editor.document.getById( id ); range.moveToPosition( span, CKEDITOR.POSITION_BEFORE_START ); span.remove(); } else { // If the fist method does not succeed we might be next to // the short element (like header): // // Lorem ipsum pulvinar purus et euismod. // // // SOME HEADER| * // // // vestibulum tincidunt augue eget tempus. // // * - drop position // | - expected cursor position // // In such situation elementFromPoint returns proper element. Using getClientRect // it is possible to check if the cursor should be at the beginning or at the end // of paragraph. var $element = editor.document.$.elementFromPoint( x, y ), element = new CKEDITOR.dom.element( $element ), rect; if ( !element.equals( editor.editable() ) && element.getName() != 'html' ) { rect = element.getClientRect(); if ( x < rect.left ) { range.setStartAt( element, CKEDITOR.POSITION_AFTER_START ); range.collapse( true ); } else { range.setStartAt( element, CKEDITOR.POSITION_BEFORE_END ); range.collapse( true ); } } // If drop happens on no element elementFromPoint returns html or body. // // * |Lorem ipsum pulvinar purus et euismod. // // vestibulum tincidunt augue eget tempus. // // * - drop position // | - expected cursor position // // In such case we can try to use default selection. If startContainer is not // 'editable' element it is probably proper selection. else if ( defaultRange && defaultRange.startContainer && !defaultRange.startContainer.equals( editor.editable() ) ) { return defaultRange; // Otherwise we can not find any drop position and we have to return null // and cancel drop event. } else { return null; } } } catch ( err ) { return null; } } else { return null; } return range; }, /** * This function tries to link the `evt.data.dataTransfer` property of the {@link CKEDITOR.editor#dragstart}, * {@link CKEDITOR.editor#dragend} and {@link CKEDITOR.editor#drop} events to a single * {@link CKEDITOR.plugins.clipboard.dataTransfer} object. * * This method is automatically used by the core of the drag and drop functionality and * usually does not have to be called manually when using the drag and drop events. * * This method behaves differently depending on whether the drag and drop events were fired * artificially (to represent a non-native drag and drop) or whether they were caused by the native drag and drop. * * If the native event is not available, then it will create a new {@link CKEDITOR.plugins.clipboard.dataTransfer} * instance (if it does not exist already) and will link it to this and all following event objects until * the {@link #resetDragDataTransfer} method is called. It means that all three drag and drop events must be fired * in order to ensure that the data transfer is bound correctly. * * If the native event is available, then the {@link CKEDITOR.plugins.clipboard.dataTransfer} is identified * by its ID and a new instance is assigned to the `evt.data.dataTransfer` only if the ID changed or * the {@link #resetDragDataTransfer} method was called. * * @since 4.5.0 * @param {CKEDITOR.dom.event} [evt] A drop event object. * @param {CKEDITOR.editor} [sourceEditor] The source editor instance. */ initDragDataTransfer: function( evt, sourceEditor ) { // Create a new dataTransfer object based on the drop event. // If this event was used on dragstart to create dataTransfer // both dataTransfer objects will have the same id. var nativeDataTransfer = evt.data.$ ? evt.data.$.dataTransfer : null, dataTransfer = new this.dataTransfer( nativeDataTransfer, sourceEditor ); // Set dataTransfer.id only for 'dragstart' event (so for events initializing dataTransfer inside editor) (#962). if ( evt.name === 'dragstart' ) { dataTransfer.storeId(); } if ( !nativeDataTransfer ) { // No native event. if ( this.dragData ) { dataTransfer = this.dragData; } else { this.dragData = dataTransfer; } } else { // Native event. If there is the same id we will replace dataTransfer with the one // created on drag, because it contains drag editor, drag content and so on. // Otherwise (in case of drag from external source) we save new object to // the global clipboard.dragData. if ( this.dragData && dataTransfer.id == this.dragData.id ) { dataTransfer = this.dragData; } else { this.dragData = dataTransfer; } } evt.data.dataTransfer = dataTransfer; }, /** * Removes the global {@link #dragData} so the next call to {@link #initDragDataTransfer} * always creates a new instance of {@link CKEDITOR.plugins.clipboard.dataTransfer}. * * @since 4.5.0 */ resetDragDataTransfer: function() { this.dragData = null; }, /** * Global object storing the data transfer of the current drag and drop operation. * Do not use it directly, use {@link #initDragDataTransfer} and {@link #resetDragDataTransfer}. * * Note: This object is global (meaning that it is not related to a single editor instance) * in order to handle drag and drop from one editor into another. * * @since 4.5.0 * @private * @property {CKEDITOR.plugins.clipboard.dataTransfer} dragData */ /** * Range object to save the drag range and remove its content after the drop. * * @since 4.5.0 * @private * @property {CKEDITOR.dom.range} dragRange */ /** * Initializes and links data transfer objects based on the paste event. If the data * transfer object was already initialized on this event, the function will * return that object. In IE it is not possible to link copy/cut and paste events * so the method always returns a new object. The same happens if there is no paste event * passed to the method. * * @since 4.5.0 * @param {CKEDITOR.dom.event} [evt] A paste event object. * @param {CKEDITOR.editor} [sourceEditor] The source editor instance. * @returns {CKEDITOR.plugins.clipboard.dataTransfer} The data transfer object. */ initPasteDataTransfer: function( evt, sourceEditor ) { if ( !this.isCustomCopyCutSupported ) { // Edge < 16 does not support custom copy/cut, but it has some useful data in the clipboardData (https://dev.ckeditor.com/ticket/13755). return new this.dataTransfer( ( CKEDITOR.env.edge && evt && evt.data.$ && evt.data.$.clipboardData ) || null, sourceEditor ); } else if ( evt && evt.data && evt.data.$ ) { var clipboardData = evt.data.$.clipboardData, dataTransfer = new this.dataTransfer( clipboardData, sourceEditor ); // Set dataTransfer.id only for 'copy'/'cut' events (so for events initializing dataTransfer inside editor) (#962). if ( evt.name === 'copy' || evt.name === 'cut' ) { dataTransfer.storeId(); } if ( this.copyCutData && dataTransfer.id == this.copyCutData.id ) { dataTransfer = this.copyCutData; dataTransfer.$ = clipboardData; } else { this.copyCutData = dataTransfer; } return dataTransfer; } else { return new this.dataTransfer( null, sourceEditor ); } }, /** * Prevents dropping on the specified element. * * @since 4.5.0 * @param {CKEDITOR.dom.element} element The element on which dropping should be disabled. */ preventDefaultDropOnElement: function( element ) { element && element.on( 'dragover', preventDefaultSetDropEffectToNone ); } }; // Data type used to link drag and drop events. // // In IE URL data type is buggie and there is no way to mark drag & drop without // modifying text data (which would be displayed if user drop content to the textarea) // so we just read dragged text. // // In Chrome and Firefox we can use custom data types. clipboardIdDataType = CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ? 'cke/id' : 'Text'; /** * Facade for the native `dataTransfer`/`clipboadData` object to hide all differences * between browsers. * * @since 4.5.0 * @class CKEDITOR.plugins.clipboard.dataTransfer * @constructor Creates a class instance. * @param {Object} [nativeDataTransfer] A native data transfer object. * @param {CKEDITOR.editor} [editor] The source editor instance. If the editor is defined, dataValue will * be created based on the editor content and the type will be 'html'. */ CKEDITOR.plugins.clipboard.dataTransfer = function( nativeDataTransfer, editor ) { if ( nativeDataTransfer ) { this.$ = nativeDataTransfer; } this._ = { metaRegExp: /^/i, fragmentRegExp: /\s*|\s*/g, types: [], data: {}, files: [], // Stores full HTML so it can be accessed asynchronously with `getData( 'text/html', true )`. nativeHtmlCache: '', normalizeType: function( type ) { type = type.toLowerCase(); if ( type == 'text' || type == 'text/plain' ) { return 'Text'; // IE support only Text and URL; } else if ( type == 'url' ) { return 'URL'; // IE support only Text and URL; } else if ( type === 'files' ) { // Do not normalize Files type (#4604). return 'Files'; } else { return type; } } }; this._.fallbackDataTransfer = new CKEDITOR.plugins.clipboard.fallbackDataTransfer( this ); // Check if ID is already created. this.id = this.getData( clipboardIdDataType ); // If there is no ID we need to create it. Different browsers needs different ID. if ( !this.id ) { if ( clipboardIdDataType == 'Text' ) { // For IE10+ only Text data type is supported and we have to compare dragged // and dropped text. If the ID is not set it means that empty string was dragged // (ex. image with no alt). We change null to empty string. this.id = ''; } else { // String for custom data type. this.id = 'cke-' + CKEDITOR.tools.getUniqueId(); } } if ( editor ) { this.sourceEditor = editor; this.setData( 'text/html', editor.getSelectedHtml( 1 ) ); // Without setData( 'text', ... ) on dragstart there is no drop event in Safari. // Also 'text' data is empty as drop to the textarea does not work if we do not put there text. if ( clipboardIdDataType != 'Text' && !this.getData( 'text/plain' ) ) { this.setData( 'text/plain', editor.getSelection().getSelectedText() ); } } /** * Data transfer ID used to bind all dataTransfer * objects based on the same event (e.g. in drag and drop events). * * @readonly * @property {String} id */ /** * A native DOM event object. * * @readonly * @property {Object} $ */ /** * Source editor — the editor where the drag starts. * Might be undefined if the drag starts outside the editor (e.g. when dropping files to the editor). * * @readonly * @property {CKEDITOR.editor} sourceEditor */ /** * Private properties and methods. * * @private * @property {Object} _ */ }; /** * Data transfer operation (drag and drop or copy and paste) started and ended in the same * editor instance. * * @since 4.5.0 * @readonly * @property {Number} [=1] * @member CKEDITOR */ CKEDITOR.DATA_TRANSFER_INTERNAL = 1; /** * Data transfer operation (drag and drop or copy and paste) started in one editor * instance and ended in another. * * @since 4.5.0 * @readonly * @property {Number} [=2] * @member CKEDITOR */ CKEDITOR.DATA_TRANSFER_CROSS_EDITORS = 2; /** * Data transfer operation (drag and drop or copy and paste) started outside of the editor. * The source of the data may be a textarea, HTML, another application, etc. * * @since 4.5.0 * @readonly * @property {Number} [=3] * @member CKEDITOR */ CKEDITOR.DATA_TRANSFER_EXTERNAL = 3; CKEDITOR.plugins.clipboard.dataTransfer.prototype = { /** * Facade for the native `getData` method. * * @param {String} type The type of data to retrieve. * @param {Boolean} [getNative=false] Indicates if the whole, original content of the dataTransfer should be returned. * Introduced in CKEditor 4.7.0. * @returns {String} type Stored data for the given type or an empty string if the data for that type does not exist. */ getData: function( type, getNative ) { function isEmpty( data ) { return data === undefined || data === null || data === ''; } function filterUnwantedCharacters( data ) { if ( typeof data !== 'string' ) { return data; } var htmlEnd = data.indexOf( '' ); if ( htmlEnd !== -1 ) { // Just cut everything after ``, so everything after htmlEnd index + length of ``. // Required to workaround bug: https://bugs.chromium.org/p/chromium/issues/detail?id=696978 return data.substring( 0, htmlEnd + 7 ); } return data; } type = this._.normalizeType( type ); var data = type == 'text/html' && getNative ? this._.nativeHtmlCache : this._.data[ type ]; if ( isEmpty( data ) ) { if ( this._.fallbackDataTransfer.isRequired() ) { data = this._.fallbackDataTransfer.getData( type, getNative ); } else { try { data = this.$.getData( type ) || ''; } catch ( e ) { data = ''; } } if ( type == 'text/html' && !getNative ) { data = this._stripHtml( data ); } } // Firefox on Linux put files paths as a text/plain data if there are files // in the dataTransfer object. We need to hide it, because files should be // handled on paste only if dataValue is empty. if ( type == 'Text' && CKEDITOR.env.gecko && this.getFilesCount() && data.substring( 0, 7 ) == 'file://' ) { data = ''; } return filterUnwantedCharacters( data ); }, /** * Facade for the native `setData` method. * * @param {String} type The type of data to retrieve. * @param {String} value The data to add. */ setData: function( type, value ) { type = this._.normalizeType( type ); if ( type == 'text/html' ) { this._.data[ type ] = this._stripHtml( value ); // If 'text/html' is set manually we also store it in `nativeHtmlCache` without modifications. this._.nativeHtmlCache = value; } else { this._.data[ type ] = value; } // There is "Unexpected call to method or property access." error if you try // to set data of unsupported type on IE. if ( !CKEDITOR.plugins.clipboard.isCustomDataTypesSupported && type != 'URL' && type != 'Text' ) { return; } // If we use the text type to bind the ID, then if someone tries to set the text, we must also // update ID accordingly. https://dev.ckeditor.com/ticket/13468. if ( clipboardIdDataType == 'Text' && type == 'Text' ) { this.id = value; } if ( this._.fallbackDataTransfer.isRequired() ) { this._.fallbackDataTransfer.setData( type, value ); } else { try { this.$.setData( type, value ); } catch ( e ) {} } }, /** * Stores dataTransfer id in native data transfer object * so it can be retrieved by other events. * * @since 4.8.0 */ storeId: function() { if ( clipboardIdDataType !== 'Text' ) { this.setData( clipboardIdDataType, this.id ); } }, /** * Gets the data transfer type. * * @param {CKEDITOR.editor} targetEditor The drop/paste target editor instance. * @returns {Number} Possible values: {@link CKEDITOR#DATA_TRANSFER_INTERNAL}, * {@link CKEDITOR#DATA_TRANSFER_CROSS_EDITORS}, {@link CKEDITOR#DATA_TRANSFER_EXTERNAL}. */ getTransferType: function( targetEditor ) { if ( !this.sourceEditor ) { return CKEDITOR.DATA_TRANSFER_EXTERNAL; } else if ( this.sourceEditor == targetEditor ) { return CKEDITOR.DATA_TRANSFER_INTERNAL; } else { return CKEDITOR.DATA_TRANSFER_CROSS_EDITORS; } }, /** * Copies the data from the native data transfer to a private cache. * This function is needed because the data from the native data transfer * is available only synchronously to the event listener. It is not possible * to get the data asynchronously, after a timeout, and the {@link CKEDITOR.editor#paste} * event is fired asynchronously — hence the need for caching the data. */ cacheData: function() { if ( !this.$ ) { return; } var that = this, i, file, files; function getAndSetData( type ) { type = that._.normalizeType( type ); var data = that.getData( type ); // Cache full html. if ( type == 'text/html' ) { that._.nativeHtmlCache = that.getData( type, true ); data = that._stripHtml( data ); } if ( data ) { that._.data[ type ] = data; } // Cache type itself (#4604). that._.types.push( type ); } // Copy data. if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) { if ( this.$.types ) { for ( i = 0; i < this.$.types.length; i++ ) { getAndSetData( this.$.types[ i ] ); } } } else { getAndSetData( 'Text' ); getAndSetData( 'URL' ); } // Copy files references. file = this._getImageFromClipboard(); // Only access .files once - it's expensive in Chrome (#4807). files = this.$ && this.$.files || null; if ( files || file ) { this._.files = []; // Edge have empty files property with no length (https://dev.ckeditor.com/ticket/13755). if ( files && files.length ) { for ( i = 0; i < files.length; i++ ) { this._.files.push( files[ i ] ); } } // Don't include $.items if both $.files and $.items contains files, because, // according to spec and browsers behavior, they contain the same files. if ( this._.files.length === 0 && file ) { this._.files.push( file ); } } }, /** * Gets the number of files in the dataTransfer object. * * @returns {Number} The number of files. */ getFilesCount: function() { if ( this._.files.length ) { return this._.files.length; } // Only access .files once - it's expensive in Chrome (#4807). var files = this.$ && this.$.files || null; if ( files && files.length ) { return files.length; } return this._getImageFromClipboard() ? 1 : 0; }, /** * Gets the file at the index given. * * @param {Number} i Index. * @returns {File} File instance. */ getFile: function( i ) { if ( this._.files.length ) { return this._.files[ i ]; } // Only access .files once - it's expensive in Chrome (#4807). var files = this.$ && this.$.files || null; if ( files && files.length ) { return files[ i ]; } // File or null if the file was not found. return i === 0 ? this._getImageFromClipboard() : undefined; }, /** * Checks if the data transfer contains only files. * * @since 4.17.0 * @returns {Boolean} `true` if the object contains only files. */ isFileTransfer: function() { var types = this.getTypes(), // Firefox uses application/x-moz-file type for dropped local files. filteredTypes = CKEDITOR.tools.array.filter( types, function( type ) { return type !== 'application/x-moz-file'; } ); return filteredTypes.length === 1 && filteredTypes[ 0 ].toLowerCase() === 'files'; }, /** * Checks if the data transfer contains any data. * * @returns {Boolean} `true` if the object contains no data. */ isEmpty: function() { var typesToCheck = {}, type; // If dataTransfer contains files it is not empty. if ( this.getFilesCount() ) { return false; } CKEDITOR.tools.array.forEach( CKEDITOR.tools.object.keys( this._.data ), function( type ) { typesToCheck[ type ] = 1; } ); // Add native types. if ( this.$ ) { if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) { if ( this.$.types ) { for ( var i = 0; i < this.$.types.length; i++ ) { typesToCheck[ this.$.types[ i ] ] = 1; } } } else { typesToCheck.Text = 1; typesToCheck.URL = 1; } } // Remove ID. if ( clipboardIdDataType != 'Text' ) { typesToCheck[ clipboardIdDataType ] = 0; } for ( type in typesToCheck ) { if ( typesToCheck[ type ] && this.getData( type ) !== '' ) { return false; } } return true; }, /** * Returns all MIME types inside the clipboard data. * * @since 4.13.1 * @returns {String[]} */ getTypes: function() { if ( this._.types.length > 0 ) { return this._.types; } if ( !this.$ || !this.$.types ) { return []; } return [].slice.call( this.$.types ); }, /** * When the content of the clipboard is pasted in Chrome, the clipboard data object has an empty `files` property, * but it is possible to get the file as `items[0].getAsFile();` (https://dev.ckeditor.com/ticket/12961). * * @private * @returns {File} File instance or `null` if not found. */ _getImageFromClipboard: function() { var file; try { if ( this.$ && this.$.items && this.$.items[ 0 ] ) { file = this.$.items[ 0 ].getAsFile(); // Duck typing if ( file && file.type ) { return file; } } } catch ( err ) { // noop } return undefined; }, /** * This function removes this meta information and returns only the contents of the `` element if found. * * Various environments use miscellaneous meta tags in HTML clipboard, e.g. * * * `` at the begging of the HTML data. * * Surrounding HTML with `` and `` nested within `` elements. * * @private * @param {String} html * @returns {String} */ _stripHtml: function( html ) { var result = html; // Passed HTML may be empty or null. There is no need to strip such values (#1299). if ( result && result.length ) { result = extractBodyContent( result ); // See https://dev.ckeditor.com/ticket/13583 for more details. // Additionally https://dev.ckeditor.com/ticket/16847 adds a flag allowing to get the whole, original content. result = result.replace( this._.metaRegExp, '' ); // Remove also comments. result = result.replace( this._.fragmentRegExp, '' ); } return result; function extractBodyContent( html ) { var parser = new CKEDITOR.htmlParser(), start, end; parser.onTagOpen = function( name ) { if ( name === 'body' ) { start = parser._.htmlPartsRegex.lastIndex; } }; parser.onTagClose = function( name ) { if ( name === 'body' ) { end = parser._.htmlPartsRegex.lastIndex; } }; parser.parse( html ); if ( typeof start !== 'number' || typeof end !== 'number' ) { return html; } return html.substring( start, end ).replace( /<\/body\s*>$/gi, '' ); } } }; /** * Fallback dataTransfer object which is used together with {@link CKEDITOR.plugins.clipboard.dataTransfer} * for browsers supporting Clipboard API, but not supporting custom * MIME types (Edge 16+, see [ckeditor4/issues/#962](https://github.com/ckeditor/ckeditor4/issues/962)). * * @since 4.8.0 * @class CKEDITOR.plugins.clipboard.fallbackDataTransfer * @constructor * @param {CKEDITOR.plugins.clipboard.dataTransfer} dataTransfer DataTransfer * object which internal cache and * {@link CKEDITOR.plugins.clipboard.dataTransfer#$ data transfer} objects will be reused. */ CKEDITOR.plugins.clipboard.fallbackDataTransfer = function( dataTransfer ) { /** * DataTransfer object which internal cache and * {@link CKEDITOR.plugins.clipboard.dataTransfer#$ data transfer} objects will be modified if needed. * * @private * @property {CKEDITOR.plugins.clipboard.dataTransfer} _dataTransfer */ this._dataTransfer = dataTransfer; /** * A MIME type used for storing custom MIME types. * * @private * @property {String} [_customDataFallbackType='text/html'] */ this._customDataFallbackType = 'text/html'; }; /** * True if the environment supports custom MIME types in {@link CKEDITOR.plugins.clipboard.dataTransfer#getData} * and {@link CKEDITOR.plugins.clipboard.dataTransfer#setData} methods. * * Introduced to distinguish between browsers which support only some whitelisted types (like `text/html`, `application/xml`), * but do not support custom MIME types (like `cke/id`). When the value of this property equals `null` * it means it was not yet initialized. * * This property should not be accessed directly, use {@link #isRequired} method instead. * * @private * @static * @property {Boolean} */ CKEDITOR.plugins.clipboard.fallbackDataTransfer._isCustomMimeTypeSupported = null; /** * Array containing MIME types which are not supported by native `setData`. Those types are * recognized by error which is thrown when using native `setData` with a given type * (see {@link CKEDITOR.plugins.clipboard.fallbackDataTransfer#_isUnsupportedMimeTypeError}). * * @private * @static * @property {String[]} */ CKEDITOR.plugins.clipboard.fallbackDataTransfer._customTypes = []; CKEDITOR.plugins.clipboard.fallbackDataTransfer.prototype = { /** * Whether {@link CKEDITOR.plugins.clipboard.fallbackDataTransfer fallbackDataTransfer object} should * be used when operating on native `dataTransfer`. If `true` is returned, it means custom MIME types * are not supported in the current browser (see {@link #_isCustomMimeTypeSupported}). * * @returns {Boolean} */ isRequired: function() { var fallbackDataTransfer = CKEDITOR.plugins.clipboard.fallbackDataTransfer, nativeDataTransfer = this._dataTransfer.$; if ( fallbackDataTransfer._isCustomMimeTypeSupported === null ) { // If there is no `dataTransfer` we cannot detect if fallback is needed. // Method returns `false` so regular flow will be applied. if ( !nativeDataTransfer ) { return false; } else { var testValue = 'cke test value', testType = 'cke/mimetypetest'; fallbackDataTransfer._isCustomMimeTypeSupported = false; // It looks like after our custom MIME type test Edge 17 is denying access on nativeDataTransfer (#2169). // Upstream issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/18089287/ if ( CKEDITOR.env.edge && CKEDITOR.env.version >= 17 ) { return true; } try { nativeDataTransfer.setData( testType, testValue ); fallbackDataTransfer._isCustomMimeTypeSupported = nativeDataTransfer.getData( testType ) === testValue; nativeDataTransfer.clearData( testType ); } catch ( e ) {} } } return !fallbackDataTransfer._isCustomMimeTypeSupported; }, /** * Returns the data of the given MIME type if stored in a regular way or in a special comment. If given type * is the same as {@link #_customDataFallbackType} the whole data without special comment is returned. * * @param {String} type * @param {Boolean} [getNative=false] Indicates if the whole, original content of the dataTransfer should be returned. * @returns {String} */ getData: function( type, getNative ) { // As cache is already checked in CKEDITOR.plugins.clipboard.dataTransfer#getData it is skipped // here. So the assumption is the given type is not in cache. var nativeData = this._getData( this._customDataFallbackType, true ); if ( getNative ) { return nativeData; } var dataComment = this._extractDataComment( nativeData ), value = null; // If we are getting the same type which may store custom data we need to extract content only. if ( type === this._customDataFallbackType ) { value = dataComment.content; } else { // If we are getting different type we need to check inside data comment if it is stored there. if ( dataComment.data && dataComment.data[ type ] ) { value = dataComment.data[ type ]; } else { // And then fallback to regular `getData`. value = this._getData( type, true ); } } return value !== null ? value : ''; }, /** * Sets given data in native `dataTransfer` object. If given MIME type is not supported it uses * {@link #_customDataFallbackType} MIME type to save data using special comment format: * * * * It is important to keep in mind that `{ type: value }` object is stringified (using `JSON.stringify`) * and encoded (using `encodeURIComponent`). * * @param {String} type * @param {String} value * @returns {String} The value which was set. */ setData: function( type, value ) { // In case of fallbackDataTransfer, cache does not reflect native data one-to-one. For example, having // types like text/plain, text/html, cke/id will result in cache storing: // // { // text/plain: value1, // text/html: value2, // cke/id: value3 // } // // and native dataTransfer storing: // // { // text/plain: value1, // text/html: value2 // } // // This way, accessing cache will always return proper value for a given type without a need for further processing. // Cache is already set in CKEDITOR.plugins.clipboard.dataTransfer#setData so it is skipped here. var isFallbackDataType = type === this._customDataFallbackType; if ( isFallbackDataType ) { value = this._applyDataComment( value, this._getFallbackTypeData() ); } var data = value, nativeDataTransfer = this._dataTransfer.$; try { nativeDataTransfer.setData( type, data ); if ( isFallbackDataType ) { // If fallback type used, the native data is different so we overwrite `nativeHtmlCache` here. this._dataTransfer._.nativeHtmlCache = data; } } catch ( e ) { if ( this._isUnsupportedMimeTypeError( e ) ) { var fallbackDataTransfer = CKEDITOR.plugins.clipboard.fallbackDataTransfer; if ( CKEDITOR.tools.indexOf( fallbackDataTransfer._customTypes, type ) === -1 ) { fallbackDataTransfer._customTypes.push( type ); } var fallbackTypeContent = this._getFallbackTypeContent(), fallbackTypeData = this._getFallbackTypeData(); fallbackTypeData[ type ] = data; try { data = this._applyDataComment( fallbackTypeContent, fallbackTypeData ); nativeDataTransfer.setData( this._customDataFallbackType, data ); // Again, fallback type was changed, so we need to refresh the cache. this._dataTransfer._.nativeHtmlCache = data; } catch ( e ) { data = ''; // Some dev logger should be added here. } } } return data; }, /** * Native getData wrapper. * * @private * @param {String} type * @param {Boolean} [skipCache=false] * @returns {String|null} */ _getData: function( type, skipCache ) { var cache = this._dataTransfer._.data; if ( !skipCache && cache[ type ] ) { return cache[ type ]; } else { try { return this._dataTransfer.$.getData( type ); } catch ( e ) { return null; } } }, /** * Returns content stored in {@link #\_customDataFallbackType}. Content is always first retrieved * from {@link #_dataTransfer} cache and then from native `dataTransfer` object. * * @private * @returns {String} */ _getFallbackTypeContent: function() { var fallbackTypeContent = this._dataTransfer._.data[ this._customDataFallbackType ]; if ( !fallbackTypeContent ) { fallbackTypeContent = this._extractDataComment( this._getData( this._customDataFallbackType, true ) ).content; } return fallbackTypeContent; }, /** * Returns custom data stored in {@link #\_customDataFallbackType}. Custom data is always first retrieved * from {@link #_dataTransfer} cache and then from native `dataTransfer` object. * * @private * @returns {Object} */ _getFallbackTypeData: function() { var fallbackTypes = CKEDITOR.plugins.clipboard.fallbackDataTransfer._customTypes, fallbackTypeData = this._extractDataComment( this._getData( this._customDataFallbackType, true ) ).data || {}, cache = this._dataTransfer._.data; CKEDITOR.tools.array.forEach( fallbackTypes, function( type ) { if ( cache[ type ] !== undefined ) { fallbackTypeData[ type ] = cache[ type ]; } else if ( fallbackTypeData[ type ] !== undefined ) { fallbackTypeData[ type ] = fallbackTypeData[ type ]; } }, this ); return fallbackTypeData; }, /** * Whether provided error means that unsupported MIME type was used when calling native `dataTransfer.setData` method. * * @private * @param {Error} error * @returns {Boolean} */ _isUnsupportedMimeTypeError: function( error ) { return error.message && error.message.search( /element not found/gi ) !== -1; }, /** * Extracts `cke-data` comment from the given content. * * @private * @param {String} content * @returns {Object} Returns an object containing extracted data as `data` * and content (without `cke-data` comment) as `content`. * @returns {Object|null} return.data Object containing `MIME type : value` pairs * or null if `cke-data` comment is not present. * @returns {String} return.content Regular content without `cke-data` comment. */ _extractDataComment: function( content ) { var result = { data: null, content: content || '' }; // At least 17 characters length: . if ( content && content.length > 16 ) { var matcher = //g, matches; matches = matcher.exec( content ); if ( matches && matches[ 1 ] ) { result.data = JSON.parse( decodeURIComponent( matches[ 1 ] ) ); result.content = content.replace( matches[ 0 ], '' ); } } return result; }, /** * Creates `cke-data` comment containing stringified and encoded data object which is prepended to a given content. * * @private * @param {String} content * @param {Object} data * @returns {String} */ _applyDataComment: function( content, data ) { var customData = ''; if ( data && CKEDITOR.tools.object.keys( data ).length ) { customData = ''; } return customData + ( content && content.length ? content : '' ); } }; } )(); /** * The default content type that is used when pasted data cannot be clearly recognized as HTML or text. * * For example: `'foo'` may come from a plain text editor or a website. It is not possible to recognize the content * type in this case, so the default type will be used. At the same time it is clear that `'example text'` is * HTML and its origin is a web page, email or another rich text editor. * * **Note:** If content type is text, then styles of the paste context are preserved. * * CKEDITOR.config.clipboard_defaultContentType = 'text'; * * See also the {@link CKEDITOR.editor#paste} event and read more about the integration with clipboard * in the {@glink guide/dev_clipboard Clipboard Deep Dive guide}. * * @since 4.0.0 * @cfg {'html'/'text'} [clipboard_defaultContentType='html'] * @member CKEDITOR.config */ /** * Fired after the user initiated a paste action, but before the data is inserted into the editor. * The listeners to this event are able to process the content before its insertion into the document. * * Read more about the integration with clipboard in the {@glink guide/dev_clipboard Clipboard Deep Dive guide}. * * See also: * * * the {@link CKEDITOR.config#pasteFilter} option, * * the {@link CKEDITOR.editor#drop} event, * * the {@link CKEDITOR.plugins.clipboard.dataTransfer} class. * * @since 3.1.0 * @event paste * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param data * @param {String} data.type The type of data in `data.dataValue`. Usually `'html'` or `'text'`, but for listeners * with a priority smaller than `6` it may also be `'auto'` which means that the content type has not been recognised yet * (this will be done by the content type sniffer that listens with priority `6`). * @param {String} data.dataValue HTML to be pasted. * @param {String} data.method Indicates the data transfer method. It could be drag and drop or copy and paste. * Possible values: `'drop'`, `'paste'`. Introduced in CKEditor 4.5. * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer Facade for the native dataTransfer object * which provides access to various data types and files, and passes some data between linked events * (like drag and drop). Introduced in CKEditor 4.5. * @param {Boolean} [data.dontFilter=false] Whether the {@link CKEDITOR.editor#pasteFilter paste filter} should not * be applied to data. This option has no effect when `data.type` equals `'text'` which means that for instance * {@link CKEDITOR.config#forcePasteAsPlainText} has a higher priority. Introduced in CKEditor 4.5. */ /** * Fired before the {@link #paste} event. Allows to preset data type. * * **Note:** This event is deprecated. Add a `0` priority listener for the * {@link #paste} event instead. * * @deprecated * @event beforePaste * @member CKEDITOR.editor */ /** * Fired after the {@link #paste} event if content was modified. Note that if the paste * event does not insert any data, the `afterPaste` event will not be fired. * * @event afterPaste * @member CKEDITOR.editor */ /** * Internal event to open the Paste dialog window. * * * This event was not available in 4.7.0-4.8.0 versions. * * @private * @event pasteDialog * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param {Function} [data] Callback that will be passed to {@link CKEDITOR.editor#openDialog}. */ /** * Facade for the native `drop` event. Fired when the native `drop` event occurs. * * **Note:** To manipulate dropped data, use the {@link CKEDITOR.editor#paste} event. * Use the `drop` event only to control drag and drop operations (e.g. to prevent the ability to drop some content). * * Read more about integration with drag and drop in the {@glink guide/dev_clipboard Clipboard Deep Dive guide}. * * See also: * * * The {@link CKEDITOR.editor#paste} event, * * The {@link CKEDITOR.editor#dragstart} and {@link CKEDITOR.editor#dragend} events, * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class. * * @since 4.5.0 * @event drop * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param data * @param {Object} data.$ Native drop event. * @param {CKEDITOR.dom.node} data.target Drop target. * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. * @param {CKEDITOR.dom.range} data.dragRange Drag range, lets you manipulate the drag range. * Note that dragged HTML is saved as `text/html` data on `dragstart` so if you change the drag range * on drop, dropped HTML will not change. You need to change it manually using * {@link CKEDITOR.plugins.clipboard.dataTransfer#setData dataTransfer.setData}. * @param {CKEDITOR.dom.range} data.dropRange Drop range, lets you manipulate the drop range. */ /** * Facade for the native `dragstart` event. Fired when the native `dragstart` event occurs. * * This event can be canceled in order to block the drag start operation. It can also be fired to mimic the start of the drag and drop * operation. For instance, the `widget` plugin uses this option to integrate its custom block widget drag and drop with * the entire system. * * Read more about integration with drag and drop in the {@glink guide/dev_clipboard Clipboard Deep Dive guide}. * * See also: * * * The {@link CKEDITOR.editor#paste} event, * * The {@link CKEDITOR.editor#drop} and {@link CKEDITOR.editor#dragend} events, * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class. * * @since 4.5.0 * @event dragstart * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param data * @param {Object} data.$ Native dragstart event. * @param {CKEDITOR.dom.node} data.target Drag target. * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. */ /** * Facade for the native `dragend` event. Fired when the native `dragend` event occurs. * * Read more about integration with drag and drop in the {@glink guide/dev_clipboard Clipboard Deep Dive guide}. * * See also: * * * The {@link CKEDITOR.editor#paste} event, * * The {@link CKEDITOR.editor#drop} and {@link CKEDITOR.editor#dragend} events, * * The {@link CKEDITOR.plugins.clipboard.dataTransfer} class. * * @since 4.5.0 * @event dragend * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param data * @param {Object} data.$ Native dragend event. * @param {CKEDITOR.dom.node} data.target Drag target. * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. */ /** * Defines a filter which is applied to external data pasted or dropped into the editor. Possible values are: * * * `'plain-text'` – Content will be pasted as a plain text. * * `'semantic-content'` – Known tags (except `div`, `span`) with all attributes (except * `style` and `class`) will be kept. * * `'h1 h2 p div'` – Custom rules compatible with {@link CKEDITOR.filter}. * * `null` – Content will not be filtered by the paste filter (but it still may be filtered * by {@glink guide/dev_advanced_content_filter Advanced Content Filter}). This value can be used to * disable the paste filter in Chrome and Safari, where this option defaults to `'semantic-content'`. * * Example: * * config.pasteFilter = 'plain-text'; * * Custom setting: * * config.pasteFilter = 'h1 h2 p ul ol li; img[!src, alt]; a[!href]'; * * Based on this configuration option, a proper {@link CKEDITOR.filter} instance will be defined and assigned to the editor * as a {@link CKEDITOR.editor#pasteFilter}. You can tweak the paste filter settings on the fly on this object * as well as delete or replace it. * * var editor = CKEDITOR.replace( 'editor', { * pasteFilter: 'semantic-content' * } ); * * editor.on( 'instanceReady', function() { * // The result of this will be that all semantic content will be preserved * // except tables. * editor.pasteFilter.disallow( 'table' ); * } ); * * Note that the paste filter is applied only to **external** data. There are three data sources: * * * copied and pasted in the same editor (internal), * * copied from one editor and pasted into another (cross-editor), * * coming from all other sources like websites, MS Word, etc. (external). * * If {@link CKEDITOR.config#allowedContent Advanced Content Filter} is not disabled, then * it will also be applied to pasted and dropped data. The paste filter job is to "normalize" * external data which often needs to be handled differently than content produced by the editor. * * This setting defaults to `'semantic-content'` in Chrome, Opera and Safari (all Blink and Webkit based browsers) * due to messy HTML which these browsers keep in the clipboard. In other browsers it defaults to `null`. * * @since 4.5.0 * @cfg {String} [pasteFilter='semantic-content' in Chrome and Safari and `null` in other browsers] * @member CKEDITOR.config */ /** * {@link CKEDITOR.filter Content filter} which is used when external data is pasted or dropped into the editor * or a forced paste as plain text occurs. * * This object might be used on the fly to define rules for pasted external content. * This object is available and used if the {@link CKEDITOR.plugins.clipboard clipboard} plugin is enabled and * {@link CKEDITOR.config#pasteFilter} or {@link CKEDITOR.config#forcePasteAsPlainText} was defined. * * To enable the filter: * * var editor = CKEDITOR.replace( 'editor', { * pasteFilter: 'plain-text' * } ); * * You can also modify the filter on the fly later on: * * editor.pasteFilter = new CKEDITOR.filter( 'p h1 h2; a[!href]' ); * * Note that the paste filter is only applied to **external** data. There are three data sources: * * * copied and pasted in the same editor (internal), * * copied from one editor and pasted into another (cross-editor), * * coming from all other sources like websites, MS Word, etc. (external). * * If {@link CKEDITOR.config#allowedContent Advanced Content Filter} is not disabled, then * it will also be applied to pasted and dropped data. The paste filter job is to "normalize" * external data which often needs to be handled differently than content produced by the editor. * * @since 4.5.0 * @readonly * @property {CKEDITOR.filter} [pasteFilter] * @member CKEDITOR.editor */ /** * Duration of the notification displayed after pasting was blocked by the browser. * * @since 4.7.0 * @cfg {Number} [clipboard_notificationDuration=10000] * @member CKEDITOR.config */ CKEDITOR.config.clipboard_notificationDuration = 10000; /** * Whether to use clipboard plugin to handle image pasting and dropping, * turning images into base64 strings on browsers supporting the File API. * * @since 4.17.0 * @cfg {Boolean} [clipboard_handleImages=true] * @member CKEDITOR.config */ CKEDITOR.config.clipboard_handleImages = true; rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/dev/0000755000201500020150000000000014515446705022772 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/dev/console.js0000644000201500020150000000210714515446705024772 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /* global CKCONSOLE */ 'use strict'; ( function() { var pasteType, pasteValue; CKCONSOLE.add( 'paste', { panels: [ { type: 'box', content: '

      ' + '
    • type:
    • ' + '
    • value:
    • ' + '
    ', refresh: function() { return { header: 'Paste', type: pasteType, value: pasteValue }; }, refreshOn: function( editor, refresh ) { editor.on( 'paste', function( evt ) { pasteType = evt.data.type; pasteValue = CKEDITOR.tools.htmlEncode( evt.data.dataValue ); refresh(); } ); } }, { type: 'log', on: function( editor, log, logFn ) { editor.on( 'paste', function( evt ) { logFn( 'paste; type:' + evt.data.type )(); } ); } } ] } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/dev/dnd.html0000644000201500020150000003351014515446705024427 0ustar puckpuck Manual test for https://dev.ckeditor.com/ticket/11460

    Manual test for #11460

    Description (hide/show)

    Test internal D&D in the editor, dropping content from an external source (helpers, MS Word) and D&D between editors. Keep in mind that internal D&D is the most complex operation because editor have to handle two ranges at the same time.

    Expected behavior:

    • proper drop position,
    • in the internal and cross editor D&D: dragged content should be removed,
    • dropped content should be (more less) the same as dragged content,
    • paste event should be fired,
    • undo should work properly (one undo operation for one D&D),
    • no crashes, nor errors,

    Drag scenarios:

    • drag simple text,
    • drag table cell/cells,
    • drag link,
    • drag helpers textarea content,
    • drag helpers html content,
    • drag content from MS Word.

    Drop scenarios:

    • drop in the different paragraph (before and after),
    • drop in the same paragraph (before and after),
    • drop in the same text node (before and after),
    • drop between text lines,
    • drop on the whitespace next to the header,
    • drop on the whitespace on the left side from the quote,
    • drop into a cell.

    Known issues (not part of this ticket):

    • because of #11636 dragged content is not correct in some cases (e.g. when you drag part of the link),
    • drag position needs clean up after D&D (e.g. remove empty paragraphs, fix table),
    • drop position needs clean up after D&D (e.g. add spaces before/after dropped content, apply parents styles, break paragraph when one paragraph is dropped at the end to the other paragraph),
    • in the external D&D: Chrome add plenty of addition tags.

    Helpers (hide/show)

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. In commodo vulputate tempor. Sed <b>at elit</b> vel ligula mollis aliquet a ac odio.
    Aenean cursus egestas ipsum.
    				

    Classic editor (hide/show)

    Inline editor (hide/show)

    Saturn V carrying Apollo 11 Apollo 11

    Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

    Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

    Broadcasting and quotes

    Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

    One small step for [a] man, one giant leap for mankind.

    Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

    [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

    Technical details

    Mission crew
    Position Astronaut
    Commander Neil A. Armstrong
    Command Module Pilot Michael Collins
    Lunar Module Pilot Edwin "Buzz" E. Aldrin, Jr.

    Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

    1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
    2. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
    3. Lunar Module for landing on the Moon.

    After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.


    Source: Wikipedia.org

    rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/dev/clipboard.html0000644000201500020150000001274014515446705025623 0ustar puckpuck Clipboard playground – CKEditor Sample

    CKEditor Sample — clipboard plugin playground

    Editor 6

    Content content content.

    Styled by .someClass.

    rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/0000755000201500020150000000000014515446705023135 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/zh.js0000644000201500020150000000160314515446705024114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'zh', { copy: '複製', copyError: '瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用鍵盤快捷鍵 (Ctrl/Cmd+C) 複製。', cut: '剪下', cutError: '瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用鏐盤快捷鍵 (Ctrl/Cmd+X) 剪下。', paste: '貼上', pasteNotification: '請按下「%1」貼上。您的瀏覽器不支援工具列按鈕或是內容功能表選項。', pasteArea: '貼上區', pasteMsg: '請將您的內容貼於下方區域中並按下「OK」。', fileFormatNotSupportedNotification: '不支援 ${formats} 檔案格式。', fileWithoutFormatNotSupportedNotification: '檔案格式不支援。' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/nb.js0000644000201500020150000000173714515446705024102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'nb', { copy: 'Kopier', copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).', cut: 'Klipp ut', cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).', paste: 'Lim inn', pasteNotification: 'Trykk %1 for å lime inn. Nettleseren din støtter ikke å lime inn med knappen i verktøylinjen eller høyreklikkmenyen.', pasteArea: 'Innlimingsområde', pasteMsg: 'Lim inn innholdet i området nedenfor og klikk OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/eo.js0000644000201500020150000000176214515446705024104 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'eo', { copy: 'Kopii', copyError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).', cut: 'Eltondi', cutError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).', paste: 'Interglui', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Intergluoareo', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/es.js0000644000201500020150000000202314515446705024077 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'es', { copy: 'Copiar', copyError: 'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).', cut: 'Cortar', cutError: 'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).', paste: 'Pegar', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Zona de pegado', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ro.js0000644000201500020150000000220514515446705024112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ro', { copy: 'Copiază', copyError: 'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).', cut: 'Tăiere', cutError: 'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).', paste: 'Adaugă', pasteNotification: 'Apasă %1 pentru adăugare. Navigatorul (browser) tău nu suportă adăugarea din clipboard cu butonul din toolbar sau cu opțiunea din meniul contextual.', pasteArea: 'Suprafața de adăugare', pasteMsg: 'Adaugă conținutul tău înăuntru zonei de mai jos și apasă OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/hr.js0000644000201500020150000000177014515446705024111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'hr', { copy: 'Kopiraj', copyError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).', cut: 'Izreži', cutError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).', paste: 'Zalijepi', pasteNotification: 'Vaš preglednik Vam ne dozvoljava lijepljenje običnog teksta na ovaj način. Za lijepljenje, pritisnite %1.', pasteArea: 'Okvir za lijepljenje', pasteMsg: 'Zalijepite vaš sadržaj u okvir ispod i pritisnite OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/it.js0000644000201500020150000000177614515446705024122 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'it', { copy: 'Copia', copyError: 'Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).', cut: 'Taglia', cutError: 'Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).', paste: 'Incolla', pasteNotification: 'Premere %1 per incollare. Il tuo browser non permette di incollare tramite il pulsante della barra degli strumenti o tramite la voce del menu contestuale.', pasteArea: 'Area dove incollare', pasteMsg: 'Incollare il proprio contenuto all\'interno dell\'area sottostante e premere OK.', fileFormatNotSupportedNotification: 'I file in formato ${formats} non sono supportati.', fileWithoutFormatNotSupportedNotification: 'Il formato di file non è supportato.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/de-ch.js0000644000201500020150000000216314515446705024455 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'de-ch', { copy: 'Kopieren', copyError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch zu kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).', cut: 'Ausschneiden', cutError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).', paste: 'Einfügen', pasteNotification: 'Drücken Sie %1 zum Einfügen. Ihr Browser unterstützt nicht das Einfügen über dem Knopf in der Werkzeugleiste oder dem Kontextmenü.', pasteArea: 'Einfügebereich', pasteMsg: 'Fügen Sie den Inhalt in den unteren Bereich ein und drücken Sie OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/sk.js0000644000201500020150000000207514515446705024114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'sk', { copy: 'Kopírovať', copyError: 'Bezpečnostné nastavenia vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Použite na to klávesnicu (Ctrl/Cmd+C).', cut: 'Vystrihnúť', cutError: 'Bezpečnostné nastavenia vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Použite na to klávesnicu (Ctrl/Cmd+X).', paste: 'Vložiť', pasteNotification: 'Stlačte %1 na vloženie. Váš prehliadač nepodporuje vloženie prostredníctvom tlačidla v nástrojovej lište alebo voľby v kontextovom menu.', pasteArea: 'Miesto pre vloženie', pasteMsg: 'Vložte svoj obsah do nasledujúcej oblasti a stlačte OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/az.js0000644000201500020150000000152414515446705024107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'az', { copy: 'Köçür', copyError: 'Avtomatik köçürülməsi mümkün deyil. Ctrl+C basın.', cut: 'Kəs', cutError: 'Avtomatik kəsmə mümkün deyil. Ctrl+X basın.', paste: 'Əlavə et', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/pt.js0000644000201500020150000000200314515446705024111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'pt', { copy: 'Copiar', copyError: 'A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).', cut: 'Cortar', cutError: 'A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).', paste: 'Colar', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Área de colagem', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/si.js0000644000201500020150000000214714515446705024112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'si', { copy: 'පිටපත් කරන්න', copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', // MISSING cut: 'කපාගන්න', cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING paste: 'අලවන්න', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'අලවන ප්‍රදේශ', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ko.js0000644000201500020150000000200614515446705024102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ko', { copy: '복사', copyError: '브라우저의 보안설정 때문에 복사할 수 없습니다. 키보드(Ctrl/Cmd+C)를 이용해서 복사하십시오.', cut: '잘라내기', cutError: '브라우저의 보안설정 때문에 잘라내기 기능을 실행할 수 없습니다. 키보드(Ctrl/Cmd+X)를 이용해서 잘라내기 하십시오', paste: '붙여넣기', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: '붙여넣기 범위', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/mk.js0000644000201500020150000000246514515446705024111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'mk', { copy: 'Копирај (Copy)', copyError: 'Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот автоматски да изврши копирање. Ве молиме употребете ја тастатурата. (Ctrl/Cmd+C)', cut: 'Исечи (Cut)', cutError: 'Опциите за безбедност на вашиот прелистувач не дозволуваат уредувачот автоматски да изврши сечење. Ве молиме употребете ја тастатурата. (Ctrl/Cmd+C)', paste: 'Залепи (Paste)', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Простор за залепување', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/cy.js0000644000201500020150000000201414515446705024103 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'cy', { copy: 'Copïo', copyError: '\'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu\'r golygydd i gynnal \'gweithredoedd copïo\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).', cut: 'Torri', cutError: 'Nid yw gosodiadau diogelwch eich porwr yn caniatàu\'r golygydd i gynnal \'gweithredoedd torri\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).', paste: 'Gludo', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Ardal Gludo', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/uk.js0000644000201500020150000000276314515446705024122 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'uk', { copy: 'Копіювати', copyError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).', cut: 'Вирізати', cutError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)', paste: 'Вставити', pasteNotification: 'Натисніть %1, щоб вставити. Ваш браузер не підтримує вставку за допомогою кнопки панелі інструментів або пункту контекстного меню.', pasteArea: 'Область вставки', pasteMsg: 'Вставте вміст у область нижче та натисніть OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/zh-cn.js0000644000201500020150000000166314515446705024520 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'zh-cn', { copy: '复制', copyError: '您的浏览器安全设置不允许编辑器自动执行复制操作,请使用键盘快捷键(Ctrl/Cmd+C)来完成。', cut: '剪切', cutError: '您的浏览器安全设置不允许编辑器自动执行剪切操作,请使用键盘快捷键(Ctrl/Cmd+X)来完成。', paste: '粘贴', pasteNotification: '您的浏览器不支持通过工具栏或右键菜单进行粘贴,请按 %1 进行粘贴。', pasteArea: '粘贴区域', pasteMsg: '将您的内容粘贴到下方区域,然后按确定。', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/sv.js0000644000201500020150000000167714515446705024136 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'sv', { copy: 'Kopiera', copyError: 'Säkerhetsinställningar i din webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.', cut: 'Klipp ut', cutError: 'Säkerhetsinställningar i din webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.', paste: 'Klistra in', pasteNotification: 'Tryck på %1 för att klistra in. Din webbläsare stödjer inte inklistring via verktygsfältet eller snabbmenyn.', pasteArea: 'Inklistringsområde', pasteMsg: 'Klistra in ditt innehåll i området nedan och tryck på OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/lt.js0000644000201500020150000000205514515446705024114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'lt', { copy: 'Kopijuoti', copyError: 'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).', cut: 'Iškirpti', cutError: 'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).', paste: 'Įdėti', pasteNotification: 'Spauskite %1 kad įkliuotumėte. Jūsų naršyklė nepalaiko įklijavimo paspaudus mygtuką arba kontekstinio menių galimybės.', pasteArea: 'Įkelti dalį', pasteMsg: 'Įklijuokite savo turinį į žemiau esantį lauką ir paspauskite OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/is.js0000644000201500020150000000174214515446705024112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'is', { copy: 'Afrita', copyError: 'Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).', cut: 'Klippa', cutError: 'Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).', paste: 'Líma', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/fr-ca.js0000644000201500020150000000206714515446705024470 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'fr-ca', { copy: 'Copier', copyError: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).', cut: 'Couper', cutError: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).', paste: 'Coller', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Coller la zone', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/et.js0000644000201500020150000000173614515446705024112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'et', { copy: 'Kopeeri', copyError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).', cut: 'Lõika', cutError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).', paste: 'Aseta', pasteNotification: 'Asetamiseks vajuta %1. Sinu brauser ei toeta asetamist tööriistariba nupu või kontekstimenüü valikuga.', pasteArea: 'Asetamise ala', pasteMsg: 'Aseta sisu alumisse kasti ja vajuta OK nupule.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/bs.js0000644000201500020150000000200514515446705024074 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'bs', { copy: 'Kopiraj', copyError: 'Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).', cut: 'Izreži', cutError: 'Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).', paste: 'Zalijepi', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/pl.js0000644000201500020150000000200614515446705024104 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'pl', { copy: 'Kopiuj', copyError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.', cut: 'Wytnij', cutError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.', paste: 'Wklej', pasteNotification: 'Naciśnij %1 by wkleić tekst. Twoja przeglądarka nie pozwala na wklejanie za pomocą przycisku paska narzędzi lub opcji menu kontekstowego.', pasteArea: 'Miejsce do wklejenia treści', pasteMsg: 'Wklej treść do obszaru poniżej i naciśnij OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/bg.js0000644000201500020150000000267714515446705024077 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'bg', { copy: 'Копирай', copyError: 'Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни действията по копиране. За целта използвайте клавиатурата (Ctrl+C).', cut: 'Отрежи', cutError: 'Настройките за сигурност на вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. За целта използвайте клавиатурата (Ctrl+X).', paste: 'Вмъкни', pasteNotification: 'Натиснете %1 за да вмъкнете. Вашият браузър не поддържа поставяне с бутон от лентата с инструменти или от контекстното меню.', pasteArea: 'Зона за поставяне', pasteMsg: 'Поставете съдържанието в зоната отдолу и натиснете OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/fa.js0000644000201500020150000000260114515446705024060 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'fa', { copy: 'رونوشت', copyError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).', cut: 'برش', cutError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).', paste: 'چسباندن', pasteNotification: '1% را فشاردهید تا قرار داده شود. مرورگر شما از قراردهی با دکمه نوارابزار یا گزینه منوی زمینه پشتیبانی نمیکند', pasteArea: 'محل چسباندن', pasteMsg: 'محتوای خود را در ناحیه زیر قرار دهید و OK را فشار دهید', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ku.js0000644000201500020150000000253214515446705024114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ku', { copy: 'لەبەرگرتنەوە', copyError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).', cut: 'بڕین', cutError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).', paste: 'لکاندن', pasteNotification: 'کلیک بکە لەسەر %1 بۆ لکاندنی. وێبگەڕەکەت پشتیوانی لکاندن ناکات بە دوگمەی تولامراز یان ئامرازی ناوەڕۆکی لیستە - کلیکی دەستی ڕاست. ', pasteArea: 'ناوچەی لکاندن', pasteMsg: 'ناوەڕۆکەکەت لەم پانتایی خوارەوە بلکێنە', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/bn.js0000644000201500020150000000275514515446705024103 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'bn', { copy: 'কপি', copyError: 'আপনার ব্রাউজারের নিরাপত্তা সেটিংসমূহ এডিটরকে স্বয়ংক্রিয়ভাবে কপি করার প্রক্রিয়া চালনা করার অনুমতি দেয় না। অনুগ্রহপূর্বক এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।', cut: 'কাট', cutError: 'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।', paste: 'পেস্ট', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/el.js0000644000201500020150000000300614515446705024072 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'el', { copy: 'Αντιγραφή', copyError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).', cut: 'Αποκοπή', cutError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).', paste: 'Επικόλληση', pasteNotification: 'Πατήστε %1 για επικόλληση. Ο φυλλομετρητής σας δεν υποστηρίζει επικόλληση με το κουμπί της γραμμής εργαλείων ή την επιλογή από το μενού δεξιού κλικ.', pasteArea: 'Περιοχή Επικόλλησης', pasteMsg: 'Επικολλήστε το περιεχόμενό σας μέσα στην περιοχή παρακάτω και πατήστε Εντάξει.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/fi.js0000644000201500020150000000171214515446705024072 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'fi', { copy: 'Kopioi', copyError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).', cut: 'Leikkaa', cutError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).', paste: 'Liitä', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Leikealue', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ru.js0000644000201500020150000000270314515446705024123 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ru', { copy: 'Копировать', copyError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).', cut: 'Вырезать', cutError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).', paste: 'Вставить', pasteNotification: 'Для вставки нажмите %1. Ваш браузер не поддерживает возможность вставки через панель инструментов или контекстное меню', pasteArea: 'Область вставки', pasteMsg: 'Вставьте контент в эту область и нажмите OK', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/gl.js0000644000201500020150000000200114515446705024066 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'gl', { copy: 'Copiar', copyError: 'Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).', cut: 'Cortar', cutError: 'Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).', paste: 'Pegar', pasteNotification: 'Prema %1 para pegar. O seu navegador non admite pegar co botón da barra de ferramentas ou coa opción do menú contextual.', pasteArea: 'Zona de pegado', pasteMsg: 'Pegue o contido dentro da área de abaixo e prema Aceptar.', fileFormatNotSupportedNotification: 'Os formatos de ficheiro ${formats} non son compatíbeis.', fileWithoutFormatNotSupportedNotification: 'O formato de ficheiro non está admitido.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/sr-latn.js0000644000201500020150000000177614515446705025066 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'sr-latn', { copy: 'Kopiraj', copyError: 'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).', cut: 'Iseci', cutError: 'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).', paste: 'Zalepi', pasteNotification: '"Pritisnite taster %1 za lepljenje. Vaš pretraživač ne dozvoljava lepljenje iz alatne trake ili menia.', pasteArea: 'Prostor za lepljenje', pasteMsg: 'Nalepite sadržaj u sledeći prostor i pritisnite taster OK.', fileFormatNotSupportedNotification: 'Formati datoteke ${formats} nisu podržani.', fileWithoutFormatNotSupportedNotification: 'Format datoteke nije podržan.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/oc.js0000644000201500020150000000214414515446705024075 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'oc', { copy: 'Copiar', copyError: 'Los paramètres de seguretat de vòstre navigador autorizan pas l\'editor a executar automaticament l\'operacion « Copiar ». Utilizatz l\'acorchi de clavièr a aqueste efièit (Ctrl/Cmd+C).', cut: 'Talhar', cutError: 'Los paramètres de seguretat de vòstre navigador autorizan pas l\'editor a executar automaticament l\'operacion « Talhar ». Utilizatz l\'acorchi de clavièr a aqueste efièit (Ctrl/Cmd+X).', paste: 'Pegar', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/sq.js0000644000201500020150000000214214515446705024115 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'sq', { copy: 'Kopjo', copyError: 'Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).', cut: 'Preje', cutError: 'Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).', paste: 'Hidhe', pasteNotification: 'Shtyp %1 për të hedhur tekstin. Shfletuesi juaj nuk mbështetë hedhjen me pullë shiriti ose alternativën e menysë kontekstuale.', pasteArea: 'Hapësira e Hedhjes', pasteMsg: 'Hidh përmbajtjen brenda hapësirës më poshtë dhe shtyp MIRË.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/pt-br.js0000644000201500020150000000206014515446705024515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'pt-br', { copy: 'Copiar', copyError: 'As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).', cut: 'Recortar', cutError: 'As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).', paste: 'Colar', pasteNotification: 'Pressione %1 para colar. Seu navegador não permite colar pelos botões da barra de tarefas ou pelo menu de contexto.', pasteArea: 'Área para Colar', pasteMsg: 'Cole o conteúdo na área abaixo e pressione OK.', fileFormatNotSupportedNotification: 'Os formatos de arquivo ${formats} não são suportados.', fileWithoutFormatNotSupportedNotification: 'Formato de arquivo não suportado.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/fo.js0000644000201500020150000000200214515446705024071 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'fo', { copy: 'Avrita', copyError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).', cut: 'Kvett', cutError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).', paste: 'Innrita', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Avritingarumráði', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/af.js0000644000201500020150000000163714515446705024070 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'af', { copy: 'Kopiëer', copyError: 'U leser se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).', cut: 'Uitsnei', cutError: 'U leser se sekuriteitsinstelling belet die outomatiese uitsnei-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).', paste: 'Byvoeg', pasteNotification: 'Druk %1 om by te voeg. You leser ondersteun nie die toolbar knoppie of inoud kieslysie opsie nie. ', pasteArea: 'Area byvoeg', pasteMsg: 'Voeg jou inhoud in die gebied onder by en druk OK', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/hi.js0000644000201500020150000000235714515446705024102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'hi', { copy: 'कॉपी', copyError: 'आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।', cut: 'कट', cutError: 'आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।', paste: 'पेस्ट', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/km.js0000644000201500020150000000324314515446705024104 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'km', { copy: 'ចម្លង', copyError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។', cut: 'កាត់យក', cutError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។', paste: 'បិទ​ភ្ជាប់', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'តំបន់​បិទ​ភ្ជាប់', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/nl.js0000644000201500020150000000173314515446705024110 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'nl', { copy: 'Kopiëren', copyError: 'De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.', cut: 'Knippen', cutError: 'De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.', paste: 'Plakken', pasteNotification: 'Plakken met de knop in de werkbalk wordt niet ondersteund door de browser. Gebruik de sneltoets %1 van het toetsenbord.', pasteArea: 'Plakgebied', pasteMsg: 'Plak de inhoud in het vak hieronder en druk op OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ka.js0000644000201500020150000000305114515446705024065 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ka', { copy: 'ასლი', copyError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).', cut: 'ამოჭრა', cutError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).', paste: 'ჩასმა', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'ჩასმის არე', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/es-mx.js0000644000201500020150000000206314515446705024525 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'es-mx', { copy: 'Copiar', copyError: 'La configuración de seguridad de su navegador no permite al editor ejecutar automáticamente operaciones de copiado. Por favor, utilice el teclado para (Ctrl/Cmd+C).', cut: 'Cortar', cutError: 'La configuración de seguridad de su navegador no permite al editor ejecutar automáticamente operaciones de corte. Por favor, utilice el teclado para (Ctrl/Cmd+X).', paste: 'Pegar', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/mn.js0000644000201500020150000000231114515446705024102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'mn', { copy: 'Хуулах', copyError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.', cut: 'Хайчлах', cutError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.', paste: 'Буулгах', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/da.js0000644000201500020150000000205314515446705024057 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'da', { copy: 'Kopiér', copyError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen. Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).', cut: 'Klip', cutError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen. Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).', paste: 'Indsæt', pasteNotification: 'Tryk %1 for at sætte ind. Din browser understøtter ikke indsættelse med værktøjslinje knappen eller kontekst menuen.', pasteArea: 'Indsættelses område', pasteMsg: 'Indsæt dit indhold i området nedenfor og tryk OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/he.js0000644000201500020150000000214714515446705024073 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'he', { copy: 'העתקה', copyError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).', cut: 'גזירה', cutError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).', paste: 'הדבקה', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'איזור הדבקה', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ca.js0000644000201500020150000000204314515446705024055 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ca', { copy: 'Copiar', copyError: 'La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).', cut: 'Retallar', cutError: 'La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).', paste: 'Enganxar', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Àrea d\'enganxat', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/gu.js0000644000201500020150000000231714515446705024111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'gu', { copy: 'નકલ', copyError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।', cut: 'કાપવું', cutError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.', paste: 'પેસ્ટ', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'પેસ્ટ કરવાની જગ્યા', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ms.js0000644000201500020150000000172614515446705024120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ms', { copy: 'Salin', copyError: 'Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).', cut: 'Potong', cutError: 'Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).', paste: 'Tampal', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/th.js0000644000201500020150000000277614515446705024122 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'th', { copy: 'สำเนา', copyError: 'ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).', cut: 'ตัด', cutError: 'ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).', paste: 'วาง', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/de.js0000644000201500020150000000215114515446705024062 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'de', { copy: 'Kopieren', copyError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch zu kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).', cut: 'Ausschneiden', cutError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).', paste: 'Einfügen', pasteNotification: 'Drücken Sie %1 zum Einfügen. Ihr Browser unterstützt nicht das Einfügen über den Knopf in der Toolbar oder dem Kontextmenü.', pasteArea: 'Einfügebereich', pasteMsg: 'Fügen Sie den Inhalt in den unteren Bereich ein und drücken Sie OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/en-ca.js0000644000201500020150000000201214515446705024451 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'en-ca', { copy: 'Copy', copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', cut: 'Cut', cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', paste: 'Paste', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/tt.js0000644000201500020150000000223214515446705024121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'tt', { copy: 'Күчермәләү', copyError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.', cut: 'Кисеп алу', cutError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.', paste: 'Өстәү', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Өстәү мәйданы', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/vi.js0000644000201500020150000000212214515446705024106 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'vi', { copy: 'Sao chép', copyError: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).', cut: 'Cắt', cutError: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).', paste: 'Dán', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Khu vực dán', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/cs.js0000644000201500020150000000223114515446705024076 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'cs', { copy: 'Kopírovat', copyError: 'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).', cut: 'Vyjmout', cutError: 'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).', paste: 'Vložit', pasteNotification: 'Stiskněte %1 pro vložení. Váš prohlížeč nepodporuje vkládání pomocí tlačítka na panelu nástrojů nebo volby kontextového menu.', pasteArea: 'Oblast vkládání', pasteMsg: 'Vložte svůj obsah do oblasti níže a stiskněte OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/tr.js0000644000201500020150000000211714515446705024121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'tr', { copy: 'Kopyala', copyError: 'Tarayıcı yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.', cut: 'Kes', cutError: 'Tarayıcı yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.', paste: 'Yapıştır', pasteNotification: '%1 tuşuna yapıştırmak için tıklayın. Tarayıcınız, Araç Çubuğu yada İçerik Menüsünü kullanarak yapıştırmayı desteklemiyor.', pasteArea: 'Yapıştırma Alanı', pasteMsg: 'İçeriğinizi alttaki bulunan alana yapıştırın ve TAMAM butonuna tıklayın', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ja.js0000644000201500020150000000225414515446705024070 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ja', { copy: 'コピー', copyError: 'ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。', cut: '切り取り', cutError: 'ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。', paste: '貼り付け', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: '貼り付け場所', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/sl.js0000644000201500020150000000173714515446705024121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'sl', { copy: 'Kopiraj', copyError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).', cut: 'Izreži', cutError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).', paste: 'Prilepi', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Prilepi območje', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/lv.js0000644000201500020150000000207614515446705024121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'lv', { copy: 'Kopēt', copyError: 'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt kopēšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.', cut: 'Izgriezt', cutError: 'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt izgriezšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+X), lai veiktu šo darbību.', paste: 'Ielīmēt', pasteNotification: 'Nospied %1 lai ielīmētu. Tavs pārlūks neatbalsta ielīmēšanu ar rīkjoslas pogām vai uznirstošās izvēlnes opciju.', pasteArea: 'Ielīmēšanas zona', pasteMsg: 'Ielīmē saturu zemāk esošajā laukā un nospied OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/en-au.js0000644000201500020150000000175114515446705024504 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'en-au', { copy: 'Copy', copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', cut: 'Cut', cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', paste: 'Paste', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', pasteArea: 'Paste Area', pasteMsg: 'Paste your content inside the area below and press OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/en.js0000644000201500020150000000172014515446705024075 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'en', { copy: 'Copy', copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', cut: 'Cut', cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', paste: 'Paste', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', pasteArea: 'Paste Area', pasteMsg: 'Paste your content inside the area below and press OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/no.js0000644000201500020150000000173414515446705024114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'no', { copy: 'Kopier', copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).', cut: 'Klipp ut', cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).', paste: 'Lim inn', pasteNotification: 'Trykk %1 for å lime inn. På grunn av manglende støtte i nettleseren din, kan du ikke lime inn via knapperaden eller kontekstmenyen.', pasteArea: 'Innlimingsområde', pasteMsg: 'Lim inn innholdet i området nedenfor og trykk OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/fr.js0000644000201500020150000000220314515446705024077 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'fr', { copy: 'Copier', copyError: 'Les paramètres de sécurité de votre navigateur n\'autorisent pas l\'éditeur à exécuter automatiquement l\'opération « Copier ». Veuillez utiliser le raccourci clavier à cet effet (Ctrl/Cmd+C).', cut: 'Couper', cutError: 'Les paramètres de sécurité de votre navigateur n\'autorisent pas l\'éditeur à exécuter automatiquement l\'opération « Couper ». Veuillez utiliser le raccourci clavier à cet effet (Ctrl/Cmd+X).', paste: 'Coller', pasteNotification: 'Utilisez le raccourci %1 pour coller. Votre navigateur n\'accepte pas de coller à l\'aide du bouton ou du menu contextuel.', pasteArea: 'Coller la zone', pasteMsg: 'Collez votre contenu dans la zone de saisie ci-dessous et cliquez OK.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/id.js0000644000201500020150000000201714515446705024067 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'id', { copy: 'Salin', copyError: 'Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)', cut: 'Potong', cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING paste: 'Tempel', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Area Tempel', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ug.js0000644000201500020150000000265514515446705024116 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ug', { copy: 'كۆچۈر', copyError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ', cut: 'كەس', cutError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ', paste: 'چاپلا', pasteNotification: 'چاپلانغىنى 1% . سىزنىڭ تور كۆرگۈچىڭىز قۇرال تەكچىسى ۋە سىيرىلما تاللاپ چاپلاش ئىقتىدارىنى قوللىمايدىكەن .', pasteArea: 'چاپلاش دائىرىسى', pasteMsg: 'مەزمۇنىڭىزنى تۆۋەندىكى رايونغا چاپلاپ ئاندىن OK نى بېسىڭ .', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/ar.js0000644000201500020150000000227214515446705024100 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'ar', { copy: 'نسخ', copyError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).', cut: 'قص', cutError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).', paste: 'لصق', pasteNotification: 'اضغط %1 للصق. اللصق عن طريق شريط الادوات او القائمة غير مدعوم من المتصفح المستخدم من قبلك.', pasteArea: 'منطقة اللصق', pasteMsg: 'الصق المحتوى بداخل المساحة المخصصة ادناه ثم اضغط على OK', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/sr.js0000644000201500020150000000263014515446705024120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'sr', { copy: 'Копирај', copyError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).', cut: 'Исеци', cutError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).', paste: 'Залепи', pasteNotification: 'Притисните тастер %1 за лепљење. Ваш ретраживач не дозвољаба лепљење из алатне траке или мениа.', pasteArea: 'Залепи зону', pasteMsg: 'Налепите садржај у следећи простор и притисните тастер OK.', fileFormatNotSupportedNotification: 'Формати датотеке ${форматс} нису подржани.', fileWithoutFormatNotSupportedNotification: 'Формат датотеке није подржан.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/eu.js0000644000201500020150000000177014515446705024111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'eu', { copy: 'Kopiatu', copyError: 'Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki kopiatzea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+C).', cut: 'Ebaki', cutError: 'Zure web nabigatzailearen segurtasun ezarpenek ez dute baimentzen testuak automatikoki moztea. Mesedez teklatua erabil ezazu (Ctrl/Cmd+X).', paste: 'Itsatsi', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Itsasteko area', pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/en-gb.js0000644000201500020150000000201214515446705024456 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'en-gb', { copy: 'Copy', copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', cut: 'Cut', cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', paste: 'Paste', pasteNotification: 'Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.', // MISSING pasteArea: 'Paste Area', // MISSING pasteMsg: 'Paste your content inside the area below and press OK.', // MISSING fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/lang/hu.js0000644000201500020150000000214114515446705024105 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'clipboard', 'hu', { copy: 'Másolás', copyError: 'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).', cut: 'Kivágás', cutError: 'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).', paste: 'Beillesztés', pasteNotification: 'Nyomja meg a %1 gombot a beillesztéshez. A böngésző nem támogatja a beillesztést az eszköztárról vagy a menüből.', pasteArea: 'Beillesztési terület', pasteMsg: 'Illessze be a tartalmat az alábbi mezőbe, és nyomja meg az OK-t.', fileFormatNotSupportedNotification: 'The ${formats} file format(s) are not supported.', // MISSING fileWithoutFormatNotSupportedNotification: 'The file format is not supported.' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/dialogs/0000755000201500020150000000000014515446705023636 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/dialogs/paste.js0000644000201500020150000001666414515446705025325 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.dialog.add( 'paste', function( editor ) { var lang = editor.lang.clipboard, clipboard = CKEDITOR.plugins.clipboard, lastDataTransfer; function onPasteFrameLoad( win ) { var doc = new CKEDITOR.dom.document( win.document ), body = doc.getBody(), script = doc.getById( 'cke_actscrpt' ); script && script.remove(); body.setAttribute( 'contenteditable', true ); // Forward dataTransfer (#13883). body.on( clipboard.mainPasteEvent, function( evt ) { var dataTransfer = clipboard.initPasteDataTransfer( evt ); if ( !lastDataTransfer ) { lastDataTransfer = dataTransfer; } else // For two paste with the same dataTransfer we can use that dataTransfer (two internal pastes are // considered as an internal paste). if ( dataTransfer != lastDataTransfer ) { // If there were two paste with different DataTransfer objects create a new, empty, data transfer // and use it (one internal and one external paste are considered as external paste). lastDataTransfer = clipboard.initPasteDataTransfer(); } } ); // IE before version 8 will leave cursor blinking inside the document after // editor blurred unless we clean up the selection. (#4716) if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 ) { doc.getWindow().on( 'blur', function() { doc.$.selection.empty(); } ); } doc.on( 'keydown', function( e ) { var domEvent = e.data, key = domEvent.getKeystroke(), processed; switch ( key ) { case 27: this.hide(); processed = 1; break; case 9: case CKEDITOR.SHIFT + 9: this.changeFocus( 1 ); processed = 1; } processed && domEvent.preventDefault(); }, this ); editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) ); // Handle pending focus. if ( doc.getWindow().getFrame().removeCustomData( 'pendingFocus' ) ) body.focus(); } // If pasteDialogCommit wasn't canceled by e.g. editor.getClipboardData // then fire paste event. // Do not use editor#paste, because it would start from beforePaste event. editor.on( 'pasteDialogCommit', function( evt ) { if ( evt.data ) { editor.fire( 'paste', { type: 'auto', dataValue: evt.data.dataValue, method: 'paste', dataTransfer: evt.data.dataTransfer || clipboard.initPasteDataTransfer() } ); } }, null, null, 1000 ); return { title: lang.paste, minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350, minHeight: CKEDITOR.env.quirks ? 250 : 245, onShow: function() { // FIREFOX BUG: Force the browser to render the dialog to make the to-be- // inserted iframe editable. (#3366) this.parts.dialog.$.offsetHeight; this.setupContent(); // Reset committed indicator. this._.committed = false; }, onLoad: function() { if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' ) this.parts.contents.setStyle( 'overflow', 'hidden' ); }, onOk: function() { this.commitContent(); }, contents: [ { id: 'general', label: editor.lang.common.generalTab, elements: [ { type: 'html', id: 'pasteMsg', html: '
    ' + lang.pasteMsg + '
    ' }, { type: 'html', id: 'editing_area', style: 'width:100%;height:100%', html: '', focus: function() { var iframe = this.getInputElement(), doc = iframe.getFrameDocument(), body = doc.getBody(); // Frame content may not loaded at the moment. if ( !body || body.isReadOnly() ) iframe.setCustomData( 'pendingFocus', 1 ); else body.focus(); }, setup: function() { var dialog = this.getDialog(); var htmlToLoad = '' + '' + '' + ''; var src = CKEDITOR.env.air ? 'javascript:void(0)' : // jshint ignore:line ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ? 'javascript:void((function(){' + encodeURIComponent( // jshint ignore:line 'document.open();' + '(' + CKEDITOR.tools.fixDomain + ')();' + 'document.close();' ) + '})())"' : ''; var iframe = CKEDITOR.dom.element.createFromHtml( '' ); // Reset last data transfer. lastDataTransfer = null; iframe.on( 'load', function( e ) { e.removeListener(); var doc = iframe.getFrameDocument(); doc.write( htmlToLoad ); editor.focusManager.add( doc.getBody() ); if ( CKEDITOR.env.air ) onPasteFrameLoad.call( this, doc.getWindow().$ ); }, dialog ); iframe.setCustomData( 'dialog', dialog ); var container = this.getElement(); container.setHtml( '' ); container.append( iframe ); // IE need a redirect on focus to make // the cursor blinking inside iframe. (#5461) if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) { var focusGrabber = CKEDITOR.dom.element.createFromHtml( '' ); focusGrabber.on( 'focus', function() { // Since fixDomain is called in src attribute, // IE needs some slight delay to correctly move focus. setTimeout( function() { iframe.$.contentWindow.focus(); } ); } ); container.append( focusGrabber ); // Override focus handler on field. this.focus = function() { focusGrabber.focus(); this.fire( 'focus' ); }; } this.getInputElement = function() { return iframe; }; // Force container to scale in IE. if ( CKEDITOR.env.ie ) { container.setStyle( 'display', 'block' ); container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' ); } }, commit: function() { var editor = this.getDialog().getParentEditor(), body = this.getInputElement().getFrameDocument().getBody(), bogus = body.getBogus(), html; bogus && bogus.remove(); // Saving the contents so changes until paste is complete will not take place (#7500) html = body.getHtml(); this.getDialog()._.committed = true; editor.fire( 'pasteDialogCommit', { dataValue: html, // Avoid error if there was no paste so lastDataTransfer is null. dataTransfer: lastDataTransfer || clipboard.initPasteDataTransfer() } ); } } ] } ] }; } ); /** * Internal event to pass the paste dialog data to the listeners. * * This event was not available in versions 4.7.0-4.8.0. * * @private * @event pasteDialogCommit * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/0000755000201500020150000000000014503523375023323 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/cut-rtl.png0000644000201500020150000000141014503523375025417 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8}S=SA=μHB4B[AYX`'!Rb-l,$)⻙k^IDAT8Œ10 E{(&z]6`RiHKI,Xq{!IDi$^@)%$݇n.""}<yJ2sjS,-ԠklC[1I-A.7y5 JZZAPg3*VY7L97?Bf-?waz.0%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/copy-rtl.png0000644000201500020150000000077214503523375025610 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8˵m04gN) ()$TQ BdYIDAT8Œ10 E{(&z]6`RiHKI,Xq{!IDi$^@)%$݇n.""}<yJ2sjS,-ԠklC[1I-A.7y5 JZZAPg3*VY7L97?Bf-?waz.0%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/hidpi/0000755000201500020150000000000014503523375024420 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/hidpi/cut-rtl.png0000644000201500020150000000305014503523375026516 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !,IDATXÍWOhU}onvgٕ Hͩ  XAoM&!Q!Zhs 03o$"\zu?Vcw6M0#-˲-n} $˲ҙ̨T*~[3mYxf,]h>kj)}ijuBQ$ɟDbRAmu7766'\-<4MR3$8n}W| #5Iu";zw8/1238yEXW kgR)j뱱cy}SnaNRj[I1H-(=)I銛85ssscRmlA0QTj468=c":755 Y.|k ÜQA5NP7R꘢(0b|&>dvJ̷ɖ]k!nǭd|"zScCXI.Y}NS9@A_DRW>QnʲWbmxTU̾;DQqIґp0;#W,B5ʕ ]c;"0Ibh_HSWoYr ltn.8wWQ L0rm٥nkU.u]~OYˁgWu+6ukciY`;XUeOŚ,p8SY(OrV$D(.v$)ie5T"*@.*cOYfp!Oo4%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/hidpi/copy-rtl.png0000644000201500020150000000136714503523375026706 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXWn0 dHeRi. ^II/kp߃ iy!N@"pp>q?1/8esct4ugw$4M="6~b" "-%~QaҕƘ`疈>ZnsW,Eq!lD̯v+V hCyec淘?U Bݒ܈WWf%c5$6jc1KylērlS V8J*%D+$^vEDm4JIUwNv8-$uUVV+w%$"Wm>}F{>6Df$ hU,i"a7c$IeDVhR lô%$n*G{^q$-Ԑhrj)45l)~4!m+>9K*~N >nCbL]J:T@4BB4 *MG%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/hidpi/paste-rtl.png0000644000201500020150000000152614503523375027045 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !ZIDATXíWj0}#9B%Pzl q!?Cr J7/gzgҮ²yOz3ln,J~03sq]j;-ڃVs [)yA(8?$!"m&(^&xf+mۢiL&"4Dm["rPm@4O f~)bĤ~gfg"خ!s>꘢(0b|&>dvJ̷ɖ]k!nǭd|"zScCXI.Y}NS9@A_DRW>QnʲWbmxTU̾;DQqIґp0;#W,B5ʕ ]c;"0Ibh_HSWoYr ltn.8wWQ L0rm٥nkU.u]~OYˁgWu+6ukciY`;XUeOŚ,p8SY(OrV$D(.v$)ie5T"*@.*cOYfp!Oo4%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/hidpi/cut.png0000644000201500020150000000305014503523375025717 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !,IDATXÍWOhU}onvgٕ Hͩ  XAoM&!Q!Zhs 03o$"\zu?Vcw6M0#-˲-n} $˲ҙ̨T*~[3mYxf,]h>kj)}ijuBQ$ɟDbRAmu7766'\-<4MR3$8n}W| #5Iu";zw8/1238yEXW kgR)j뱱cy}SnaNRj[I1H-(=)I銛85ssscRmlA0QTj468=c":755 Y.|k ÜQA5NP7Rq?1/8esct4ugw$4M="6~b" "-%~QaҕƘ`疈>ZnsW,Eq!lD̯v+V hCyec淘?U Bݒ܈WWf%c5$6jc1KylērlS V8J*%D+$^vEDm4JIUwNv8-$uUVV+w%$"Wm>}F{>6Df$ hU,i"a7c$IeDVhR lô%$n*G{^q$-Ԑhrj)45l)~4!m+>9K*~N >nCbL]J:T@4BB4 *MG%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/clipboard/icons/cut.png0000644000201500020150000000141014503523375024620 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8}S=SA=μHB4B[AYX`'!Rb-l,$)⻙k^IDAT8˵m04gN) ()$TQ BdY -1; } ); if ( imgShapesIds.length && isShapeFromList ) { // As we don't know how to process shapes we can remove them. return false; } }, 'p': function( element ) { element.filterChildren( filter ); if ( element.attributes.style && element.attributes.style.match( /display:\s*none/i ) ) { return false; } if ( List.thisIsAListItem( editor, element ) ) { if ( Heuristics.isEdgeListItem( editor, element ) ) { Heuristics.cleanupEdgeListItem( element ); } List.convertToFakeListItem( editor, element ); // IE pastes nested paragraphs in list items, which is different from other browsers. (https://dev.ckeditor.com/ticket/16826) // There's a possibility that list item will contain multiple paragraphs, in that case we want // to split them with BR. tools.array.reduce( element.children, function( paragraphsReplaced, node ) { if ( node.name === 'p' ) { // If there were already paragraphs replaced, put a br before this paragraph, so that // it's inline children are displayed in a next line. if ( paragraphsReplaced > 0 ) { var br = new CKEDITOR.htmlParser.element( 'br' ); br.insertBefore( node ); } node.replaceWithChildren(); paragraphsReplaced += 1; } return paragraphsReplaced; }, 0 ); } else { // In IE list level information is stored in

    elements inside

  • elements. var container = element.getAscendant( function( element ) { return element.name == 'ul' || element.name == 'ol'; } ), style = tools.parseCssText( element.attributes.style ); if ( container && !container.attributes[ 'cke-list-level' ] && style[ 'mso-list' ] && style[ 'mso-list' ].match( /level/ ) ) { container.attributes[ 'cke-list-level' ] = style[ 'mso-list' ].match( /level(\d+)/ )[1]; } // Adapt paragraph formatting to editor's convention according to enter-mode (#423). if ( editor.config.enterMode == CKEDITOR.ENTER_BR ) { // We suffer from attribute/style lost in this situation. delete element.name; element.add( new CKEDITOR.htmlParser.element( 'br' ) ); } } Style.createStyleStack( element, filter, editor ); }, 'pre': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'h1': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'h2': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'h3': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'h4': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'h5': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'h6': function( element ) { if ( List.thisIsAListItem( editor, element ) ) List.convertToFakeListItem( editor, element ); Style.createStyleStack( element, filter, editor ); }, 'font': function( element ) { if ( element.getHtml().match( /^\s*$/ ) ) { // There might be font tag directly in document fragment, we cannot replace it with a textnode as this generates // superfluous spaces in output. What later might be transformed into empty paragraphs, so just remove such element. if ( element.parent.type === CKEDITOR.NODE_ELEMENT ) { new CKEDITOR.htmlParser.text( ' ' ).insertAfter( element ); } return false; } if ( editor && editor.config.pasteFromWordRemoveFontStyles === true && element.attributes.size ) { // font[size] are still used by old IEs for font size. delete element.attributes.size; } // Create style stack for td/th > font if only class // and style attributes are present. Such markup is produced by Excel. if ( CKEDITOR.dtd.tr[ element.parent.name ] && CKEDITOR.tools.arrayCompare( CKEDITOR.tools.object.keys( element.attributes ), [ 'class', 'style' ] ) ) { Style.createStyleStack( element, filter, editor ); } else { createAttributeStack( element, filter ); } }, 'ul': function( element ) { if ( !msoListsDetected ) { // List should only be processed if we're sure we're working with Word. (https://dev.ckeditor.com/ticket/16593) return; } // Edge case from 11683 - an unusual way to create a level 2 list. if ( element.parent.name == 'li' && tools.indexOf( element.parent.children, element ) === 0 ) { Style.setStyle( element.parent, 'list-style-type', 'none' ); } List.dissolveList( element ); return false; }, 'li': function( element ) { Heuristics.correctLevelShift( element ); if ( !msoListsDetected ) { return; } element.attributes.style = Style.normalizedStyles( element, editor ); Style.pushStylesLower( element ); }, 'ol': function( element ) { if ( !msoListsDetected ) { // List should only be processed if we're sure we're working with Word. (https://dev.ckeditor.com/ticket/16593) return; } // Fix edge-case where when a list skips a level in IE11, the
      element // is implicitly surrounded by a
    1. . if ( element.parent.name == 'li' && tools.indexOf( element.parent.children, element ) === 0 ) { Style.setStyle( element.parent, 'list-style-type', 'none' ); } List.dissolveList( element ); return false; }, 'span': function( element ) { element.filterChildren( filter ); element.attributes.style = Style.normalizedStyles( element, editor ); if ( !element.attributes.style || // Remove garbage bookmarks that disrupt the content structure. element.attributes.style.match( /^mso\-bookmark:OLE_LINK\d+$/ ) || element.getHtml().match( /^(\s| )+$/ ) ) { commonFilter.elements.replaceWithChildren( element ); return false; } if ( element.attributes.style.match( /FONT-FAMILY:\s*Symbol/i ) ) { element.forEach( function( node ) { node.value = node.value.replace( / /g, '' ); }, CKEDITOR.NODE_TEXT, true ); } Style.createStyleStack( element, filter, editor ); }, 'v:imagedata': remove, // This is how IE8 presents images. 'v:shape': function( element ) { // There are 3 paths: // 1. There is regular `v:shape` (no `v:imagedata` inside). // 2. There is a simple situation with `v:shape` with `v:imagedata` inside. We can remove such element and rely on `img` tag found later on. // 3. There is a complicated situation where we cannot find proper `img` tag after `v:shape` or there is some canvas element. // a) If shape is a child of v:group, then most probably it belongs to canvas, so we need to treat it as in path 1. // b) In other cases, most probably there is no related `img` tag. We need to transform `v:shape` into `img` tag (IE8 integration). var duplicate = false, child = element.getFirst( 'v:imagedata' ); // Path 1: if ( child === null ) { shapeTagging( element ); return; } // Path 2: // Sometimes a child with proper ID might be nested in other tag. element.parent.find( function( child ) { if ( child.name == 'img' && child.attributes && child.attributes[ 'v:shapes' ] == element.attributes.id ) { duplicate = true; } }, true ); if ( duplicate ) { return false; } else { // Path 3: var src = ''; // 3.a) Filter out situation when canvas is used. In such scenario there is v:group containing v:shape containing v:imagedata. // We streat such v:shapes as in Path 1. if ( element.parent.name === 'v:group' ) { shapeTagging( element ); return; } // 3.b) Most probably there is no img tag later on, so we need to transform this v:shape into img. This should only happen on IE8. element.forEach( function( child ) { if ( child.attributes && child.attributes.src ) { src = child.attributes.src; } }, CKEDITOR.NODE_ELEMENT, true ); element.filterChildren( filter ); element.name = 'img'; element.attributes.src = element.attributes.src || src; delete element.attributes.type; } return; }, 'style': function() { // We don't want to let any styles in. Firefox tends to add some. return false; }, 'object': function( element ) { // The specs about object `data` attribute: // Address of the resource as a valid URL. At least one of data and type must be defined. // If there is not `data`, skip the object element. (https://dev.ckeditor.com/ticket/17001) return !!( element.attributes && element.attributes.data ); }, // Integrate page breaks with `pagebreak` plugin (#2598). 'br': function( element ) { if ( !editor.plugins.pagebreak ) { return; } var styles = tools.parseCssText( element.attributes.style, true ); // Safari uses `break-before` instead of `page-break-before` to recognize page breaks. if ( styles[ 'page-break-before' ] === 'always' || styles[ 'break-before' ] === 'page' ) { var pagebreakEl = CKEDITOR.plugins.pagebreak.createElement( editor ); return CKEDITOR.htmlParser.fragment.fromHtml( pagebreakEl.getOuterHtml() ).children[ 0 ]; } } }, attributes: { 'style': function( styles, element ) { // Returning false deletes the attribute. return Style.normalizedStyles( element, editor ) || false; }, 'class': function( classes ) { // The (el\d+)|(font\d+) are default Excel classes for table cells and text. return falseIfEmpty( classes.replace( /(el\d+)|(font\d+)|msonormal|msolistparagraph\w*/ig, '' ) ); }, 'cellspacing': remove, 'cellpadding': remove, 'border': remove, 'v:shapes': remove, 'o:spid': remove }, comment: function( element ) { if ( element.match( /\[if.* supportFields.*\]/ ) ) { inComment++; } if ( element == '[endif]' ) { inComment = inComment > 0 ? inComment - 1 : 0; } return false; }, text: function( content, node ) { if ( inComment ) { return ''; } var grandparent = node.parent && node.parent.parent; if ( grandparent && grandparent.attributes && grandparent.attributes.style && grandparent.attributes.style.match( /mso-list:\s*ignore/i ) ) { return content.replace( / /g, ' ' ); } return content; } }; tools.array.forEach( shapeTags, function( shapeTag ) { rules.elements[ shapeTag ] = shapeTagging; } ); return rules; function shapeTagging( element ) { // Check if regular or canvas shape (#1088). if ( element.attributes[ 'o:gfxdata' ] || element.parent.name === 'v:group' ) { shapesIds.push( element.attributes.id ); } } }; /** * Namespace containing list-oriented helper methods. * * @private * @since 4.13.0 * @member CKEDITOR.plugins.pastetools.filters.word */ plug.lists = { /** * Checks if a given element is a list item-alike. * * @private * @since 4.13.0 * @param {CKEDITOR.editor} editor * @param {CKEDITOR.htmlParser.element} element * @returns {Boolean} * @member CKEDITOR.plugins.pastetools.filters.word.lists */ thisIsAListItem: function( editor, element ) { if ( Heuristics.isEdgeListItem( editor, element ) ) { return true; } /*jshint -W024 */ // Normally a style of the sort that looks like "mso-list: l0 level1 lfo1" // indicates a list element, but the same style may appear in a

      that's within a

    2. . if ( ( element.attributes.style && element.attributes.style.match( /mso\-list:\s?l\d/ ) && element.parent.name !== 'li' ) || element.attributes[ 'cke-dissolved' ] || element.getHtml().match( // ) ) { return true; } return false; /*jshint +W024 */ }, /** * Converts an element to an element with the `cke:li` tag name. * * @private * @since 4.13.0 * @param {CKEDITOR.editor} editor * @param {CKEDITOR.htmlParser.element} element * @member CKEDITOR.plugins.pastetools.filters.word.lists */ convertToFakeListItem: function( editor, element ) { if ( Heuristics.isDegenerateListItem( editor, element ) ) { Heuristics.assignListLevels( editor, element ); } // A dummy call to cache parsed list info inside of cke-list-* attributes. this.getListItemInfo( element ); if ( !element.attributes[ 'cke-dissolved' ] ) { // The symbol is usually the first text node descendant // of the element that doesn't start with a whitespace character; var symbol; element.forEach( function( element ) { // Sometimes there are custom markers represented as images. // They can be recognized by the distinctive alt attribute value. if ( !symbol && element.name == 'img' && element.attributes[ 'cke-ignored' ] && element.attributes.alt == '*' ) { symbol = '·'; // Remove the "symbol" now, since it's the best opportunity to do so. element.remove(); } }, CKEDITOR.NODE_ELEMENT ); element.forEach( function( element ) { if ( !symbol && !element.value.match( /^ / ) ) { symbol = element.value; } }, CKEDITOR.NODE_TEXT ); // Without a symbol this isn't really a list item. if ( typeof symbol == 'undefined' ) { return; } element.attributes[ 'cke-symbol' ] = symbol.replace( /(?: | ).*$/, '' ); List.removeSymbolText( element ); } var styles = element.attributes && tools.parseCssText( element.attributes.style ); // Default list has 40px padding. To correct indentation we need to reduce margin-left by 40px for each list level. // Additionally margin has to be reduced by sum of margins of each parent, however it can't be done until list are structured in a tree (#2870). // Note margin left is absent in IE pasted content. if ( styles[ 'margin-left' ] ) { var margin = styles[ 'margin-left' ], level = element.attributes[ 'cke-list-level' ]; // Ignore negative margins (#2870). margin = Math.max( CKEDITOR.tools.convertToPx( margin ) - 40 * level, 0 ); if ( margin ) { styles[ 'margin-left' ] = margin + 'px'; } else { delete styles[ 'margin-left' ]; } element.attributes.style = CKEDITOR.tools.writeCssText( styles ); } // Converting to a normal list item would implicitly wrap the element around an
        . element.name = 'cke:li'; }, /** * Converts any fake list items contained within `root` into real `
      • ` elements. * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} root * @returns {CKEDITOR.htmlParser.element[]} An array of converted elements. * @member CKEDITOR.plugins.pastetools.filters.word.lists */ convertToRealListItems: function( root ) { var listElements = []; // Select and clean up list elements. root.forEach( function( element ) { if ( element.name == 'cke:li' ) { element.name = 'li'; listElements.push( element ); } }, CKEDITOR.NODE_ELEMENT, false ); return listElements; }, removeSymbolText: function( element ) { // ...from a list element. var symbol = element.attributes[ 'cke-symbol' ], // Find the first element which contains symbol to be replaced (#2690). node = element.findOne( function( node ) { // Since symbol may contains special characters we use `indexOf` (instead of RegExp) which is sufficient (#877). return node.value && node.value.indexOf( symbol ) > -1; }, true ), parent; if ( node ) { node.value = node.value.replace( symbol, '' ); parent = node.parent; if ( parent.getHtml().match( /^(\s| )*$/ ) && parent !== element ) { parent.remove(); } else if ( !node.value ) { node.remove(); } } }, setListSymbol: function( list, symbol, level ) { level = level || 1; var style = tools.parseCssText( list.attributes.style ); if ( list.name == 'ol' ) { if ( list.attributes.type || style[ 'list-style-type' ] ) return; var typeMap = { '[ivx]': 'lower-roman', '[IVX]': 'upper-roman', '[a-z]': 'lower-alpha', '[A-Z]': 'upper-alpha', '\\d': 'decimal' }; for ( var type in typeMap ) { if ( List.getSubsectionSymbol( symbol ).match( new RegExp( type ) ) ) { style[ 'list-style-type' ] = typeMap[ type ]; break; } } list.attributes[ 'cke-list-style-type' ] = style[ 'list-style-type' ]; } else { var symbolMap = { '·': 'disc', 'o': 'circle', '§': 'square' // In Word this is a square. }; if ( !style[ 'list-style-type' ] && symbolMap[ symbol ] ) { style[ 'list-style-type' ] = symbolMap[ symbol ]; } } List.setListSymbol.removeRedundancies( style, level ); ( list.attributes.style = CKEDITOR.tools.writeCssText( style ) ) || delete list.attributes.style; }, setListStart: function( list ) { var symbols = [], offset = 0; for ( var i = 0; i < list.children.length; i++ ) { symbols.push( list.children[ i ].attributes[ 'cke-symbol' ] || '' ); } // When a list starts with a sublist, use the next element as a start indicator. if ( !symbols[ 0 ] ) { offset++; } // Attribute set in setListSymbol() switch ( list.attributes[ 'cke-list-style-type' ] ) { case 'lower-roman': case 'upper-roman': list.attributes.start = List.toArabic( List.getSubsectionSymbol( symbols[ offset ] ) ) - offset; break; case 'lower-alpha': case 'upper-alpha': list.attributes.start = List.getSubsectionSymbol( symbols[ offset ] ).replace( /\W/g, '' ).toLowerCase().charCodeAt( 0 ) - 96 - offset; break; case 'decimal': list.attributes.start = ( parseInt( List.getSubsectionSymbol( symbols[ offset ] ), 10 ) - offset ) || 1; break; } if ( list.attributes.start == '1' ) { delete list.attributes.start; } delete list.attributes[ 'cke-list-style-type' ]; }, /** * Numbering helper. * * @since 4.13.0 * @member CKEDITOR.plugins.pastetools.filters.word.lists */ numbering: { /** * Converts the list marker value into a decimal number. * * var toNumber = CKEDITOR.plugins.pastefromword.lists.numbering.toNumber; * * console.log( toNumber( 'XIV', 'upper-roman' ) ); // Logs 14. * console.log( toNumber( 'd', 'lower-alpha' ) ); // Logs 4. * console.log( toNumber( '35', 'decimal' ) ); // Logs 35. * console.log( toNumber( '404', 'foo' ) ); // Logs 1. * * @param {String} marker * @param {String} markerType Marker type according to CSS `list-style-type` values. * @returns {Number} * @member CKEDITOR.plugins.pastetools.filters.word.lists.numbering */ toNumber: function( marker, markerType ) { // Functions copied straight from old PFW implementation, no need to reinvent the wheel. function fromAlphabet( str ) { var alpahbets = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; str = str.toUpperCase(); var l = alpahbets.length, retVal = 1; for ( var x = 1; str.length > 0; x *= l ) { retVal += alpahbets.indexOf( str.charAt( str.length - 1 ) ) * x; str = str.substr( 0, str.length - 1 ); } return retVal; } function fromRoman( str ) { var romans = [ [ 1000, 'M' ], [ 900, 'CM' ], [ 500, 'D' ], [ 400, 'CD' ], [ 100, 'C' ], [ 90, 'XC' ], [ 50, 'L' ], [ 40, 'XL' ], [ 10, 'X' ], [ 9, 'IX' ], [ 5, 'V' ], [ 4, 'IV' ], [ 1, 'I' ] ]; str = str.toUpperCase(); var l = romans.length, retVal = 0; for ( var i = 0; i < l; ++i ) { for ( var j = romans[ i ], k = j[ 1 ].length; str.substr( 0, k ) == j[ 1 ]; str = str.substr( k ) ) retVal += j[ 0 ]; } return retVal; } if ( markerType == 'decimal' ) { return Number( marker ); } else if ( markerType == 'upper-roman' || markerType == 'lower-roman' ) { return fromRoman( marker.toUpperCase() ); } else if ( markerType == 'lower-alpha' || markerType == 'upper-alpha' ) { return fromAlphabet( marker ); } else { return 1; } }, /** * Returns a list style based on the Word marker content. * * var getStyle = CKEDITOR.plugins.pastefromword.lists.numbering.getStyle; * * console.log( getStyle( '4' ) ); // Logs: "decimal" * console.log( getStyle( 'b' ) ); // Logs: "lower-alpha" * console.log( getStyle( 'P' ) ); // Logs: "upper-alpha" * console.log( getStyle( 'i' ) ); // Logs: "lower-roman" * console.log( getStyle( 'X' ) ); // Logs: "upper-roman" * * * **Implementation note:** Characters `c` and `d` are not converted to roman on purpose. It is 100 and 500 respectively, so * you rarely go with a list up until this point, while it is common to start with `c` and `d` in alpha. * * @param {String} marker Marker content retained from Word, e.g. `1`, `7`, `XI`, `b`. * @returns {String} Resolved marker type. * @member CKEDITOR.plugins.pastetools.filters.word.lists.numbering */ getStyle: function( marker ) { var typeMap = { 'i': 'lower-roman', 'v': 'lower-roman', 'x': 'lower-roman', 'l': 'lower-roman', 'm': 'lower-roman', 'I': 'upper-roman', 'V': 'upper-roman', 'X': 'upper-roman', 'L': 'upper-roman', 'M': 'upper-roman' }, firstCharacter = marker.slice( 0, 1 ), type = typeMap[ firstCharacter ]; if ( !type ) { type = 'decimal'; if ( firstCharacter.match( /[a-z]/ ) ) { type = 'lower-alpha'; } if ( firstCharacter.match( /[A-Z]/ ) ) { type = 'upper-alpha'; } } return type; } }, // Taking into account cases like "1.1.2." etc. - get the last element. getSubsectionSymbol: function( symbol ) { return ( symbol.match( /([\da-zA-Z]+).?$/ ) || [ 'placeholder', '1' ] )[ 1 ]; }, setListDir: function( list ) { var dirs = { ltr: 0, rtl: 0 }; list.forEach( function( child ) { if ( child.name == 'li' ) { var dir = child.attributes.dir || child.attributes.DIR || ''; if ( dir.toLowerCase() == 'rtl' ) { dirs.rtl++; } else { dirs.ltr++; } } }, CKEDITOR.ELEMENT_NODE ); if ( dirs.rtl > dirs.ltr ) { list.attributes.dir = 'rtl'; } }, createList: function( element ) { // "o" symbolizes a circle in unordered lists. if ( ( element.attributes[ 'cke-symbol' ].match( /([\da-np-zA-NP-Z]).?/ ) || [] )[ 1 ] ) { return new CKEDITOR.htmlParser.element( 'ol' ); } return new CKEDITOR.htmlParser.element( 'ul' ); }, /** * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} root An element to be looked through for lists. * @returns {CKEDITOR.htmlParser.element[]} An array of created list items. * @member CKEDITOR.plugins.pastetools.filters.word.lists */ createLists: function( root ) { var element, level, i, j, listElements = List.convertToRealListItems( root ); if ( listElements.length === 0 ) { return []; } // Chop data into continuous lists. var lists = List.groupLists( listElements ); // Create nested list structures. for ( i = 0; i < lists.length; i++ ) { var list = lists[ i ], firstLevel1Element = list[ 0 ]; // To determine the type of the top-level list a level 1 element is needed. for ( j = 0; j < list.length; j++ ) { if ( list[ j ].attributes[ 'cke-list-level' ] == 1 ) { firstLevel1Element = list[ j ]; break; } } var containerStack = [ List.createList( firstLevel1Element ) ], // List wrapper (ol/ul). innermostContainer = containerStack[ 0 ], allContainers = [ containerStack[ 0 ] ]; // Insert first known list item before the list wrapper. innermostContainer.insertBefore( list[ 0 ] ); for ( j = 0; j < list.length; j++ ) { element = list[ j ]; level = element.attributes[ 'cke-list-level' ]; while ( level > containerStack.length ) { var content = List.createList( element ); var children = innermostContainer.children; if ( children.length > 0 ) { children[ children.length - 1 ].add( content ); } else { var container = new CKEDITOR.htmlParser.element( 'li', { style: 'list-style-type:none' } ); container.add( content ); innermostContainer.add( container ); } containerStack.push( content ); allContainers.push( content ); innermostContainer = content; if ( level == containerStack.length ) { List.setListSymbol( content, element.attributes[ 'cke-symbol' ], level ); } } while ( level < containerStack.length ) { containerStack.pop(); innermostContainer = containerStack[ containerStack.length - 1 ]; if ( level == containerStack.length ) { List.setListSymbol( innermostContainer, element.attributes[ 'cke-symbol' ], level ); } } // For future reference this is where the list elements are actually put into the lists. element.remove(); innermostContainer.add( element ); } // Try to set the symbol for the root (level 1) list. var level1Symbol; if ( containerStack[ 0 ].children.length ) { level1Symbol = containerStack[ 0 ].children[ 0 ].attributes[ 'cke-symbol' ]; if ( !level1Symbol && containerStack[ 0 ].children.length > 1 ) { level1Symbol = containerStack[0].children[1].attributes[ 'cke-symbol' ]; } if ( level1Symbol ) { List.setListSymbol( containerStack[ 0 ], level1Symbol ); } } // This can be done only after all the list elements are where they should be. for ( j = 0; j < allContainers.length; j++ ) { List.setListStart( allContainers[ j ] ); } // Last but not least apply li[start] if needed, also this needs to be done once ols are final. for ( j = 0; j < list.length; j++ ) { this.determineListItemValue( list[ j ] ); } } // Adjust left margin based on parents sum of parents left margin (#2870). CKEDITOR.tools.array.forEach( listElements, function( element ) { var listParents = getParentListItems( element ), leftOffset = getTotalMarginLeft( listParents ), styles, marginLeft; if ( !leftOffset ) { return; } element.attributes = element.attributes || {}; styles = CKEDITOR.tools.parseCssText( element.attributes.style ); marginLeft = styles[ 'margin-left' ] || 0; marginLeft = Math.max( parseInt( marginLeft, 10 ) - leftOffset, 0 ); if ( marginLeft ) { styles[ 'margin-left' ] = marginLeft + 'px'; } else { delete styles[ 'margin-left' ]; } element.attributes.style = CKEDITOR.tools.writeCssText( styles ); } ); return listElements; function getParentListItems( element ) { var parents = [], parent = element.parent; while ( parent ) { if ( parent.name === 'li' ) { parents.push( parent ); } parent = parent.parent; } return parents; } function getTotalMarginLeft( elements ) { return CKEDITOR.tools.array.reduce( elements, function( total, element ) { if ( element.attributes && element.attributes.style ) { var marginLeft = CKEDITOR.tools.parseCssText( element.attributes.style )[ 'margin-left' ]; } return marginLeft ? total + parseInt( marginLeft, 10 ) : total; }, 0 ); } }, /** * Final cleanup — removes all `cke-*` helper attributes. * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element[]} listElements * @member CKEDITOR.plugins.pastetools.filters.word.lists */ cleanup: function( listElements ) { var tempAttributes = [ 'cke-list-level', 'cke-symbol', 'cke-list-id', 'cke-indentation', 'cke-dissolved' ], i, j; for ( i = 0; i < listElements.length; i++ ) { for ( j = 0; j < tempAttributes.length; j++ ) { delete listElements[ i ].attributes[ tempAttributes[ j ] ]; } } }, /** * Tries to determine the `li[value]` attribute for a given list item. The `element` given must * have a parent in order for this function to work properly. * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} element * @member CKEDITOR.plugins.pastetools.filters.word.lists */ determineListItemValue: function( element ) { if ( element.parent.name !== 'ol' ) { // li[value] make sense only for list items in ordered list. return; } var assumedValue = this.calculateValue( element ), cleanSymbol = element.attributes[ 'cke-symbol' ].match( /[a-z0-9]+/gi ), computedValue, listType; if ( cleanSymbol ) { // Note that we always want to use last match, just because of markers like "1.1.4" "1.A.a.IV" etc. cleanSymbol = cleanSymbol[ cleanSymbol.length - 1 ]; // We can determine proper value only if we know what type of list is it. // So we need to check list wrapper if it has this information. listType = element.parent.attributes[ 'cke-list-style-type' ] || this.numbering.getStyle( cleanSymbol ); computedValue = this.numbering.toNumber( cleanSymbol, listType ); if ( computedValue !== assumedValue ) { element.attributes.value = computedValue; } } }, /** * Calculates the value for a given `
      • ` element based on preceding list items (e.g. the `value` * attribute). It could also look at the start attribute of its parent list (`
          `). * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} element The `
        1. ` element. * @returns {Number} * @member CKEDITOR.plugins.pastetools.filters.word.lists */ calculateValue: function( element ) { if ( !element.parent ) { return 1; } var list = element.parent, elementIndex = element.getIndex(), valueFound = null, // Index of the element with value attribute. valueElementIndex, curElement, i; // Look for any preceding li[value]. for ( i = elementIndex; i >= 0 && valueFound === null; i-- ) { curElement = list.children[ i ]; if ( curElement.attributes && curElement.attributes.value !== undefined ) { valueElementIndex = i; valueFound = parseInt( curElement.attributes.value, 10 ); } } // Still if no li[value] was found, we'll check the list. if ( valueFound === null ) { valueFound = list.attributes.start !== undefined ? parseInt( list.attributes.start, 10 ) : 1; valueElementIndex = 0; } return valueFound + ( elementIndex - valueElementIndex ); }, /** * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} element * @member CKEDITOR.plugins.pastetools.filters.word.lists */ dissolveList: function( element ) { var nameIs = function( name ) { return function( element ) { return element.name == name; }; }, isList = function( element ) { return nameIs( 'ul' )( element ) || nameIs( 'ol' )( element ); }, arrayTools = CKEDITOR.tools.array, elements = [], children, i; element.forEach( function( child ) { elements.push( child ); }, CKEDITOR.NODE_ELEMENT, false ); var items = arrayTools.filter( elements, nameIs( 'li' ) ), lists = arrayTools.filter( elements, isList ); arrayTools.forEach( lists, function( list ) { var type = list.attributes.type, start = parseInt( list.attributes.start, 10 ) || 1, level = countParents( isList, list ) + 1; if ( !type ) { var style = tools.parseCssText( list.attributes.style ); type = style[ 'list-style-type' ]; } arrayTools.forEach( arrayTools.filter( list.children, nameIs( 'li' ) ), function( child, index ) { var symbol; switch ( type ) { case 'disc': symbol = '·'; break; case 'circle': symbol = 'o'; break; case 'square': symbol = '§'; break; case '1': case 'decimal': symbol = ( start + index ) + '.'; break; case 'a': case 'lower-alpha': symbol = String.fromCharCode( 'a'.charCodeAt( 0 ) + start - 1 + index ) + '.'; break; case 'A': case 'upper-alpha': symbol = String.fromCharCode( 'A'.charCodeAt( 0 ) + start - 1 + index ) + '.'; break; case 'i': case 'lower-roman': symbol = toRoman( start + index ) + '.'; break; case 'I': case 'upper-roman': symbol = toRoman( start + index ).toUpperCase() + '.'; break; default: symbol = list.name == 'ul' ? '·' : ( start + index ) + '.'; } child.attributes[ 'cke-symbol' ] = symbol; child.attributes[ 'cke-list-level' ] = level; } ); } ); children = arrayTools.reduce( items, function( acc, listElement ) { var child = listElement.children[ 0 ]; if ( child && child.name && child.attributes.style && child.attributes.style.match( /mso-list:/i ) ) { Style.pushStylesLower( listElement, { 'list-style-type': true, 'display': true } ); var childStyle = tools.parseCssText( child.attributes.style, true ); Style.setStyle( listElement, 'mso-list', childStyle[ 'mso-list' ], true ); Style.setStyle( child, 'mso-list', '' ); // mso-list takes precedence in determining the level. delete listElement[ 'cke-list-level' ]; // If this style has a value it's usually "none". This marks such list elements for deletion. var styleName = childStyle.display ? 'display' : childStyle.DISPLAY ? 'DISPLAY' : ''; if ( styleName ) { Style.setStyle( listElement, 'display', childStyle[ styleName ], true ); } } // Don't include elements put there only to contain another list. if ( listElement.children.length === 1 && isList( listElement.children[ 0 ] ) ) { return acc; } listElement.name = 'p'; listElement.attributes[ 'cke-dissolved' ] = true; acc.push( listElement ); return acc; }, [] ); for ( i = children.length - 1; i >= 0; i-- ) { children[ i ].insertAfter( element ); } for ( i = lists.length - 1; i >= 0; i-- ) { delete lists[ i ].name; } function toRoman( number ) { if ( number >= 50 ) return 'l' + toRoman( number - 50 ); if ( number >= 40 ) return 'xl' + toRoman( number - 40 ); if ( number >= 10 ) return 'x' + toRoman( number - 10 ); if ( number == 9 ) return 'ix'; if ( number >= 5 ) return 'v' + toRoman( number - 5 ); if ( number == 4 ) return 'iv'; if ( number >= 1 ) return 'i' + toRoman( number - 1 ); return ''; } function countParents( condition, element ) { return count( element, 0 ); function count( parent, number ) { if ( !parent || !parent.parent ) { return number; } if ( condition( parent.parent ) ) { return count( parent.parent, number + 1 ); } else { return count( parent.parent, number ); } } } }, groupLists: function( listElements ) { // Chop data into continuous lists. var i, element, lists = [ [ listElements[ 0 ] ] ], lastList = lists[ 0 ]; element = listElements[ 0 ]; element.attributes[ 'cke-indentation' ] = element.attributes[ 'cke-indentation' ] || getElementIndentation( element ); for ( i = 1; i < listElements.length; i++ ) { element = listElements[ i ]; var previous = listElements[ i - 1 ]; element.attributes[ 'cke-indentation' ] = element.attributes[ 'cke-indentation' ] || getElementIndentation( element ); if ( element.previous !== previous ) { List.chopDiscontinuousLists( lastList, lists ); lists.push( lastList = [] ); } lastList.push( element ); } List.chopDiscontinuousLists( lastList, lists ); return lists; }, /** * Converts a single, flat list items array into an array with a hierarchy of items. * * As the list gets chopped, it will be forced to render as a separate list, even if it has a deeper nesting level. * For example, for level 3 it will create a structure like `ol > li > ol > li > ol > li`. * * Note that list items within a single list but with different levels that did not get chopped * will still be rendered as a list tree later. * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element[]} list An array containing list items. * @param {CKEDITOR.htmlParser.element[]} lists All the lists in the pasted content represented by an array of arrays * of list items. Modified by this method. * @member CKEDITOR.plugins.pastetools.filters.word.lists */ chopDiscontinuousLists: function( list, lists ) { var levelSymbols = {}; var choppedLists = [ [] ], lastListInfo; for ( var i = 0; i < list.length; i++ ) { var lastSymbol = levelSymbols[ list[ i ].attributes[ 'cke-list-level' ] ], currentListInfo = this.getListItemInfo( list[ i ] ), currentSymbol, forceType; if ( lastSymbol ) { // An "h" before an "i". forceType = lastSymbol.type.match( /alpha/ ) && lastSymbol.index == 7 ? 'alpha' : forceType; // An "n" before an "o". forceType = list[ i ].attributes[ 'cke-symbol' ] == 'o' && lastSymbol.index == 14 ? 'alpha' : forceType; currentSymbol = List.getSymbolInfo( list[ i ].attributes[ 'cke-symbol' ], forceType ); currentListInfo = this.getListItemInfo( list[ i ] ); // Based on current and last index we'll decide if we want to chop list. if ( // If the last list was a different list type then chop it! lastSymbol.type != currentSymbol.type || // If those are logically different lists, and current list is not a continuation (https://dev.ckeditor.com/ticket/7918): ( lastListInfo && currentListInfo.id != lastListInfo.id && !this.isAListContinuation( list[ i ] ) ) ) { choppedLists.push( [] ); } } else { currentSymbol = List.getSymbolInfo( list[ i ].attributes[ 'cke-symbol' ] ); } // Reset all higher levels for ( var j = parseInt( list[ i ].attributes[ 'cke-list-level' ], 10 ) + 1; j < 20; j++ ) { if ( levelSymbols[ j ] ) { delete levelSymbols[ j ]; } } levelSymbols[ list[ i ].attributes[ 'cke-list-level' ] ] = currentSymbol; choppedLists[ choppedLists.length - 1 ].push( list[ i ] ); lastListInfo = currentListInfo; } [].splice.apply( lists, [].concat( [ tools.indexOf( lists, list ), 1 ], choppedLists ) ); }, /** * Checks if this list is a direct continuation of a list interrupted by a list with a different ID and * with a different level. So if you look at the following list: * * * list1 level1 * * list1 level1 * * list2 level2 * * list2 level2 * * list1 level1 * * It would return `true`, which means it is a continuation, and should not be chopped. However, if any paragraph or * anything else appears in-between, it should be broken into different lists. * * You can see fixtures from issue https://dev.ckeditor.com/ticket/7918 as an example. * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} listElement The list to be checked. * @returns {Boolean} * @member CKEDITOR.plugins.pastetools.filters.word.lists */ isAListContinuation: function( listElement ) { var prev = listElement; do { prev = prev.previous; if ( prev && prev.type === CKEDITOR.NODE_ELEMENT ) { if ( prev.attributes[ 'cke-list-level' ] === undefined ) { // Not a list, so looks like an interrupted list. return false; } if ( prev.attributes[ 'cke-list-level' ] === listElement.attributes[ 'cke-list-level' ] ) { // Same level, so we want to check if this is a continuation. return prev.attributes[ 'cke-list-id' ] === listElement.attributes[ 'cke-list-id' ]; } } } while ( prev ); return false; }, // Source: http://stackoverflow.com/a/17534350/3698944 toArabic: function( symbol ) { if ( !symbol.match( /[ivxl]/i ) ) return 0; if ( symbol.match( /^l/i ) ) return 50 + List.toArabic( symbol.slice( 1 ) ); if ( symbol.match( /^lx/i ) ) return 40 + List.toArabic( symbol.slice( 1 ) ); if ( symbol.match( /^x/i ) ) return 10 + List.toArabic( symbol.slice( 1 ) ); if ( symbol.match( /^ix/i ) ) return 9 + List.toArabic( symbol.slice( 2 ) ); if ( symbol.match( /^v/i ) ) return 5 + List.toArabic( symbol.slice( 1 ) ); if ( symbol.match( /^iv/i ) ) return 4 + List.toArabic( symbol.slice( 2 ) ); if ( symbol.match( /^i/i ) ) return 1 + List.toArabic( symbol.slice( 1 ) ); // Ignore other characters. return List.toArabic( symbol.slice( 1 ) ); }, /** * Returns an object describing the given `symbol`. * * @private * @since 4.13.0 * @param {String} symbol * @param {String} type * @returns {Object} ret * @returns {Number} ret.index Identified numbering value * @returns {String} ret.type One of: `decimal`, `disc`, `circle`, `square`, `roman`, `alpha`. * @member CKEDITOR.plugins.pastetools.filters.word.lists */ getSymbolInfo: function( symbol, type ) { var symbolCase = symbol.toUpperCase() == symbol ? 'upper-' : 'lower-', symbolMap = { '·': [ 'disc', -1 ], 'o': [ 'circle', -2 ], '§': [ 'square', -3 ] }; if ( symbol in symbolMap || ( type && type.match( /(disc|circle|square)/ ) ) ) { return { index: symbolMap[ symbol ][ 1 ], type: symbolMap[ symbol ][ 0 ] }; } if ( symbol.match( /\d/ ) ) { return { index: symbol ? parseInt( List.getSubsectionSymbol( symbol ) , 10 ) : 0, type: 'decimal' }; } symbol = symbol.replace( /\W/g, '' ).toLowerCase(); if ( ( !type && symbol.match( /[ivxl]+/i ) ) || ( type && type != 'alpha' ) || type == 'roman' ) { return { index: List.toArabic( symbol ), type: symbolCase + 'roman' }; } if ( symbol.match( /[a-z]/i ) ) { return { index: symbol.charCodeAt( 0 ) - 97, type: symbolCase + 'alpha' }; } return { index: -1, type: 'disc' }; }, /** * Returns Word-generated information about the given list item, mainly by parsing the `mso-list` * CSS property. * * Note: Paragraphs with `mso-list` are also counted as list items because Word serves * list items as paragraphs. * * @private * @since 4.13.0 * @param {CKEDITOR.htmlParser.element} list * @returns ret * @returns {String} ret.id List ID. Usually it is a decimal string. * @returns {String} ret.level List nesting level. `0` means it is the outermost list. Usually it is * a decimal string. * @member CKEDITOR.plugins.pastetools.filters.word.lists */ getListItemInfo: function( list ) { if ( list.attributes[ 'cke-list-id' ] !== undefined ) { // List was already resolved. return { id: list.attributes[ 'cke-list-id' ], level: list.attributes[ 'cke-list-level' ] }; } var propValue = tools.parseCssText( list.attributes.style )[ 'mso-list' ], ret = { id: '0', level: '1' }; if ( propValue ) { // Add one whitespace so it's easier to match values assuming that all of these are separated with \s. propValue += ' '; ret.level = propValue.match( /level(.+?)\s+/ )[ 1 ]; ret.id = propValue.match( /l(\d+?)\s+/ )[ 1 ]; } // Store values. List level will be reused if present to prevent regressions. list.attributes[ 'cke-list-level' ] = list.attributes[ 'cke-list-level' ] !== undefined ? list.attributes[ 'cke-list-level' ] : ret.level; list.attributes[ 'cke-list-id' ] = ret.id; return ret; } }; List = plug.lists; /** * Namespace containing methods used to process the pasted content using heuristics. * * @private * @since 4.13.0 * @member CKEDITOR.plugins.pastetools.filters.word */ plug.heuristics = { /** * Decides if an `item` looks like a list item in Microsoft Edge. * * Note: It will return `false` when run in a browser other than Microsoft Edge, despite the configuration. * * @param {CKEDITOR.editor} editor * @param {CKEDITOR.htmlParser.element} item * @returns {Boolean} * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private */ isEdgeListItem: function( editor, item ) { if ( !CKEDITOR.env.edge || !editor.config.pasteFromWord_heuristicsEdgeList ) { return false; } var innerText = ''; // Edge doesn't provide any list-specific markup, so the only way to guess if it's a list is to check the text structure. item.forEach && item.forEach( function( text ) { innerText += text.value; }, CKEDITOR.NODE_TEXT ); if ( innerText.match( /^(?: | )*\(?[a-zA-Z0-9]+?[\.\)](?: | ){2,}/ ) ) { return true; } return Heuristics.isDegenerateListItem( editor, item ); }, /** * Cleans up a given list `item`. It is needed to remove Edge pre-marker indentation, since Edge pastes * list items as plain paragraphs with multiple ` `s before the list marker. * * @since 4.7.0 * @param {CKEDITOR.htmlParser.element} item The pre-processed list-like item, like a paragraph. * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private */ cleanupEdgeListItem: function( item ) { var textOccurred = false; item.forEach( function( node ) { if ( !textOccurred ) { node.value = node.value.replace( /^(?: |[\s])+/, '' ); // If there's any remaining text beside nbsp it means that we can stop filtering. if ( node.value.length ) { textOccurred = true; } } }, CKEDITOR.NODE_TEXT ); }, /** * Checks whether an element is a degenerate list item. * * Degenerate list items are elements that have some styles specific to list items, * but lack the ones that could be used to determine their features (like list level etc.). * * @param {CKEDITOR.editor} editor * @param {CKEDITOR.htmlParser.element} item * @returns {Boolean} * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private * */ isDegenerateListItem: function( editor, item ) { return !!item.attributes[ 'cke-list-level' ] || ( item.attributes.style && !item.attributes.style.match( /mso\-list/ ) && !!item.find( function( child ) { // In rare cases there's no indication that a heading is a list item other than // the fact that it has a child element containing only a list symbol. if ( child.type == CKEDITOR.NODE_ELEMENT && item.name.match( /h\d/i ) && child.getHtml().match( /^[a-zA-Z0-9]+?[\.\)]$/ ) ) { return true; } var css = tools.parseCssText( child.attributes && child.attributes.style, true ); if ( !css ) { return false; } var fontSize = css.font || css['font-size'] || '', fontFamily = css[ 'font-family' ] || ''; return ( fontSize.match( /7pt/i ) && !!child.previous ) || fontFamily.match( /symbol/i ); }, true ).length ); }, /** * Assigns list levels to the `item` and all directly subsequent nodes for which {@link #isEdgeListItem} returns `true`. * * The algorithm determines list item level based on the lowest common non-zero difference in indentation * of two or more subsequent list-like elements. * * @param {CKEDITOR.editor} editor * @param {CKEDITOR.htmlParser.element} item The first item of the list. * @returns {Object/null} `null` if list levels were already applied, or an object used to verify results in tests. * @returns {Number[]} return.indents * @returns {Number[]} return.levels * @returns {Number[]} return.diffs * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private */ assignListLevels: function( editor, item ) { // If levels were already calculated, it means that this function was called for preceeding element. There's // no need to do this heavy work. if ( item.attributes && item.attributes[ 'cke-list-level' ] !== undefined ) { return; } var indents = [ getElementIndentation( item ) ], items = [ item ], levels = [], array = CKEDITOR.tools.array, map = array.map; while ( item.next && item.next.attributes && !item.next.attributes[ 'cke-list-level' ] && Heuristics.isDegenerateListItem( editor, item.next ) ) { item = item.next; indents.push( getElementIndentation( item ) ); items.push( item ); } // An array with indentation difference between n and n-1 list item. It's 0 for the first one. var indentationDiffs = map( indents, function( curIndent, i ) { return i === 0 ? 0 : curIndent - indents[ i - 1 ]; } ), // Guess indentation step, but it must not be equal to 0. indentationPerLevel = this.guessIndentationStep( array.filter( indents, function( val ) { return val !== 0; } ) ); // Here's the tricky part, we need to magically figure out what is the indentation difference between list level. levels = map( indents, function( val ) { // Make sure that the level is a full number. return Math.round( val / indentationPerLevel ); } ); // Level can not be equal to 0, in case if it happens bump all the levels by 1, if ( array.indexOf( levels, 0 ) !== -1 ) { levels = map( levels, function( val ) { return val + 1; } ); } // Assign levels to a proper place. array.forEach( items, function( curItem, index ) { curItem.attributes[ 'cke-list-level' ] = levels[ index ]; } ); return { indents: indents, levels: levels, diffs: indentationDiffs }; }, /** * Given an array of list indentations, this method tries to guess what the indentation difference per list level is. * E.g. assuming that you have something like: * * * foo (indentation 30px) * * bar (indentation 90px) * * baz (indentation 90px) * * baz (indentation 115px) * * baz (indentation 60px) * * The method will return `30`. * * @param {Number[]} indentations An array of indentation sizes. * @returns {Number/null} A number or `null` if empty `indentations` was given. * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private */ guessIndentationStep: function( indentations ) { return indentations.length ? Math.min.apply( null, indentations ) : null; }, /** * Shifts lists that were deformed during pasting one level down * so that the list structure matches the content copied from Word. * * @param {CKEDITOR.htmlParser.element} element * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private * */ correctLevelShift: function( element ) { var isShiftedList = function( list ) { return list.children && list.children.length == 1 && Heuristics.isShifted( list.children[ 0 ] ); }; if ( this.isShifted( element ) ) { var lists = CKEDITOR.tools.array.filter( element.children, function( child ) { return ( child.name == 'ul' || child.name == 'ol' ); } ); var listChildren = CKEDITOR.tools.array.reduce( lists, function( acc, list ) { var preceding = isShiftedList( list ) ? [ list ] : list.children; return preceding.concat( acc ); }, [] ); CKEDITOR.tools.array.forEach( lists, function( list ) { list.remove(); } ); CKEDITOR.tools.array.forEach( listChildren, function( child ) { // `Add` method without index always append child at the end (#796). element.add( child ); } ); delete element.name; } }, /** * Determines if the list is malformed in a manner that its items * are one level deeper than they should be. * * @param {CKEDITOR.htmlParser.element} element * @returns {Boolean} * @member CKEDITOR.plugins.pastetools.filters.word.heuristics * @private */ isShifted: function( element ) { if ( element.name !== 'li' ) { return false; } return CKEDITOR.tools.array.filter( element.children, function( child ) { if ( child.name ) { if ( child.name == 'ul' || child.name == 'ol' ) { return false; } if ( child.name == 'p' && child.children.length === 0 ) { return false; } } return true; } ).length === 0; } }; Heuristics = plug.heuristics; // Expose this function since it's useful in other places. List.setListSymbol.removeRedundancies = function( style, level ) { // 'disc' and 'decimal' are the default styles in some cases - remove redundancy. if ( ( level === 1 && style[ 'list-style-type' ] === 'disc' ) || style[ 'list-style-type' ] === 'decimal' ) { delete style[ 'list-style-type' ]; } }; function falseIfEmpty( value ) { if ( value === '' ) { return false; } return value; } // Used when filtering attributes - returning false deletes the attribute. function remove() { return false; } CKEDITOR.cleanWord = CKEDITOR.pasteFilters.word = pastetools.createFilter( { rules: [ commonFilter.rules, plug.rules ], additionalTransforms: function( html ) { // Before filtering inline all the styles to allow because some of them are available only in style // sheets. This step is skipped in IEs due to their flaky support for custom types in dataTransfer. (https://dev.ckeditor.com/ticket/16847) if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported ) { html = commonFilter.styles.inliner.inline( html ).getBody().getHtml(); } // Sometimes Word malforms the comments. return html.replace( //g, ']-->' ); } } ); /** * See {@link CKEDITOR.plugins.pastetools.filters.word.lists}. * * @property {Object} lists * @private * @deprecated 4.13.0 * @since 4.6.0 * @member CKEDITOR.plugins.pastefromword */ /** * See {@link CKEDITOR.plugins.pastetools.filters.word.images}. * * @property {Object} images * @private * @deprecated 4.13.0 * @removed 4.16.0 * @since 4.8.0 * @member CKEDITOR.plugins.pastefromword */ /** * See {@link CKEDITOR.plugins.pastetools.filters.image}. * * @property {Object} images * @private * @removed 4.16.0 * @since 4.13.0 * @member CKEDITOR.plugins.pastetools.filters.word */ /** * See {@link CKEDITOR.plugins.pastetools.filters.image#extractFromRtf}. * * @property {Function} extractFromRtf * @private * @removed 4.16.0 * @since 4.13.0 * @member CKEDITOR.plugins.pastetools.filters.word.images */ /** * See {@link CKEDITOR.plugins.pastetools.filters.image#extractTagsFromHtml}. * * @property {Function} extractTagsFromHtml * @private * @removed 4.16.0 * @since 4.13.0 * @member CKEDITOR.plugins.pastetools.filters.word.images */ /** * See {@link CKEDITOR.plugins.pastetools.filters.word.heuristics}. * * @property {Object} heuristics * @private * @deprecated 4.13.0 * @since 4.6.2 * @member CKEDITOR.plugins.pastefromword */ /** * See {@link CKEDITOR.plugins.pastetools.filters.common.styles}. * * @property {Object} styles * @private * @deprecated 4.13.0 * @since 4.6.0 * @member CKEDITOR.plugins.pastefromword */ /** * See {@link #pasteTools_removeFontStyles}. * * **Important note:** Prior to version 4.6.0 this configuration option defaulted to `true`. * * @deprecated 4.13.0 * @since 3.1.0 * @cfg {Boolean} [pasteFromWordRemoveFontStyles=false] * @member CKEDITOR.config */ /** * Whether to transform Microsoft Word outline numbered headings into lists. * * config.pasteFromWordNumberedHeadingToList = true; * * @removed 4.6.0 * @since 3.1.0 * @cfg {Boolean} [pasteFromWordNumberedHeadingToList=false] * @member CKEDITOR.config */ /** * Whether to remove element styles that cannot be managed with the editor. Note * that this option does not handle font-specific styles, which depend on the * {@link #pasteTools_removeFontStyles} setting instead. * * config.pasteFromWordRemoveStyles = false; * * @removed 4.6.0 * @since 3.1.0 * @cfg {Boolean} [pasteFromWordRemoveStyles=true] * @member CKEDITOR.config */ /** * Activates a heuristic that helps detect lists pasted into the editor in Microsoft Edge. * * The reason why this heuristic is needed is that on pasting Microsoft Edge removes any Word-specific * metadata allowing to identify lists. * * // Disables list heuristics for Edge. * config.pasteFromWord_heuristicsEdgeList = false; * * @since 4.6.2 * @cfg {Boolean} [pasteFromWord_heuristicsEdgeList=true] * @member CKEDITOR.config */ CKEDITOR.config.pasteFromWord_heuristicsEdgeList = true; } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/plugin.js0000755000201500020150000002100514515446711025003 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview This plugin handles pasting content from Microsoft Office applications. */ ( function() { /* global confirm */ CKEDITOR.plugins.add( 'pastefromword', { requires: 'pastetools', // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'pastefromword,pastefromword-rtl', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { // Flag indicate this command is actually been asked instead of a generic pasting. var forceFromWord = 0, pastetoolsPath = CKEDITOR.plugins.getPath( 'pastetools' ), path = this.path, configInlineImages = editor.config.pasteFromWord_inlineImages === undefined ? true : editor.config.pasteFromWord_inlineImages, defaultFilters = [ CKEDITOR.getUrl( pastetoolsPath + 'filter/common.js' ), CKEDITOR.getUrl( pastetoolsPath + 'filter/image.js' ), CKEDITOR.getUrl( path + 'filter/default.js' ) ]; editor.addCommand( 'pastefromword', { // Snapshots are done manually by editable.insertXXX methods. canUndo: false, async: true, /** * The Paste from Word command. It will determine its pasted content from Word automatically if possible. * * At the time of writing it was working correctly only in Internet Explorer browsers, due to their * `paste` support in `document.execCommand`. * * @private * @param {CKEDITOR.editor} editor An instance of the editor where the command is being executed. * @param {Object} [data] The options object. * @param {Boolean/String} [data.notification=true] Content for a notification shown after an unsuccessful * paste attempt. If `false`, the notification will not be displayed. This parameter was added in 4.7.0. * @member CKEDITOR.editor.commands.pastefromword */ exec: function( editor, data ) { forceFromWord = 1; editor.execCommand( 'paste', { type: 'html', notification: data && typeof data.notification !== 'undefined' ? data.notification : true } ); } } ); // Register the toolbar button. CKEDITOR.plugins.clipboard.addPasteButton( editor, 'PasteFromWord', { label: editor.lang.pastefromword.toolbar, command: 'pastefromword', toolbar: 'clipboard,50' } ); // Features brought by this command beside the normal process: // 1. No more bothering of user about the clean-up. // 2. Perform the clean-up even if content is not from Microsoft Word. // (e.g. from a Microsoft Word similar application.) // 3. Listen with high priority (3), so clean up is done before content // type sniffing (priority = 6). editor.pasteTools.register( { filters: editor.config.pasteFromWordCleanupFile ? [ editor.config.pasteFromWordCleanupFile ] : defaultFilters, canHandle: function( evt ) { var data = evt.data, // Always get raw clipboard data (#3586). mswordHtml = CKEDITOR.plugins.pastetools.getClipboardData( data, 'text/html' ), generatorName = CKEDITOR.plugins.pastetools.getContentGeneratorName( mswordHtml ), wordRegexp = /(class="?Mso|style=["'][^"]*?\bmso\-|w:WordDocument||<\/font>)/, // Use wordRegexp only when there is no meta generator tag in the content isOfficeContent = generatorName ? generatorName === 'microsoft' : wordRegexp.test( mswordHtml ); return mswordHtml && ( forceFromWord || isOfficeContent ); }, handle: function( evt, next ) { var data = evt.data, mswordHtml = CKEDITOR.plugins.pastetools.getClipboardData( data, 'text/html' ), // Required in Paste from Word Image plugin (#662). dataTransferRtf = CKEDITOR.plugins.pastetools.getClipboardData( data, 'text/rtf' ), pfwEvtData = { dataValue: mswordHtml, dataTransfer: { 'text/rtf': dataTransferRtf } }; // PFW might still get prevented, if it's not forced. if ( editor.fire( 'pasteFromWord', pfwEvtData ) === false && !forceFromWord ) { return; } // Do not apply paste filter to data filtered by the Word filter (https://dev.ckeditor.com/ticket/13093). data.dontFilter = true; if ( forceFromWord || confirmCleanUp() ) { pfwEvtData.dataValue = CKEDITOR.cleanWord( pfwEvtData.dataValue, editor ); // Paste From Word Image: // RTF clipboard is required for embedding images. // If img tags are not allowed there is no point to process images. // Also skip embedding images if image filter is not loaded. if ( CKEDITOR.plugins.clipboard.isCustomDataTypesSupported && configInlineImages && CKEDITOR.pasteFilters.image ) { pfwEvtData.dataValue = CKEDITOR.pasteFilters.image( pfwEvtData.dataValue, editor, dataTransferRtf ); } editor.fire( 'afterPasteFromWord', pfwEvtData ); data.dataValue = pfwEvtData.dataValue; if ( editor.config.forcePasteAsPlainText === true ) { // If `config.forcePasteAsPlainText` set to true, force plain text even on Word content (#1013). data.type = 'text'; } else if ( !CKEDITOR.plugins.clipboard.isCustomCopyCutSupported && editor.config.forcePasteAsPlainText === 'allow-word' ) { // In browsers using pastebin when pasting from Word, evt.data.type is 'auto' (not 'html') so it gets converted // by 'pastetext' plugin to 'text'. We need to restore 'html' type (#1013) and (#1638). data.type = 'html'; } } // Reset forceFromWord. forceFromWord = 0; next(); function confirmCleanUp() { return !editor.config.pasteFromWordPromptCleanup || confirm( editor.lang.pastefromword.confirmCleanup ); } } } ); } } ); } )(); /** * Whether to prompt the user about the clean up of content being pasted from Microsoft Word. * * config.pasteFromWordPromptCleanup = true; * * @since 3.1.0 * @cfg {Boolean} [pasteFromWordPromptCleanup=false] * @member CKEDITOR.config */ /** * The file that provides the Microsoft Word cleanup function for pasting operations. * * **Note:** This is a global configuration shared by all editor instances present * on the page. * * // Load from the 'pastefromword' plugin 'filter' sub folder (custom.js file) using a path relative to the CKEditor installation folder. * CKEDITOR.config.pasteFromWordCleanupFile = 'plugins/pastefromword/filter/custom.js'; * * // Load from the 'pastefromword' plugin 'filter' sub folder (custom.js file) using a full path (including the CKEditor installation folder). * CKEDITOR.config.pasteFromWordCleanupFile = '/ckeditor/plugins/pastefromword/filter/custom.js'; * * // Load custom.js file from the 'customFilters' folder (located in server's root) using the full URL. * CKEDITOR.config.pasteFromWordCleanupFile = 'http://my.example.com/customFilters/custom.js'; * * @since 3.1.0 * @cfg {String} [pasteFromWordCleanupFile= + 'filter/default.js'] * @member CKEDITOR.config */ /** * Flag decides whether embedding images pasted with Word content is enabled or not. * * **Note:** Please be aware that embedding images requires Clipboard API support, available only in modern browsers, that is indicated by * {@link CKEDITOR.plugins.clipboard#isCustomDataTypesSupported} flag. * * // Disable embedding images pasted from Word. * config.pasteFromWord_inlineImages = false; * * @since 4.8.0 * @cfg {Boolean} [pasteFromWord_inlineImages=true] * @member CKEDITOR.config */ /** * See {@link #pasteTools_keepZeroMargins}. * @since 4.12.0 * @deprecated 4.13.0 * @cfg {Boolean} [pasteFromWord_keepZeroMargins=false] * @member CKEDITOR.config */ /** * Fired when the pasted content was recognized as Microsoft Word content. * * This event is cancellable. If canceled, it will prevent Paste from Word processing. * * @since 4.6.0 * @event pasteFromWord * @param data * @param {String} data.dataValue Pasted content. Changes to this property will affect the pasted content. * @member CKEDITOR.editor */ /** * Fired after the Paste form Word filters have been applied. * * @since 4.6.0 * @event afterPasteFromWord * @param data * @param {String} data.dataValue Pasted content after processing. Changes to this property will affect the pasted content. * @member CKEDITOR.editor */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/0000755000201500020150000000000014515446711024067 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/zh.js0000644000201500020150000000074214515446711025051 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'zh', { confirmCleanup: '您想貼上的文字似乎是自 Word 複製而來,請問您是否要先清除 Word 的格式後再行貼上?', error: '由於發生內部錯誤,無法清除清除 Word 的格式。', title: '自 Word 貼上', toolbar: '自 Word 貼上' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/nb.js0000644000201500020150000000074314515446711025030 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'nb', { confirmCleanup: 'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?', error: 'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil', title: 'Lim inn fra Word', toolbar: 'Lim inn fra Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/eo.js0000644000201500020150000000073614515446711025036 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'eo', { confirmCleanup: 'La teksto, kiun vi volas interglui, ŝajnas esti kopiita el Word. Ĉu vi deziras purigi ĝin antaŭ intergluo?', error: 'Ne eblis purigi la intergluitajn datenojn pro interna eraro', title: 'Interglui el Word', toolbar: 'Interglui el Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/es.js0000644000201500020150000000070314515446711025034 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'es', { confirmCleanup: 'El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?', error: 'No ha sido posible limpiar los datos debido a un error interno', title: 'Pegar desde Word', toolbar: 'Pegar desde Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ro.js0000644000201500020150000000075114515446711025050 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ro', { confirmCleanup: 'Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?', error: 'Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne', title: 'Adaugă din Word', toolbar: 'Adaugă din Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/hr.js0000644000201500020150000000072614515446711025043 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'hr', { confirmCleanup: 'Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?', error: 'Nije moguće očistiti podatke za ljepljenje zbog interne greške', title: 'Zalijepi iz Worda', toolbar: 'Zalijepi iz Worda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/it.js0000644000201500020150000000072614515446711025046 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'it', { confirmCleanup: 'Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?', error: 'Non è stato possibile eliminare il testo incollato a causa di un errore interno.', title: 'Incolla da Word', toolbar: 'Incolla da Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/de-ch.js0000644000201500020150000000101114515446711025376 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'de-ch', { confirmCleanup: 'Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?', error: 'Aufgrund eines internen Fehlers war es nicht möglich, die eingefügten Daten zu bereinigen', title: 'Aus Word einfügen', toolbar: 'Aus Word einfügen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/sk.js0000644000201500020150000000073514515446711025047 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'sk', { confirmCleanup: 'Zdá sa, že vkladaný text pochádza z programu MS Word. Chcete ho pred vkladaním automaticky vyčistiť?', error: 'Kvôli internej chybe nebolo možné vložené dáta vyčistiť', title: 'Vložiť z Wordu', toolbar: 'Vložiť z Wordu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/az.js0000644000201500020150000000075114515446711025042 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'az', { confirmCleanup: 'Əlavə edilən mətn Word-dan köçürülənə oxşayır. Təmizləmək istəyirsinizmi?', error: 'Daxili səhvə görə əlavə edilən məlumatların təmizlənməsi mümkün deyil', title: 'Word-dan əlavəetmə', toolbar: 'Word-dan əlavəetmə' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/pt.js0000644000201500020150000000073314515446711025053 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'pt', { confirmCleanup: 'O texto que pretende colar parece ter sido copiado do Word. Deseja limpar o código antes de o colar?', error: 'Não foi possível limpar a informação colada devido a um erro interno.', title: 'Colar do Word', toolbar: 'Colar do Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/si.js0000644000201500020150000000105114515446711025035 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'si', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'වචන වලින් අලවන්න', toolbar: 'වචන වලින් අලවන්න' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ko.js0000644000201500020150000000077714515446711025051 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ko', { confirmCleanup: '붙여 넣을 내용은 MS Word에서 복사 한 것입니다. 붙여 넣기 전에 정리 하시겠습니까?', error: '내부 오류로 붙여 넣은 데이터를 정리 할 수 없습니다.', title: 'MS Word 에서 붙여넣기', toolbar: 'MS Word 에서 붙여넣기' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/mk.js0000644000201500020150000000100514515446711025030 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'mk', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Paste from Word', // MISSING toolbar: 'Paste from Word' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/cy.js0000644000201500020150000000070214515446711025037 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'cy', { confirmCleanup: 'Mae\'r testun rydych chi am ludo wedi\'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?', error: 'Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol', title: 'Gludo o Word', toolbar: 'Gludo o Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/uk.js0000644000201500020150000000120414515446711025041 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'uk', { confirmCleanup: 'Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?', error: 'Неможливо очистити форматування через внутрішню помилку.', title: 'Вставити з Word', toolbar: 'Вставити з Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/zh-cn.js0000644000201500020150000000070614515446711025447 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'zh-cn', { confirmCleanup: '您要粘贴的内容好像是来自 MS Word,是否要清除 MS Word 格式后再粘贴?', error: '由于内部错误无法清理要粘贴的数据', title: '从 MS Word 粘贴', toolbar: '从 MS Word 粘贴' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/sv.js0000644000201500020150000000077114515446711025062 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'sv', { confirmCleanup: 'Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa den innan du klistrar in den?', error: 'Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel', title: 'Klistra in från Word', toolbar: 'Klistra in från Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/lt.js0000644000201500020150000000071514515446711025047 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'lt', { confirmCleanup: 'Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?', error: 'Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto', title: 'Įdėti iš Word', toolbar: 'Įdėti iš Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/is.js0000644000201500020150000000075514515446711025047 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'is', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Líma úr Word', toolbar: 'Líma úr Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/fr-ca.js0000644000201500020150000000075614515446711025425 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'fr-ca', { confirmCleanup: 'Le texte que vous tentez de coller semble provenir de Word. Désirez vous le nettoyer avant de coller?', error: 'Il n\'a pas été possible de nettoyer les données collées du à une erreur interne', title: 'Coller de Word', toolbar: 'Coller de Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/et.js0000644000201500020150000000072514515446711025041 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'et', { confirmCleanup: 'Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?', error: 'Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik', title: 'Asetamine Wordist', toolbar: 'Asetamine Wordist' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/bs.js0000644000201500020150000000076514515446711025041 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'bs', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Zalijepi iz Word-a', toolbar: 'Zalijepi iz Word-a' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/pl.js0000644000201500020150000000102014515446711025031 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'pl', { confirmCleanup: 'Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?', error: 'Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.', title: 'Wklej z programu MS Word', toolbar: 'Wklej z programu MS Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/bg.js0000644000201500020150000000117014515446711025014 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'bg', { confirmCleanup: 'Текстът, който искате да поставите, изглежда е копиран от Word. Искате ли да се почисти преди поставянето?', error: 'Вмъкваните данни не могат да бъдат почистени поради вътрешна грешка', title: 'Вмъкни от Word', toolbar: 'Вмъкни от Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/fa.js0000644000201500020150000000120514515446711025011 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'fa', { confirmCleanup: 'متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟', error: 'به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.', title: 'چسباندن از Word', toolbar: 'چسباندن از Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ku.js0000644000201500020150000000114214515446711025042 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ku', { confirmCleanup: 'ئەم دەقەی بەتەمای بیلکێنی پێدەچێت له word هێنرابێت. دەتەوێت پاکی بکەیوه پێش ئەوەی بیلکێنی؟', error: 'هیچ ڕێگەیەك نەبوو لەلکاندنی دەقەکه بەهۆی هەڵەیەکی ناوەخۆیی', title: 'لکاندنی لەلایەن Word', toolbar: 'لکاندنی لەڕێی Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/bn.js0000644000201500020150000000101514515446711025021 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'bn', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'পেস্ট (শব্দ)', toolbar: 'পেস্ট (শব্দ)' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/el.js0000644000201500020150000000127614515446711025033 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'el', { confirmCleanup: 'Το κείμενο που επικολλάται φαίνεται να είναι αντιγραμμένο από το Word. Μήπως θα θέλατε να καθαριστεί προτού επικολληθεί;', error: 'Δεν ήταν δυνατό να καθαριστούν τα δεδομένα λόγω ενός εσωτερικού σφάλματος', title: 'Επικόλληση από το Word', toolbar: 'Επικόλληση από το Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/fi.js0000644000201500020150000000077214515446711025031 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'fi', { confirmCleanup: 'Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)', error: 'Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia', title: 'Liitä Word-dokumentista', toolbar: 'Liitä Word-dokumentista' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ru.js0000644000201500020150000000121614515446711025053 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ru', { confirmCleanup: 'Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?', error: 'Невозможно очистить вставленные данные из-за внутренней ошибки', title: 'Вставить из Word', toolbar: 'Вставить из Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/gl.js0000644000201500020150000000071614515446711025033 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'gl', { confirmCleanup: 'O texto que quere pegar semella ser copiado desde o Word. Quere depuralo antes de pegalo?', error: 'Non foi posíbel depurar os datos pegados por mor dun erro interno', title: 'Pegar desde Word', toolbar: 'Pegar desde Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/sr-latn.js0000644000201500020150000000062414515446711026007 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'sr-latn', { confirmCleanup: 'Kopirani tekst je iz Word-a. Želite ga očistiti? ', error: 'Zbog interne greške tekst nije očišćen.', title: 'Zalepi iz Worda', toolbar: 'Zalepi iz Worda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/oc.js0000644000201500020150000000073414515446711025032 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'oc', { confirmCleanup: 'Sembla que lo tèxte de pegar proven de Word. Lo volètz netejar abans de lo pegar ?', error: 'Las donadas pegadas an pas pogut èsser netejadas a causa d\'una error intèrna', title: 'Pegar dempuèi Word', toolbar: 'Pegar dempuèi Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/sq.js0000644000201500020150000000101514515446711025045 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'sq', { confirmCleanup: 'Teksti që dëshironi të e hidhni siç duket është kopjuar nga Word-i. Dëshironi të e pastroni para se të e hidhni?', error: 'Nuk ishte e mundur të fshiheshin të dhënat e hedhura për shkak të një gabimi të brendshëm', title: 'Hidhe nga Word-i', toolbar: 'Hidhe nga Word-i' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/pt-br.js0000644000201500020150000000075314515446711025456 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'pt-br', { confirmCleanup: 'O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?', error: 'Não foi possível limpar os dados colados devido a um erro interno', title: 'Colar do Word', toolbar: 'Colar do Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/fo.js0000644000201500020150000000072014515446711025030 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'fo', { confirmCleanup: 'Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?', error: 'Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil', title: 'Innrita frá Word', toolbar: 'Innrita frá Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/af.js0000644000201500020150000000075314515446711025020 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'af', { confirmCleanup: 'Die teks wat u wil byvoeg lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit bygevoeg word?', error: 'Die bygevoegte teks kon nie skoongemaak word nie, weens \'n interne fout', title: 'Uit Word byvoeg', toolbar: 'Uit Word byvoeg' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/hi.js0000644000201500020150000000103314515446711025022 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'hi', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'पेस्ट (वर्ड से)', toolbar: 'पेस्ट (वर्ड से)' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/km.js0000644000201500020150000000161114515446711025033 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'km', { confirmCleanup: 'អត្ថបទ​ដែល​អ្នក​ចង់​បិទ​ភ្ជាប់​នេះ ទំនង​ដូច​ជា​ចម្លង​មក​ពី Word។ តើ​អ្នក​ចង់​សម្អាត​វា​មុន​បិទ​ភ្ជាប់​ទេ?', error: 'ដោយ​សារ​មាន​បញ្ហា​ផ្នែក​ក្នុង​ធ្វើ​ឲ្យ​មិន​អាច​សម្អាត​ទិន្នន័យ​ដែល​បាន​បិទ​ភ្ជាប់', title: 'បិទ​ភ្ជាប់​ពី Word', toolbar: 'បិទ​ភ្ជាប់​ពី Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/nl.js0000644000201500020150000000077614515446711025050 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'nl', { confirmCleanup: 'De tekst die u wilt plakken lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?', error: 'Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout', title: 'Plakken vanuit Word', toolbar: 'Plakken vanuit Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ka.js0000644000201500020150000000126214515446711025021 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ka', { confirmCleanup: 'ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?', error: 'შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა', title: 'ვორდიდან ჩასმა', toolbar: 'ვორდიდან ჩასმა' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/es-mx.js0000644000201500020150000000072414515446711025461 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'es-mx', { confirmCleanup: 'El texto que desea pegar parece estar copiado de Word. ¿Quieres limpiarlo antes de pegarlo?', error: 'No fue posible limpiar los datos pegados debido a un error interno', title: 'Pegar desde word', toolbar: 'Pegar desde word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/mn.js0000644000201500020150000000100514515446711025033 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'mn', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Word-оос буулгах', toolbar: 'Word-оос буулгах' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/da.js0000644000201500020150000000077014515446711025015 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'da', { confirmCleanup: 'Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?', error: 'Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl', title: 'Indsæt fra Word', toolbar: 'Indsæt fra Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/he.js0000644000201500020150000000102214515446711025014 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'he', { confirmCleanup: 'נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?', error: 'לא ניתן היה לנקות את המידע בשל תקלה פנימית.', title: 'הדבקה מ-Word', toolbar: 'הדבקה מ-Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ca.js0000644000201500020150000000075314515446711025015 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ca', { confirmCleanup: 'El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?', error: 'No ha estat possible netejar les dades enganxades degut a un error intern', title: 'Enganxa des del Word', toolbar: 'Enganxa des del Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/gu.js0000644000201500020150000000130714515446711025041 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'gu', { confirmCleanup: 'તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?', error: 'પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.', title: 'પેસ્ટ (વડૅ ટેક્સ્ટ)', toolbar: 'પેસ્ટ (વડૅ ટેક્સ્ટ)' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ms.js0000644000201500020150000000076114515446711025050 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ms', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Tampal dari Word', toolbar: 'Tampal dari Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/th.js0000644000201500020150000000175314515446711025046 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'th', { confirmCleanup: 'ข้อความที่คุณต้องการวางลงไปเป็นข้อความที่คัดลอกมาจากโปรแกรมไมโครซอฟท์เวิร์ด คุณต้องการล้างค่าข้อความดังกล่าวก่อนวางลงไปหรือไม่?', error: 'ไม่สามารถล้างข้อมูลที่ต้องการวางได้เนื่องจากเกิดข้อผิดพลาดภายในระบบ', title: 'วางสำเนาจากตัวอักษรเวิร์ด', toolbar: 'วางสำเนาจากตัวอักษรเวิร์ด' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/de.js0000644000201500020150000000100514515446711025011 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'de', { confirmCleanup: 'Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?', error: 'Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen', title: 'Aus Word einfügen', toolbar: 'Aus Word einfügen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/en-ca.js0000644000201500020150000000076214515446711025415 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'en-ca', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Paste from Word', toolbar: 'Paste from Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/tt.js0000644000201500020150000000077714515446711025067 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'tt', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING error: 'It was not possible to clean up the pasted data due to an internal error', // MISSING title: 'Word\'тан өстәү', toolbar: 'Word\'тан өстәү' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/vi.js0000644000201500020150000000104114515446711025037 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'vi', { confirmCleanup: 'Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?', error: 'Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ', title: 'Dán với định dạng Word', toolbar: 'Dán với định dạng Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/cs.js0000644000201500020150000000074114515446711025034 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'cs', { confirmCleanup: 'Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?', error: 'Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.', title: 'Vložit z Wordu', toolbar: 'Vložit z Wordu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/tr.js0000644000201500020150000000076214515446711025057 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'tr', { confirmCleanup: 'Yapıştırmaya çalıştığınız metin Word\'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?', error: 'Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir', title: 'Word\'den Yapıştır', toolbar: 'Word\'den Yapıştır' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ja.js0000644000201500020150000000111014515446711025010 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ja', { confirmCleanup: '貼り付けを行うテキストはワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか?', error: '内部エラーにより貼り付けたデータをクリアできませんでした', title: 'ワード文章から貼り付け', toolbar: 'ワード文章から貼り付け' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/sl.js0000644000201500020150000000074014515446711025044 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'sl', { confirmCleanup: 'Besedilo, ki ga želite prilepiti, je kopirano iz Worda. Ali ga želite očistiti, preden ga prilepite?', error: 'Ni bilo mogoče očistiti prilepljenih podatkov zaradi notranje napake', title: 'Prilepi iz Worda', toolbar: 'Prilepi iz Worda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/lv.js0000644000201500020150000000075114515446711025051 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'lv', { confirmCleanup: 'Teksts, kuru vēlaties ielīmēt, izskatās ir nokopēts no Word. Vai vēlaties to iztīrīt pirms ielīmēšanas?', error: 'Iekšējas kļūdas dēļ, neizdevās iztīrīt ielīmētos datus.', title: 'Ievietot no Worda', toolbar: 'Ievietot no Worda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/en-au.js0000644000201500020150000000073414515446711025436 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'en-au', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', error: 'It was not possible to clean up the pasted data due to an internal error', title: 'Paste from Word', toolbar: 'Paste from Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/en.js0000644000201500020150000000073114515446711025030 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'en', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', error: 'It was not possible to clean up the pasted data due to an internal error', title: 'Paste from Word', toolbar: 'Paste from Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/no.js0000644000201500020150000000074314515446711025045 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'no', { confirmCleanup: 'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?', error: 'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil', title: 'Lim inn fra Word', toolbar: 'Lim inn fra Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/fr.js0000644000201500020150000000074214515446711025037 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'fr', { confirmCleanup: 'Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller ?', error: 'Les données collées n\'ont pas pu être nettoyées à cause d\'une erreur interne', title: 'Coller depuis Word', toolbar: 'Coller depuis Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/id.js0000644000201500020150000000075314515446711025026 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'id', { confirmCleanup: 'Teks yang ingin anda tempel sepertinya di salin dari Word. Apakah anda mau membersihkannya sebelum menempel?', error: 'Tidak mungkin membersihkan data yang ditempel dikerenakan kesalahan internal', title: 'Tempel dari Word', toolbar: 'Tempel dari Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ug.js0000644000201500020150000000121614515446711025040 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ug', { confirmCleanup: 'سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟', error: 'ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ', title: 'MS Word تىن چاپلا', toolbar: 'MS Word تىن چاپلا' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/ar.js0000644000201500020150000000104014515446711025022 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'ar', { confirmCleanup: 'يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟', error: 'لم يتم مسح المعلومات الملصقة لخلل داخلي', title: 'لصق من وورد', toolbar: 'لصق من وورد' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/sr.js0000644000201500020150000000075214515446711025055 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'sr', { confirmCleanup: 'Уметнути текст је копиран из Word-а. Желите га очитити? ', error: 'Због интерне грешке текст није очишћен.', title: 'Залепи из Worda', toolbar: 'Залепи из Worda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/eu.js0000644000201500020150000000072614515446711025043 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'eu', { confirmCleanup: 'Itsatsi nahi duzun testua Word-etik kopiatua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?', error: 'Barne-errore bat dela eta ezin izan da itsatsitako testua garbitu', title: 'Itsatsi Word-etik', toolbar: 'Itsatsi Word-etik' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/en-gb.js0000644000201500020150000000073414515446711025421 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'en-gb', { confirmCleanup: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', error: 'It was not possible to clean up the pasted data due to an internal error', title: 'Paste from Word', toolbar: 'Paste from Word' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/lang/hu.js0000644000201500020150000000075414515446711025047 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'pastefromword', 'hu', { confirmCleanup: 'Úgy tűnik a beillesztett szöveget Word-ből másolta át. Meg szeretné tisztítani a szöveget? (ajánlott)', error: 'Egy belső hiba miatt nem sikerült megtisztítani a szöveget', title: 'Beillesztés Word-ből', toolbar: 'Beillesztés Word-ből' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/icons/0000755000201500020150000000000014503523375024260 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/icons/pastefromword.png0000644000201500020150000000072714503523375027670 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8˥SA0\Oyқߢ tښTrI†DCH " ]n̬'R 4~e_TT$~ώl$ +Qͦ6,ljѐVU=bJJ6HZU$֙I~&3;5ϣZs 8 m 97Ba'תc ewN%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/icons/hidpi/0000755000201500020150000000000014503523375025355 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/icons/hidpi/pastefromword.png0000644000201500020150000000162714503523375030765 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXíWn0}Gʴ7yT蒥c l pg?h#dHK@?7ْxs)%"Żw㉢z f0s]J({"j5y8RUUbF1Lem9nocqD <՘ }kmȲ ]Vjyoe4M92J|`|>Z\u9,KH]*ĝ;PJIUU]/qpJkvC5hOJ6 *>nȏ 2F_ 0p \]ah(cVnJhl$._lݧ4" wƘKK&{a9ABʼne;$!us [pV@`ŲQ)enʍF0 1^u`Lp!QI\k}zϕR}1fUUFUUm1cpoyoIB8$EŒV1_,˯ylr*nN,o+760NyĆ=8" whX4&˲: 7* ZkJ?$"B$!TwgBӾb3U5k} SEQ.^'ecE~d<;v%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/pastefromword/icons/hidpi/pastefromword-rtl.png0000644000201500020150000000165714503523375031567 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXWn0}GSR&(d!%poOh#C]Y%vϥNE'zaR<=iZVDtDtPJ}=y"5}CyQOm%"Wu]70xxm۞; Ir-0xcO^te_B3:ESsR/&Z"TC)C`4R.1Qȵ'788p+!OEq r#"CX) Ncچj| AmI_cHf2)1CO`^)El2Vb8udIDAT8˕Av0 D"qeyTz^ ћnDJMl@263If`WI_*HRD\ (}M$2wB;(u!Ɇ2g'S5| ճmVynt4/9#wQf8$el3ch{n%%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/widgetselection/0000755000201500020150000000000014515446713023445 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widgetselection/plugin.js0000644000201500020150000002623214515446713025306 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview A plugin created to handle ticket https://dev.ckeditor.com/ticket/11064. While the issue is caused by native WebKit/Blink behaviour, * this plugin can be easily detached or modified when the issue is fixed in the browsers without changing the core. * When Ctrl/Cmd + A is pressed to select all content it does not work due to a bug in * Webkit/Blink if a non-editable element is at the beginning or the end of the content. */ ( function() { 'use strict'; CKEDITOR.plugins.add( 'widgetselection', { init: function( editor ) { if ( CKEDITOR.env.webkit ) { var widgetselection = CKEDITOR.plugins.widgetselection; editor.on( 'contentDom', function( evt ) { var editor = evt.editor, editable = editor.editable(); editable.attachListener( editable, 'keydown', function( evt ) { // Ctrl/Cmd + A if ( evt.data.getKeystroke() == CKEDITOR.CTRL + 65 ) { // Defer the call so the selection is already changed by the pressed keys. CKEDITOR.tools.setTimeout( function() { // Manage filler elements on keydown. If there is no need // to add fillers, we need to check and clean previously used once. if ( !widgetselection.addFillers( editable ) ) { widgetselection.removeFillers( editable ); } }, 0 ); } }, null, null, -1 ); // Check and clean previously used fillers. editor.on( 'selectionCheck', function( evt ) { widgetselection.removeFillers( evt.editor.editable() ); } ); // Remove fillers on paste before data gets inserted into editor. editor.on( 'paste', function( evt ) { evt.data.dataValue = widgetselection.cleanPasteData( evt.data.dataValue ); } ); if ( 'selectall' in editor.plugins ) { widgetselection.addSelectAllIntegration( editor ); } } ); } } } ); /** * A set of helper methods for the Widget Selection plugin. * * @property widgetselection * @member CKEDITOR.plugins * @since 4.6.1 */ CKEDITOR.plugins.widgetselection = { /** * The start filler element reference. * * @property {CKEDITOR.dom.element} * @member CKEDITOR.plugins.widgetselection * @private */ startFiller: null, /** * The end filler element reference. * * @property {CKEDITOR.dom.element} * @member CKEDITOR.plugins.widgetselection * @private */ endFiller: null, /** * An attribute which identifies the filler element. * * @property {String} * @member CKEDITOR.plugins.widgetselection * @private */ fillerAttribute: 'data-cke-filler-webkit', /** * The default content of the filler element. Note: The filler needs to have `visible` content. * Unprintable elements or empty content do not help as a workaround. * * @property {String} * @member CKEDITOR.plugins.widgetselection * @private */ fillerContent: ' ', /** * Tag name which is used to create fillers. * * @property {String} * @member CKEDITOR.plugins.widgetselection * @private */ fillerTagName: 'div', /** * Adds a filler before or after a non-editable element at the beginning or the end of the `editable`. * * @param {CKEDITOR.editable} editable * @returns {Boolean} * @member CKEDITOR.plugins.widgetselection */ addFillers: function( editable ) { var editor = editable.editor; // Whole content should be selected, if not fix the selection manually. if ( !this.isWholeContentSelected( editable ) && editable.getChildCount() > 0 ) { var firstChild = editable.getFirst( filterTempElements ), lastChild = editable.getLast( filterTempElements ); // Check if first element is editable. If not prepend with filler. if ( firstChild && firstChild.type == CKEDITOR.NODE_ELEMENT && !firstChild.isEditable() ) { this.startFiller = this.createFiller(); editable.append( this.startFiller, 1 ); } // Check if last element is editable. If not append filler. if ( lastChild && lastChild.type == CKEDITOR.NODE_ELEMENT && !lastChild.isEditable() ) { this.endFiller = this.createFiller( true ); editable.append( this.endFiller, 0 ); } // Reselect whole content after any filler was added. if ( this.hasFiller( editable ) ) { var rangeAll = editor.createRange(); rangeAll.selectNodeContents( editable ); rangeAll.select(); return true; } } return false; }, /** * Removes filler elements or updates their references. * * It will **not remove** filler elements if the whole content is selected, as it would break the * selection. * * @param {CKEDITOR.editable} editable * @member CKEDITOR.plugins.widgetselection */ removeFillers: function( editable ) { // If startFiller or endFiller exists and not entire content is selected it means the selection // just changed from selected all. We need to remove fillers and set proper selection/content. if ( this.hasFiller( editable ) && !this.isWholeContentSelected( editable ) ) { var startFillerContent = editable.findOne( this.fillerTagName + '[' + this.fillerAttribute + '=start]' ), endFillerContent = editable.findOne( this.fillerTagName + '[' + this.fillerAttribute + '=end]' ); if ( this.startFiller && startFillerContent && this.startFiller.equals( startFillerContent ) ) { this.removeFiller( this.startFiller, editable ); } else { // The start filler is still present but it is a different element than previous one. It means the // undo recreating entirely selected content was performed. We need to update filler reference. this.startFiller = startFillerContent; } if ( this.endFiller && endFillerContent && this.endFiller.equals( endFillerContent ) ) { this.removeFiller( this.endFiller, editable ); } else { // Same as with start filler. this.endFiller = endFillerContent; } } }, /** * Removes fillers from the paste data. * * @param {String} data * @returns {String} * @member CKEDITOR.plugins.widgetselection * @private */ cleanPasteData: function( data ) { if ( data && data.length ) { data = data .replace( this.createFillerRegex(), '' ) .replace( this.createFillerRegex( true ), '' ); } return data; }, /** * Checks if the entire content of the given editable is selected. * * @param {CKEDITOR.editable} editable * @returns {Boolean} * @member CKEDITOR.plugins.widgetselection * @private */ isWholeContentSelected: function( editable ) { var range = editable.editor.getSelection().getRanges()[ 0 ]; if ( range ) { if ( range && range.collapsed ) { return false; } else { var rangeClone = range.clone(); rangeClone.enlarge( CKEDITOR.ENLARGE_ELEMENT ); return !!( rangeClone && editable && rangeClone.startContainer && rangeClone.endContainer && rangeClone.startOffset === 0 && rangeClone.endOffset === editable.getChildCount() && rangeClone.startContainer.equals( editable ) && rangeClone.endContainer.equals( editable ) ); } } return false; }, /** * Checks if there is any filler element in the given editable. * * @param {CKEDITOR.editable} editable * @returns {Boolean} * @member CKEDITOR.plugins.widgetselection * @private */ hasFiller: function( editable ) { return editable.find( this.fillerTagName + '[' + this.fillerAttribute + ']' ).count() > 0; }, /** * Creates a filler element. * * @param {Boolean} [onEnd] If filler will be placed on end or beginning of the content. * @returns {CKEDITOR.dom.element} * @member CKEDITOR.plugins.widgetselection * @private */ createFiller: function( onEnd ) { var filler = new CKEDITOR.dom.element( this.fillerTagName ); filler.setHtml( this.fillerContent ); filler.setAttribute( this.fillerAttribute, onEnd ? 'end' : 'start' ); filler.setAttribute( 'data-cke-temp', 1 ); filler.setStyles( { display: 'block', width: 0, height: 0, padding: 0, border: 0, margin: 0, position: 'absolute', top: 0, left: '-9999px', opacity: 0, overflow: 'hidden' } ); return filler; }, /** * Removes the specific filler element from the given editable. If the filler contains any content (typed or pasted), * it replaces the current editable content. If not, the caret is placed before the first or after the last editable * element (depends if the filler was at the beginning or the end). * * @param {CKEDITOR.dom.element} filler * @param {CKEDITOR.editable} editable * @member CKEDITOR.plugins.widgetselection * @private */ removeFiller: function( filler, editable ) { if ( filler ) { var editor = editable.editor, currentRange = editable.editor.getSelection().getRanges()[ 0 ], currentPath = currentRange.startPath(), range = editor.createRange(), insertedHtml, fillerOnStart, manuallyHandleCaret; if ( currentPath.contains( filler ) ) { insertedHtml = filler.getHtml(); manuallyHandleCaret = true; } fillerOnStart = filler.getAttribute( this.fillerAttribute ) == 'start'; filler.remove(); filler = null; if ( insertedHtml && insertedHtml.length > 0 && insertedHtml != this.fillerContent ) { editable.insertHtmlIntoRange( insertedHtml, editor.getSelection().getRanges()[ 0 ] ); range.setStartAt( editable.getChild( editable.getChildCount() - 1 ), CKEDITOR.POSITION_BEFORE_END ); editor.getSelection().selectRanges( [ range ] ); } else if ( manuallyHandleCaret ) { if ( fillerOnStart ) { range.setStartAt( editable.getFirst().getNext(), CKEDITOR.POSITION_AFTER_START ); } else { range.setEndAt( editable.getLast().getPrevious(), CKEDITOR.POSITION_BEFORE_END ); } editable.editor.getSelection().selectRanges( [ range ] ); } } }, /** * Creates a regular expression which will match the filler HTML in the text. * * @param {Boolean} [onEnd] Whether a regular expression should be created for the filler at the beginning or * the end of the content. * @returns {RegExp} * @member CKEDITOR.plugins.widgetselection * @private */ createFillerRegex: function( onEnd ) { var matcher = this.createFiller( onEnd ).getOuterHtml() .replace( /style="[^"]*"/gi, 'style="[^"]*"' ) .replace( />[^<]*[^<]*<' ); return new RegExp( ( !onEnd ? '^' : '' ) + matcher + ( onEnd ? '$' : '' ) ); }, /** * Adds an integration for the [Select All](https://ckeditor.com/cke4/addon/selectall) plugin to the given `editor`. * * @private * @param {CKEDITOR.editor} editor * @member CKEDITOR.plugins.widgetselection */ addSelectAllIntegration: function( editor ) { var widgetselection = this; editor.editable().attachListener( editor, 'beforeCommandExec', function( evt ) { var editable = editor.editable(); if ( evt.data.name == 'selectAll' && editable ) { widgetselection.addFillers( editable ); } }, null, null, 9999 ); } }; function filterTempElements( el ) { return el.getName && !el.hasAttribute( 'data-cke-temp' ); } } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/dialogui/0000755000201500020150000000000014515446705022052 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/dialogui/plugin.js0000644000201500020150000014736614515446705023727 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview The Dialog User Interface plugin. */ CKEDITOR.plugins.add( 'dialogui', { onLoad: function() { var initPrivateObject = function( elementDefinition ) { this._ || ( this._ = {} ); this._[ 'default' ] = this._.initValue = elementDefinition[ 'default' ] || ''; this._.required = elementDefinition.required || false; var args = [ this._ ]; for ( var i = 1; i < arguments.length; i++ ) args.push( arguments[ i ] ); args.push( true ); CKEDITOR.tools.extend.apply( CKEDITOR.tools, args ); return this._; }, textBuilder = { build: function( dialog, elementDefinition, output ) { return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output ); } }, commonBuilder = { build: function( dialog, elementDefinition, output ) { return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, elementDefinition, output ); } }, containerBuilder = { build: function( dialog, elementDefinition, output ) { var children = elementDefinition.children, child, childHtmlList = [], childObjList = []; for ( var i = 0; ( i < children.length && ( child = children[ i ] ) ); i++ ) { var childHtml = []; childHtmlList.push( childHtml ); childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); } return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); } }, commonPrototype = { isChanged: function() { return this.getValue() != this.getInitValue(); }, reset: function( noChangeEvent ) { this.setValue( this.getInitValue(), noChangeEvent ); }, setInitValue: function() { this._.initValue = this.getValue(); }, resetInitValue: function() { this._.initValue = this._[ 'default' ]; }, getInitValue: function() { return this._.initValue; } }, commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, { onChange: function( dialog, func ) { if ( !this._.domOnChangeRegistered ) { dialog.on( 'load', function() { this.getInputElement().on( 'change', function() { // Make sure 'onchange' doesn't get fired after dialog closed. (https://dev.ckeditor.com/ticket/5719) if ( !dialog.parts.dialog.isVisible() ) return; this.fire( 'change', { value: this.getValue() } ); }, this ); }, this ); this._.domOnChangeRegistered = true; } this.on( 'change', func ); } }, true ), eventRegex = /^on([A-Z]\w+)/, cleanInnerDefinition = function( def ) { // An inner UI element should not have the parent's type, title or events. for ( var i in def ) { if ( eventRegex.test( i ) || i == 'title' || i == 'type' ) delete def[ i ]; } return def; }, // @context {CKEDITOR.dialog.uiElement} UI element (textarea or textInput) // @param {CKEDITOR.dom.event} evt toggleBidiKeyUpHandler = function( evt ) { var keystroke = evt.data.getKeystroke(); // ALT + SHIFT + Home for LTR direction. if ( keystroke == CKEDITOR.SHIFT + CKEDITOR.ALT + 36 ) this.setDirectionMarker( 'ltr' ); // ALT + SHIFT + End for RTL direction. else if ( keystroke == CKEDITOR.SHIFT + CKEDITOR.ALT + 35 ) this.setDirectionMarker( 'rtl' ); }; CKEDITOR.tools.extend( CKEDITOR.ui.dialog, { /** * Base class for all dialog window elements with a textual label on the left. * * @class CKEDITOR.ui.dialog.labeledElement * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a labeledElement class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `label` (Required) The label string. * * `labelLayout` (Optional) Put 'horizontal' here if the * label element is to be laid out horizontally. Otherwise a vertical * layout will be used. * * `widths` (Optional) This applies only to horizontal * layouts — a two-element array of lengths to specify the widths of the * label and the content element. * * `role` (Optional) Value for the `role` attribute. * * `includeLabel` (Optional) If set to `true`, the `aria-labelledby` attribute * will be included. * * @param {Array} htmlList The list of HTML code to output to. * @param {Function} contentHtml * A function returning the HTML code string to be added inside the content * cell. */ labeledElement: function( dialog, elementDefinition, htmlList, contentHtml ) { if ( arguments.length < 4 ) return; var _ = initPrivateObject.call( this, elementDefinition ); _.labelId = CKEDITOR.tools.getNextId() + '_label'; this._.children = []; var innerHTML = function() { var html = [], requiredClass = elementDefinition.required ? ' cke_required' : ''; if ( elementDefinition.labelLayout != 'horizontal' ) { html.push( '', '' ); } else { var hboxDefinition = { type: 'hbox', widths: elementDefinition.widths, padding: 0, children: [ { type: 'html', html: '' }, { type: 'html', html: '' + contentHtml.call( this, dialog, elementDefinition ) + '' } ] }; CKEDITOR.dialog._.uiElementBuilders.hbox.build( dialog, hboxDefinition, html ); } return html.join( '' ); }; var attributes = { role: elementDefinition.role || 'presentation' }; if ( elementDefinition.includeLabel ) attributes[ 'aria-labelledby' ] = _.labelId; CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'div', null, attributes, innerHTML ); }, /** * A text input with a label. This UI element class represents both the * single-line text inputs and password inputs in dialog boxes. * * Since 4.11.0 it also represents the phone number input. * * @class CKEDITOR.ui.dialog.textInput * @extends CKEDITOR.ui.dialog.labeledElement * @constructor Creates a textInput class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `default` (Optional) The default value. * * `validate` (Optional) The validation function. * * `maxLength` (Optional) The maximum length of text box contents. * * `size` (Optional) The size of the text box. This is * usually overridden by the size defined by the skin, though. * * @param {Array} htmlList List of HTML code to output to. */ textInput: function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; initPrivateObject.call( this, elementDefinition ); var domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textInput', attributes = { 'class': 'cke_dialog_ui_input_' + elementDefinition.type, id: domId, type: elementDefinition.type }; // Set the validator, if any. if ( elementDefinition.validate ) this.validate = elementDefinition.validate; // Set the max length and size. if ( elementDefinition.maxLength ) attributes.maxlength = elementDefinition.maxLength; if ( elementDefinition.size ) attributes.size = elementDefinition.size; if ( elementDefinition.inputStyle ) attributes.style = elementDefinition.inputStyle; // If user presses Enter in a text box, it implies clicking OK for the dialog. var me = this, keyPressedOnMe = false; dialog.on( 'load', function() { me.getInputElement().on( 'keydown', function( evt ) { if ( evt.data.getKeystroke() == 13 ) keyPressedOnMe = true; } ); // Lower the priority this 'keyup' since 'ok' will close the dialog.(https://dev.ckeditor.com/ticket/3749) me.getInputElement().on( 'keyup', function( evt ) { if ( evt.data.getKeystroke() == 13 && keyPressedOnMe ) { dialog.getButton( 'ok' ) && setTimeout( function() { dialog.getButton( 'ok' ).click(); }, 0 ); keyPressedOnMe = false; } if ( me.bidi ) toggleBidiKeyUpHandler.call( me, evt ); }, null, null, 1000 ); } ); var innerHTML = function() { // IE BUG: Text input fields in IE at 100% would exceed a or inline // container's width, so need to wrap it inside a
          . var html = [ '' ); return html.join( '' ); }; CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); }, /** * A text area with a label at the top or on the left. * * @class CKEDITOR.ui.dialog.textarea * @extends CKEDITOR.ui.dialog.labeledElement * @constructor Creates a textarea class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * * The element definition. Accepted fields: * * * `rows` (Optional) The number of rows displayed. * Defaults to 5 if not defined. * * `cols` (Optional) The number of cols displayed. * Defaults to 20 if not defined. Usually overridden by skins. * * `default` (Optional) The default value. * * `validate` (Optional) The validation function. * * @param {Array} htmlList List of HTML code to output to. */ textarea: function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; initPrivateObject.call( this, elementDefinition ); var me = this, domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textarea', attributes = {}; if ( elementDefinition.validate ) this.validate = elementDefinition.validate; // Generates the essential attributes for the textarea tag. attributes.rows = elementDefinition.rows || 5; attributes.cols = elementDefinition.cols || 20; attributes[ 'class' ] = 'cke_dialog_ui_input_textarea ' + ( elementDefinition[ 'class' ] || '' ); if ( typeof elementDefinition.inputStyle != 'undefined' ) attributes.style = elementDefinition.inputStyle; if ( elementDefinition.dir ) attributes.dir = elementDefinition.dir; if ( me.bidi ) { dialog.on( 'load', function() { me.getInputElement().on( 'keyup', toggleBidiKeyUpHandler ); }, me ); } var innerHTML = function() { attributes[ 'aria-labelledby' ] = this._.labelId; this._.required && ( attributes[ 'aria-required' ] = this._.required ); var html = [ '' ); return html.join( '' ); }; CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); }, /** * A single checkbox with a label on the right. * * @class CKEDITOR.ui.dialog.checkbox * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a checkbox class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `checked` (Optional) Whether the checkbox is checked * on instantiation. Defaults to `false`. * * `validate` (Optional) The validation function. * * `label` (Optional) The checkbox label. * * @param {Array} htmlList List of HTML code to output to. */ checkbox: function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; var _ = initPrivateObject.call( this, elementDefinition, { 'default': !!elementDefinition[ 'default' ] } ); if ( elementDefinition.validate ) this.validate = elementDefinition.validate; var innerHTML = function() { var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition, { id: elementDefinition.id ? elementDefinition.id + '_checkbox' : CKEDITOR.tools.getNextId() + '_checkbox' }, true ), html = []; var labelId = CKEDITOR.tools.getNextId() + '_label'; var attributes = { 'class': 'cke_dialog_ui_checkbox_input', type: 'checkbox', 'aria-labelledby': labelId }; cleanInnerDefinition( myDefinition ); if ( elementDefinition[ 'default' ] ) attributes.checked = 'checked'; if ( typeof myDefinition.inputStyle != 'undefined' ) myDefinition.style = myDefinition.inputStyle; _.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes ); html.push( ' ' ); return html.join( '' ); }; CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'span', null, null, innerHTML ); }, /** * A group of radio buttons. * * @class CKEDITOR.ui.dialog.radio * @extends CKEDITOR.ui.dialog.labeledElement * @constructor Creates a radio class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `default` (Required) The default value. * * `validate` (Optional) The validation function. * * `items` (Required) An array of options. Each option * is a one- or two-item array of format `[ 'Description', 'Value' ]`. If `'Value'` * is missing, then the value would be assumed to be the same as the description. * * @param {Array} htmlList List of HTML code to output to. */ radio: function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; initPrivateObject.call( this, elementDefinition ); if ( !this._[ 'default' ] ) this._[ 'default' ] = this._.initValue = elementDefinition.items[ 0 ][ 1 ]; if ( elementDefinition.validate ) this.validate = elementDefinition.validate; var children = [], me = this; var innerHTML = function() { var inputHtmlList = [], html = [], commonName = ( elementDefinition.id ? elementDefinition.id : CKEDITOR.tools.getNextId() ) + '_radio'; for ( var i = 0; i < elementDefinition.items.length; i++ ) { var item = elementDefinition.items[ i ], title = item[ 2 ] !== undefined ? item[ 2 ] : item[ 0 ], value = item[ 1 ] !== undefined ? item[ 1 ] : item[ 0 ], inputId = CKEDITOR.tools.getNextId() + '_radio_input', labelId = inputId + '_label', inputDefinition = CKEDITOR.tools.extend( {}, elementDefinition, { id: inputId, title: null, type: null }, true ), labelDefinition = CKEDITOR.tools.extend( {}, inputDefinition, { title: title }, true ), inputAttributes = { type: 'radio', 'class': 'cke_dialog_ui_radio_input', name: commonName, value: value, 'aria-labelledby': labelId }, inputHtml = []; if ( me._[ 'default' ] == value ) inputAttributes.checked = 'checked'; cleanInnerDefinition( inputDefinition ); cleanInnerDefinition( labelDefinition ); if ( typeof inputDefinition.inputStyle != 'undefined' ) inputDefinition.style = inputDefinition.inputStyle; // Make inputs of radio type focusable (https://dev.ckeditor.com/ticket/10866). inputDefinition.keyboardFocusable = true; children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) ); inputHtml.push( ' ' ); new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtml, 'label', null, { id: labelId, 'for': inputAttributes.id }, item[ 0 ] ); inputHtmlList.push( inputHtml.join( '' ) ); } new CKEDITOR.ui.dialog.hbox( dialog, children, inputHtmlList, html ); return html.join( '' ); }; // Adding a role="radiogroup" to definition used for wrapper. elementDefinition.role = 'radiogroup'; elementDefinition.includeLabel = true; CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); this._.children = children; }, /** * A button with a label inside. * * @class CKEDITOR.ui.dialog.button * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a button class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `label` (Required) The button label. * * `disabled` (Optional) Set to `true` if you want the * button to appear in the disabled state. * * @param {Array} htmlList List of HTML code to output to. */ button: function( dialog, elementDefinition, htmlList ) { if ( !arguments.length ) return; if ( typeof elementDefinition == 'function' ) elementDefinition = elementDefinition( dialog.getParentEditor() ); initPrivateObject.call( this, elementDefinition, { disabled: elementDefinition.disabled || false } ); // Add OnClick event to this input. CKEDITOR.event.implementOn( this ); var me = this; // Register an event handler for processing button clicks. dialog.on( 'load', function() { var element = this.getElement(); ( function() { element.on( 'click', function( evt ) { me.click(); // https://dev.ckeditor.com/ticket/9958 evt.data.preventDefault(); } ); element.on( 'keydown', function( evt ) { if ( evt.data.getKeystroke() in { 32: 1 } ) { me.click(); evt.data.preventDefault(); } } ); } )(); element.unselectable(); }, this ); var outerDefinition = CKEDITOR.tools.extend( {}, elementDefinition ); delete outerDefinition.style; var labelId = CKEDITOR.tools.getNextId() + '_label'; CKEDITOR.ui.dialog.uiElement.call( this, dialog, outerDefinition, htmlList, 'a', null, { style: elementDefinition.style, href: 'javascript:void(0)', // jshint ignore:line title: elementDefinition.label, hidefocus: 'true', 'class': elementDefinition[ 'class' ], role: 'button', 'aria-labelledby': labelId }, '' + CKEDITOR.tools.htmlEncode( elementDefinition.label ) + '' ); }, /** * A select box. * * @class CKEDITOR.ui.dialog.select * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a button class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `default` (Required) The default value. * * `validate` (Optional) The validation function. * * `items` (Required) An array of options. Each option * is a one- or two-item array of format `[ 'Description', 'Value' ]`. If `'Value'` * is missing, then the value would be assumed to be the same as the * description. * * `multiple` (Optional) Set this to `true` if you would like * to have a multiple-choice select box. * * `size` (Optional) The number of items to display in * the select box. * * @param {Array} htmlList List of HTML code to output to. */ select: function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; var _ = initPrivateObject.call( this, elementDefinition ); if ( elementDefinition.validate ) this.validate = elementDefinition.validate; _.inputId = CKEDITOR.tools.getNextId() + '_select'; var innerHTML = function() { var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition, { id: ( elementDefinition.id ? elementDefinition.id + '_select' : CKEDITOR.tools.getNextId() + '_select' ) }, true ), html = [], innerHTML = [], attributes = { 'id': _.inputId, 'class': 'cke_dialog_ui_input_select', 'aria-labelledby': this._.labelId }; html.push( '' ); return html.join( '' ); }; CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); }, /** * A file upload input. * * @class CKEDITOR.ui.dialog.file * @extends CKEDITOR.ui.dialog.labeledElement * @constructor Creates a file class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `validate` (Optional) The validation function. * * @param {Array} htmlList List of HTML code to output to. */ file: function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; if ( elementDefinition[ 'default' ] === undefined ) elementDefinition[ 'default' ] = ''; var _ = CKEDITOR.tools.extend( initPrivateObject.call( this, elementDefinition ), { definition: elementDefinition, buttons: [] } ); if ( elementDefinition.validate ) this.validate = elementDefinition.validate; /** @ignore */ var innerHTML = function() { _.frameId = CKEDITOR.tools.getNextId() + '_fileInput'; var html = [ '' ); return html.join( '' ); }; // IE BUG: Parent container does not resize to contain the iframe automatically. dialog.on( 'load', function() { var iframe = CKEDITOR.document.getById( _.frameId ), contentDiv = iframe.getParent(); contentDiv.addClass( 'cke_dialog_ui_input_file' ); } ); CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML ); }, /** * A button for submitting the file in a file upload input. * * @class CKEDITOR.ui.dialog.fileButton * @extends CKEDITOR.ui.dialog.button * @constructor Creates a fileButton class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `for` (Required) The file input's page and element ID * to associate with, in a two-item array format: `[ 'page_id', 'element_id' ]`. * * `validate` (Optional) The validation function. * * @param {Array} htmlList List of HTML code to output to. */ fileButton: function( dialog, elementDefinition, htmlList ) { var me = this; if ( arguments.length < 3 ) return; initPrivateObject.call( this, elementDefinition ); if ( elementDefinition.validate ) this.validate = elementDefinition.validate; var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition ); var onClick = myDefinition.onClick; myDefinition.className = ( myDefinition.className ? myDefinition.className + ' ' : '' ) + 'cke_dialog_ui_button'; myDefinition.onClick = function( evt ) { var target = elementDefinition[ 'for' ]; // [ pageId, elementId ] // If exists onClick in elementDefinition, then it is called and checked response type. // If it's possible, then XHR is used, what prevents of using submit. var responseType = onClick ? onClick.call( this, evt ) : false; if ( responseType !== false ) { if ( responseType !== 'xhr' ) { dialog.getContentElement( target[ 0 ], target[ 1 ] ).submit(); } this.disable(); } }; dialog.on( 'load', function() { dialog.getContentElement( elementDefinition[ 'for' ][ 0 ], elementDefinition[ 'for' ][ 1 ] )._.buttons.push( me ); } ); CKEDITOR.ui.dialog.button.call( this, dialog, myDefinition, htmlList ); }, html: ( function() { var myHtmlRe = /^\s*<[\w:]+\s+([^>]*)?>/, theirHtmlRe = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/, emptyTagRe = /\/$/; /** * A dialog window element made from raw HTML code. * * @class CKEDITOR.ui.dialog.html * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a html class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element definition. * Accepted fields: * * * `html` (Required) HTML code of this element. * * @param {Array} htmlList List of HTML code to be added to the dialog's content area. */ return function( dialog, elementDefinition, htmlList ) { if ( arguments.length < 3 ) return; var myHtmlList = [], myHtml, theirHtml = elementDefinition.html, myMatch, theirMatch; // If the HTML input doesn't contain any tags at the beginning, add a tag around it. if ( theirHtml.charAt( 0 ) != '<' ) theirHtml = '' + theirHtml + ''; // Look for focus function in definition. var focus = elementDefinition.focus; if ( focus ) { var oldFocus = this.focus; this.focus = function() { ( typeof focus == 'function' ? focus : oldFocus ).call( this ); this.fire( 'focus' ); }; if ( elementDefinition.isFocusable ) { var oldIsFocusable = this.isFocusable; this.isFocusable = oldIsFocusable; } this.keyboardFocusable = true; } CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtmlList, 'span', null, null, '' ); // Append the attributes created by the uiElement call to the real HTML. myHtml = myHtmlList.join( '' ); myMatch = myHtml.match( myHtmlRe ); theirMatch = theirHtml.match( theirHtmlRe ) || [ '', '', '' ]; if ( emptyTagRe.test( theirMatch[ 1 ] ) ) { theirMatch[ 1 ] = theirMatch[ 1 ].slice( 0, -1 ); theirMatch[ 2 ] = '/' + theirMatch[ 2 ]; } htmlList.push( [ theirMatch[ 1 ], ' ', myMatch[ 1 ] || '', theirMatch[ 2 ] ].join( '' ) ); }; } )(), /** * Form fieldset for grouping dialog UI elements. * * @class CKEDITOR.ui.dialog.fieldset * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a fieldset class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {Array} childObjList * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. * @param {Array} childHtmlList Array of HTML code that corresponds to the HTML output of all the * objects in childObjList. * @param {Array} htmlList Array of HTML code that this element will output to. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `label` (Optional) The legend of the this fieldset. * * `children` (Required) An array of dialog window field definitions which will be grouped inside this fieldset. * */ fieldset: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { var legendLabel = elementDefinition.label; /** @ignore */ var innerHTML = function() { var html = []; legendLabel && html.push( '' + legendLabel + '' ); for ( var i = 0; i < childHtmlList.length; i++ ) html.push( childHtmlList[ i ] ); return html.join( '' ); }; this._ = { children: childObjList }; CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'fieldset', null, null, innerHTML ); } }, true ); CKEDITOR.ui.dialog.html.prototype = new CKEDITOR.ui.dialog.uiElement(); /** @class CKEDITOR.ui.dialog.labeledElement */ CKEDITOR.ui.dialog.labeledElement.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), { /** * Sets the label text of the element. * * @param {String} label The new label text. * @returns {CKEDITOR.ui.dialog.labeledElement} The current labeled element. */ setLabel: function( label ) { var node = CKEDITOR.document.getById( this._.labelId ); if ( node.getChildCount() < 1 ) ( new CKEDITOR.dom.text( label, CKEDITOR.document ) ).appendTo( node ); else node.getChild( 0 ).$.nodeValue = label; return this; }, /** * Retrieves the current label text of the elment. * * @returns {String} The current label text. */ getLabel: function() { var node = CKEDITOR.document.getById( this._.labelId ); if ( !node || node.getChildCount() < 1 ) return ''; else return node.getChild( 0 ).getText(); }, /** * Defines the `onChange` event for UI element definitions. * @property {Object} */ eventProcessors: commonEventProcessors }, true ); /** @class CKEDITOR.ui.dialog.button */ CKEDITOR.ui.dialog.button.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), { /** * Simulates a click to the button. * * @returns {Object} Return value of the `click` event. */ click: function() { if ( !this._.disabled ) return this.fire( 'click', { dialog: this._.dialog } ); return false; }, /** * Enables the button. */ enable: function() { this._.disabled = false; var element = this.getElement(); element && element.removeClass( 'cke_disabled' ); }, /** * Disables the button. */ disable: function() { this._.disabled = true; this.getElement().addClass( 'cke_disabled' ); }, /** * Checks whether a field is visible. * * @returns {Boolean} */ isVisible: function() { return this.getElement().getFirst().isVisible(); }, /** * Checks whether a field is enabled. Fields can be disabled by using the * {@link #disable} method and enabled by using the {@link #enable} method. * * @returns {Boolean} */ isEnabled: function() { return !this._.disabled; }, /** * Defines the `onChange` event and `onClick` for button element definitions. * * @property {Object} */ eventProcessors: CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, { onClick: function( dialog, func ) { this.on( 'click', function() { func.apply( this, arguments ); } ); } }, true ), /** * Handler for the element's access key up event. Simulates a click to * the button. */ accessKeyUp: function() { this.click(); }, /** * Handler for the element's access key down event. Simulates a mouse * down to the button. */ accessKeyDown: function() { this.focus(); }, keyboardFocusable: true }, true ); /** @class CKEDITOR.ui.dialog.textInput */ CKEDITOR.ui.dialog.textInput.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), { /** * Gets the text input DOM element under this UI object. * * @returns {CKEDITOR.dom.element} The DOM element of the text input. */ getInputElement: function() { return CKEDITOR.document.getById( this._.inputId ); }, /** * Puts focus into the text input. */ focus: function() { var me = this.selectParentTab(); // GECKO BUG: setTimeout() is needed to workaround invisible selections. setTimeout( function() { var element = me.getInputElement(); element && element.$.focus(); }, 0 ); }, /** * Selects all the text in the text input. */ select: function() { var me = this.selectParentTab(); // GECKO BUG: setTimeout() is needed to workaround invisible selections. setTimeout( function() { var e = me.getInputElement(); if ( e ) { e.$.focus(); e.$.select(); } }, 0 ); }, /** * Handler for the text input's access key up event. Makes a `select()` * call to the text input. */ accessKeyUp: function() { this.select(); }, /** * Sets the value of this text input object. * * uiElement.setValue( 'Blamo' ); * * @param {Object} value The new value. * @returns {CKEDITOR.ui.dialog.textInput} The current UI element. */ setValue: function( value ) { if ( this.bidi ) { var marker = value && value.charAt( 0 ), dir = ( marker == '\u202A' ? 'ltr' : marker == '\u202B' ? 'rtl' : null ); if ( dir ) { value = value.slice( 1 ); } // Set the marker or reset it (if dir==null). this.setDirectionMarker( dir ); } if ( !value ) { value = ''; } return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply( this, arguments ); }, /** * Gets the value of this text input object. * * @returns {String} The value. */ getValue: function() { var value = CKEDITOR.ui.dialog.uiElement.prototype.getValue.call( this ); if ( this.bidi && value ) { var dir = this.getDirectionMarker(); if ( dir ) { value = ( dir == 'ltr' ? '\u202A' : '\u202B' ) + value; } } return value; }, /** * Sets the text direction marker and the `dir` attribute of the input element. * * @since 4.5.0 * @param {String} dir The text direction. Pass `null` to reset. */ setDirectionMarker: function( dir ) { var inputElement = this.getInputElement(); if ( dir ) { inputElement.setAttributes( { dir: dir, 'data-cke-dir-marker': dir } ); // Don't remove the dir attribute if this field hasn't got the marker, // because the dir attribute could be set independently. } else if ( this.getDirectionMarker() ) { inputElement.removeAttributes( [ 'dir', 'data-cke-dir-marker' ] ); } }, /** * Gets the value of the text direction marker. * * @since 4.5.0 * @returns {String} `'ltr'`, `'rtl'` or `null` if the marker is not set. */ getDirectionMarker: function() { return this.getInputElement().data( 'cke-dir-marker' ); }, keyboardFocusable: true }, commonPrototype, true ); CKEDITOR.ui.dialog.textarea.prototype = new CKEDITOR.ui.dialog.textInput(); /** @class CKEDITOR.ui.dialog.select */ CKEDITOR.ui.dialog.select.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement(), { /** * Gets the DOM element of the select box. * * @returns {CKEDITOR.dom.element} The `` element of this file input. * * @returns {CKEDITOR.dom.element} The file input element. */ getInputElement: function() { var frameDocument = CKEDITOR.document.getById( this._.frameId ).getFrameDocument(); return frameDocument.$.forms.length > 0 ? new CKEDITOR.dom.element( frameDocument.$.forms[ 0 ].elements[ 0 ] ) : this.getElement(); }, /** * Uploads the file in the file input. * * @returns {CKEDITOR.ui.dialog.file} This object. */ submit: function() { this.getInputElement().getParent().$.submit(); return this; }, /** * Gets the action assigned to the form. * * @returns {String} The value of the action. */ getAction: function() { return this.getInputElement().getParent().$.action; }, /** * The events must be applied to the inner input element, and * this must be done when the iframe and form have been loaded. */ registerEvents: function( definition ) { var regex = /^on([A-Z]\w+)/, match; var registerDomEvent = function( uiElement, dialog, eventName, func ) { uiElement.on( 'formLoaded', function() { uiElement.getInputElement().on( eventName, func, uiElement ); } ); }; for ( var i in definition ) { if ( !( match = i.match( regex ) ) ) continue; if ( this.eventProcessors[ i ] ) this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] ); else registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] ); } return this; }, /** * Redraws the file input and resets the file path in the file input. * The redrawing logic is necessary because non-IE browsers tend to clear * the `', onLoad: function() { var iframe = this.getElement(); this.getDialog().on( 'selectPage', function( ev ) { if ( ev.data.page == 'preview' ) { var self = this; setTimeout( function() { var doc = iframe.getFrameDocument(), html = doc.getElementsByTag( 'html' ).getItem( 0 ), head = doc.getHead(), body = doc.getBody(); self.commitContent( doc, html, head, body, 1 ); }, 50 ); } } ); iframe.getAscendant( 'table' ).setStyle( 'height', '100%' ); } } ] } ] }; } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/samples/0000755000201500020150000000000014515446705023552 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/samples/docprops.html0000644000201500020150000002014014515446705026266 0ustar puckpuck Document Properties — CKEditor Sample

          CKEditor Samples » Document Properties Plugin

          This sample is not maintained anymore. Check out its brand new version in CKEditor Examples.

          This sample shows how to configure CKEditor to use the Document Properties plugin. This plugin allows you to set the metadata of the page, including the page encoding, margins, meta tags, or background.

          Note: This plugin is to be used along with the fullPage configuration.

          The CKEditor instance below is inserted with a JavaScript call using the following code:

          CKEDITOR.replace( 'textarea_id', {
          	fullPage: true,
          	extraPlugins: 'docprops',
          	allowedContent: true
          });
          

          Note that textarea_id in the code above is the id attribute of the <textarea> element to be replaced.

          The allowedContent in the code above is set to true to disable content filtering. Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations.

          rt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/icons/0000755000201500020150000000000014503523375023215 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/icons/docprops.png0000644000201500020150000000104514503523375025554 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8ˍR1N0 }vRr8 -2$F@ #F46)Œ(M]a͈6o]rf^e2mۃ—sn1XiM?s d*@9<ϟċ/ ɞAڶ=L)]*sNPE)%[f>pcgSnad?sQJAj r3?*&f"rND*"{ s's_)aYcGJ)kF}[ljc~;E^ 7cΎ&%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/icons/hidpi/0000755000201500020150000000000014503523375024312 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/icons/hidpi/docprops.png0000644000201500020150000000177114503523375026657 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXíVk0;[KpB )CPI@@O2vI]K3B}ƒ ".謵A}hv_]]ALhS֭ {W`@đ^γ,H"z9Zi )ZkDĻOWa"TQJA۶;Oh2 "e m> IbHOB)EQ ܐLXkw ߃z1愈.y/7 ZC۶Qpׇhr3ؖRb ۉ1܀y4$|eY4- `QL?EQ"zW+ɐ.yaR໵1fY }15U"B4\86~(;Ol!N(嗒>dSTU$:^UUY%Kg2@:,=ۇM}\)W<~:iR֡7G(T$PܕRW;Hx erϘlrY׾tt}} [[[PK}?4嗗 1L  "63umYe[J%9E%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/icons/hidpi/docprops-rtl.png0000644000201500020150000000204414503523375027450 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !(IDATXíW=k@}3Z8߹0LR%? `7nʸh)H!`rǝySb[v}!!`͘`4d1DcyQQ 5cߺ5 EDD䐈@D7UUֽ;*|d=o˲W"򩇏w}/ 7u|>n%T D@v%`K c?DV}M Gfq,@:>fx>/|~aBWO=VG=~7%˲"Vf@$ C>!2(Y,NX>Î҄tqt%|}֥~e\$i=& 1bҝ#"F$IZoUgHtzj‰4ݞfnջ*uVŏ((MS %oY+" O[n,q AJ泳N}cKZ\\7>N][__esRb %v[iQ}`@+"?G3%{M~p`%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/docprops/icons/docprops-rtl.png0000644000201500020150000000103714503523375026354 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8ˍS;N0h G" ؂{QDBD@G~40Oɱ=yqm[ \ M1EQDsi{kfJ0ڶsnoCD' vP%31rنa8%&q  with another list tree as the first // child, we'll need to append a filler (
          /NBSP) or the list item // wouldn't be editable. (https://dev.ckeditor.com/ticket/6724) if ( !currentListItem.getChildCount() && CKEDITOR.env.needsNbspFiller && doc.$.documentMode <= 7 ) currentListItem.append( doc.createText( '\xa0' ) ); currentListItem.append( listData.listNode ); currentIndex = listData.nextIndex; } else if ( item.indent == -1 && !baseIndex && itemGrandParent ) { if ( listNodeNames[ itemGrandParent.getName() ] ) { currentListItem = item.element.clone( false, true ); if ( orgDir != itemGrandParent.getDirection( 1 ) ) currentListItem.setAttribute( 'dir', orgDir ); } else { currentListItem = new CKEDITOR.dom.documentFragment( doc ); } // Migrate all children to the new container, // apply the proper text direction. var dirLoose = itemGrandParent.getDirection( 1 ) != orgDir, li = item.element, className = li.getAttribute( 'class' ), style = li.getAttribute( 'style' ); var needsBlock = currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT && ( paragraphMode != CKEDITOR.ENTER_BR || dirLoose || style || className ); var child, count = item.contents.length, cachedBookmark; for ( i = 0; i < count; i++ ) { child = item.contents[ i ]; // Append bookmark if we can, or cache it and append it when we'll know // what to do with it. Generally - we want to keep it next to its original neighbour. // Exception: if bookmark is the only child it hasn't got any neighbour, so handle it normally // (wrap with block if needed). if ( bookmarks( child ) && count > 1 ) { // If we don't need block, it's simple - append bookmark directly to the current list item. if ( !needsBlock ) currentListItem.append( child.clone( 1, 1 ) ); else cachedBookmark = child.clone( 1, 1 ); } // Block content goes directly to the current list item, without wrapping. else if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() ) { // Apply direction on content blocks. if ( dirLoose && !child.getDirection() ) child.setAttribute( 'dir', orgDir ); inheritInlineStyles( li, child ); className && child.addClass( className ); // Close the block which we started for inline content. block = null; // Append bookmark directly before current child. if ( cachedBookmark ) { currentListItem.append( cachedBookmark ); cachedBookmark = null; } // Append this block element to the list item. currentListItem.append( child.clone( 1, 1 ) ); } // Some inline content was found - wrap it with block and append that // block to the current list item or append it to the block previously created. else if ( needsBlock ) { // Establish new block to hold text direction and styles. if ( !block ) { block = doc.createElement( paragraphName ); currentListItem.append( block ); dirLoose && block.setAttribute( 'dir', orgDir ); } // Copy over styles to new block; style && block.setAttribute( 'style', style ); className && block.setAttribute( 'class', className ); // Append bookmark directly before current child. if ( cachedBookmark ) { block.append( cachedBookmark ); cachedBookmark = null; } block.append( child.clone( 1, 1 ) ); } // E.g. BR mode - inline content appended directly to the list item. else { currentListItem.append( child.clone( 1, 1 ) ); } } // No content after bookmark - append it to the block if we had one // or directly to the current list item if we finished directly in the current list item. if ( cachedBookmark ) { ( block || currentListItem ).append( cachedBookmark ); cachedBookmark = null; } if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT && currentIndex != listArray.length - 1 ) { var last; // Remove bogus
          if this browser uses them. if ( CKEDITOR.env.needsBrFiller ) { last = currentListItem.getLast(); if ( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( 'br' ) ) last.remove(); } // If the last element is not a block, append
          to separate merged list items. last = currentListItem.getLast( nonEmpty ); if ( !( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( CKEDITOR.dtd.$block ) ) ) currentListItem.append( doc.createElement( 'br' ) ); } var currentListItemName = currentListItem.$.nodeName.toLowerCase(); if ( currentListItemName == 'div' || currentListItemName == 'p' ) { currentListItem.appendBogus(); } retval.append( currentListItem ); rootNode = null; currentIndex++; } else { return null; } block = null; if ( listArray.length <= currentIndex || Math.max( listArray[ currentIndex ].indent, 0 ) < indentLevel ) break; } if ( database ) { var currentNode = retval.getFirst(); while ( currentNode ) { if ( currentNode.type == CKEDITOR.NODE_ELEMENT ) { // Clear marker attributes for the new list tree made of cloned nodes, if any. CKEDITOR.dom.element.clearMarkers( database, currentNode ); // Clear redundant direction attribute specified on list items. if ( currentNode.getName() in CKEDITOR.dtd.$listItem ) cleanUpDirection( currentNode ); } currentNode = currentNode.getNextSourceNode(); } } return { listNode: retval, nextIndex: currentIndex }; } }; function changeListType( editor, groupObj, database, listsCreated ) { // This case is easy... // 1. Convert the whole list into a one-dimensional array. // 2. Change the list type by modifying the array. // 3. Recreate the whole list by converting the array to a list. // 4. Replace the original list with the recreated list. var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ), selectedListItems = []; for ( var i = 0; i < groupObj.contents.length; i++ ) { var itemNode = groupObj.contents[ i ]; itemNode = itemNode.getAscendant( 'li', true ); if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) ) continue; selectedListItems.push( itemNode ); CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true ); } var root = groupObj.root, doc = root.getDocument(), listNode, newListNode; for ( i = 0; i < selectedListItems.length; i++ ) { var listIndex = selectedListItems[ i ].getCustomData( 'listarray_index' ); listNode = listArray[ listIndex ].parent; // Switch to new list node for this particular item. if ( !listNode.is( this.type ) ) { newListNode = doc.createElement( this.type ); // Copy all attributes, except from 'start' and 'type'. listNode.copyAttributes( newListNode, { start: 1, type: 1 } ); // The list-style-type property should be ignored. newListNode.removeStyle( 'list-style-type' ); listArray[ listIndex ].parent = newListNode; } } var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode ); var child, length = newList.listNode.getChildCount(); for ( i = 0; i < length && ( child = newList.listNode.getChild( i ) ); i++ ) { if ( child.getName() == this.type ) listsCreated.push( child ); } newList.listNode.replace( groupObj.root ); editor.fire( 'contentDomInvalidated' ); } function createList( editor, groupObj, listsCreated ) { var contents = groupObj.contents, doc = groupObj.root.getDocument(), listContents = []; // It is possible to have the contents returned by DomRangeIterator to be the same as the root. // e.g. when we're running into table cells. // In such a case, enclose the childNodes of contents[0] into a
          . if ( contents.length == 1 && contents[ 0 ].equals( groupObj.root ) ) { var divBlock = doc.createElement( 'div' ); contents[ 0 ].moveChildren && contents[ 0 ].moveChildren( divBlock ); contents[ 0 ].append( divBlock ); contents[ 0 ] = divBlock; } // Calculate the common parent node of all content blocks. var commonParent = groupObj.contents[ 0 ].getParent(); for ( var i = 0; i < contents.length; i++ ) commonParent = commonParent.getCommonAncestor( contents[ i ].getParent() ); var useComputedState = editor.config.useComputedState, listDir, explicitDirection; // We want to insert things that are in the same tree level only, so calculate the contents again // by expanding the selected blocks to the same tree level. for ( i = 0; i < contents.length; i++ ) { var contentNode = contents[ i ], parentNode; while ( ( parentNode = contentNode.getParent() ) ) { if ( parentNode.equals( commonParent ) ) { listContents.push( contentNode ); // Determine the lists's direction. if ( !explicitDirection && contentNode.getDirection() ) explicitDirection = 1; var itemDir = contentNode.getDirection( useComputedState ); if ( listDir !== null ) { // If at least one LI have a different direction than current listDir, we can't have listDir. if ( listDir && listDir != itemDir ) listDir = null; else listDir = itemDir; } break; } contentNode = parentNode; } } if ( listContents.length < 1 ) return; // Insert the list to the DOM tree. var insertAnchor = listContents[ listContents.length - 1 ].getNext(), listNode = doc.createElement( this.type ); listsCreated.push( listNode ); var contentBlock, listItem; while ( listContents.length ) { contentBlock = listContents.shift(); listItem = doc.createElement( 'li' ); // If current block should be preserved, append it to list item instead of // transforming it to
        2. element. if ( shouldPreserveBlock( contentBlock ) ) contentBlock.appendTo( listItem ); else { contentBlock.copyAttributes( listItem ); // Remove direction attribute after it was merged into list root. (https://dev.ckeditor.com/ticket/7657) if ( listDir && contentBlock.getDirection() ) { listItem.removeStyle( 'direction' ); listItem.removeAttribute( 'dir' ); } contentBlock.moveChildren( listItem ); contentBlock.remove(); } listItem.appendTo( listNode ); } // Apply list root dir only if it has been explicitly declared. if ( listDir && explicitDirection ) listNode.setAttribute( 'dir', listDir ); if ( insertAnchor ) listNode.insertBefore( insertAnchor ); else listNode.appendTo( commonParent ); } function removeList( editor, groupObj, database ) { // This is very much like the change list type operation. // Except that we're changing the selected items' indent to -1 in the list array. var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ), selectedListItems = []; for ( var i = 0; i < groupObj.contents.length; i++ ) { var itemNode = groupObj.contents[ i ]; itemNode = itemNode.getAscendant( 'li', true ); if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) ) continue; selectedListItems.push( itemNode ); CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true ); } var lastListIndex = null; for ( i = 0; i < selectedListItems.length; i++ ) { var listIndex = selectedListItems[ i ].getCustomData( 'listarray_index' ); listArray[ listIndex ].indent = -1; lastListIndex = listIndex; } // After cutting parts of the list out with indent=-1, we still have to maintain the array list // model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the // list cannot be converted back to a real DOM list. for ( i = lastListIndex + 1; i < listArray.length; i++ ) { if ( listArray[ i ].indent > listArray[ i - 1 ].indent + 1 ) { var indentOffset = listArray[ i - 1 ].indent + 1 - listArray[ i ].indent; var oldIndent = listArray[ i ].indent; while ( listArray[ i ] && listArray[ i ].indent >= oldIndent ) { listArray[ i ].indent += indentOffset; i++; } i--; } } var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, groupObj.root.getAttribute( 'dir' ) ); // Compensate
          before/after the list node if the surrounds are non-blocks.(https://dev.ckeditor.com/ticket/3836) var docFragment = newList.listNode, boundaryNode, siblingNode; function compensateBrs( isStart ) { if ( ( boundaryNode = docFragment[ isStart ? 'getFirst' : 'getLast' ]() ) && !( boundaryNode.is && boundaryNode.isBlockBoundary() ) && ( siblingNode = groupObj.root[ isStart ? 'getPrevious' : 'getNext' ]( CKEDITOR.dom.walker.invisible( true ) ) ) && !( siblingNode.is && siblingNode.isBlockBoundary( { br: 1 } ) ) ) { editor.document.createElement( 'br' )[ isStart ? 'insertBefore' : 'insertAfter' ]( boundaryNode ); } } compensateBrs( true ); compensateBrs(); docFragment.replace( groupObj.root ); editor.fire( 'contentDomInvalidated' ); } var headerTagRegex = /^h[1-6]$/; // Checks wheather this block should be element preserved (not transformed to
        3. ) when creating list. function shouldPreserveBlock( block ) { return ( // https://dev.ckeditor.com/ticket/5335 block.is( 'pre' ) || // https://dev.ckeditor.com/ticket/5271 - this is a header. headerTagRegex.test( block.getName() ) || // 11083 - this is a non-editable element. block.getAttribute( 'contenteditable' ) == 'false' ); } function listCommand( name, type ) { this.name = name; this.type = type; this.context = type; this.allowedContent = type + ' li'; this.requiredContent = type; } var elementType = CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT ); // Merge child nodes with direction preserved. (https://dev.ckeditor.com/ticket/7448) function mergeChildren( from, into, refNode, forward ) { var child, itemDir; while ( ( child = from[ forward ? 'getLast' : 'getFirst' ]( elementType ) ) ) { if ( ( itemDir = child.getDirection( 1 ) ) !== into.getDirection( 1 ) ) child.setAttribute( 'dir', itemDir ); child.remove(); refNode ? child[ forward ? 'insertBefore' : 'insertAfter' ]( refNode ) : into.append( child, forward ); refNode = child; } } listCommand.prototype = { exec: function( editor ) { // Run state check first of all. this.refresh( editor, editor.elementPath() ); var config = editor.config, selection = editor.getSelection(), ranges = selection && selection.getRanges(); // Midas lists rule #1 says we can create a list even in an empty document. // But DOM iterator wouldn't run if the document is really empty. // So create a paragraph if the document is empty and we're going to create a list. if ( this.state == CKEDITOR.TRISTATE_OFF ) { var editable = editor.editable(); if ( !editable.getFirst( nonEmpty ) ) { config.enterMode == CKEDITOR.ENTER_BR ? editable.appendBogus() : ranges[ 0 ].fixBlock( 1, config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ); selection.selectRanges( ranges ); } // Maybe a single range there enclosing the whole list, // turn on the list state manually(https://dev.ckeditor.com/ticket/4129). else { var range = ranges.length == 1 && ranges[ 0 ], enclosedNode = range && range.getEnclosedNode(); if ( enclosedNode && enclosedNode.is && this.type == enclosedNode.getName() ) this.setState( CKEDITOR.TRISTATE_ON ); } } var bookmarks = selection.createBookmarks( true ); // Group the blocks up because there are many cases where multiple lists have to be created, // or multiple lists have to be cancelled. var listGroups = [], database = {}, rangeIterator = ranges.createIterator(), index = 0; while ( ( range = rangeIterator.getNextRange() ) && ++index ) { var boundaryNodes = range.getBoundaryNodes(), startNode = boundaryNodes.startNode, endNode = boundaryNodes.endNode; if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' ) range.setStartAt( boundaryNodes.startNode, CKEDITOR.POSITION_AFTER_START ); if ( endNode.type == CKEDITOR.NODE_ELEMENT && endNode.getName() == 'td' ) range.setEndAt( boundaryNodes.endNode, CKEDITOR.POSITION_BEFORE_END ); var iterator = range.createIterator(), block; iterator.forceBrBreak = ( this.state == CKEDITOR.TRISTATE_OFF ); while ( ( block = iterator.getNextParagraph() ) ) { // Avoid duplicate blocks get processed across ranges. // Avoid processing comments, we don't want to touch it. if ( block.getCustomData( 'list_block' ) || hasCommentsChildOnly( block ) ) continue; else CKEDITOR.dom.element.setMarker( database, block, 'list_block', 1 ); var path = editor.elementPath( block ), pathElements = path.elements, pathElementsCount = pathElements.length, processedFlag = 0, blockLimit = path.blockLimit, element; // First, try to group by a list ancestor. for ( var i = pathElementsCount - 1; i >= 0 && ( element = pathElements[ i ] ); i-- ) { // Don't leak outside block limit (https://dev.ckeditor.com/ticket/3940). if ( listNodeNames[ element.getName() ] && blockLimit.contains( element ) ) { // If we've encountered a list inside a block limit // The last group object of the block limit element should // no longer be valid. Since paragraphs after the list // should belong to a different group of paragraphs before // the list. (Bug https://dev.ckeditor.com/ticket/1309) blockLimit.removeCustomData( 'list_group_object_' + index ); var groupObj = element.getCustomData( 'list_group_object' ); if ( groupObj ) groupObj.contents.push( block ); else { groupObj = { root: element, contents: [ block ] }; listGroups.push( groupObj ); CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj ); } processedFlag = 1; break; } } if ( processedFlag ) continue; // No list ancestor? Group by block limit, but don't mix contents from different ranges. var root = blockLimit; if ( root.getCustomData( 'list_group_object_' + index ) ) root.getCustomData( 'list_group_object_' + index ).contents.push( block ); else { groupObj = { root: root, contents: [ block ] }; CKEDITOR.dom.element.setMarker( database, root, 'list_group_object_' + index, groupObj ); listGroups.push( groupObj ); } } } // Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element. // We either have to build lists or remove lists, for removing a list does not makes sense when we are looking // at the group that's not rooted at lists. So we have three cases to handle. var listsCreated = []; while ( listGroups.length > 0 ) { groupObj = listGroups.shift(); if ( this.state == CKEDITOR.TRISTATE_OFF ) { if ( isEmptyList( groupObj ) ) { continue; } else if ( listNodeNames[ groupObj.root.getName() ] ) { changeListType.call( this, editor, groupObj, database, listsCreated ); } else { createList.call( this, editor, groupObj, listsCreated ); } } else if ( this.state == CKEDITOR.TRISTATE_ON && listNodeNames[ groupObj.root.getName() ] && !isEmptyList( groupObj ) ) { removeList.call( this, editor, groupObj, database ); } } // For all new lists created, merge into adjacent, same type lists. for ( i = 0; i < listsCreated.length; i++ ) mergeListSiblings( listsCreated[ i ] ); // Clean up, restore selection and update toolbar button states. CKEDITOR.dom.element.clearAllMarkers( database ); selection.selectBookmarks( bookmarks ); editor.focus(); function isEmptyList( groupObj ) { // If list is without any li item, then ignore such element from transformation, because it throws errors in console (#2411, #2438). return listNodeNames[ groupObj.root.getName() ] && !getChildCount( groupObj.root, [ CKEDITOR.NODE_COMMENT ] ); } function getChildCount( element, excludeTypes ) { return CKEDITOR.tools.array.filter( element.getChildren().toArray(), function( node ) { return CKEDITOR.tools.array.indexOf( excludeTypes, node.type ) === -1; } ).length; } function hasCommentsChildOnly( element ) { var ret = true; if ( element.getChildCount() === 0 ) { return false; } element.forEach( function( node ) { if ( node.type !== CKEDITOR.NODE_COMMENT ) { ret = false; return false; } }, null, true ); return ret; } }, refresh: function( editor, path ) { var list = path.contains( listNodeNames, 1 ), limit = path.blockLimit || path.root; // 1. Only a single type of list activate. // 2. Do not show list outside of block limit. if ( list && limit.contains( list ) ) this.setState( list.is( this.type ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF ); else this.setState( CKEDITOR.TRISTATE_OFF ); } }; // Merge list adjacent, of same type lists. function mergeListSiblings( listNode ) { function mergeSibling( rtl ) { var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ]( nonEmpty ); if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT && sibling.is( listNode.getName() ) ) { // Move children order by merge direction.(https://dev.ckeditor.com/ticket/3820) mergeChildren( listNode, sibling, null, !rtl ); listNode.remove(); listNode = sibling; } } mergeSibling(); mergeSibling( 1 ); } // Check if node is block element that recieves text. function isTextBlock( node ) { return node.type == CKEDITOR.NODE_ELEMENT && ( node.getName() in CKEDITOR.dtd.$block || node.getName() in CKEDITOR.dtd.$listItem ) && CKEDITOR.dtd[ node.getName() ][ '#' ]; } // Join visually two block lines. function joinNextLineToCursor( editor, cursor, nextCursor ) { editor.fire( 'saveSnapshot' ); // Merge with previous block's content. nextCursor.enlarge( CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ); var frag = nextCursor.extractContents(); cursor.trim( false, true ); var bm = cursor.createBookmark(); // Kill original bogus; var currentPath = new CKEDITOR.dom.elementPath( cursor.startContainer ), pathBlock = currentPath.block, currentBlock = currentPath.lastElement.getAscendant( 'li', 1 ) || pathBlock, nextPath = new CKEDITOR.dom.elementPath( nextCursor.startContainer ), nextLi = nextPath.contains( CKEDITOR.dtd.$listItem ), nextList = nextPath.contains( CKEDITOR.dtd.$list ), last; // Remove bogus node the current block/pseudo block. if ( pathBlock ) { var bogus = pathBlock.getBogus(); bogus && bogus.remove(); } else if ( nextList ) { last = nextList.getPrevious( nonEmpty ); if ( last && blockBogus( last ) ) last.remove(); } // Kill the tail br in extracted. last = frag.getLast(); if ( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( 'br' ) ) last.remove(); // Insert fragment at the range position. var nextNode = cursor.startContainer.getChild( cursor.startOffset ); if ( nextNode ) frag.insertBefore( nextNode ); else cursor.startContainer.append( frag ); // Move the sub list nested in the next list item. if ( nextLi ) { var sublist = getSubList( nextLi ); if ( sublist ) { // If next line is in the sub list of the current list item. if ( currentBlock.contains( nextLi ) ) { mergeChildren( sublist, nextLi.getParent(), nextLi ); sublist.remove(); } // Migrate the sub list to current list item. else { currentBlock.append( sublist ); } } } var nextBlock, parent; // Remove any remaining zombies path blocks at the end after line merged. while ( nextCursor.checkStartOfBlock() && nextCursor.checkEndOfBlock() ) { nextPath = nextCursor.startPath(); nextBlock = nextPath.block; // Abort when nothing to be removed (https://dev.ckeditor.com/ticket/10890). if ( !nextBlock ) break; // Check if also to remove empty list. if ( nextBlock.is( 'li' ) ) { parent = nextBlock.getParent(); if ( nextBlock.equals( parent.getLast( nonEmpty ) ) && nextBlock.equals( parent.getFirst( nonEmpty ) ) ) nextBlock = parent; } nextCursor.moveToPosition( nextBlock, CKEDITOR.POSITION_BEFORE_START ); nextBlock.remove(); } // Check if need to further merge with the list resides after the merged block. (https://dev.ckeditor.com/ticket/9080) var walkerRng = nextCursor.clone(), editable = editor.editable(); walkerRng.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END ); var walker = new CKEDITOR.dom.walker( walkerRng ); walker.evaluator = function( node ) { return nonEmpty( node ) && !blockBogus( node ); }; var next = walker.next(); if ( next && next.type == CKEDITOR.NODE_ELEMENT && next.getName() in CKEDITOR.dtd.$list ) mergeListSiblings( next ); cursor.moveToBookmark( bm ); // Make fresh selection. cursor.select(); editor.fire( 'saveSnapshot' ); } function getSubList( li ) { var last = li.getLast( nonEmpty ); return last && last.type == CKEDITOR.NODE_ELEMENT && last.getName() in listNodeNames ? last : null; } CKEDITOR.plugins.add( 'list', { // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'bulletedlist,bulletedlist-rtl,numberedlist,numberedlist-rtl', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% requires: 'indentlist', init: function( editor ) { if ( editor.blockless ) return; // Register commands. editor.addCommand( 'numberedlist', new listCommand( 'numberedlist', 'ol' ) ); editor.addCommand( 'bulletedlist', new listCommand( 'bulletedlist', 'ul' ) ); // Register the toolbar button. if ( editor.ui.addButton ) { editor.ui.addButton( 'NumberedList', { isToggle: true, label: editor.lang.list.numberedlist, command: 'numberedlist', directional: true, toolbar: 'list,10' } ); editor.ui.addButton( 'BulletedList', { isToggle: true, label: editor.lang.list.bulletedlist, command: 'bulletedlist', directional: true, toolbar: 'list,20' } ); } // Handled backspace/del key to join list items. (https://dev.ckeditor.com/ticket/8248,https://dev.ckeditor.com/ticket/9080) editor.on( 'key', function( evt ) { // Use getKey directly in order to ignore modifiers. // Justification: https://dev.ckeditor.com/ticket/11861#comment:13 var key = evt.data.domEvent.getKey(), li; // DEl/BACKSPACE if ( editor.mode == 'wysiwyg' && key in { 8: 1, 46: 1 } ) { var sel = editor.getSelection(), range = sel.getRanges()[ 0 ], path = range && range.startPath(); if ( !range || !range.collapsed ) return; var isBackspace = key == 8; var editable = editor.editable(); var walker = new CKEDITOR.dom.walker( range.clone() ); walker.evaluator = function( node ) { return nonEmpty( node ) && !blockBogus( node ); }; // Backspace/Del behavior at the start/end of table is handled in core. walker.guard = function( node, isOut ) { return !( isOut && node.type == CKEDITOR.NODE_ELEMENT && node.is( 'table' ) ); }; var cursor = range.clone(); if ( isBackspace ) { var previous, joinWith; // Join a sub list's first line, with the previous visual line in parent. if ( ( previous = path.contains( listNodeNames ) ) && range.checkBoundaryOfElement( previous, CKEDITOR.START ) && ( previous = previous.getParent() ) && previous.is( 'li' ) && ( previous = getSubList( previous ) ) ) { joinWith = previous; previous = previous.getPrevious( nonEmpty ); // Place cursor before the nested list. cursor.moveToPosition( previous && blockBogus( previous ) ? previous : joinWith, CKEDITOR.POSITION_BEFORE_START ); } // Join any line following a list, with the last visual line of the list. else { walker.range.setStartAt( editable, CKEDITOR.POSITION_AFTER_START ); walker.range.setEnd( range.startContainer, range.startOffset ); previous = walker.previous(); if ( previous && previous.type == CKEDITOR.NODE_ELEMENT && ( previous.getName() in listNodeNames || previous.is( 'li' ) ) ) { if ( !previous.is( 'li' ) ) { walker.range.selectNodeContents( previous ); walker.reset(); walker.evaluator = isTextBlock; previous = walker.previous(); } joinWith = previous; // Place cursor at the end of previous block. cursor.moveToElementEditEnd( joinWith ); // And then just before end of closest block element (https://dev.ckeditor.com/ticket/12729). cursor.moveToPosition( cursor.endPath().block, CKEDITOR.POSITION_BEFORE_END ); } } if ( joinWith ) { joinNextLineToCursor( editor, cursor, range ); evt.cancel(); } else { var list = path.contains( listNodeNames ); // Backspace pressed at the start of list outdents the first list item. (https://dev.ckeditor.com/ticket/9129) if ( list && range.checkBoundaryOfElement( list, CKEDITOR.START ) ) { li = list.getFirst( nonEmpty ); if ( range.checkBoundaryOfElement( li, CKEDITOR.START ) ) { previous = list.getPrevious( nonEmpty ); // Only if the list item contains a sub list, do nothing but // simply move cursor backward one character. if ( getSubList( li ) ) { if ( previous ) { range.moveToElementEditEnd( previous ); range.select(); } evt.cancel(); } else { editor.execCommand( 'outdent' ); evt.cancel(); } } } } } else { var next, nextLine; li = path.contains( 'li' ); if ( li ) { walker.range.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END ); var last = li.getLast( nonEmpty ); var block = last && isTextBlock( last ) ? last : li; // Indicate cursor at the visual end of an list item. var isAtEnd = 0; next = walker.next(); // When list item contains a sub list. if ( next && next.type == CKEDITOR.NODE_ELEMENT && next.getName() in listNodeNames && next.equals( last ) ) { isAtEnd = 1; // Move to the first item in sub list. next = walker.next(); } // Right at the end of list item. else if ( range.checkBoundaryOfElement( block, CKEDITOR.END ) ) { isAtEnd = 2; } if ( isAtEnd && next ) { // Put cursor range there. nextLine = range.clone(); nextLine.moveToElementEditStart( next ); // https://dev.ckeditor.com/ticket/13409 // For the following case and similar // //
            //
          • //

            x^

            //
              //
            • y
            • //
            //
          • //
          if ( isAtEnd == 1 ) { // Move the cursor to if attached to "x" text node. cursor.optimize(); // Abort if the range is attached directly in
        4. , like // //
            //
          • // x^ //
              //
            • y
            • //
            //
          • //
          if ( !cursor.startContainer.equals( li ) ) { var node = cursor.startContainer, farthestInlineAscendant; // Find , which is farthest from but still inline element. while ( node.is( CKEDITOR.dtd.$inline ) ) { farthestInlineAscendant = node; node = node.getParent(); } // Move the range so it does not contain inline elements. // It prevents from being included in . // // // // so instead of // //
            //
          • //

            x^y

            //
          • //
          // // pressing DELETE produces // //
            //
          • //

            x^y

            //
          • //
          if ( farthestInlineAscendant ) { cursor.moveToPosition( farthestInlineAscendant, CKEDITOR.POSITION_AFTER_END ); } } } // Moving `cursor` and `next line` only when at the end literally (https://dev.ckeditor.com/ticket/12729). if ( isAtEnd == 2 ) { cursor.moveToPosition( cursor.endPath().block, CKEDITOR.POSITION_BEFORE_END ); // Next line might be text node not wrapped in block element. if ( nextLine.endPath().block ) { nextLine.moveToPosition( nextLine.endPath().block, CKEDITOR.POSITION_AFTER_START ); } } joinNextLineToCursor( editor, cursor, nextLine ); evt.cancel(); } } else { // Handle Del key pressed before the list. walker.range.setEndAt( editable, CKEDITOR.POSITION_BEFORE_END ); next = walker.next(); if ( next && next.type == CKEDITOR.NODE_ELEMENT && next.is( listNodeNames ) ) { // The start
        5. next = next.getFirst( nonEmpty ); // Simply remove the current empty block, move cursor to the // subsequent list. if ( path.block && range.checkStartOfBlock() && range.checkEndOfBlock() ) { path.block.remove(); range.moveToElementEditStart( next ); range.select(); evt.cancel(); } // Preventing the default (merge behavior), but simply move // the cursor one character forward if subsequent list item // contains sub list. else if ( getSubList( next ) ) { range.moveToElementEditStart( next ); range.select(); evt.cancel(); } // Merge the first list item with the current line. else { nextLine = range.clone(); nextLine.moveToElementEditStart( next ); joinNextLineToCursor( editor, cursor, nextLine ); evt.cancel(); } } } } // The backspace/del could potentially put cursor at a bad position, // being it handled or not, check immediately the selection to have it fixed. setTimeout( function() { editor.selectionChange( 1 ); } ); } } ); } } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/0000755000201500020150000000000014515446710022145 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/zh.js0000644000201500020150000000046314515446710023127 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'zh', { bulletedlist: '插入/移除項目符號清單', numberedlist: '插入/移除編號清單清單' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/nb.js0000644000201500020150000000046014515446710023102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'nb', { bulletedlist: 'Legg til / fjern punktliste', numberedlist: 'Legg til / fjern nummerert liste' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/eo.js0000644000201500020150000000041314515446710023104 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'eo', { bulletedlist: 'Bula Listo', numberedlist: 'Numera Listo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/es.js0000644000201500020150000000041014515446710023105 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'es', { bulletedlist: 'Viñetas', numberedlist: 'Numeración' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ro.js0000644000201500020150000000050314515446710023121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ro', { bulletedlist: 'Inserează / Elimină Listă cu puncte', numberedlist: 'Inserează / Elimină Listă numerotată' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/hr.js0000644000201500020150000000042114515446710023111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'hr', { bulletedlist: 'Obična lista', numberedlist: 'Brojčana lista' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/it.js0000644000201500020150000000046614515446710023125 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'it', { bulletedlist: 'Inserisci/Rimuovi Elenco Puntato', numberedlist: 'Inserisci/Rimuovi Elenco Numerato' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/de-ch.js0000644000201500020150000000044214515446710023463 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'de-ch', { bulletedlist: 'Liste', numberedlist: 'Nummerierte Liste einfügen/entfernen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/sk.js0000644000201500020150000000050614515446710023121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'sk', { bulletedlist: 'Vložiť/odstrániť zoznam s odrážkami', numberedlist: 'Vložiť/odstrániť číslovaný zoznam' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/az.js0000644000201500020150000000050014515446710023110 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'az', { bulletedlist: 'Markerlənmiş siyahını başlat/sil', numberedlist: 'Nömrələnmiş siyahını başlat/sil' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/pt.js0000644000201500020150000000040614515446710023126 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'pt', { bulletedlist: 'Marcas', numberedlist: 'Numeração' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/si.js0000644000201500020150000000063414515446710023121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'si', { bulletedlist: 'ඇතුලත් / ඉවත් කිරීම ලඉස්තුව', numberedlist: 'ඇතුලත් / ඉවත් කිරීම අන්න්කිත ලඉස්තුව' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ko.js0000644000201500020150000000043514515446710023116 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ko', { bulletedlist: '순서 없는 목록', numberedlist: '순서 있는 목록' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/mk.js0000644000201500020150000000050114515446710023106 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'mk', { bulletedlist: 'Insert/Remove Bulleted List', // MISSING numberedlist: 'Insert/Remove Numbered List' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/cy.js0000644000201500020150000000045414515446710023121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'cy', { bulletedlist: 'Mewnosod/Tynnu Rhestr Bwled', numberedlist: 'Mewnosod/Tynnu Rhestr Rhifol' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/uk.js0000644000201500020150000000057514515446710023131 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'uk', { bulletedlist: 'Вставити/видалити маркований список', numberedlist: 'Вставити/видалити нумерований список' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/zh-cn.js0000644000201500020150000000042014515446710023516 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'zh-cn', { bulletedlist: '项目列表', numberedlist: '编号列表' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/sv.js0000644000201500020150000000045314515446710023135 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'sv', { bulletedlist: 'Infoga/ta bort punktlista', numberedlist: 'Infoga/ta bort numrerad lista' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/lt.js0000644000201500020150000000044014515446710023120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'lt', { bulletedlist: 'Suženklintas sąrašas', numberedlist: 'Numeruotas sąrašas' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/is.js0000644000201500020150000000042114515446710023113 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'is', { bulletedlist: 'Punktalisti', numberedlist: 'Númeraður listi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/fr-ca.js0000644000201500020150000000042714515446710023476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'fr-ca', { bulletedlist: 'Liste à puces', numberedlist: 'Liste numérotée' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/et.js0000644000201500020150000000041214515446710023110 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'et', { bulletedlist: 'Punktloend', numberedlist: 'Numberloend' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/bs.js0000644000201500020150000000041214515446710023104 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'bs', { bulletedlist: 'Lista', numberedlist: 'Numerisana lista' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/pl.js0000644000201500020150000000042714515446710023121 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'pl', { bulletedlist: 'Lista wypunktowana', numberedlist: 'Lista numerowana' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/bg.js0000644000201500020150000000060314515446710023072 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'bg', { bulletedlist: 'Вмъкване/премахване на точков списък', numberedlist: 'Вмъкване/премахване на номериран списък' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/fa.js0000644000201500020150000000045514515446710023075 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'fa', { bulletedlist: 'فهرست نقطه​ای', numberedlist: 'فهرست شماره​دار' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ku.js0000644000201500020150000000051714515446710023125 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ku', { bulletedlist: 'دانان/لابردنی خاڵی لیست', numberedlist: 'دانان/لابردنی ژمارەی لیست' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/bn.js0000644000201500020150000000061314515446710023102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'bn', { bulletedlist: 'বুলেটেড তালিকা প্রবেশ/অপসারন করি', numberedlist: 'সাংখ্যিক লিস্টের লেবেল' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/el.js0000644000201500020150000000060714515446710023106 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'el', { bulletedlist: 'Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων', numberedlist: 'Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/fi.js0000644000201500020150000000041514515446710023101 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'fi', { bulletedlist: 'Luettelomerkit', numberedlist: 'Numerointi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ru.js0000644000201500020150000000060514515446710023132 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ru', { bulletedlist: 'Вставить / удалить маркированный список', numberedlist: 'Вставить / удалить нумерованный список' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/gl.js0000644000201500020150000000046314515446710023110 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'gl', { bulletedlist: 'Inserir/retirar lista viñeteada', numberedlist: 'Inserir/retirar lista numerada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/sr-latn.js0000644000201500020150000000042014515446710024057 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'sr-latn', { bulletedlist: 'Nаbrajanje', numberedlist: 'Numerisanje' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/oc.js0000644000201500020150000000050214515446710023101 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'oc', { bulletedlist: 'Inserir/Suprimir una lista amb de piuses', numberedlist: 'Inserir/Suprimir una lista numerotada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/sq.js0000644000201500020150000000045614515446710023133 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'sq', { bulletedlist: 'Vendos/Largo Listën me Pika', numberedlist: 'Vendos/Largo Listën me Numra' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/pt-br.js0000644000201500020150000000043014515446710023524 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'pt-br', { bulletedlist: 'Lista sem números', numberedlist: 'Lista numerada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/fo.js0000644000201500020150000000042714515446710023112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'fo', { bulletedlist: 'Punktmerktur listi', numberedlist: 'Talmerktur listi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/af.js0000644000201500020150000000042314515446710023070 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'af', { bulletedlist: 'Ongenommerde lys', numberedlist: 'Genommerde lys' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/hi.js0000644000201500020150000000045514515446710023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'hi', { bulletedlist: 'बुलॅट सूची', numberedlist: 'अंकीय सूची' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/km.js0000644000201500020150000000062114515446710023111 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'km', { bulletedlist: 'បញ្ចូល / លុប​បញ្ជី​ជា​ចំណុច​មូល', numberedlist: 'បញ្ចូល / លុប​បញ្ជី​ជា​លេខ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/nl.js0000644000201500020150000000044014515446710023112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'nl', { bulletedlist: 'Opsomming invoegen', numberedlist: 'Genummerde lijst invoegen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ka.js0000644000201500020150000000047714515446710023106 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ka', { bulletedlist: 'ღილიანი სია', numberedlist: 'გადანომრილი სია' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/es-mx.js0000644000201500020150000000047214515446710023537 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'es-mx', { bulletedlist: 'Insertar/Remover Lista con viñetas', numberedlist: 'Insertar/Remover Lista numerada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/mn.js0000644000201500020150000000047514515446710023123 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'mn', { bulletedlist: 'Цэгтэй жагсаалт', numberedlist: 'Дугаарлагдсан жагсаалт' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/da.js0000644000201500020150000000042114515446710023064 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'da', { bulletedlist: 'Punktopstilling', numberedlist: 'Talopstilling' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/he.js0000644000201500020150000000044514515446710023102 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'he', { bulletedlist: 'רשימת נקודות', numberedlist: 'רשימה ממוספרת' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ca.js0000644000201500020150000000042214515446710023064 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ca', { bulletedlist: 'Llista de pics', numberedlist: 'Llista numerada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/gu.js0000644000201500020150000000047114515446710023120 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'gu', { bulletedlist: 'બુલેટ સૂચિ', numberedlist: 'સંખ્યાંકન સૂચિ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ms.js0000644000201500020150000000043514515446710023124 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ms', { bulletedlist: 'Senarai tidak bernombor', numberedlist: 'Senarai bernombor' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/th.js0000644000201500020150000000056614515446710023125 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'th', { bulletedlist: 'ลำดับรายการแบบสัญลักษณ์', numberedlist: 'ลำดับรายการแบบตัวเลข' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/de.js0000644000201500020150000000043714515446710023077 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'de', { bulletedlist: 'Liste', numberedlist: 'Nummerierte Liste einfügen/entfernen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/en-ca.js0000644000201500020150000000045614515446710023473 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'en-ca', { bulletedlist: 'Insert/Remove Bulleted List', numberedlist: 'Insert/Remove Numbered List' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/tt.js0000644000201500020150000000054214515446710023133 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'tt', { bulletedlist: 'Маркерлы тезмә өстәү/бетерү', numberedlist: ' Номерланган тезмә өстәү/бетерү' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/vi.js0000644000201500020150000000050014515446710023114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'vi', { bulletedlist: 'Chèn/Xoá Danh sách không thứ tự', numberedlist: 'Chèn/Xoá Danh sách có thứ tự' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/cs.js0000644000201500020150000000041314515446710023106 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'cs', { bulletedlist: 'Odrážky', numberedlist: 'Číslování' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/tr.js0000644000201500020150000000042114515446710023125 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'tr', { bulletedlist: 'Simgeli Liste', numberedlist: 'Numaralı Liste' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ja.js0000644000201500020150000000043714515446710023101 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ja', { bulletedlist: '番号無しリスト', numberedlist: '番号付きリスト' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/sl.js0000644000201500020150000000047514515446710023127 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'sl', { bulletedlist: 'Vstavi/odstrani neoštevilčen seznam', numberedlist: 'Vstavi/odstrani oštevilčen seznam' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/lv.js0000644000201500020150000000047714515446710023134 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'lv', { bulletedlist: 'Ievietot/noņemt sarakstu ar aizzīmēm', numberedlist: 'Ievietot/noņemt numurētu sarakstu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/en-au.js0000644000201500020150000000045614515446710023515 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'en-au', { bulletedlist: 'Insert/Remove Bulleted List', numberedlist: 'Insert/Remove Numbered List' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/en.js0000644000201500020150000000045314515446710023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'en', { bulletedlist: 'Insert/Remove Bulleted List', numberedlist: 'Insert/Remove Numbered List' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/no.js0000644000201500020150000000046314515446710023122 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'no', { bulletedlist: 'Legg til/Fjern punktmerket liste', numberedlist: 'Legg til/Fjern nummerert liste' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/fr.js0000644000201500020150000000050214515446710023107 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'fr', { bulletedlist: 'Insérer/Supprimer une liste à puces', numberedlist: 'Insérer/Supprimer une liste numérotée' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/id.js0000644000201500020150000000045114515446710023077 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'id', { bulletedlist: 'Sisip/Hapus Daftar Bullet', numberedlist: 'Sisip/Hapus Daftar Bernomor' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ug.js0000644000201500020150000000046714515446710023125 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ug', { bulletedlist: 'تۈر بەلگە تىزىمى', numberedlist: 'تەرتىپ نومۇر تىزىمى' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/ar.js0000644000201500020150000000047714515446710023115 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'ar', { bulletedlist: 'ادخال/حذف تعداد نقطي', numberedlist: 'ادخال/حذف تعداد رقمي' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/sr.js0000644000201500020150000000043314515446710023127 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'sr', { bulletedlist: 'Набрајање', numberedlist: 'Нумерисање' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/eu.js0000644000201500020150000000043114515446710023112 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'eu', { bulletedlist: 'Buletdun Zerrenda', numberedlist: 'Zenbakidun Zerrenda' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/en-gb.js0000644000201500020150000000045614515446710023500 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'en-gb', { bulletedlist: 'Insert/Remove Bulleted List', numberedlist: 'Insert/Remove Numbered List' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/lang/hu.js0000644000201500020150000000041214515446710023114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'list', 'hu', { bulletedlist: 'Felsorolás', numberedlist: 'Számozás' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/0000755000201500020150000000000014503523375022337 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/bulletedlist.png0000644000201500020150000000056214503523375025544 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->aIDAT8Q @Dުe?-W40?:ʌ̨$r :ט !-Uh4jxSIQ ڞ:7~'e$dtj%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/numberedlist.png0000644000201500020150000000060614503523375025544 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->uIDAT8˭RA b&]5P"$H> 8hivLs| Hb"QPe䚃Xz-,)Z$k !UB.o)ԵCFAQ$5#V:9'Ĝ%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/hidpi/0000755000201500020150000000000014503523375023434 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/hidpi/bulletedlist.png0000644000201500020150000000147414503523375026644 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !@IDATXVA0 }@Wrܠ\@gBDf,EA؎lg B{Α{eRH>9ء؋zՁoJr f|GP"Z$U \y8,"TQ*H:y 9EQ\״BBUUfMv%b`j yLl^?$1!l ,"j !c I.5)`K < E"t0 $:d$ax8fl :V8a$bI])auTr`&[SC4S_sČ}i(" }8ɷiY(reY`UU>hr`QeY^CTTUn,7qoK[ზ+{[)DUJAЏ5 ,;IK$IwtBu̲,`ioA+ӻ@DP54K7;n IdYh4MȯO̎Wơ%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/hidpi/numberedlist.png0000644000201500020150000000121714503523375026640 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXWYN0 \j*=s Au: KvW俓.{_5T3>p/ _U';5>DlgzVo?Ed믉'61UC*'bЅ$p@f r$͑Zqj}Acpz28 Fp86HV%ώk:"L@N8鱥0_$O IVT3ICOw{ncؓl"AR#CD贰C𝛙!Hd^/$d<M6E{ E6=Ɔ{Oι:{\֨&vGLJ("{m9f=&$%"qN cgӀO/D6dE>_՟2fpgq6꺦a 2s? &Őo.zWMӐuIDAT8˥I 3U? Ri# b 0qLp{e?ssX؎O ETn fBfeFWR3YV.F>tKl'`PQf' %tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/list/icons/bulletedlist-rtl.png0000644000201500020150000000055714503523375026347 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->^IDAT8;0 C[Qs2S%JI!eX񗀒0{Nn>wb?.cke_widget_element{' + 'outline:2px solid #ffd25c;' + 'cursor:default' + '}' + '.cke_widget_wrapper:hover .cke_widget_editable{' + 'outline:2px solid #ffd25c' + '}' + '.cke_widget_wrapper.cke_widget_focused>.cke_widget_element,' + // We need higher specificity than hover style. '.cke_widget_wrapper .cke_widget_editable.cke_widget_editable_focused{' + 'outline:2px solid #47a4f5' + '}' + '.cke_widget_editable{' + 'cursor:text' + '}' + '.cke_widget_drag_handler_container{' + 'position:absolute;' + 'width:' + DRAG_HANDLER_SIZE + 'px;' + 'height:0;' + 'display:block;' + 'opacity:0.75;' + 'transition:height 0s 0.2s;' + // Delay hiding drag handler. // Prevent drag handler from being misplaced (https://dev.ckeditor.com/ticket/11198). 'line-height:0' + '}' + '.cke_widget_wrapper:hover>.cke_widget_drag_handler_container{' + 'height:' + DRAG_HANDLER_SIZE + 'px;' + 'transition:none' + '}' + '.cke_widget_drag_handler_container:hover{' + 'opacity:1' + '}' + '.cke_editable[contenteditable="false"] .cke_widget_drag_handler_container{' + // Hide drag handler in read only mode (#3260). 'display:none;' + '}' + 'img.cke_widget_drag_handler{' + 'cursor:move;' + 'width:' + DRAG_HANDLER_SIZE + 'px;' + 'height:' + DRAG_HANDLER_SIZE + 'px;' + 'display:inline-block' + '}' + '.cke_widget_mask{' + 'position:absolute;' + 'top:0;' + 'left:0;' + 'width:100%;' + 'height:100%;' + 'display:block' + '}' + '.cke_widget_partial_mask{' + 'position:absolute;' + 'display:block' + '}' + '.cke_editable.cke_widget_dragging, .cke_editable.cke_widget_dragging *{' + 'cursor:move !important' + '}' ); addCustomStyleHandler(); }, beforeInit: function( editor ) { // Widgets require querySelectorAll for proper work (#1319). if ( CKEDITOR.document.$.querySelectorAll === undefined ) { return; } /** * An instance of widget repository. It contains all * {@link CKEDITOR.plugins.widget.repository#registered registered widget definitions} and * {@link CKEDITOR.plugins.widget.repository#instances initialized instances}. * * editor.widgets.add( 'someName', { * // Widget definition... * } ); * * editor.widgets.registered.someName; // -> Widget definition * * @since 4.3.0 * @readonly * @property {CKEDITOR.plugins.widget.repository} widgets * @member CKEDITOR.editor */ editor.widgets = new Repository( editor ); }, afterInit: function( editor ) { // Widgets require querySelectorAll for proper work (#1319). if ( CKEDITOR.document.$.querySelectorAll === undefined ) { return; } addWidgetButtons( editor ); setupContextMenu( editor ); setupUndoFilter( editor.undoManager ); } } ); /** * Widget repository. It keeps track of all {@link #registered registered widget definitions} and * {@link #instances initialized instances}. An instance of the repository is available under * the {@link CKEDITOR.editor#widgets} property. * * @class CKEDITOR.plugins.widget.repository * @mixins CKEDITOR.event * @constructor Creates a widget repository instance. Note that the widget plugin automatically * creates a repository instance which is available under the {@link CKEDITOR.editor#widgets} property. * @param {CKEDITOR.editor} editor The editor instance for which the repository will be created. */ function Repository( editor ) { /** * The editor instance for which this repository was created. * * @readonly * @property {CKEDITOR.editor} editor */ this.editor = editor; /** * A hash of registered widget definitions (definition name => {@link CKEDITOR.plugins.widget.definition}). * * To register a definition use the {@link #add} method. * * @readonly */ this.registered = {}; /** * An object containing initialized widget instances (widget id => {@link CKEDITOR.plugins.widget}). * * @readonly */ this.instances = {}; /** * An array of selected widget instances. * * @readonly * @property {CKEDITOR.plugins.widget[]} selected */ this.selected = []; /** * The focused widget instance. See also {@link CKEDITOR.plugins.widget#event-focus} * and {@link CKEDITOR.plugins.widget#event-blur} events. * * editor.on( 'selectionChange', function() { * if ( editor.widgets.focused ) { * // Do something when a widget is focused... * } * } ); * * @readonly * @property {CKEDITOR.plugins.widget} focused */ this.focused = null; /** * The widget instance that contains the nested editable which is currently focused. * * @readonly * @property {CKEDITOR.plugins.widget} widgetHoldingFocusedEditable */ this.widgetHoldingFocusedEditable = null; this._ = { nextId: 0, upcasts: [], upcastCallbacks: [], filters: {} }; setupWidgetsLifecycle( this ); setupSelectionObserver( this ); setupMouseObserver( this ); setupKeyboardObserver( this ); setupDragAndDrop( this ); setupNativeCutAndCopy( this ); } Repository.prototype = { /** * Minimum interval between selection checks. * * @private */ MIN_SELECTION_CHECK_INTERVAL: 500, /** * Adds a widget definition to the repository. Fires the {@link CKEDITOR.editor#widgetDefinition} event * which allows to modify the widget definition which is going to be registered. * * @param {String} name The name of the widget definition. * @param {CKEDITOR.plugins.widget.definition} widgetDef Widget definition. * @returns {CKEDITOR.plugins.widget.definition} */ add: function( name, widgetDef ) { var editor = this.editor; // Create prototyped copy of original widget definition, so we won't modify it. widgetDef = CKEDITOR.tools.prototypedCopy( widgetDef ); widgetDef.name = name; widgetDef._ = widgetDef._ || {}; editor.fire( 'widgetDefinition', widgetDef ); if ( widgetDef.template ) widgetDef.template = new CKEDITOR.template( widgetDef.template ); addWidgetCommand( editor, widgetDef ); addWidgetProcessors( this, widgetDef ); this.registered[ name ] = widgetDef; // Define default `getMode` member for widget dialog definition (#2423). if ( widgetDef.dialog && editor.plugins.dialog ) { var dialogListener = CKEDITOR.on( 'dialogDefinition', function( evt ) { var definition = evt.data.definition, dialog = definition.dialog; if ( !definition.getMode && dialog.getName() === widgetDef.dialog ) { definition.getMode = function() { var model = dialog.getModel( editor ); return model && model instanceof CKEDITOR.plugins.widget && model.ready ? CKEDITOR.dialog.EDITING_MODE : CKEDITOR.dialog.CREATION_MODE; }; } dialogListener.removeListener(); } ); } return widgetDef; }, /** * Adds a callback for element upcasting. Each callback will be executed * for every element which is later tested by upcast methods. If a callback * returns `false`, the element will not be upcasted. * * // Images with the "banner" class will not be upcasted (e.g. to the image widget). * editor.widgets.addUpcastCallback( function( element ) { * if ( element.name == 'img' && element.hasClass( 'banner' ) ) * return false; * } ); * * @param {Function} callback * @param {CKEDITOR.htmlParser.element} callback.element */ addUpcastCallback: function( callback ) { this._.upcastCallbacks.push( callback ); }, /** * Checks the selection to update widget states (selection and focus). * * This method is triggered by the {@link #event-checkSelection} event. */ checkSelection: function() { if ( !this.editor.getSelection() ) { return; } var sel = this.editor.getSelection(), selectedElement = sel.getSelectedElement(), updater = stateUpdater( this ), widget; // Widget is focused so commit and finish checking. if ( selectedElement && ( widget = this.getByElement( selectedElement, true ) ) ) return updater.focus( widget ).select( widget ).commit(); var range = sel.getRanges()[ 0 ]; // No ranges or collapsed range mean that nothing is selected, so commit and finish checking. if ( !range || range.collapsed ) return updater.commit(); // Range is not empty, so create walker checking for wrappers. var walker = new CKEDITOR.dom.walker( range ), wrapper; walker.evaluator = Widget.isDomWidgetWrapper; while ( ( wrapper = walker.next() ) ) updater.select( this.getByElement( wrapper ) ); updater.commit(); }, /** * Checks if all widget instances are still present in the DOM. * Destroys those instances that are not present. * Reinitializes widgets on widget wrappers for which widget instances * cannot be found. Takes nested widgets into account, too. * * This method triggers the {@link #event-checkWidgets} event whose listeners * can cancel the method's execution or modify its options. * * @param [options] The options object. * @param {Boolean} [options.initOnlyNew] Initializes widgets only on newly wrapped * widget elements (those which still have the `cke_widget_new` class). When this option is * set to `true`, widgets which were invalidated (e.g. by replacing with a cloned DOM structure) * will not be reinitialized. This makes the check faster. * @param {Boolean} [options.focusInited] If only one widget is initialized by * the method, it will be focused. */ checkWidgets: function( options ) { this.fire( 'checkWidgets', CKEDITOR.tools.copy( options || {} ) ); }, /** * Removes the widget from the editor and moves the selection to the closest * editable position if the widget was focused before. * * @param {CKEDITOR.plugins.widget} widget The widget instance to be deleted. */ del: function( widget ) { if ( this.focused === widget ) { var editor = widget.editor, range = editor.createRange(), found; // If haven't found place for caret on the default side, // try to find it on the other side. if ( !( found = range.moveToClosestEditablePosition( widget.wrapper, true ) ) ) found = range.moveToClosestEditablePosition( widget.wrapper, false ); if ( found ) editor.getSelection().selectRanges( [ range ] ); } widget.wrapper.remove(); this.destroy( widget, true ); }, /** * Destroys the widget instance and all its nested widgets (widgets inside its nested editables). * * @param {CKEDITOR.plugins.widget} widget The widget instance to be destroyed. * @param {Boolean} [offline] Whether the widget is offline (detached from the DOM tree) — * in this case the DOM (attributes, classes, etc.) will not be cleaned up. */ destroy: function( widget, offline ) { if ( this.widgetHoldingFocusedEditable === widget ) setFocusedEditable( this, widget, null, offline ); widget.destroy( offline ); delete this.instances[ widget.id ]; this.fire( 'instanceDestroyed', widget ); }, /** * Destroys all widget instances. * * @param {Boolean} [offline] Whether the widgets are offline (detached from the DOM tree) — * in this case the DOM (attributes, classes, etc.) will not be cleaned up. * @param {CKEDITOR.dom.element} [container] The container within widgets will be destroyed. * This option will be ignored if the `offline` flag was set to `true`, because in such case * it is not possible to find widgets within the passed block. */ destroyAll: function( offline, container ) { var widget, id, instances = this.instances; if ( container && !offline ) { var wrappers = container.find( '.cke_widget_wrapper' ), l = wrappers.count(), i = 0; // Length is constant, because this is not a live node list. // Note: since querySelectorAll returns nodes in document order, // outer widgets are always placed before their nested widgets and therefore // are destroyed before them. for ( ; i < l; ++i ) { widget = this.getByElement( wrappers.getItem( i ), true ); // Widget might not be found, because it could be a nested widget, // which would be destroyed when destroying its parent. if ( widget ) this.destroy( widget ); } return; } for ( id in instances ) { widget = instances[ id ]; this.destroy( widget, offline ); } }, /** * Finalizes a process of widget creation. This includes: * * * inserting widget element into editor, * * marking widget instance as ready (see {@link CKEDITOR.plugins.widget#event-ready}), * * focusing widget instance. * * This method is used by the default widget's command and is called * after widget's dialog (if set) is closed. It may also be used in a * customized process of widget creation and insertion. * * widget.once( 'edit', function() { * // Finalize creation only of not ready widgets. * if ( widget.isReady() ) * return; * * // Cancel edit event to prevent automatic widget insertion. * evt.cancel(); * * CustomDialog.open( widget.data, function saveCallback( savedData ) { * // Cache the container, because widget may be destroyed while saving data, * // if this process will require some deep transformations. * var container = widget.wrapper.getParent(); * * widget.setData( savedData ); * * // Widget will be retrieved from container and inserted into editor. * editor.widgets.finalizeCreation( container ); * } ); * } ); * * @param {CKEDITOR.dom.element/CKEDITOR.dom.documentFragment} container The element * or document fragment which contains widget wrapper. The container is used, so before * finalizing creation the widget can be freely transformed (even destroyed and reinitialized). */ finalizeCreation: function( container ) { var wrapper = container.getFirst(); if ( wrapper && Widget.isDomWidgetWrapper( wrapper ) ) { this.editor.insertElement( wrapper ); var widget = this.getByElement( wrapper ); // Fire postponed #ready event. widget.ready = true; widget.fire( 'ready' ); widget.focus(); } }, /** * Finds a widget instance which contains a given element. The element will be the {@link CKEDITOR.plugins.widget#wrapper wrapper} * of the returned widget or a descendant of this {@link CKEDITOR.plugins.widget#wrapper wrapper}. * * editor.widgets.getByElement( someWidget.wrapper ); // -> someWidget * editor.widgets.getByElement( someWidget.parts.caption ); // -> someWidget * * // Check wrapper only: * editor.widgets.getByElement( someWidget.wrapper, true ); // -> someWidget * editor.widgets.getByElement( someWidget.parts.caption, true ); // -> null * * @param {CKEDITOR.dom.element} element The element to be checked. * @param {Boolean} [checkWrapperOnly] If set to `true`, the method will not check wrappers' descendants. * @returns {CKEDITOR.plugins.widget} The widget instance or `null`. */ getByElement: ( function() { var validWrapperElements = { div: 1, span: 1 }; function getWidgetId( element ) { return element.is( validWrapperElements ) && element.data( 'cke-widget-id' ); } return function( element, checkWrapperOnly ) { if ( !element ) return null; var id = getWidgetId( element ); // There's no need to check element parents if element is a wrapper. if ( !checkWrapperOnly && !id ) { var limit = this.editor.editable(); // Try to find a closest ascendant which is a widget wrapper. do { element = element.getParent(); } while ( element && !element.equals( limit ) && !( id = getWidgetId( element ) ) ); } return this.instances[ id ] || null; }; } )(), /** * Initializes a widget on a given element if the widget has not been initialized on it yet. * * @param {CKEDITOR.dom.element} element The future widget element. * @param {String/CKEDITOR.plugins.widget.definition} [widgetDef] Name of a widget or a widget definition. * The widget definition should be previously registered by using the * {@link CKEDITOR.plugins.widget.repository#add} method. * @param [startupData] Widget startup data (has precedence over default one). * @returns {CKEDITOR.plugins.widget} The widget instance or `null` if a widget could not be initialized on * a given element. */ initOn: function( element, widgetDef, startupData ) { if ( !widgetDef ) widgetDef = this.registered[ element.data( 'widget' ) ]; else if ( typeof widgetDef == 'string' ) widgetDef = this.registered[ widgetDef ]; if ( !widgetDef ) return null; // Wrap element if still wasn't wrapped (was added during runtime by method that skips dataProcessor). var wrapper = this.wrapElement( element, widgetDef.name ); if ( wrapper ) { // Check if widget wrapper is new (widget hasn't been initialized on it yet). // This class will be removed by widget constructor to avoid locking snapshot twice. if ( wrapper.hasClass( 'cke_widget_new' ) ) { var widget = new Widget( this, this._.nextId++, element, widgetDef, startupData ); // Widget could be destroyed when initializing it. if ( widget.isInited() ) { this.instances[ widget.id ] = widget; return widget; } else { return null; } } // Widget already has been initialized, so try to get widget by element. // Note - it may happen that other instance will returned than the one created above, // if for example widget was destroyed and reinitialized. return this.getByElement( element ); } // No wrapper means that there's no widget for this element. return null; }, /** * Initializes widgets on all elements which were wrapped by {@link #wrapElement} and * have not been initialized yet. * * @param {CKEDITOR.dom.element} [container=editor.editable()] The container which will be checked for not * initialized widgets. Defaults to editor's {@link CKEDITOR.editor#editable editable} element. * @returns {CKEDITOR.plugins.widget[]} Array of widget instances which have been initialized. * Note: Only first-level widgets are returned — without nested widgets. */ initOnAll: function( container ) { var newWidgets = ( container || this.editor.editable() ).find( '.cke_widget_new' ), newInstances = [], instance; for ( var i = newWidgets.count(); i--; ) { instance = this.initOn( newWidgets.getItem( i ).getFirst( Widget.isDomWidgetElement ) ); if ( instance ) newInstances.push( instance ); } return newInstances; }, /** * Allows to listen to events on specific types of widgets, even if they are not created yet. * * Please note that this method inherits parameters from the {@link CKEDITOR.event#method-on} method with one * extra parameter at the beginning which is the widget name. * * editor.widgets.onWidget( 'image', 'action', function( evt ) { * // Event `action` occurs on `image` widget. * } ); * * @since 4.5.0 * @param {String} widgetName * @param {String} eventName * @param {Function} listenerFunction * @param {Object} [scopeObj] * @param {Object} [listenerData] * @param {Number} [priority=10] */ onWidget: function( widgetName ) { var args = Array.prototype.slice.call( arguments ); args.shift(); for ( var i in this.instances ) { var instance = this.instances[ i ]; if ( instance.name == widgetName ) { instance.on.apply( instance, args ); } } this.on( 'instanceCreated', function( evt ) { var widget = evt.data; if ( widget.name == widgetName ) { widget.on.apply( widget, args ); } } ); }, /** * Parses element classes string and returns an object * whose keys contain class names. Skips all `cke_*` classes. * * This method is used by the {@link CKEDITOR.plugins.widget#getClasses} method and * may be used when overriding that method. * * @since 4.4.0 * @param {String} classes String (value of `class` attribute). * @returns {Object} Object containing classes or `null` if no classes found. */ parseElementClasses: function( classes ) { if ( !classes ) return null; classes = CKEDITOR.tools.trim( classes ).split( /\s+/ ); var cl, obj = {}, hasClasses = 0; while ( ( cl = classes.pop() ) ) { if ( cl.indexOf( 'cke_' ) == -1 ) obj[ cl ] = hasClasses = 1; } return hasClasses ? obj : null; }, /** * Wraps an element with a widget's non-editable container. * * If this method is called on an {@link CKEDITOR.htmlParser.element}, then it will * also take care of fixing the DOM after wrapping (the wrapper may not be allowed in element's parent). * * @param {CKEDITOR.dom.element/CKEDITOR.htmlParser.element} element The widget element to be wrapped. * @param {String} [widgetName] The name of the widget definition. Defaults to element's `data-widget` * attribute value. * @returns {CKEDITOR.dom.element/CKEDITOR.htmlParser.element} The wrapper element or `null` if * the widget definition of this name is not registered. */ wrapElement: function( element, widgetName ) { var wrapper = null, widgetDef, isInline; if ( element instanceof CKEDITOR.dom.element ) { widgetName = widgetName || element.data( 'widget' ); widgetDef = this.registered[ widgetName ]; if ( !widgetDef ) return null; // Do not wrap already wrapped element. wrapper = element.getParent(); if ( wrapper && wrapper.type == CKEDITOR.NODE_ELEMENT && wrapper.data( 'cke-widget-wrapper' ) ) return wrapper; // If attribute isn't already set (e.g. for pasted widget), set it. if ( !element.hasAttribute( 'data-cke-widget-keep-attr' ) ) element.data( 'cke-widget-keep-attr', element.data( 'widget' ) ? 1 : 0 ); element.data( 'widget', widgetName ); isInline = isWidgetInline( widgetDef, element.getName() ); // Preserve initial and trailing space by replacing white space with   (#605). if ( isInline ) { preserveSpaces( element ); } wrapper = new CKEDITOR.dom.element( isInline ? 'span' : 'div', element.getDocument() ); wrapper.setAttributes( getWrapperAttributes( isInline, widgetName ) ); wrapper.data( 'cke-display-name', widgetDef.pathName ? widgetDef.pathName : element.getName() ); // Replace element unless it is a detached one. if ( element.getParent( true ) ) wrapper.replace( element ); element.appendTo( wrapper ); } else if ( element instanceof CKEDITOR.htmlParser.element ) { widgetName = widgetName || element.attributes[ 'data-widget' ]; widgetDef = this.registered[ widgetName ]; if ( !widgetDef ) return null; wrapper = element.parent; if ( wrapper && wrapper.type == CKEDITOR.NODE_ELEMENT && wrapper.attributes[ 'data-cke-widget-wrapper' ] ) return wrapper; // If attribute isn't already set (e.g. for pasted widget), set it. if ( !( 'data-cke-widget-keep-attr' in element.attributes ) ) element.attributes[ 'data-cke-widget-keep-attr' ] = element.attributes[ 'data-widget' ] ? 1 : 0; if ( widgetName ) element.attributes[ 'data-widget' ] = widgetName; isInline = isWidgetInline( widgetDef, element.name ); // Preserve initial and trailing space by replacing white space with   (#605). if ( isInline ) { preserveSpaces( element ); } wrapper = new CKEDITOR.htmlParser.element( isInline ? 'span' : 'div', getWrapperAttributes( isInline, widgetName ) ); wrapper.attributes[ 'data-cke-display-name' ] = widgetDef.pathName ? widgetDef.pathName : element.name; var parent = element.parent, index; // Don't detach already detached element. if ( parent ) { index = element.getIndex(); element.remove(); } wrapper.add( element ); // Insert wrapper fixing DOM (splitting parents if wrapper is not allowed inside them). parent && insertElement( parent, index, wrapper ); } return wrapper; }, // Expose for tests. _tests_createEditableFilter: createEditableFilter }; CKEDITOR.event.implementOn( Repository.prototype ); /** * An event fired when a widget instance is created, but before it is fully initialized. * * @event instanceCreated * @param {CKEDITOR.plugins.widget} data The widget instance. */ /** * An event fired when a widget instance was destroyed. * * See also {@link CKEDITOR.plugins.widget#event-destroy}. * * @event instanceDestroyed * @param {CKEDITOR.plugins.widget} data The widget instance. */ /** * An event fired to trigger the selection check. * * See the {@link #method-checkSelection} method. * * @event checkSelection */ /** * An event fired by the the {@link #method-checkWidgets} method. * * It can be canceled in order to stop the {@link #method-checkWidgets} * method execution or the event listener can modify the method's options. * * @event checkWidgets * @param [data] * @param {Boolean} [data.initOnlyNew] Initialize widgets only on newly wrapped * widget elements (those which still have the `cke_widget_new` class). When this option is * set to `true`, widgets which were invalidated (e.g. by replacing with a cloned DOM structure) * will not be reinitialized. This makes the check faster. * @param {Boolean} [data.focusInited] If only one widget is initialized by * the method, it will be focused. */ /** * An instance of a widget. Together with {@link CKEDITOR.plugins.widget.repository} these * two classes constitute the core of the Widget System. * * Note that neither the repository nor the widget instances can be created by using their constructors. * A repository instance is automatically set up by the Widget plugin and is accessible under * {@link CKEDITOR.editor#widgets}, while widget instances are created and destroyed by the repository. * * To create a widget, first you need to {@link CKEDITOR.plugins.widget.repository#add register} its * {@link CKEDITOR.plugins.widget.definition definition}: * * editor.widgets.add( 'simplebox', { * upcast: function( element ) { * // Defines which elements will become widgets. * if ( element.hasClass( 'simplebox' ) ) * return true; * }, * init: function() { * // ... * } * } ); * * Once the widget definition is registered, widgets will be automatically * created when loading data: * * editor.setData( '
          foo
          ', function() { * console.log( editor.widgets.instances ); // -> An object containing one instance. * } ); * * It is also possible to create instances during runtime by using a command * (if a {@link CKEDITOR.plugins.widget.definition#template} property was defined): * * // You can execute an automatically defined command to * // insert a new simplebox widget or edit the one currently focused. * editor.execCommand( 'simplebox' ); * * Note: Since CKEditor 4.5.0 widget's `startupData` can be passed as the command argument: * * editor.execCommand( 'simplebox', { * startupData: { * align: 'left' * } * } ); * * A widget can also be created in a completely custom way: * * var element = editor.document.createElement( 'div' ); * editor.insertElement( element ); * var widget = editor.widgets.initOn( element, 'simplebox' ); * * @since 4.3.0 * @class CKEDITOR.plugins.widget * @mixins CKEDITOR.event * @extends CKEDITOR.plugins.widget.definition * @constructor Creates an instance of the widget class. Do not use it directly, but instead initialize widgets * by using the {@link CKEDITOR.plugins.widget.repository#initOn} method or by the upcasting system. * @param {CKEDITOR.plugins.widget.repository} widgetsRepo * @param {Number} id Unique ID of this widget instance. * @param {CKEDITOR.dom.element} element The widget element. * @param {CKEDITOR.plugins.widget.definition} widgetDef Widget's registered definition. * @param [startupData] Initial widget data. This data object will overwrite the default data and * the data loaded from the DOM. */ function Widget( widgetsRepo, id, element, widgetDef, startupData ) { var editor = widgetsRepo.editor; // Extend this widget with widgetDef-specific methods and properties. CKEDITOR.tools.extend( this, widgetDef, { /** * The editor instance. * * @readonly * @property {CKEDITOR.editor} */ editor: editor, /** * This widget's unique (per editor instance) ID. * * @readonly * @property {Number} */ id: id, /** * Whether this widget is an inline widget (based on an inline element unless * forced otherwise by {@link CKEDITOR.plugins.widget.definition#inline}). * * **Note:** This option does not allow to turn a block element into an inline widget. * However, it makes it possible to turn an inline element into a block widget or to * force a correct type in case when automatic recognition fails. * * @readonly * @property {Boolean} */ inline: element.getParent().getName() == 'span', /** * The widget element — the element on which the widget was initialized. * * @readonly * @property {CKEDITOR.dom.element} element */ element: element, /** * Widget's data object. * * The data can only be set by using the {@link #setData} method. * Changes made to the data fire the {@link #event-data} event. * * @readonly */ data: CKEDITOR.tools.extend( {}, typeof widgetDef.defaults == 'function' ? widgetDef.defaults() : widgetDef.defaults ), /** * Indicates if a widget is data-ready. Set to `true` when data from all sources * ({@link CKEDITOR.plugins.widget.definition#defaults}, set in the * {@link #init} method, loaded from the widget's element and startup data coming from the constructor) * are finally loaded. This is immediately followed by the first {@link #event-data}. * * @readonly */ dataReady: false, /** * Whether a widget instance was initialized. This means that: * * * An instance was created, * * Its properties were set, * * The `init` method was executed. * * **Note**: The first {@link #event-data} event could not be fired yet which * means that the widget's DOM has not been set up yet. Wait for the {@link #event-ready} * event to be notified when a widget is fully initialized and ready. * * **Note**: Use the {@link #isInited} method to check whether a widget is initialized and * has not been destroyed. * * @readonly */ inited: false, /** * Whether a widget instance is ready. This means that the widget is {@link #inited} and * that its DOM was finally set up. * * **Note:** Use the {@link #isReady} method to check whether a widget is ready and * has not been destroyed. * * @readonly */ ready: false, // Revert what widgetDef could override (automatic #edit listener). edit: Widget.prototype.edit, /** * The nested editable element which is currently focused. * * @readonly * @property {CKEDITOR.plugins.widget.nestedEditable} */ focusedEditable: null, /** * The widget definition from which this instance was created. * * @readonly * @property {CKEDITOR.plugins.widget.definition} definition */ definition: widgetDef, /** * Link to the widget repository which created this instance. * * @readonly * @property {CKEDITOR.plugins.widget.repository} repository */ repository: widgetsRepo, draggable: widgetDef.draggable !== false, // WAAARNING: Overwrite widgetDef's priv object, because otherwise violent unicorn's gonna visit you. _: { downcastFn: ( widgetDef.downcast && typeof widgetDef.downcast == 'string' ) ? widgetDef.downcasts[ widgetDef.downcast ] : widgetDef.downcast } }, true ); /** * An object of widget component elements. * * For every `partName => selector` pair in {@link CKEDITOR.plugins.widget.definition#parts}, * one `partName => element` pair is added to this object during the widget initialization. * Parts can be reinitialized with the {@link #refreshParts} method. * * @readonly * @property {Object} parts */ /** * An object containing definitions of widget parts (`part name => CSS selector`). * * Unlike the {@link #parts} object, it stays unchanged throughout the widget lifecycle * and is used in the {@link #refreshParts} method. * * @readonly * @property {Object} partSelectors * @since 4.14.0 */ /** * The template which will be used to create a new widget element (when the widget's command is executed). * It will be populated with {@link #defaults default values}. * * @readonly * @property {CKEDITOR.template} template */ /** * The widget wrapper — a non-editable `div` or `span` element (depending on {@link #inline}) * which is a parent of the {@link #element} and widget compontents like the drag handler and the {@link #mask}. * It is the outermost widget element. * * @readonly * @property {CKEDITOR.dom.element} wrapper */ widgetsRepo.fire( 'instanceCreated', this ); setupWidget( this, widgetDef ); this.init && this.init(); // Finally mark widget as inited. this.inited = true; setupWidgetData( this, startupData ); // If at some point (e.g. in #data listener) widget hasn't been destroyed // and widget is already attached to document then fire #ready. if ( this.isInited() && editor.editable().contains( this.wrapper ) ) { this.ready = true; this.fire( 'ready' ); } } Widget.prototype = { /** * Adds a class to the widget element. This method is used by * the {@link #applyStyle} method and should be overridden by widgets * which should handle classes differently (e.g. add them to other elements). * * Since 4.6.0 this method also adds a corresponding class prefixed with {@link #WRAPPER_CLASS_PREFIX} * to the widget wrapper element. * * **Note**: This method should not be used directly. Use the {@link #setData} method to * set the `classes` property. Read more in the {@link #setData} documentation. * * See also: {@link #removeClass}, {@link #hasClass}, {@link #getClasses}. * * @since 4.4.0 * @param {String} className The class name to be added. */ addClass: function( className ) { this.element.addClass( className ); this.wrapper.addClass( Widget.WRAPPER_CLASS_PREFIX + className ); }, /** * Applies the specified style to the widget. It is highly recommended to use the * {@link CKEDITOR.editor#applyStyle} or {@link CKEDITOR.style#apply} methods instead of * using this method directly, because unlike editor's and style's methods, this one * does not perform any checks. * * By default this method handles only classes defined in the style. It clones existing * classes which are stored in the {@link #property-data widget data}'s `classes` property, * adds new classes, and calls the {@link #setData} method if at least one new class was added. * Then, using the {@link #event-data} event listener widget applies modifications passing * new classes to the {@link #addClass} method. * * If you need to handle classes differently than in the default way, you can override the * {@link #addClass} and related methods. You can also handle other style properties than `classes` * by overriding this method. * * See also: {@link #checkStyleActive}, {@link #removeStyle}. * * @since 4.4.0 * @param {CKEDITOR.style} style The custom widget style to be applied. */ applyStyle: function( style ) { applyRemoveStyle( this, style, 1 ); }, /** * Checks if the specified style is applied to this widget. It is highly recommended to use the * {@link CKEDITOR.style#checkActive} method instead of using this method directly, * because unlike style's method, this one does not perform any checks. * * By default this method handles only classes defined in the style and passes * them to the {@link #hasClass} method. You can override these methods to handle classes * differently or to handle more of the style properties. * * See also: {@link #applyStyle}, {@link #removeStyle}. * * @since 4.4.0 * @param {CKEDITOR.style} style The custom widget style to be checked. * @returns {Boolean} Whether the style is applied to this widget. */ checkStyleActive: function( style ) { var classes = getStyleClasses( style ), cl; if ( !classes ) return false; while ( ( cl = classes.pop() ) ) { if ( !this.hasClass( cl ) ) return false; } return true; }, /** * Destroys this widget instance. * * Use {@link CKEDITOR.plugins.widget.repository#destroy} when possible instead of this method. * * This method fires the {#event-destroy} event. * * @param {Boolean} [offline] Whether a widget is offline (detached from the DOM tree) — * in this case the DOM (attributes, classes, etc.) will not be cleaned up. */ destroy: function( offline ) { this.fire( 'destroy' ); if ( this.editables ) { for ( var name in this.editables ) this.destroyEditable( name, offline ); } if ( !offline ) { if ( this.element.data( 'cke-widget-keep-attr' ) == '0' ) this.element.removeAttribute( 'data-widget' ); this.element.removeAttributes( [ 'data-cke-widget-data', 'data-cke-widget-keep-attr' ] ); this.element.removeClass( 'cke_widget_element' ); this.element.replace( this.wrapper ); } this.wrapper = null; }, /** * Destroys a nested editable and all nested widgets. * * @param {String} editableName Nested editable name. * @param {Boolean} [offline] See {@link #method-destroy} method. */ destroyEditable: function( editableName, offline ) { var editable = this.editables[ editableName ], canDestroyFilter = true; editable.removeListener( 'focus', onEditableFocus ); editable.removeListener( 'blur', onEditableBlur ); this.editor.focusManager.remove( editable ); // Destroy filter if it's no longer used by other editables (#1722). if ( editable.filter ) { for ( var widgetName in this.repository.instances ) { var widget = this.repository.instances[ widgetName ]; if ( !widget.editables ) { continue; } var widgetEditable = widget.editables[ editableName ]; if ( !widgetEditable || widgetEditable === editable ) { continue; } if ( editable.filter === widgetEditable.filter ) { canDestroyFilter = false; } } if ( canDestroyFilter ) { editable.filter.destroy(); var filters = this.repository._.filters[ this.name ]; if ( filters ) { delete filters[ editableName ]; } } } if ( !offline ) { this.repository.destroyAll( false, editable ); editable.removeClass( 'cke_widget_editable' ); editable.removeClass( 'cke_widget_editable_focused' ); editable.removeAttributes( [ 'contenteditable', 'data-cke-widget-editable', 'data-cke-enter-mode' ] ); } delete this.editables[ editableName ]; }, /** * Starts widget editing. * * This method fires the {@link CKEDITOR.plugins.widget#event-edit} event * which may be canceled in order to prevent it from opening a dialog window. * * The dialog window name is obtained from the event's data `dialog` property or * from {@link CKEDITOR.plugins.widget.definition#dialog}. * * @returns {Boolean} Returns `true` if a dialog window was opened. */ edit: function() { var evtData = { dialog: this.dialog }, that = this; // Edit event was blocked or there's no dialog to be automatically opened. if ( this.fire( 'edit', evtData ) === false || !evtData.dialog ) return false; this.editor.openDialog( evtData.dialog, function( dialog ) { var showListener, okListener; // Allow to add a custom dialog handler. if ( that.fire( 'dialog', dialog ) === false ) return; showListener = dialog.on( 'show', function() { dialog.setupContent( that ); } ); okListener = dialog.on( 'ok', function() { // Commit dialog's fields, but prevent from // firing data event for every field. Fire only one, // bulk event at the end. var dataChanged, dataListener = that.on( 'data', function( evt ) { dataChanged = 1; evt.cancel(); }, null, null, 0 ); // Create snapshot preceeding snapshot with changed widget... // TODO it should not be required, but it is and I found similar // code in dialog#ok listener in dialog/plugin.js. that.editor.fire( 'saveSnapshot' ); dialog.commitContent( that ); dataListener.removeListener(); if ( dataChanged ) { that.fire( 'data', that.data ); that.editor.fire( 'saveSnapshot' ); } } ); dialog.once( 'hide', function() { showListener.removeListener(); okListener.removeListener(); } ); }, that ); return true; }, /** * Returns widget element classes parsed to an object. This method * is used to populate the `classes` property of widget's {@link #property-data}. * * This method reuses {@link CKEDITOR.plugins.widget.repository#parseElementClasses}. * It should be overriden if a widget should handle classes differently (e.g. on other elements). * * See also: {@link #removeClass}, {@link #addClass}, {@link #hasClass}. * * @since 4.4.0 * @returns {Object} */ getClasses: function() { return this.repository.parseElementClasses( this.element.getAttribute( 'class' ) ); }, /** * Returns the HTML of the widget. Can be overridden by * {@link CKEDITOR.plugins.widget.definition#getClipboardHtml widgetDefinition.getClipboardHtml()} * to customize the HTML copied to the clipboard during copy, cut and drag events. * * @since 4.13.0 * @returns {String} Widget HTML. */ getClipboardHtml: function() { var range = this.editor.createRange(); range.setStartBefore( this.wrapper ); range.setEndAfter( this.wrapper ); return this.editor.editable().getHtmlFromRange( range ).getHtml(); }, /** * Checks if the widget element has specified class. This method is used by * the {@link #checkStyleActive} method and should be overriden by widgets * which should handle classes differently (e.g. on other elements). * * See also: {@link #removeClass}, {@link #addClass}, {@link #getClasses}. * * @since 4.4.0 * @param {String} className The class to be checked. * @param {Boolean} Whether a widget has specified class. */ hasClass: function( className ) { return this.element.hasClass( className ); }, /** * Initializes a nested editable. * * **Note**: Only elements from {@link CKEDITOR.dtd#$editable} may become editables. * * @param {String} editableName The nested editable name. * @param {CKEDITOR.plugins.widget.nestedEditable.definition} definition The definition of the nested editable. * @returns {Boolean} Whether an editable was successfully initialized. */ initEditable: function( editableName, definition ) { // Don't fetch just first element which matched selector but look for a correct one. (https://dev.ckeditor.com/ticket/13334) var editable = this._findOneNotNested( definition.selector ); if ( editable && editable.is( CKEDITOR.dtd.$editable ) ) { editable = new NestedEditable( this.editor, editable, { filter: createEditableFilter.call( this.repository, this.name, editableName, definition ) } ); this.editables[ editableName ] = editable; editable.setAttributes( { contenteditable: 'true', 'data-cke-widget-editable': editableName, 'data-cke-enter-mode': editable.enterMode } ); if ( editable.filter ) editable.data( 'cke-filter', editable.filter.id ); editable.addClass( 'cke_widget_editable' ); // This class may be left when d&ding widget which // had focused editable. Clean this class here, not in // cleanUpWidgetElement for performance and code size reasons. editable.removeClass( 'cke_widget_editable_focused' ); if ( definition.pathName ) editable.data( 'cke-display-name', definition.pathName ); this.editor.focusManager.add( editable ); editable.on( 'focus', onEditableFocus, this ); CKEDITOR.env.ie && editable.on( 'blur', onEditableBlur, this ); // Finally, process editable's data. This data wasn't processed when loading // editor's data, becuase they need to be processed separately, with its own filters and settings. editable._.initialSetData = true; editable.setData( editable.getHtml() ); return true; } return false; }, /** * Looks inside wrapper element to find a node that * matches given selector and is not nested in other widget. (https://dev.ckeditor.com/ticket/13334) * * @since 4.5.0 * @private * @param {String} selector Selector to match. * @returns {CKEDITOR.dom.element} Matched element or `null` if a node has not been found. */ _findOneNotNested: function( selector ) { var matchedElements = this.wrapper.find( selector ), match, closestWrapper; for ( var i = 0; i < matchedElements.count(); i++ ) { match = matchedElements.getItem( i ); closestWrapper = match.getAscendant( Widget.isDomWidgetWrapper ); // The closest ascendant-wrapper of this match defines to which widget // this match belongs. If the ascendant is this widget's wrapper // it means that the match is not nested in other widget. if ( this.wrapper.equals( closestWrapper ) ) { return match; } } return null; }, /** * Checks if a widget has already been initialized and has not been destroyed yet. * * See {@link #inited} for more details. * * @returns {Boolean} */ isInited: function() { return !!( this.wrapper && this.inited ); }, /** * Checks if a widget is ready and has not been destroyed yet. * * See {@link #property-ready} for more details. * * @returns {Boolean} */ isReady: function() { return this.isInited() && this.ready; }, /** * Focuses a widget by selecting it. */ focus: function() { var sel = this.editor.getSelection(); // Fake the selection before focusing editor, to avoid unpreventable viewports scrolling // on Webkit/Blink/IE which is done because there's no selection or selection was somewhere else than widget. if ( sel ) { var isDirty = this.editor.checkDirty(); sel.fake( this.wrapper ); !isDirty && this.editor.resetDirty(); } // Always focus editor (not only when focusManger.hasFocus is false) (because of https://dev.ckeditor.com/ticket/10483). this.editor.focus(); }, /** * Refreshes the widget's mask. It can be used together with the {@link #refreshParts} method to reinitialize the mask * for dynamically created widgets. * * @since 4.14.0 */ refreshMask: function() { setupMask( this ); }, /** * Reinitializes the widget's {@link #parts}. * * This method can be used to link new DOM elements to widget parts, for example in case when the widget's HTML is created * asynchronously or modified during the widget lifecycle. Note that it uses the {@link #partSelectors} object, so it does not * refresh parts that were created manually. * * @since 4.14.0 * @param {Boolean} [refreshInitialized=true] Whether the parts that are already initialized should be reinitialized. */ refreshParts: function( refreshInitialized ) { refreshInitialized = typeof refreshInitialized !== 'undefined' ? refreshInitialized : true; setupParts( this, refreshInitialized ); }, /** * Removes a class from the widget element. This method is used by * the {@link #removeStyle} method and should be overriden by widgets * which should handle classes differently (e.g. on other elements). * * **Note**: This method should not be used directly. Use the {@link #setData} method to * set the `classes` property. Read more in the {@link #setData} documentation. * * See also: {@link #hasClass}, {@link #addClass}. * * @since 4.4.0 * @param {String} className The class to be removed. */ removeClass: function( className ) { this.element.removeClass( className ); this.wrapper.removeClass( Widget.WRAPPER_CLASS_PREFIX + className ); }, /** * Removes the specified style from the widget. It is highly recommended to use the * {@link CKEDITOR.editor#removeStyle} or {@link CKEDITOR.style#remove} methods instead of * using this method directly, because unlike editor's and style's methods, this one * does not perform any checks. * * Read more about how applying/removing styles works in the {@link #applyStyle} method documentation. * * See also {@link #checkStyleActive}, {@link #applyStyle}, {@link #getClasses}. * * @since 4.4.0 * @param {CKEDITOR.style} style The custom widget style to be removed. */ removeStyle: function( style ) { applyRemoveStyle( this, style, 0 ); }, /** * Sets widget value(s) in the {@link #property-data} object. * If the given value(s) modifies current ones, the {@link #event-data} event is fired. * * this.setData( 'align', 'left' ); * this.data.align; // -> 'left' * * this.setData( { align: 'right', opened: false } ); * this.data.align; // -> 'right' * this.data.opened; // -> false * * Set values are stored in {@link #element}'s attribute (`data-cke-widget-data`), * in a JSON string, therefore {@link #property-data} should contain * only serializable data. * * **Note:** A special data property, `classes`, exists. It contains an object with * classes which were returned by the {@link #getClasses} method during the widget initialization. * This property is then used by the {@link #applyStyle} and {@link #removeStyle} methods. * When it is changed (the reference to object must be changed!), the widget updates its classes by * using the {@link #addClass} and {@link #removeClass} methods. * * // Adding a new class. * var classes = CKEDITOR.tools.clone( widget.data.classes ); * classes.newClass = 1; * widget.setData( 'classes', classes ); * * // Removing a class. * var classes = CKEDITOR.tools.clone( widget.data.classes ); * delete classes.newClass; * widget.setData( 'classes', classes ); * * @param {String/Object} keyOrData * @param {Object} value * @chainable */ setData: function( key, value ) { var data = this.data, modified = 0; if ( typeof key == 'string' ) { if ( data[ key ] !== value ) { data[ key ] = value; modified = 1; } } else { var newData = key; for ( key in newData ) { if ( data[ key ] !== newData[ key ] ) { modified = 1; data[ key ] = newData[ key ]; } } } // Block firing data event and overwriting data element before setupWidgetData is executed. if ( modified && this.dataReady ) { writeDataToElement( this ); this.fire( 'data', data ); } return this; }, /** * Changes the widget's focus state. This method is executed automatically after * a widget was focused by the {@link #method-focus} method or the selection was moved * out of the widget. * * This is a low-level method which is not integrated with e.g. the undo manager. * Use the {@link #method-focus} method instead. * * @param {Boolean} selected Whether to select or deselect this widget. * @chainable */ setFocused: function( focused ) { this.wrapper[ focused ? 'addClass' : 'removeClass' ]( 'cke_widget_focused' ); this.fire( focused ? 'focus' : 'blur' ); return this; }, /** * Changes the widget's select state. This method is executed automatically after * a widget was selected by the {@link #method-focus} method or the selection * was moved out of the widget. * * This is a low-level method which is not integrated with e.g. the undo manager. * Use the {@link #method-focus} method instead or simply change the selection. * * @param {Boolean} selected Whether to select or deselect this widget. * @chainable */ setSelected: function( selected ) { this.wrapper[ selected ? 'addClass' : 'removeClass' ]( 'cke_widget_selected' ); this.fire( selected ? 'select' : 'deselect' ); return this; }, /** * Repositions drag handler according to the widget's element position. Should be called from events, like mouseover. */ updateDragHandlerPosition: function() { var editor = this.editor, domElement = this.element.$, oldPos = this._.dragHandlerOffset, newPos = { x: domElement.offsetLeft, y: domElement.offsetTop - DRAG_HANDLER_SIZE }; if ( oldPos && newPos.x == oldPos.x && newPos.y == oldPos.y ) return; // We need to make sure that dirty state is not changed (https://dev.ckeditor.com/ticket/11487). var initialDirty = editor.checkDirty(); editor.fire( 'lockSnapshot' ); this.dragHandlerContainer.setStyles( { top: newPos.y + 'px', left: newPos.x + 'px' } ); this.dragHandlerContainer.removeStyle( 'display' ); editor.fire( 'unlockSnapshot' ); !initialDirty && editor.resetDirty(); this._.dragHandlerOffset = newPos; } }; CKEDITOR.event.implementOn( Widget.prototype ); /** * Gets the {@link #isDomNestedEditable nested editable} * (returned as a {@link CKEDITOR.dom.element}, not as a {@link CKEDITOR.plugins.widget.nestedEditable}) * closest to the `node` or the `node` if it is a nested editable itself. * * @since 4.5.0 * @static * @param {CKEDITOR.dom.element} guard Stop ancestor search on this node (usually editor's editable). * @param {CKEDITOR.dom.node} node Start the search from this node. * @returns {CKEDITOR.dom.element/null} Element or `null` if not found. */ Widget.getNestedEditable = function( guard, node ) { if ( !node || node.equals( guard ) ) return null; if ( Widget.isDomNestedEditable( node ) ) return node; return Widget.getNestedEditable( guard, node.getParent() ); }; /** * Checks whether the `node` is a widget's drag handle element. * * @since 4.5.0 * @static * @param {CKEDITOR.dom.node} node * @returns {Boolean} */ Widget.isDomDragHandler = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-drag-handler' ); }; /** * Checks whether the `node` is a container of the widget's drag handle element. * * @since 4.5.0 * @static * @param {CKEDITOR.dom.node} node * @returns {Boolean} */ Widget.isDomDragHandlerContainer = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && node.hasClass( 'cke_widget_drag_handler_container' ); }; /** * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#editables nested editable}. * Note that this function only checks whether it is the right element, not whether * the passed `node` is an instance of {@link CKEDITOR.plugins.widget.nestedEditable}. * * @since 4.5.0 * @static * @param {CKEDITOR.dom.node} node * @returns {Boolean} */ Widget.isDomNestedEditable = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-editable' ); }; /** * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#element widget element}. * * @since 4.5.0 * @static * @param {CKEDITOR.dom.node} node * @returns {Boolean} */ Widget.isDomWidgetElement = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' ); }; /** * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#wrapper widget wrapper}. * * @since 4.5.0 * @static * @param {CKEDITOR.dom.element} node * @returns {Boolean} */ Widget.isDomWidgetWrapper = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-wrapper' ); }; /** * Checks whether the `node` is a DOM widget. * * @since 4.8.0 * @static * @param {CKEDITOR.dom.node} node * @returns {Boolean} */ Widget.isDomWidget = function( node ) { return node ? this.isDomWidgetWrapper( node ) || this.isDomWidgetElement( node ) : false; }; /** * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#element widget element}. * * @since 4.5.0 * @static * @param {CKEDITOR.htmlParser.node} node * @returns {Boolean} */ Widget.isParserWidgetElement = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && !!node.attributes[ 'data-widget' ]; }; /** * Checks whether the `node` is a {@link CKEDITOR.plugins.widget#wrapper widget wrapper}. * * @since 4.5.0 * @static * @param {CKEDITOR.htmlParser.element} node * @returns {Boolean} */ Widget.isParserWidgetWrapper = function( node ) { return node.type == CKEDITOR.NODE_ELEMENT && !!node.attributes[ 'data-cke-widget-wrapper' ]; }; /** * Prefix added to wrapper classes. Each class added to the widget element by the {@link #addClass} * method will also be added to the wrapper prefixed with it. * * @since 4.6.0 * @static * @readonly * @property {String} [='cke_widget_wrapper_'] */ Widget.WRAPPER_CLASS_PREFIX = 'cke_widget_wrapper_'; /** * An event fired when a widget is ready (fully initialized). This event is fired after: * * * {@link #init} is called, * * The first {@link #event-data} event is fired, * * A widget is attached to the document. * * Therefore, in case of widget creation with a command which opens a dialog window, this event * will be delayed after the dialog window is closed and the widget is finally inserted into the document. * * **Note**: If your widget does not use automatic dialog window binding (i.e. you open the dialog window manually) * or another situation in which the widget wrapper is not attached to document at the time when it is * initialized occurs, you need to take care of firing {@link #event-ready} yourself. * * See also {@link #property-ready} and {@link #property-inited} properties, and * {@link #isReady} and {@link #isInited} methods. * * @event ready */ /** * An event fired when a widget is about to be destroyed, but before it is * fully torn down. * * @event destroy */ /** * An event fired when a widget is focused. * * Widget can be focused by executing {@link #method-focus}. * * @event focus */ /** * An event fired when a widget is blurred. * * @event blur */ /** * An event fired when a widget is selected. * * @event select */ /** * An event fired when a widget is deselected. * * @event deselect */ /** * An event fired by the {@link #method-edit} method. It can be canceled * in order to stop the default action (opening a dialog window and/or * {@link CKEDITOR.plugins.widget.repository#finalizeCreation finalizing widget creation}). * * @event edit * @param data * @param {String} data.dialog Defaults to {@link CKEDITOR.plugins.widget.definition#dialog} * and can be changed or set by the listener. */ /** * An event fired when a dialog window for widget editing is opened. * This event can be canceled in order to handle the editing dialog in a custom manner. * * @event dialog * @param {CKEDITOR.dialog} data The opened dialog window instance. */ /** * An event fired when a key is pressed on a focused widget. * This event is forwarded from the {@link CKEDITOR.editor#key} event and * has the ability to block editor keystrokes if it is canceled. * * @event key * @param data * @param {Number} data.keyCode A number representing the key code (or combination). */ /** * An event fired when a widget is double clicked. * * **Note:** If a default editing action is executed on double click (i.e. a widget has a * {@link CKEDITOR.plugins.widget.definition#dialog dialog} defined and the {@link #event-doubleclick} event was not * canceled), this event will be automatically canceled, so a listener added with the default priority (10) * will not be executed. Use a listener with low priority (e.g. 5) to be sure that it will be executed. * * widget.on( 'doubleclick', function( evt ) { * console.log( 'widget#doubleclick' ); * }, null, null, 5 ); * * If your widget handles double click in a special way (so the default editing action is not executed), * make sure you cancel this event, because otherwise it will be propagated to {@link CKEDITOR.editor#doubleclick} * and another feature may step in (e.g. a Link dialog window may be opened if your widget was inside a link). * * @event doubleclick * @param data * @param {CKEDITOR.dom.element} data.element The double-clicked element. */ /** * An event fired when the context menu is opened for a widget. * * @event contextMenu * @param data The object containing context menu options to be added * for this widget. See {@link CKEDITOR.plugins.contextMenu#addListener}. */ /** * An event fired when the widget data changed. See the {@link #setData} method and the {@link #property-data} property. * * @event data */ /** * The wrapper class for editable elements inside widgets. * * Do not use directly. Use {@link CKEDITOR.plugins.widget.definition#editables} or * {@link CKEDITOR.plugins.widget#initEditable}. * * @class CKEDITOR.plugins.widget.nestedEditable * @extends CKEDITOR.dom.element * @constructor * @param {CKEDITOR.editor} editor * @param {CKEDITOR.dom.element} element * @param config * @param {CKEDITOR.filter} [config.filter] */ function NestedEditable( editor, element, config ) { // Call the base constructor. CKEDITOR.dom.element.call( this, element.$ ); this.editor = editor; this._ = {}; var filter = this.filter = config.filter; // If blockless editable - always use BR mode. if ( !CKEDITOR.dtd[ this.getName() ].p ) this.enterMode = this.shiftEnterMode = CKEDITOR.ENTER_BR; else { this.enterMode = filter ? filter.getAllowedEnterMode( editor.enterMode ) : editor.enterMode; this.shiftEnterMode = filter ? filter.getAllowedEnterMode( editor.shiftEnterMode, true ) : editor.shiftEnterMode; } } NestedEditable.prototype = CKEDITOR.tools.extend( CKEDITOR.tools.prototypedCopy( CKEDITOR.dom.element.prototype ), { /** * Sets the editable data. The data will be passed through the {@link CKEDITOR.editor#dataProcessor} * and the {@link CKEDITOR.editor#filter}. This ensures that the data was filtered and prepared to be * edited like the {@link CKEDITOR.editor#method-setData editor data}. * * Before content is changed, all nested widgets are destroyed. Afterwards, after new content is loaded, * all nested widgets are initialized. * * @param {String} data */ setData: function( data ) { // For performance reasons don't call destroyAll when initializing a nested editable, // because there are no widgets inside. if ( !this._.initialSetData ) { // Destroy all nested widgets before setting data. this.editor.widgets.destroyAll( false, this ); } this._.initialSetData = false; // Unprotect comments, to get rid of additional characters (#4777). data = this.editor.dataProcessor.unprotectRealComments( data ); // Unescape protected content to prevent double escaping and corruption of content (#4060, #4509). data = this.editor.dataProcessor.unprotectSource( data ); data = this.editor.dataProcessor.toHtml( data, { context: this.getName(), filter: this.filter, enterMode: this.enterMode } ); this.setHtml( data ); this.editor.widgets.initOnAll( this ); }, /** * Gets the editable data. Like {@link #setData}, this method will process and filter the data. * * @returns {String} */ getData: function() { return this.editor.dataProcessor.toDataFormat( this.getHtml(), { context: this.getName(), filter: this.filter, enterMode: this.enterMode } ); } } ); /** * The editor instance. * * @readonly * @property {CKEDITOR.editor} editor */ /** * The filter instance if allowed content rules were defined. * * @readonly * @property {CKEDITOR.filter} filter */ /** * The enter mode active in this editable. * It is determined from editable's name (whether it is a blockless editable), * its allowed content rules (if defined) and the default editor's mode. * * @readonly * @property {Number} enterMode */ /** * The shift enter move active in this editable. * * @readonly * @property {Number} shiftEnterMode */ // // REPOSITORY helpers ----------------------------------------------------- // function addWidgetButtons( editor ) { var widgets = editor.widgets.registered, widget, widgetName, widgetButton; for ( widgetName in widgets ) { widget = widgets[ widgetName ]; // Create button if defined. widgetButton = widget.button; if ( widgetButton && editor.ui.addButton ) { editor.ui.addButton( CKEDITOR.tools.capitalize( widget.name, true ), { label: widgetButton, command: widget.name, toolbar: 'insert,10' } ); } } } // Create a command creating and editing widget. // // @param editor // @param {CKEDITOR.plugins.widget.definition} widgetDef function addWidgetCommand( editor, widgetDef ) { editor.addCommand( widgetDef.name, { exec: function( editor, commandData ) { var focused = editor.widgets.focused; if ( focused && focused.name == widgetDef.name ) { // If a widget of the same type is focused, start editing. focused.edit(); } else if ( widgetDef.insert ) { // ... use insert method is was defined. widgetDef.insert( { editor: editor, commandData: commandData } ); } else if ( widgetDef.template ) { // ... or create a brand-new widget from template. var defaults = typeof widgetDef.defaults == 'function' ? widgetDef.defaults() : widgetDef.defaults, element = CKEDITOR.dom.element.createFromHtml( widgetDef.template.output( defaults ), editor.document ), instance, wrapper = editor.widgets.wrapElement( element, widgetDef.name ), temp = new CKEDITOR.dom.documentFragment( wrapper.getDocument() ); // Append wrapper to a temporary document. This will unify the environment // in which #data listeners work when creating and editing widget. temp.append( wrapper ); instance = editor.widgets.initOn( element, widgetDef, commandData && commandData.startupData ); // Instance could be destroyed during initialization. // In this case finalize creation if some new widget // was left in temporary document fragment. if ( !instance ) { finalizeCreation(); return; } // Listen on edit to finalize widget insertion. // // * If dialog was set, then insert widget after dialog was successfully saved or destroy this // temporary instance. // * If dialog wasn't set and edit wasn't canceled, insert widget. var editListener = instance.once( 'edit', function( evt ) { if ( evt.data.dialog ) { instance.once( 'dialog', function( evt ) { var dialog = evt.data, okListener, cancelListener; // Finalize creation AFTER (20) new data was set. okListener = dialog.once( 'ok', finalizeCreation, null, null, 20 ); cancelListener = dialog.once( 'cancel', function( evt ) { if ( !( evt.data && evt.data.hide === false ) ) { editor.widgets.destroy( instance, true ); } } ); dialog.once( 'hide', function() { okListener.removeListener(); cancelListener.removeListener(); } ); } ); } else { // Dialog hasn't been set, so insert widget now. finalizeCreation(); } }, null, null, 999 ); instance.edit(); // Remove listener in case someone canceled it before this // listener was executed. editListener.removeListener(); } function finalizeCreation() { editor.widgets.finalizeCreation( temp ); } }, allowedContent: widgetDef.allowedContent, requiredContent: widgetDef.requiredContent, contentForms: widgetDef.contentForms, contentTransformations: widgetDef.contentTransformations } ); } function addWidgetProcessors( widgetsRepo, widgetDef ) { var upcast = widgetDef.upcast, priority = widgetDef.upcastPriority || 10; function multipleUpcastsHandler( element, data ) { var upcasts = widgetDef.upcast.split( ',' ), upcast, i; for ( i = 0; i < upcasts.length; i++ ) { upcast = upcasts[ i ]; if ( upcast === element.name ) { return widgetDef.upcasts[ upcast ].call( this, element, data ); } } return false; } if ( !upcast ) return; // Multiple upcasts defined in string. if ( typeof upcast == 'string' ) { // This handler ensures that upcast method is fired only for appropriate element (#1094). addUpcast( multipleUpcastsHandler, widgetDef, priority ); } // Single rule which is automatically activated. else { addUpcast( upcast, widgetDef, priority ); } function addUpcast( upcast, def, priority ) { // Find index of the first higher (in terms of value) priority upcast. var index = CKEDITOR.tools.getIndex( widgetsRepo._.upcasts, function( element ) { return element[ 2 ] > priority; } ); // Add at the end if it is the highest priority so far. if ( index < 0 ) { index = widgetsRepo._.upcasts.length; } widgetsRepo._.upcasts.splice( index, 0, [ CKEDITOR.tools.bind( upcast, def ), def.name, priority ] ); } } function blurWidget( widgetsRepo, widget ) { widgetsRepo.focused = null; if ( widget.isInited() ) { var isDirty = widget.editor.checkDirty(); // Widget could be destroyed in the meantime - e.g. data could be set. widgetsRepo.fire( 'widgetBlurred', { widget: widget } ); widget.setFocused( false ); !isDirty && widget.editor.resetDirty(); } } function checkWidgets( evt ) { var options = evt.data; if ( this.editor.mode != 'wysiwyg' ) return; var editable = this.editor.editable(), instances = this.instances, newInstances, i, count, wrapper, notYetInitialized; if ( !editable ) return; // Remove widgets which have no corresponding elements in DOM. for ( i in instances ) { // https://dev.ckeditor.com/ticket/13410 Remove widgets that are ready. This prevents from destroying widgets that are during loading process. if ( instances[ i ].isReady() && !editable.contains( instances[ i ].wrapper ) ) this.destroy( instances[ i ], true ); } // Init on all (new) if initOnlyNew option was passed. if ( options && options.initOnlyNew ) newInstances = this.initOnAll(); else { var wrappers = editable.find( '.cke_widget_wrapper' ); newInstances = []; // Create widgets on existing wrappers if they do not exists. for ( i = 0, count = wrappers.count(); i < count; i++ ) { wrapper = wrappers.getItem( i ); notYetInitialized = !this.getByElement( wrapper, true ); // Check if: // * there's no instance for this widget // * wrapper is not inside some temporary element like copybin (https://dev.ckeditor.com/ticket/11088) // * it was a nested widget's wrapper which has been detached from DOM, // when nested editable has been initialized (it overwrites its innerHTML // and initializes nested widgets). if ( notYetInitialized && !findParent( wrapper, isDomTemp ) && editable.contains( wrapper ) ) { // Add cke_widget_new class because otherwise // widget will not be created on such wrapper. wrapper.addClass( 'cke_widget_new' ); newInstances.push( this.initOn( wrapper.getFirst( Widget.isDomWidgetElement ) ) ); } } } // If only single widget was initialized and focusInited was passed, focus it. if ( options && options.focusInited && newInstances.length == 1 ) newInstances[ 0 ].focus(); } // Unwraps widget element and clean up element. // // This function is used to clean up pasted widgets. // It should have similar result to widget#destroy plus // some additional adjustments, specific for pasting. // // @param {CKEDITOR.htmlParser.element} el function cleanUpWidgetElement( el ) { var parent = el.parent; if ( parent.type == CKEDITOR.NODE_ELEMENT && parent.attributes[ 'data-cke-widget-wrapper' ] ) { parent.replaceWith( el ); } } // Preserves white spaces in widget element. // // This function is replacing white spaces with   // at the beginning of the first text node // and at the end of the last text node. // // @param {CKEDITOR.htmlParser.element} el function preserveSpaces( el ) { if ( typeof el.attributes != 'undefined' && el.attributes[ 'data-widget' ] ) { var firstTextNode = getFirstTextNode( el ), lastTextNode = getLastTextNode( el ), spacesReplaced = false; // Check whether the value of the first text node contains white space at the beginning and replace it with  . if ( firstTextNode && firstTextNode.value && firstTextNode.value.match( /^\s/g ) ) { firstTextNode.parent.attributes[ 'data-cke-white-space-first' ] = 1; firstTextNode.value = firstTextNode.value.replace( /^\s/g, ' ' ); spacesReplaced = true; } // Check whether the value of the last text node contains white space at the end and replace it with  . if ( lastTextNode && lastTextNode.value && lastTextNode.value.match( /\s$/g ) ) { lastTextNode.parent.attributes[ 'data-cke-white-space-last' ] = 1; lastTextNode.value = lastTextNode.value.replace( /\s$/g, ' ' ); spacesReplaced = true; } if ( spacesReplaced ) { el.attributes[ 'data-cke-widget-white-space' ] = 1; } } } // Returns first child text node of the given element. // // @param {CKEDITOR.htmlParser.element} el. // @returns {CKEDITOR.htmlParser.text} function getFirstTextNode( el ) { return el.find( function( node ) { return node.type === 3; }, true ).shift(); } // Returns last child text node of the given element. // // @param {CKEDITOR.htmlParser.element} el. // @returns {CKEDITOR.htmlParser.text} function getLastTextNode( el ) { return el.find( function( node ) { return node.type === 3; }, true ).pop(); } // Similar to cleanUpWidgetElement, but works on DOM and finds // widget elements by its own. // // Unlike cleanUpWidgetElement it will wrap element back. // // @param {CKEDITOR.dom.element} container function cleanUpAllWidgetElements( widgetsRepo, container ) { var wrappers = container.find( '.cke_widget_wrapper' ), wrapper, element, i = 0, l = wrappers.count(); for ( ; i < l; ++i ) { wrapper = wrappers.getItem( i ); element = wrapper.getFirst( Widget.isDomWidgetElement ); // If wrapper contains widget element - unwrap it and wrap again. if ( element.type == CKEDITOR.NODE_ELEMENT && element.data( 'widget' ) ) { element.replace( wrapper ); widgetsRepo.wrapElement( element ); } else { // Otherwise - something is wrong... clean this up. wrapper.remove(); } } } // Creates {@link CKEDITOR.filter} instance for given widget, editable and rules. // // Once filter for widget-editable pair is created it is cached, so the same instance // will be returned when method is executed again. // // @param {String} widgetName // @param {String} editableName // @param {CKEDITOR.plugins.widget.nestedEditableDefinition} editableDefinition The nested editable definition. // @returns {CKEDITOR.filter} Filter instance or `null` if rules are not defined. // @context CKEDITOR.plugins.widget.repository function createEditableFilter( widgetName, editableName, editableDefinition ) { if ( !editableDefinition.allowedContent && !editableDefinition.disallowedContent ) return null; var editables = this._.filters[ widgetName ]; if ( !editables ) this._.filters[ widgetName ] = editables = {}; var filter = editables[ editableName ]; if ( !filter ) { filter = editableDefinition.allowedContent ? new CKEDITOR.filter( editableDefinition.allowedContent ) : this.editor.filter.clone(); editables[ editableName ] = filter; if ( editableDefinition.disallowedContent ) { filter.disallow( editableDefinition.disallowedContent ); } } return filter; } // Creates an iterator function which when executed on all // elements in DOM tree will gather elements that should be wrapped // and initialized as widgets. function createUpcastIterator( widgetsRepo ) { var toBeWrapped = [], upcasts = widgetsRepo._.upcasts, upcastCallbacks = widgetsRepo._.upcastCallbacks; return { toBeWrapped: toBeWrapped, iterator: function( element ) { var upcast, upcasted, data, i, upcastsLength, upcastCallbacksLength; // Wrapper found - find widget element, add it to be // cleaned up (unwrapped) and wrapped and stop iterating in this branch. if ( 'data-cke-widget-wrapper' in element.attributes ) { element = element.getFirst( Widget.isParserWidgetElement ); if ( element ) toBeWrapped.push( [ element ] ); // Do not iterate over descendants. return false; } // Widget element found - add it to be cleaned up (just in case) // and wrapped and stop iterating in this branch. else if ( 'data-widget' in element.attributes ) { toBeWrapped.push( [ element ] ); // Do not iterate over descendants. return false; } else if ( ( upcastsLength = upcasts.length ) ) { // Ignore elements with data-cke-widget-upcasted to avoid multiple upcasts (https://dev.ckeditor.com/ticket/11533). // Do not iterate over descendants. if ( element.attributes[ 'data-cke-widget-upcasted' ] ) return false; // Check element with upcast callbacks first. // If any of them return false abort upcasting. for ( i = 0, upcastCallbacksLength = upcastCallbacks.length; i < upcastCallbacksLength; ++i ) { if ( upcastCallbacks[ i ]( element ) === false ) return; // Return nothing in order to continue iterating over ascendants. // See https://dev.ckeditor.com/ticket/11186#comment:6 } for ( i = 0; i < upcastsLength; ++i ) { upcast = upcasts[ i ]; data = {}; if ( ( upcasted = upcast[ 0 ]( element, data ) ) ) { // If upcast function returned element, upcast this one. // It can be e.g. a new element wrapping the original one. if ( upcasted instanceof CKEDITOR.htmlParser.element ) element = upcasted; // Set initial data attr with data from upcast method. element.attributes[ 'data-cke-widget-data' ] = encodeURIComponent( JSON.stringify( data ) ); element.attributes[ 'data-cke-widget-upcasted' ] = 1; toBeWrapped.push( [ element, upcast[ 1 ] ] ); // Do not iterate over descendants. return false; } } } } }; } // Finds a first parent that matches query. // // @param {CKEDITOR.dom.element} element // @param {Function} query function findParent( element, query ) { var parent = element; while ( ( parent = parent.getParent() ) ) { if ( query( parent ) ) return true; } return false; } function getWrapperAttributes( inlineWidget, name ) { return { // tabindex="-1" means that it can receive focus by code. tabindex: -1, contenteditable: 'false', 'data-cke-widget-wrapper': 1, 'data-cke-filter': 'off', // Class cke_widget_new marks widgets which haven't been initialized yet. 'class': 'cke_widget_wrapper cke_widget_new cke_widget_' + ( inlineWidget ? 'inline' : 'block' ) + ( name ? ' cke_widget_' + name : '' ) }; } // Inserts element at given index. // It will check DTD and split ancestor elements up to the first // that can contain this element. // // @param {CKEDITOR.htmlParser.element} parent // @param {Number} index // @param {CKEDITOR.htmlParser.element} element function insertElement( parent, index, element ) { // Do not split doc fragment... if ( parent.type == CKEDITOR.NODE_ELEMENT ) { var parentAllows = CKEDITOR.dtd[ parent.name ]; // Parent element is known (included in DTD) and cannot contain // this element. if ( parentAllows && !parentAllows[ element.name ] ) { var parent2 = parent.split( index ), parentParent = parent.parent; // Element will now be inserted at right parent's index. index = parent2.getIndex(); // If left part of split is empty - remove it. if ( !parent.children.length ) { index -= 1; parent.remove(); } // If right part of split is empty - remove it. if ( !parent2.children.length ) parent2.remove(); // Try inserting as grandpas' children. return insertElement( parentParent, index, element ); } } // Finally we can add this element. parent.add( element, index ); } // Checks whether for the given widget definition and element widget should be created in inline or block mode. // // See also: {@link CKEDITOR.plugins.widget.definition#inline} and {@link CKEDITOR.plugins.widget#element}. // // @param {CKEDITOR.plugins.widget.definition} widgetDef The widget definition. // @param {String} elementName The name of the widget element. // @returns {Boolean} function isWidgetInline( widgetDef, elementName ) { return typeof widgetDef.inline == 'boolean' ? widgetDef.inline : !!CKEDITOR.dtd.$inline[ elementName ]; } // @param {CKEDITOR.dom.element} // @returns {Boolean} function isDomTemp( element ) { return element.hasAttribute( 'data-cke-temp' ); } function onEditableKey( widget, keyCode ) { var focusedEditable = widget.focusedEditable, range; // CTRL+A. if ( keyCode == CKEDITOR.CTRL + 65 ) { var bogus = focusedEditable.getBogus(); range = widget.editor.createRange(); range.selectNodeContents( focusedEditable ); // Exclude bogus if exists. if ( bogus ) range.setEndAt( bogus, CKEDITOR.POSITION_BEFORE_START ); range.select(); // Cancel event - block default. return false; } // DEL or BACKSPACE. else if ( keyCode == 8 || keyCode == 46 ) { var ranges = widget.editor.getSelection().getRanges(); range = ranges[ 0 ]; // Block del or backspace if at editable's boundary. return !( ranges.length == 1 && range.collapsed && range.checkBoundaryOfElement( focusedEditable, CKEDITOR[ keyCode == 8 ? 'START' : 'END' ] ) ); } } function setFocusedEditable( widgetsRepo, widget, editableElement, offline ) { var editor = widgetsRepo.editor; editor.fire( 'lockSnapshot' ); if ( editableElement ) { var editableName = editableElement.data( 'cke-widget-editable' ), editableInstance = widget.editables[ editableName ]; widgetsRepo.widgetHoldingFocusedEditable = widget; widget.focusedEditable = editableInstance; editableElement.addClass( 'cke_widget_editable_focused' ); if ( editableInstance.filter ) editor.setActiveFilter( editableInstance.filter ); editor.setActiveEnterMode( editableInstance.enterMode, editableInstance.shiftEnterMode ); } else { if ( !offline ) widget.focusedEditable.removeClass( 'cke_widget_editable_focused' ); widget.focusedEditable = null; widgetsRepo.widgetHoldingFocusedEditable = null; editor.setActiveFilter( null ); editor.setActiveEnterMode( null, null ); } editor.fire( 'unlockSnapshot' ); } function setupContextMenu( editor ) { if ( !editor.contextMenu ) return; editor.contextMenu.addListener( function( element ) { var widget = editor.widgets.getByElement( element, true ); if ( widget ) return widget.fire( 'contextMenu', {} ); } ); } // And now we've got two problems - original problem and RegExp. // Some softeners: // * FF tends to copy all blocks up to the copybin container. // * IE tends to copy only the copybin, without its container. // * We use spans on IE and blockless editors, but divs in other cases. var pasteReplaceRegex = new RegExp( '^' + '(?:<(?:div|span)(?: data-cke-temp="1")?(?: id="cke_copybin")?(?: data-cke-temp="1")?>)?' + '(?:<(?:div|span)(?: style="[^"]+")?>)?' + ']*data-cke-copybin-start="1"[^>]*>.?([\\s\\S]+)]*data-cke-copybin-end="1"[^>]*>.?' + '(?:)?' + '(?:)?' + '$', // IE8 prefers uppercase when browsers stick to lowercase HTML (https://dev.ckeditor.com/ticket/13460). 'i' ); function pasteReplaceFn( match, wrapperHtml ) { // Avoid polluting pasted data with any whitspaces, // what's going to break check whether only one widget was pasted. return CKEDITOR.tools.trim( wrapperHtml ); } function setupDragAndDrop( widgetsRepo ) { var editor = widgetsRepo.editor, lineutils = CKEDITOR.plugins.lineutils; // These listeners handle inline and block widgets drag and drop. // The only thing we need to do to make block widgets custom drag and drop functionality // is to fire those events with the right properties (like the target which must be the drag handle). editor.on( 'dragstart', function( evt ) { var target = evt.data.target; if ( Widget.isDomDragHandler( target ) ) { var widget = widgetsRepo.getByElement( target ); evt.data.dataTransfer.setData( 'cke/widget-id', widget.id ); // IE needs focus. editor.focus(); // and widget need to be focused on drag start (https://dev.ckeditor.com/ticket/12172#comment:10). widget.focus(); } } ); editor.on( 'drop', function( evt ) { var dataTransfer = evt.data.dataTransfer, id = dataTransfer.getData( 'cke/widget-id' ), transferType = dataTransfer.getTransferType( editor ), dragRange = editor.createRange(), dropRange = evt.data.dropRange, dropWidget = getWidgetFromRange( dropRange ), sourceWidget; // Disable cross-editor drag & drop for widgets - https://dev.ckeditor.com/ticket/13599. if ( id !== '' && transferType === CKEDITOR.DATA_TRANSFER_CROSS_EDITORS ) { evt.cancel(); return; } if ( transferType != CKEDITOR.DATA_TRANSFER_INTERNAL ) { return; } // Add support for dropping selection containing more than widget itself // or more than one widget (#3441). if ( id === '' && editor.widgets.selected.length > 0 ) { evt.data.dataTransfer.setData( 'text/html', getClipboardHtml( editor ) ); return; } sourceWidget = widgetsRepo.instances[ id ]; if ( !sourceWidget ) { return; } // Disable dropping into itself or nested widgets (#4509). if ( isTheSameWidget( sourceWidget, dropWidget ) ) { evt.cancel(); return; } dragRange.setStartBefore( sourceWidget.wrapper ); dragRange.setEndAfter( sourceWidget.wrapper ); evt.data.dragRange = dragRange; // [IE8-9] Reset state of the clipboard#fixSplitNodesAfterDrop fix because by setting evt.data.dragRange // (see above) after drop happened we do not need it. That fix is needed only if dragRange was created // before drop (before text node was split). delete CKEDITOR.plugins.clipboard.dragStartContainerChildCount; delete CKEDITOR.plugins.clipboard.dragEndContainerChildCount; evt.data.dataTransfer.setData( 'text/html', sourceWidget.getClipboardHtml() ); editor.widgets.destroy( sourceWidget, true ); // In case of dropping widget, the fake selection should be on the widget itself. // Thanks to that we should always get widget from range's boundary nodes. function getWidgetFromRange( range ) { var startElement = range.getBoundaryNodes().startNode; if ( startElement.type !== CKEDITOR.NODE_ELEMENT ) { startElement = startElement.getParent(); } return editor.widgets.getByElement( startElement ); } function isTheSameWidget( widget1, widget2 ) { if ( !widget1 || !widget2 ) { return false; } return widget1.wrapper.equals( widget2.wrapper ) || widget1.wrapper.contains( widget2.wrapper ); } } ); editor.on( 'contentDom', function() { var editable = editor.editable(); // Register Lineutils's utilities as properties of repo. CKEDITOR.tools.extend( widgetsRepo, { finder: new lineutils.finder( editor, { lookups: { // Element is block but not list item and not in nested editable. 'default': function( el ) { if ( el.is( CKEDITOR.dtd.$listItem ) ) return; if ( !el.is( CKEDITOR.dtd.$block ) ) return; // Allow drop line inside, but never before or after nested editable (https://dev.ckeditor.com/ticket/12006). if ( Widget.isDomNestedEditable( el ) ) return; // Do not allow droping inside the widget being dragged (https://dev.ckeditor.com/ticket/13397). if ( widgetsRepo._.draggedWidget.wrapper.contains( el ) ) { return; } // If element is nested editable, make sure widget can be dropped there (https://dev.ckeditor.com/ticket/12006). var nestedEditable = Widget.getNestedEditable( editable, el ); if ( nestedEditable ) { var draggedWidget = widgetsRepo._.draggedWidget; // Don't let the widget to be dropped into its own nested editable. if ( widgetsRepo.getByElement( nestedEditable ) == draggedWidget ) return; var filter = CKEDITOR.filter.instances[ nestedEditable.data( 'cke-filter' ) ], draggedRequiredContent = draggedWidget.requiredContent; // There will be no relation if the filter of nested editable does not allow // requiredContent of dragged widget. if ( filter && draggedRequiredContent && !filter.check( draggedRequiredContent ) ) return; } return CKEDITOR.LINEUTILS_BEFORE | CKEDITOR.LINEUTILS_AFTER; } } } ), locator: new lineutils.locator( editor ), liner: new lineutils.liner( editor, { lineStyle: { cursor: 'move !important', 'border-top-color': '#666' }, tipLeftStyle: { 'border-left-color': '#666' }, tipRightStyle: { 'border-right-color': '#666' } } ) }, true ); } ); } // Setup mouse observer which will trigger: // * widget focus on widget click, // * widget#doubleclick forwarded from editor#doubleclick. function setupMouseObserver( widgetsRepo ) { var editor = widgetsRepo.editor; editor.on( 'contentDom', function() { var editable = editor.editable(), evtRoot = editable.isInline() ? editable : editor.document, widget, mouseDownOnDragHandler; editable.attachListener( evtRoot, 'mousedown', function( evt ) { var target = evt.data.getTarget(); // Clicking scrollbar in Chrome will invoke event with target object of document type (#663). // In IE8 the target object will be empty (https://dev.ckeditor.com/ticket/10887). // We need to check if target is a proper element. widget = ( target instanceof CKEDITOR.dom.element ) ? widgetsRepo.getByElement( target ) : null; mouseDownOnDragHandler = 0; // Reset. // Widget was clicked, but not editable nested in it. if ( widget ) { // Ignore mousedown on drag and drop handler if the widget is inline. // Block widgets are handled by Lineutils. if ( widget.inline && target.type == CKEDITOR.NODE_ELEMENT && target.hasAttribute( 'data-cke-widget-drag-handler' ) ) { mouseDownOnDragHandler = 1; // When drag handler is pressed we have to clear current selection if it wasn't already on this widget. // Otherwise, the selection may be in a fillingChar, which prevents dragging a widget. (https://dev.ckeditor.com/ticket/13284, see comment 8 and 9.) if ( widgetsRepo.focused != widget ) editor.getSelection().removeAllRanges(); return; } if ( !Widget.getNestedEditable( widget.wrapper, target ) ) { evt.data.preventDefault(); if ( !CKEDITOR.env.ie ) widget.focus(); } else { // Reset widget so mouseup listener is not confused. widget = null; } } } ); // Focus widget on mouseup if mousedown was fired on drag handler. // Note: mouseup won't be fired at all if widget was dragged and dropped, so // this code will be executed only when drag handler was clicked. editable.attachListener( evtRoot, 'mouseup', function() { // Check if widget is not destroyed (if widget is destroyed the wrapper will be null). if ( mouseDownOnDragHandler && widget && widget.wrapper ) { mouseDownOnDragHandler = 0; widget.focus(); } } ); // On IE it is not enough to block mousedown. If widget wrapper (element with // contenteditable=false attribute) is clicked directly (it is a target), // then after mouseup/click IE will select that element. // It is not possible to prevent that default action, // so we force fake selection after everything happened. if ( CKEDITOR.env.ie ) { editable.attachListener( evtRoot, 'mouseup', function() { setTimeout( function() { // Check if widget is not destroyed (if widget is destroyed the wrapper will be null) and // in editable contains widget (it could be dragged and removed). if ( widget && widget.wrapper && editable.contains( widget.wrapper ) ) { widget.focus(); widget = null; } } ); } ); } } ); editor.on( 'doubleclick', function( evt ) { var widget = widgetsRepo.getByElement( evt.data.element ); // Not in widget or in nested editable. if ( !widget || Widget.getNestedEditable( widget.wrapper, evt.data.element ) ) return; return widget.fire( 'doubleclick', { element: evt.data.element } ); }, null, null, 1 ); } // Setup editor#key observer which will forward it // to focused widget. function setupKeyboardObserver( widgetsRepo ) { var editor = widgetsRepo.editor; editor.on( 'key', function( evt ) { var focused = widgetsRepo.focused, widgetHoldingFocusedEditable = widgetsRepo.widgetHoldingFocusedEditable, ret; if ( focused ) ret = focused.fire( 'key', { keyCode: evt.data.keyCode } ); else if ( widgetHoldingFocusedEditable ) ret = onEditableKey( widgetHoldingFocusedEditable, evt.data.keyCode ); return ret; }, null, null, 1 ); } // Setup copybin on native copy and cut events in order to handle copy and cut commands // if the user accepted the security alert on IEs. // Note: When copying or cutting using keystroke, copyWidgets will be executed first // by the keydown listener. A conflict between two calls will be resolved by the copy_bin existence check. function setupNativeCutAndCopy( widgetsRepo ) { var editor = widgetsRepo.editor; editor.on( 'contentDom', function() { var editable = editor.editable(); editable.attachListener( editable, 'copy', eventListener ); editable.attachListener( editable, 'cut', eventListener ); } ); function eventListener( evt ) { if ( widgetsRepo.selected.length < 1 ) { return; } copyWidgets( editor, evt.name === 'cut' ); } } // Setup selection observer which will trigger: // * widget select & focus on selection change, // * nested editable focus (related properties and classes) on selection change, // * deselecting and blurring all widgets on data, // * blurring widget on editor blur. function setupSelectionObserver( widgetsRepo ) { var editor = widgetsRepo.editor; editor.on( 'selectionCheck', fireCheckSelection ); // The selectionCheck event is fired on keyup, so we must force refreshing // widgets selection on key event. Also fire it only in WYSIWYG mode (#3352, #3704). editor.on( 'contentDom', function() { editor.editable().attachListener( editor, 'key', function() { setTimeout( fireCheckSelection, 10 ); } ); } ); // (#3498) if ( !CKEDITOR.env.ie ) { widgetsRepo.on( 'checkSelection', fixCrossContentSelection ); } widgetsRepo.on( 'checkSelection', widgetsRepo.checkSelection, widgetsRepo ); editor.on( 'selectionChange', function( evt ) { var nestedEditable = Widget.getNestedEditable( editor.editable(), evt.data.selection.getStartElement() ), newWidget = nestedEditable && widgetsRepo.getByElement( nestedEditable ), oldWidget = widgetsRepo.widgetHoldingFocusedEditable; if ( oldWidget ) { if ( oldWidget !== newWidget || !oldWidget.focusedEditable.equals( nestedEditable ) ) { setFocusedEditable( widgetsRepo, oldWidget, null ); if ( newWidget && nestedEditable ) setFocusedEditable( widgetsRepo, newWidget, nestedEditable ); } } // It may happen that there's no widget even if editable was found - // e.g. if selection was automatically set in editable although widget wasn't initialized yet. else if ( newWidget && nestedEditable ) { setFocusedEditable( widgetsRepo, newWidget, nestedEditable ); } } ); // Invalidate old widgets early - immediately on dataReady. editor.on( 'dataReady', function() { // Deselect and blur all widgets. stateUpdater( widgetsRepo ).commit(); } ); editor.on( 'blur', function() { var widget; if ( ( widget = widgetsRepo.focused ) ) blurWidget( widgetsRepo, widget ); if ( ( widget = widgetsRepo.widgetHoldingFocusedEditable ) ) setFocusedEditable( widgetsRepo, widget, null ); } ); // Selection is fixed only when it starts in content and ends in a widget (and vice versa). // It's not possible to manually create selection which starts inside one widget and ends in another, // so we are skipping this case to simplify implementation (#3498). function fixCrossContentSelection() { var selection = editor.getSelection(); if ( !selection ) { return; } var range = selection.getRanges()[ 0 ]; if ( !range || range.collapsed ) { return; } var startWidget = findWidget( range.startContainer ), endWidget = findWidget( range.endContainer ); if ( !startWidget && endWidget ) { range.setEndBefore( endWidget.wrapper ); range.select(); } else if ( startWidget && !endWidget ) { range.setStartAfter( startWidget.wrapper ); range.select(); } } function findWidget( node ) { if ( !node ) { return null; } if ( node.type == CKEDITOR.NODE_TEXT ) { return findWidget( node.getParent() ); } return editor.widgets.getByElement( node ); } function fireCheckSelection() { widgetsRepo.fire( 'checkSelection' ); } } // Set up actions like: // * processing in toHtml/toDataFormat, // * pasting handling, // * insertion handling, // * editable reload handling (setData, mode switch, undo/redo), // * DOM invalidation handling, // * widgets checks. function setupWidgetsLifecycle( widgetsRepo ) { setupWidgetsLifecycleStart( widgetsRepo ); setupWidgetsLifecycleEnd( widgetsRepo ); widgetsRepo.on( 'checkWidgets', checkWidgets ); widgetsRepo.editor.on( 'contentDomInvalidated', widgetsRepo.checkWidgets, widgetsRepo ); } function setupWidgetsLifecycleEnd( widgetsRepo ) { var editor = widgetsRepo.editor, downcastingSessions = {}; // Listen before htmlDP#htmlFilter is applied to cache all widgets, because we'll // loose data-cke-* attributes. editor.on( 'toDataFormat', function( evt ) { // To avoid conflicts between htmlDP#toDF calls done at the same time // (e.g. nestedEditable#getData called during downcasting some widget) // mark every toDataFormat event chain with the downcasting session id. var id = CKEDITOR.tools.getNextNumber(), toBeDowncasted = []; evt.data.downcastingSessionId = id; downcastingSessions[ id ] = toBeDowncasted; evt.data.dataValue.forEach( function( element ) { var attrs = element.attributes, widget, widgetElement; // Reset initial and trailing space by replacing   with white space (#605). if ( 'data-cke-widget-white-space' in attrs ) { var firstTextNode = getFirstTextNode( element ), lastTextNode = getLastTextNode( element ); // Check whether the value of the text node contains   at the beginning and replace it with white space. if ( firstTextNode.parent.attributes[ 'data-cke-white-space-first' ] ) { firstTextNode.value = firstTextNode.value.replace( /^ /g, ' ' ); } // Check whether the value of the text node contains   at the end and replace it with white space. if ( lastTextNode.parent.attributes[ 'data-cke-white-space-last' ] ) { lastTextNode.value = lastTextNode.value.replace( / $/g, ' ' ); } } // Wrapper. // Perform first part of downcasting (cleanup) and cache widgets, // because after applying DP's filter all data-cke-* attributes will be gone. if ( 'data-cke-widget-id' in attrs ) { widget = widgetsRepo.instances[ attrs[ 'data-cke-widget-id' ] ]; if ( widget ) { widgetElement = element.getFirst( Widget.isParserWidgetElement ); toBeDowncasted.push( { wrapper: element, element: widgetElement, widget: widget, editables: {} } ); // If widget did not have data-cke-widget attribute before upcasting remove it. if ( widgetElement.attributes[ 'data-cke-widget-keep-attr' ] != '1' ) delete widgetElement.attributes[ 'data-widget' ]; } } // Nested editable. else if ( 'data-cke-widget-editable' in attrs ) { // Save the reference to this nested editable in the closest widget to be downcasted. // Nested editables are downcasted in the successive toDataFormat to create an opportunity // for dataFilter's "excludeNestedEditable" option to do its job (that option relies on // contenteditable="true" attribute) (https://dev.ckeditor.com/ticket/11372). // There is possibility that nested editable is detected during pasting, when widget // containing it is not yet upcasted (#1469). if ( toBeDowncasted.length > 0 ) { toBeDowncasted[ toBeDowncasted.length - 1 ].editables[ attrs[ 'data-cke-widget-editable' ] ] = element; } // Don't check children - there won't be next wrapper or nested editable which we // should process in this session. return false; } }, CKEDITOR.NODE_ELEMENT, true ); }, null, null, 8 ); // Listen after dataProcessor.htmlFilter and ACF were applied // so wrappers securing widgets' contents are removed after all filtering was done. editor.on( 'toDataFormat', function( evt ) { // Ignore some unmarked sessions. if ( !evt.data.downcastingSessionId ) return; var toBeDowncasted = downcastingSessions[ evt.data.downcastingSessionId ], toBe, widget, widgetElement, retElement, editableElement, e, parserFragment; while ( ( toBe = toBeDowncasted.shift() ) ) { widget = toBe.widget; widgetElement = toBe.element; retElement = widget._.downcastFn && widget._.downcastFn.call( widget, widgetElement ); // In case of copying widgets, we replace the widget with clipboard data (#3138). if ( evt.data.widgetsCopy && widget.getClipboardHtml ) { parserFragment = CKEDITOR.htmlParser.fragment.fromHtml( widget.getClipboardHtml() ); retElement = parserFragment.children[ 0 ]; } // Replace nested editables' content with their output data. for ( e in toBe.editables ) { editableElement = toBe.editables[ e ]; delete editableElement.attributes.contenteditable; editableElement.setHtml( widget.editables[ e ].getData() ); } // Returned element always defaults to widgetElement. if ( !retElement ) retElement = widgetElement; toBe.wrapper.replaceWith( retElement ); } }, null, null, 13 ); editor.on( 'contentDomUnload', function() { widgetsRepo.destroyAll( true ); } ); } function setupWidgetsLifecycleStart( widgetsRepo ) { var editor = widgetsRepo.editor, processedWidgetOnly, snapshotLoaded; // Listen after ACF (so data are filtered), // but before dataProcessor.dataFilter was applied (so we can secure widgets' internals). editor.on( 'toHtml', function( evt ) { var upcastIterator = createUpcastIterator( widgetsRepo ), toBeWrapped; evt.data.dataValue.forEach( upcastIterator.iterator, CKEDITOR.NODE_ELEMENT, true ); // Clean up and wrap all queued elements. while ( ( toBeWrapped = upcastIterator.toBeWrapped.pop() ) ) { cleanUpWidgetElement( toBeWrapped[ 0 ] ); widgetsRepo.wrapElement( toBeWrapped[ 0 ], toBeWrapped[ 1 ] ); } // Used to determine whether only widget was pasted. if ( evt.data.protectedWhitespaces ) { // Whitespaces are protected by wrapping content with spans. Take the middle node only. processedWidgetOnly = evt.data.dataValue.children.length == 3 && Widget.isParserWidgetWrapper( evt.data.dataValue.children[ 1 ] ); } else { processedWidgetOnly = evt.data.dataValue.children.length == 1 && Widget.isParserWidgetWrapper( evt.data.dataValue.children[ 0 ] ); } }, null, null, 8 ); editor.on( 'dataReady', function() { // Clean up all widgets loaded from snapshot. if ( snapshotLoaded ) { cleanUpAllWidgetElements( widgetsRepo, editor.editable() ); } snapshotLoaded = 0; // Some widgets were destroyed on contentDomUnload, // some on loadSnapshot, but that does not include // e.g. setHtml on inline editor or widgets removed just // before setting data. widgetsRepo.destroyAll( true ); widgetsRepo.initOnAll(); } ); // Set flag so dataReady will know that additional // cleanup is needed, because snapshot containing widgets was loaded. editor.on( 'loadSnapshot', function( evt ) { // Primitive but sufficient check which will prevent from executing // heavier cleanUpAllWidgetElements if not needed. if ( ( /data-cke-widget/ ).test( evt.data ) ) { snapshotLoaded = 1; } widgetsRepo.destroyAll( true ); }, null, null, 9 ); // Handle pasted single widget. editor.on( 'paste', function( evt ) { var data = evt.data; data.dataValue = data.dataValue.replace( pasteReplaceRegex, pasteReplaceFn ); // If drag'n'drop kind of paste into nested editable (data.range), selection is set AFTER // data is pasted, which means editor has no chance to change activeFilter's context. // As a result, pasted data is filtered with default editor's filter instead of NE's and // funny things get inserted. Changing the filter by analysis of the paste range below (https://dev.ckeditor.com/ticket/13186). if ( data.range ) { // Check if pasting into nested editable. var nestedEditable = Widget.getNestedEditable( editor.editable(), data.range.startContainer ); if ( nestedEditable ) { // Retrieve the filter from NE's data and set it active before editor.insertHtml is done // in clipboard plugin. var filter = CKEDITOR.filter.instances[ nestedEditable.data( 'cke-filter' ) ]; if ( filter ) { editor.setActiveFilter( filter ); } } } } ); // Listen with high priority to check widgets after data was inserted. editor.on( 'afterInsertHtml', function( evt ) { if ( evt.data.intoRange ) { widgetsRepo.checkWidgets( { initOnlyNew: true } ); } else { editor.fire( 'lockSnapshot' ); // Init only new for performance reason. // Focus inited if only widget was processed. widgetsRepo.checkWidgets( { initOnlyNew: true, focusInited: processedWidgetOnly } ); editor.fire( 'unlockSnapshot' ); } } ); } // Helper for coordinating which widgets should be // selected/deselected and which one should be focused/blurred. function stateUpdater( widgetsRepo ) { var currentlySelected = widgetsRepo.selected, toBeSelected = [], toBeDeselected = currentlySelected.slice( 0 ), focused = null; return { select: function( widget ) { if ( CKEDITOR.tools.indexOf( currentlySelected, widget ) < 0 ) { toBeSelected.push( widget ); } var index = CKEDITOR.tools.indexOf( toBeDeselected, widget ); if ( index >= 0 ) { toBeDeselected.splice( index, 1 ); } return this; }, focus: function( widget ) { focused = widget; return this; }, commit: function() { var focusedChanged = widgetsRepo.focused !== focused, widget, isDirty; widgetsRepo.editor.fire( 'lockSnapshot' ); if ( focusedChanged && ( widget = widgetsRepo.focused ) ) { blurWidget( widgetsRepo, widget ); } while ( ( widget = toBeDeselected.pop() ) ) { currentlySelected.splice( CKEDITOR.tools.indexOf( currentlySelected, widget ), 1 ); // Widget could be destroyed in the meantime - e.g. data could be set. if ( widget.isInited() ) { isDirty = widget.editor.checkDirty(); widget.setSelected( false ); !isDirty && widget.editor.resetDirty(); } } if ( focusedChanged && focused ) { isDirty = widgetsRepo.editor.checkDirty(); widgetsRepo.focused = focused; widgetsRepo.fire( 'widgetFocused', { widget: focused } ); focused.setFocused( true ); !isDirty && widgetsRepo.editor.resetDirty(); } while ( ( widget = toBeSelected.pop() ) ) { currentlySelected.push( widget ); widget.setSelected( true ); } widgetsRepo.editor.fire( 'unlockSnapshot' ); } }; } function setupUndoFilter( undoManager ) { if ( !undoManager ) { return; } undoManager.addFilterRule( function( data ) { return data.replace( /\s*cke_widget_selected/g, '' ) .replace( /\s*cke_widget_focused/g, '' ); } ); } // // WIDGET helpers --------------------------------------------------------- // // LEFT, RIGHT, UP, DOWN, DEL, BACKSPACE - unblock default fake sel handlers. var keystrokesNotBlockedByWidget = { 37: 1, 38: 1, 39: 1, 40: 1, 8: 1, 46: 1 }; // Do not block SHIFT + F10 which opens context menu (#1901). keystrokesNotBlockedByWidget[ CKEDITOR.SHIFT + 121 ] = 1; // Applies or removes style's classes from widget. // @param {CKEDITOR.style} style Custom widget style. // @param {Boolean} apply Whether to apply or remove style. function applyRemoveStyle( widget, style, apply ) { var changed = 0, classes = getStyleClasses( style ), updatedClasses = widget.data.classes || {}, cl; // Ee... Something is wrong with this style. if ( !classes ) { return; } // Clone, because we need to break reference. updatedClasses = CKEDITOR.tools.clone( updatedClasses ); while ( ( cl = classes.pop() ) ) { if ( apply ) { if ( !updatedClasses[ cl ] ) { changed = updatedClasses[ cl ] = 1; } } else { if ( updatedClasses[ cl ] ) { delete updatedClasses[ cl ]; changed = 1; } } } if ( changed ) { widget.setData( 'classes', updatedClasses ); } } function cancel( evt ) { evt.cancel(); } var CopyBin = CKEDITOR.tools.createClass( { $: function( editor, options ) { this._.createCopyBin( editor, options ); this._.createListeners( options ); }, _: { createCopyBin: function( editor ) { // [IE] Use span for copybin and its container to avoid bug with expanding // editable height by absolutely positioned element. // For Edge 16+ always use div, as span causes scrolling to the end of the document // on widget cut (also for blockless editor) (#1160). // Edge 16+ workaround could be safetly removed after #1169 is fixed. var doc = editor.document, isEdge16 = CKEDITOR.env.edge && CKEDITOR.env.version >= 16, copyBinName = ( ( editor.blockless || CKEDITOR.env.ie ) && !isEdge16 ) ? 'span' : 'div', copyBin = doc.createElement( copyBinName ), container = doc.createElement( copyBinName ); container.setAttributes( { id: 'cke_copybin', 'data-cke-temp': '1' } ); // Position copybin element outside current viewport. copyBin.setStyles( { position: 'absolute', width: '1px', height: '1px', overflow: 'hidden' } ); copyBin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-5000px' ); this.editor = editor; this.copyBin = copyBin; this.container = container; }, createListeners: function( options ) { if ( !options ) { return; } if ( options.beforeDestroy ) { this.beforeDestroy = options.beforeDestroy; } if ( options.afterDestroy ) { this.afterDestroy = options.afterDestroy; } } }, proto: { handle: function( html ) { var copyBin = this.copyBin, editor = this.editor, container = this.container, // IE8 always jumps to the end of document. needsScrollHack = CKEDITOR.env.ie && CKEDITOR.env.version < 9, docElement = editor.document.getDocumentElement().$, range = editor.createRange(), that = this, // We need 100ms timeout for Chrome on macOS so it will be able to grab the content on cut. isMacWebkit = CKEDITOR.env.mac && CKEDITOR.env.webkit, copyTimeout = isMacWebkit ? 100 : 0, waitForContent = window.requestAnimationFrame && !isMacWebkit ? requestAnimationFrame : setTimeout, listener1, listener2, scrollTop; copyBin.setHtml( '\u200b' + html + '\u200b' ); // Ignore copybin. editor.fire( 'lockSnapshot' ); container.append( copyBin ); editor.editable().append( container ); listener1 = editor.on( 'selectionChange', cancel, null, null, 0 ); listener2 = editor.widgets.on( 'checkSelection', cancel, null, null, 0 ); if ( needsScrollHack ) { scrollTop = docElement.scrollTop; } // Once the clone of the widget is inside of copybin, select // the entire contents. This selection will be copied by the // native browser's clipboard system. range.selectNodeContents( copyBin ); range.select(); if ( needsScrollHack ) { docElement.scrollTop = scrollTop; } return new CKEDITOR.tools.promise( function( resolve ) { waitForContent( function() { if ( that.beforeDestroy ) { that.beforeDestroy(); } container.remove(); listener1.removeListener(); listener2.removeListener(); editor.fire( 'unlockSnapshot' ); if ( that.afterDestroy ) { that.afterDestroy(); } resolve(); }, copyTimeout ); } ); } }, statics: { hasCopyBin: function( editor ) { return !!CopyBin.getCopyBin( editor ); }, getCopyBin: function( editor ) { return editor.document.getById( 'cke_copybin' ); } } } ); function insertLine( widget, position ) { var elementTag = decodeEnterMode( widget.editor.config.enterMode ), newElement = new CKEDITOR.dom.element( elementTag ); // Avoid nesting
          inside
          . if ( elementTag !== 'br' ) { newElement.appendBogus(); } if ( position === 'after' ) { newElement.insertAfter( widget.wrapper ); } else { newElement.insertBefore( widget.wrapper ); } select( newElement ); function decodeEnterMode( option ) { if ( option == CKEDITOR.ENTER_BR ) { return 'br'; } else if ( option == CKEDITOR.ENTER_DIV ) { return 'div'; } // Default option - CKEDITOR.ENTER_P. return 'p'; } function select( element ) { var newRange = widget.editor.createRange(); newRange.setStart( element, 0 ); widget.editor.getSelection().selectRanges( [ newRange ] ); } } function copyWidgets( editor, isCut ) { var focused = editor.widgets.focused, isWholeSelection, copyBin, bookmarks; // We're still handling previous copy/cut. // When keystroke is used to copy/cut this will also prevent // conflict with copyWidgets called again for native copy/cut event. if ( CopyBin.hasCopyBin( editor ) ) { return; } copyBin = new CopyBin( editor, { beforeDestroy: function() { if ( !isCut && focused ) { focused.focus(); } if ( bookmarks ) { editor.getSelection().selectBookmarks( bookmarks ); } if ( isWholeSelection ) { CKEDITOR.plugins.widgetselection.addFillers( editor.editable() ); } }, afterDestroy: function() { // Prevent cutting in read-only editor (#1570). if ( isCut && !editor.readOnly ) { handleCut(); } } } ); // When more than one widget is selected, we must save selection to restore it // after destroying copybin. Additionally we have to work around issue with selecting all in // Blink and WebKit, when widgets are at the beginning and at the end of the content (#3138). if ( !focused ) { isWholeSelection = CKEDITOR.env.webkit && CKEDITOR.plugins.widgetselection.isWholeContentSelected( editor.editable() ); bookmarks = editor.getSelection().createBookmarks( true ); } copyBin.handle( getClipboardHtml( editor ) ); function handleCut() { if ( focused ) { editor.widgets.del( focused ); } else { editor.extractSelectedHtml(); } editor.fire( 'saveSnapshot' ); } } // Extracts classes array from style instance. function getStyleClasses( style ) { var attrs = style.getDefinition().attributes, classes = attrs && attrs[ 'class' ]; return classes ? classes.split( /\s+/ ) : null; } // [IE] Force keeping focus because IE sometimes forgets to fire focus on main editable // when blurring nested editable. // @context widget function onEditableBlur() { var active = CKEDITOR.document.getActive(), editor = this.editor, editable = editor.editable(); // If focus stays within editor override blur and set currentActive because it should be // automatically changed to editable on editable#focus but it is not fired. if ( ( editable.isInline() ? editable : editor.document.getWindow().getFrame() ).equals( active ) ) { editor.focusManager.focus( editable ); } } // Force selectionChange when editable was focused. // Similar to hack in selection.js#~620. // @context widget function onEditableFocus() { // Gecko does not support 'DOMFocusIn' event on which we unlock selection // in selection.js to prevent selection locking when entering nested editables. if ( CKEDITOR.env.gecko ) { this.editor.unlockSelection(); } // We don't need to force selectionCheck on Webkit, because on Webkit // we do that on DOMFocusIn in selection.js. if ( !CKEDITOR.env.webkit ) { this.editor.forceNextSelectionCheck(); this.editor.selectionChange( 1 ); } } function getClipboardHtml( editor ) { var selectedHtml = editor.getSelectedHtml( true ); if ( editor.widgets.focused ) { return editor.widgets.focused.getClipboardHtml(); } editor.once( 'toDataFormat', function( evt ) { evt.data.widgetsCopy = true; }, null, null, -1 ); return editor.dataProcessor.toDataFormat( selectedHtml ); } function setupWidget( widget, widgetDef ) { var keystrokeInsertLineBefore = widget.editor.config.widget_keystrokeInsertLineBefore, keystrokeInsertLineAfter = widget.editor.config.widget_keystrokeInsertLineAfter; setupWrapper( widget ); setupParts( widget ); setupEditables( widget ); setupMask( widget ); setupDragHandler( widget ); setupDataClassesListener( widget ); setupA11yListener( widget ); // https://dev.ckeditor.com/ticket/11145: [IE8] Non-editable content of widget is draggable. if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) { widget.wrapper.on( 'dragstart', function( evt ) { var target = evt.data.getTarget(); // Allow text dragging inside nested editables or dragging inline widget's drag handler. if ( !Widget.getNestedEditable( widget, target ) && !( widget.inline && Widget.isDomDragHandler( target ) ) ) { evt.data.preventDefault(); } } ); } widget.wrapper.removeClass( 'cke_widget_new' ); widget.element.addClass( 'cke_widget_element' ); widget.on( 'key', function( evt ) { var keyCode = evt.data.keyCode; // Insert a new paragraph before the widget (#4467). if ( keyCode == keystrokeInsertLineBefore ) { insertLine( widget, 'before' ); widget.editor.fire( 'saveSnapshot' ); } // Insert a new paragraph after the widget (#4467). else if ( keyCode == keystrokeInsertLineAfter ) { insertLine( widget, 'after' ); widget.editor.fire( 'saveSnapshot' ); } // ENTER. else if ( keyCode == 13 ) { widget.edit(); } // CTRL+C or CTRL+X. else if ( keyCode == CKEDITOR.CTRL + 67 || keyCode == CKEDITOR.CTRL + 88 ) { copyWidgets( widget.editor, keyCode == CKEDITOR.CTRL + 88 ); return; // Do not preventDefault. } // Pass all CTRL/ALT keystrokes. // Pass chosen keystrokes to other plugins or default fake sel handlers. else if ( keyCode in keystrokesNotBlockedByWidget || ( CKEDITOR.CTRL & keyCode ) || ( CKEDITOR.ALT & keyCode ) ) { return; } return false; }, null, null, 999 ); // Listen with high priority so it's possible // to overwrite this callback. widget.on( 'doubleclick', function( evt ) { if ( widget.edit() ) { // We have to cancel event if edit method opens a dialog, otherwise // link plugin may open extra dialog (https://dev.ckeditor.com/ticket/12140). evt.cancel(); } } ); if ( widgetDef.data ) { widget.on( 'data', widgetDef.data ); } if ( widgetDef.edit ) { widget.on( 'edit', widgetDef.edit ); } } function setupWrapper( widget ) { // Retrieve widget wrapper. Assign an id to it. var wrapper = widget.wrapper = widget.element.getParent(); wrapper.setAttribute( 'data-cke-widget-id', widget.id ); } // Replace parts object containing: // partName => selector pairs // with: // partName => element pairs function setupParts( widget, refreshInitialized ) { if ( !widget.partSelectors ) { widget.partSelectors = widget.parts; } if ( widget.parts ) { var parts = {}, el, partName; for ( partName in widget.partSelectors ) { if ( refreshInitialized || !widget.parts[ partName ] || typeof widget.parts[ partName ] == 'string' ) { el = widget.wrapper.findOne( widget.partSelectors[ partName ] ); parts[ partName ] = el; } else { parts[ partName ] = widget.parts[ partName ]; } } widget.parts = parts; } } function setupEditables( widget ) { var definedEditables = widget.editables, editableName, editableDef; widget.editables = {}; if ( !widget.editables ) { return; } for ( editableName in definedEditables ) { editableDef = definedEditables[ editableName ]; widget.initEditable( editableName, typeof editableDef == 'string' ? { selector: editableDef } : editableDef ); } } function setupMask( widget ) { if ( widget.mask === true ) { setupFullMask( widget ); } else if ( widget.mask ) { // Buffer to limit number of separate calls to 'refreshPartialMask()', e.g. during writing. var maskBuffer = new CKEDITOR.tools.buffers.throttle( 250, refreshPartialMask, widget ), timeout = ( CKEDITOR.env.gecko ? 300 : 0 ), changeListener, blurListener; // First listener is the most obvious, refresh mask after every change that could affect widget. widget.on( 'focus', function() { // Refresh widget mask on initial focus. This handle cases when widget can be resized without // being focused and is focused right after (e.g. `image2` on Edge/IE browsers). maskBuffer.input(); changeListener = widget.editor.on( 'change', maskBuffer.input ); blurListener = widget.on( 'blur', function() { changeListener.removeListener(); blurListener.removeListener(); } ); } ); // Another insurance policy vs FF but this time also Chrome (the latter is just a bit better here). // This time setup mask after editor is ready (in FF it doesn't mean that widgets are fully loaded // so timeout is needed) and after switching from source mode (same story). widget.editor.on( 'instanceReady', function() { setTimeout( function() { maskBuffer.input(); }, timeout ); } ); widget.editor.on( 'mode', function() { setTimeout( function() { maskBuffer.input(); }, timeout ); } ); // FF renders image-like widget very late, so mask has to be create asynchronously after // image is loaded. if ( CKEDITOR.env.gecko ) { var imgs = widget.element.find( 'img' ); CKEDITOR.tools.array.forEach( imgs.toArray(), function( img ) { img.on( 'load', function() { maskBuffer.input(); } ); } ); } // Focusing editable doesn't trigger focus on widget, so listen to those events separately. for ( var editable in widget.editables ) { widget.editables[ editable ].on( 'focus', function() { widget.editor.on( 'change', maskBuffer.input ); // If widget was focused before focusing editable, the 'blur' event has to be removed. // Otherwise on Chrome it will trigger after the focus event and cancel listening to // changes (on FF it works inversely). if ( blurListener ) { blurListener.removeListener(); } } ); widget.editables[ editable ].on( 'blur', function() { widget.editor.removeListener( 'change', maskBuffer.input ); } ); } // Trigger initial setup. maskBuffer.input(); } } function setupFullMask( widget ) { // Reuse mask if already exists (https://dev.ckeditor.com/ticket/11281). var mask = widget.wrapper.findOne( '.cke_widget_mask' ); if ( !mask ) { mask = new CKEDITOR.dom.element( 'img', widget.editor.document ); mask.setAttributes( { src: CKEDITOR.tools.transparentImageData, 'class': 'cke_reset cke_widget_mask' } ); widget.wrapper.append( mask ); } widget.mask = mask; } function refreshPartialMask() { if ( !this.wrapper ) { return; } // Original value of 'widget.mask' is substituted with actual mask element, so // 'widget.maskPart' property was added to be able to adjust partial mask e.g. after resizing. this.maskPart = this.maskPart || this.mask; var part = this.parts[ this.maskPart ], mask; // If requested part is invalid or wasn't fetched yet (#3775), don't create mask. if ( !part || typeof part == 'string' ) { return; } mask = this.wrapper.findOne( '.cke_widget_partial_mask' ); if ( !mask ) { mask = new CKEDITOR.dom.element( 'img', this.editor.document ); mask.setAttributes( { src: CKEDITOR.tools.transparentImageData, 'class': 'cke_reset cke_widget_partial_mask' } ); this.wrapper.append( mask ); } this.mask = mask; if ( !isMaskFitting( mask, part ) ) { setMaskSizeAndPosition( mask, part ); } } function isMaskFitting( oldElement, newElement ) { var oldEl = oldElement.$, newEl = newElement.$, dimensionsChanged = !( oldEl.offsetWidth == newEl.offsetWidth && oldEl.offsetHeight == newEl.offsetHeight ), positionChanged = !( oldEl.offsetTop == newEl.offsetTop && oldEl.offsetLeft == newEl.offsetLeft ); return !( dimensionsChanged || positionChanged ); } function setMaskSizeAndPosition( mask, maskedPart ) { // Widgets with resize feature are messing with default widget structure, // so it needs to be taken into account and mask's position will be adjusted. // The problem was appearing after dragging the widget in FF. var parent = maskedPart.getParent(), isDomWidget = CKEDITOR.plugins.widget.isDomWidget( parent ); mask.setStyles( { top: maskedPart.$.offsetTop + ( !isDomWidget ? parent.$.offsetTop : 0 ) + 'px', left: maskedPart.$.offsetLeft + ( !isDomWidget ? parent.$.offsetLeft : 0 ) + 'px', width: maskedPart.$.offsetWidth + 'px', height: maskedPart.$.offsetHeight + 'px' } ); } function setupDragHandler( widget ) { if ( !widget.draggable ) { return; } var editor = widget.editor, // Use getLast to find wrapper's direct descendant (https://dev.ckeditor.com/ticket/12022). container = widget.wrapper.getLast( Widget.isDomDragHandlerContainer ), img; // Reuse drag handler if already exists (https://dev.ckeditor.com/ticket/11281). if ( container ) { img = container.findOne( 'img' ); } else { container = new CKEDITOR.dom.element( 'span', editor.document ); container.setAttributes( { 'class': 'cke_reset cke_widget_drag_handler_container', // Split background and background-image for IE8 which will break on rgba(). // Initially drag handler should not be visible, until its position will be // calculated (https://dev.ckeditor.com/ticket/11177). // We need to hide unpositined handlers, so they don't extend // widget's outline far to the left (https://dev.ckeditor.com/ticket/12024). style: 'background:rgba(220,220,220,0.5);background-image:url(' + editor.plugins.widget.path + 'images/handle.png);' + 'display:none;' } ); img = new CKEDITOR.dom.element( 'img', editor.document ); img.setAttributes( { 'class': 'cke_reset cke_widget_drag_handler', 'data-cke-widget-drag-handler': '1', src: CKEDITOR.tools.transparentImageData, width: DRAG_HANDLER_SIZE, title: editor.lang.widget.move, height: DRAG_HANDLER_SIZE, role: 'presentation' } ); widget.inline && img.setAttribute( 'draggable', 'true' ); container.append( img ); widget.wrapper.append( container ); } // Preventing page reload when dropped content on widget wrapper (https://dev.ckeditor.com/ticket/13015). // Widget is not editable so by default drop on it isn't allowed what means that // browser handles it (there's no editable#drop event). If there's no drop event we cannot block // the drop, so page is reloaded. This listener enables drop on widget wrappers. widget.wrapper.on( 'dragover', function( evt ) { evt.data.preventDefault(); } ); widget.wrapper.on( 'mouseenter', widget.updateDragHandlerPosition, widget ); setTimeout( function() { widget.on( 'data', widget.updateDragHandlerPosition, widget ); }, 50 ); if ( !widget.inline ) { img.on( 'mousedown', onBlockWidgetDrag, widget ); // On IE8 'dragstart' is propagated to editable, so editor#dragstart is fired twice on block widgets. if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) { img.on( 'dragstart', function( evt ) { evt.data.preventDefault( true ); } ); } } widget.dragHandlerContainer = container; } function onBlockWidgetDrag( evt ) { // Allow to drag widget only with left mouse button (#711). if ( CKEDITOR.tools.getMouseButton( evt ) !== CKEDITOR.MOUSE_BUTTON_LEFT ) { return; } var finder = this.repository.finder, locator = this.repository.locator, liner = this.repository.liner, editor = this.editor, editable = editor.editable(), listeners = [], sorted = [], locations, y; // Mark dragged widget for repository#finder. this.repository._.draggedWidget = this; // Harvest all possible relations and display some closest. var relations = finder.greedySearch(), buffer = CKEDITOR.tools.eventsBuffer( 50, function() { locations = locator.locate( relations ); // There's only a single line displayed for D&D. sorted = locator.sort( y, 1 ); if ( sorted.length ) { liner.prepare( relations, locations ); liner.placeLine( sorted[ 0 ] ); liner.cleanup(); } } ); // Let's have the "dragging cursor" over entire editable. editable.addClass( 'cke_widget_dragging' ); // Cache mouse position so it is re-used in events buffer. listeners.push( editable.on( 'mousemove', function( evt ) { y = evt.data.$.clientY; buffer.input(); } ) ); // Fire drag start as it happens during the native D&D. editor.fire( 'dragstart', { target: evt.sender } ); function onMouseUp() { var l; buffer.reset(); // Stop observing events. while ( ( l = listeners.pop() ) ) l.removeListener(); onBlockWidgetDrop.call( this, sorted, evt.sender ); } // Mouseup means "drop". This is when the widget is being detached // from DOM and placed at range determined by the line (location). listeners.push( editor.document.once( 'mouseup', onMouseUp, this ) ); // Prevent calling 'onBlockWidgetDrop' twice in the inline editor. // `removeListener` does not work if it is called at the same time event is fired. if ( !editable.isInline() ) { // Mouseup may occur when user hovers the line, which belongs to // the outer document. This is, of course, a valid listener too. listeners.push( CKEDITOR.document.once( 'mouseup', onMouseUp, this ) ); } } function onBlockWidgetDrop( sorted, dragTarget ) { var finder = this.repository.finder, liner = this.repository.liner, editor = this.editor, editable = this.editor.editable(); if ( !CKEDITOR.tools.isEmpty( liner.visible ) ) { // Retrieve range for the closest location. var dropRange = finder.getRange( sorted[ 0 ] ); // Focus widget (it could lost focus after mousedown+mouseup) // and save this state as the one where we want to be taken back when undoing. this.focus(); // Drag range will be set in the drop listener. editor.fire( 'drop', { dropRange: dropRange, target: dropRange.startContainer } ); } // Clean-up custom cursor for editable. editable.removeClass( 'cke_widget_dragging' ); // Clean-up all remaining lines. liner.hideVisible(); // Clean-up drag & drop. editor.fire( 'dragend', { target: dragTarget } ); } // Setup listener on widget#data which will update (remove/add) classes // by comparing newly set classes with the old ones. function setupDataClassesListener( widget ) { // Note: previousClasses and newClasses may be null! // Tip: for ( cl in null ) is correct. var previousClasses = null; widget.on( 'data', function() { var newClasses = this.data.classes, cl; // When setting new classes one need to remember // that he must break reference. if ( previousClasses == newClasses ) { return; } for ( cl in previousClasses ) { // Avoid removing and adding classes again. if ( !( newClasses && newClasses[ cl ] ) ) { this.removeClass( cl ); } } for ( cl in newClasses ) { this.addClass( cl ); } previousClasses = newClasses; } ); } // Add a listener to data event that will set/change widget's label (https://dev.ckeditor.com/ticket/14539). function setupA11yListener( widget ) { // Note, the function gets executed in a context of widget instance. function getLabelDefault() { return this.editor.lang.widget.label.replace( /%1/, this.pathName || this.element.getName() ); } // Setting a listener on data is enough, there's no need to perform it on widget initialization, as // setupWidgetData fires this event anyway. widget.on( 'data', function() { // In some cases widget might get destroyed in an earlier data listener. For instance, image2 plugin, does // so when changing its internal state. if ( !widget.wrapper ) { return; } var label = this.getLabel ? this.getLabel() : getLabelDefault.call( this ); widget.wrapper.setAttribute( 'role', 'region' ); widget.wrapper.setAttribute( 'aria-label', label ); }, null, null, 9999 ); } function setupWidgetData( widget, startupData ) { var widgetDataAttr = widget.element.data( 'cke-widget-data' ); if ( widgetDataAttr ) { widget.setData( JSON.parse( decodeURIComponent( widgetDataAttr ) ) ); } if ( startupData ) { widget.setData( startupData ); } // Populate classes if they are not preset. if ( !widget.data.classes ) { widget.setData( 'classes', widget.getClasses() ); } // Unblock data and... widget.dataReady = true; // Write data to element because this was blocked when data wasn't ready. writeDataToElement( widget ); // Fire data event first time, because this was blocked when data wasn't ready. widget.fire( 'data', widget.data ); } function writeDataToElement( widget ) { widget.element.data( 'cke-widget-data', encodeURIComponent( JSON.stringify( widget.data ) ) ); } // // WIDGET STYLE HANDLER --------------------------------------------------- // function addCustomStyleHandler() { // Styles categorized by group. It is used to prevent applying styles for the same group being used together. var styleGroups = {}; /** * The class representing a widget style. It is an {@link CKEDITOR#STYLE_OBJECT object} like * the styles handler for widgets. * * **Note:** This custom style handler does not support all methods of the {@link CKEDITOR.style} class. * Not supported methods: {@link #applyToRange}, {@link #removeFromRange}, {@link #applyToObject}. * * @since 4.4.0 * @class CKEDITOR.style.customHandlers.widget * @extends CKEDITOR.style */ CKEDITOR.style.addCustomHandler( { type: 'widget', setup: function( styleDefinition ) { /** * The name of widget to which this style can be applied. * It is extracted from style definition's `widget` property. * * @property {String} widget */ this.widget = styleDefinition.widget; /** * An array of groups that this style belongs to. * Styles assigned to the same group cannot be combined. * * @since 4.6.2 * @property {Array} group */ this.group = typeof styleDefinition.group == 'string' ? [ styleDefinition.group ] : styleDefinition.group; // Store style categorized by its group. // It is used to prevent enabling two styles from same group. if ( this.group ) { saveStyleGroup( this ); } }, apply: function( editor ) { var widget; // Before CKEditor 4.4.0 wasn't a required argument, so we need to // handle a case when it wasn't provided. if ( !( editor instanceof CKEDITOR.editor ) ) { return; } // Theoretically we could bypass checkApplicable, get widget from // widgets.focused and check its name, what would be faster, but then // this custom style would work differently than the default style // which checks if it's applicable before applying or removing itself. if ( this.checkApplicable( editor.elementPath(), editor ) ) { widget = editor.widgets.focused; // Remove other styles from the same group. if ( this.group ) { this.removeStylesFromSameGroup( editor ); } widget.applyStyle( this ); } }, remove: function( editor ) { // Before CKEditor 4.4.0 wasn't a required argument, so we need to // handle a case when it wasn't provided. if ( !( editor instanceof CKEDITOR.editor ) ) { return; } if ( this.checkApplicable( editor.elementPath(), editor ) ) { editor.widgets.focused.removeStyle( this ); } }, /** * Removes all styles that belong to the same group as this style. This method will neither add nor remove * the current style. * Returns `true` if any style was removed, otherwise returns `false`. * * @since 4.6.2 * @param {CKEDITOR.editor} editor * @returns {Boolean} */ removeStylesFromSameGroup: function( editor ) { var removed = false, stylesFromSameGroup, path; // Before CKEditor 4.4.0 wasn't a required argument, so we need to // handle a case when it wasn't provided. if ( !( editor instanceof CKEDITOR.editor ) ) { return false; } path = editor.elementPath(); if ( this.checkApplicable( path, editor ) ) { // Iterate over each group. for ( var i = 0, l = this.group.length; i < l; i++ ) { stylesFromSameGroup = styleGroups[ this.widget ][ this.group[ i ] ]; // Iterate over each style from group. for ( var j = 0; j < stylesFromSameGroup.length; j++ ) { if ( stylesFromSameGroup[ j ] !== this && stylesFromSameGroup[ j ].checkActive( path, editor ) ) { editor.widgets.focused.removeStyle( stylesFromSameGroup[ j ] ); removed = true; } } } } return removed; }, checkActive: function( elementPath, editor ) { return this.checkElementMatch( elementPath.lastElement, 0, editor ); }, checkApplicable: function( elementPath, editor ) { // Before CKEditor 4.4.0 wasn't a required argument, so we need to // handle a case when it wasn't provided. if ( !( editor instanceof CKEDITOR.editor ) ) { return false; } return this.checkElement( elementPath.lastElement ); }, checkElementMatch: checkElementMatch, checkElementRemovable: checkElementMatch, /** * Checks if an element is a {@link CKEDITOR.plugins.widget#wrapper wrapper} of a * widget whose name matches the {@link #widget widget name} specified in the style definition. * * @param {CKEDITOR.dom.element} element * @returns {Boolean} */ checkElement: function( element ) { if ( !Widget.isDomWidgetWrapper( element ) ) { return false; } var widgetElement = element.getFirst( Widget.isDomWidgetElement ); return widgetElement && widgetElement.data( 'widget' ) == this.widget; }, buildPreview: function( label ) { return label || this._.definition.name; }, /** * Returns allowed content rules which should be registered for this style. * Uses widget's {@link CKEDITOR.plugins.widget.definition#styleableElements} to make a rule * allowing classes on specified elements or use widget's * {@link CKEDITOR.plugins.widget.definition#styleToAllowedContentRules} method to transform a style * into allowed content rules. * * @param {CKEDITOR.editor} The editor instance. * @returns {CKEDITOR.filter.allowedContentRules} */ toAllowedContentRules: function( editor ) { if ( !editor ) { return null; } var widgetDef = editor.widgets.registered[ this.widget ], classes, rule = {}; if ( !widgetDef ) { return null; } if ( widgetDef.styleableElements ) { classes = this.getClassesArray(); if ( !classes ) { return null; } rule[ widgetDef.styleableElements ] = { classes: classes, propertiesOnly: true }; return rule; } if ( widgetDef.styleToAllowedContentRules ) { return widgetDef.styleToAllowedContentRules( this ); } return null; }, /** * Returns classes defined in the style in form of an array. * * @returns {String[]} */ getClassesArray: function() { var classes = this._.definition.attributes && this._.definition.attributes[ 'class' ]; return classes ? CKEDITOR.tools.trim( classes ).split( /\s+/ ) : null; }, /** * Not implemented. * * @method applyToRange */ applyToRange: notImplemented, /** * Not implemented. * * @method removeFromRange */ removeFromRange: notImplemented, /** * Not implemented. * * @method applyToObject */ applyToObject: notImplemented } ); function notImplemented() {} // @context style function checkElementMatch( element, fullMatch, editor ) { // Before CKEditor 4.4.0 wasn't a required argument, so we need to // handle a case when it wasn't provided. if ( !editor ) { return false; } if ( !this.checkElement( element ) ) { return false; } var widget = editor.widgets.getByElement( element, true ); return widget && widget.checkStyleActive( this ); } // Save and categorize style by its group. function saveStyleGroup( style ) { var widgetName = style.widget, groupName, group; if ( !styleGroups[ widgetName ] ) { styleGroups[ widgetName ] = {}; } for ( var i = 0, l = style.group.length; i < l; i++ ) { groupName = style.group[ i ]; if ( !styleGroups[ widgetName ][ groupName ] ) { styleGroups[ widgetName ][ groupName ] = []; } group = styleGroups[ widgetName ][ groupName ]; // Don't push the style if it's already stored (#589). if ( !find( group, getCompareFn( style ) ) ) { group.push( style ); } } // Copied `CKEDITOR.tools.array` from major branch. function find( array, fn, thisArg ) { var length = array.length, i = 0; while ( i < length ) { if ( fn.call( thisArg, array[ i ], i, array ) ) { return array[ i ]; } i++; } return undefined; } function getCompareFn( left ) { return function( right ) { return deepCompare( left.getDefinition(), right.getDefinition() ); }; function deepCompare( left, right ) { var leftKeys = CKEDITOR.tools.object.keys( left ), rightKeys = CKEDITOR.tools.object.keys( right ); if ( leftKeys.length !== rightKeys.length ) { return false; } for ( var key in left ) { var areSameObjects = typeof left[ key ] === 'object' && typeof right[ key ] === 'object' && deepCompare( left[ key ], right[ key ] ); if ( !areSameObjects && left[ key ] !== right[ key ] ) { return false; } } return true; } } } } // // EXPOSE PUBLIC API ------------------------------------------------------ // CKEDITOR.plugins.widget = Widget; Widget.repository = Repository; Widget.nestedEditable = NestedEditable; } )(); /** * An event fired when a widget definition is registered by the {@link CKEDITOR.plugins.widget.repository#add} method. * It is possible to modify the definition being registered. * * @event widgetDefinition * @member CKEDITOR.editor * @param {CKEDITOR.plugins.widget.definition} data Widget definition. */ /** * This is an abstract class that describes the definition of a widget. * It is a type of {@link CKEDITOR.plugins.widget.repository#add} method's second argument. * * Widget instances inherit from registered widget definitions, although not in a prototypal way. * They are simply extended with corresponding widget definitions. Note that not all properties of * the widget definition become properties of a widget. Some, like {@link #data} or {@link #edit}, become * widget's events listeners. * * @class CKEDITOR.plugins.widget.definition * @abstract * @mixins CKEDITOR.feature */ /** * Widget definition name. It is automatically set when the definition is * {@link CKEDITOR.plugins.widget.repository#add registered}. * * @property {String} name */ /** * The method executed while initializing a widget, after a widget instance * is created, but before it is ready. It is executed before the first * {@link CKEDITOR.plugins.widget#event-data} is fired so it is common to * use the `init` method to populate widget data with information loaded from * the DOM, like for exmaple: * * init: function() { * this.setData( 'width', this.element.getStyle( 'width' ) ); * * if ( this.parts.caption.getStyle( 'display' ) != 'none' ) * this.setData( 'showCaption', true ); * } * * @property {Function} init */ /** * The function to be used to upcast an element to this widget or a * comma-separated list of upcast methods from the {@link #upcasts} object. * * The upcast function **is not** executed in the widget context (because the widget * does not exist yet), however, it is executed in the * {@link CKEDITOR.plugins.widget#definition widget's definition} context. * Two arguments are passed to the upcast function: * * * `element` ({@link CKEDITOR.htmlParser.element}) – The element to be checked. * * `data` (`Object`) – The object which can be extended with data which will then be passed to the widget. * * An element will be upcasted if a function returned `true` or an instance of * a {@link CKEDITOR.htmlParser.element} if upcasting meant DOM structure changes * (in this case the widget will be initialized on the returned element). * * @property {String/Function} upcast */ /** * The object containing functions which can be used to upcast this widget. * Only those pointed by the {@link #upcast} property will be used. * * In most cases it is appropriate to use {@link #upcast} directly, * because majority of widgets need just one method. * However, in some cases the widget author may want to expose more than one variant * and then this property may be used. * * upcasts: { * // This function may upcast only figure elements. * figure: function() { * // ... * }, * // This function may upcast only image elements. * image: function() { * // ... * }, * // More variants... * } * * // Then, widget user may choose which upcast methods will be enabled. * editor.on( 'widgetDefinition', function( evt ) { * if ( evt.data.name == 'image' ) * evt.data.upcast = 'figure,image'; // Use both methods. * } ); * * @property {Object} upcasts */ /** * The {@link #upcast} method(s) priority. The upcast with a lower priority number will be called before * the one with a higher number. The default priority is `10`. * * @since 4.5.0 * @property {Number} [upcastPriority=10] */ /** * The function to be used to downcast this widget or * a name of the downcast option from the {@link #downcasts} object. * * The downcast function will be executed in the {@link CKEDITOR.plugins.widget} context * and with `widgetElement` ({@link CKEDITOR.htmlParser.element}) argument which is * the widget's main element. * * The function may return an instance of the {@link CKEDITOR.htmlParser.node} class if the widget * needs to be downcasted to a different node than the widget's main element. * * @property {String/Function} downcast */ /** * The object containing functions which can be used to downcast this widget. * Only the one pointed by the {@link #downcast} property will be used. * * In most cases it is appropriate to use {@link #downcast} directly, * because majority of widgets have just one variant of downcasting (or none at all). * However, in some cases the widget author may want to expose more than one variant * and then this property may be used. * * downcasts: { * // This downcast may transform the widget into the figure element. * figure: function() { * // ... * }, * // This downcast may transform the widget into the image element with data-* attributes. * image: function() { * // ... * } * } * * // Then, the widget user may choose one of the downcast options when setting up his editor. * editor.on( 'widgetDefinition', function( evt ) { * if ( evt.data.name == 'image' ) * evt.data.downcast = 'figure'; * } ); * * @property downcasts */ /** * If set, it will be added as the {@link CKEDITOR.plugins.widget#event-edit} event listener. * This means that it will be executed when a widget is being edited. * See the {@link CKEDITOR.plugins.widget#method-edit} method. * * @property {Function} edit */ /** * If set, it will be added as the {@link CKEDITOR.plugins.widget#event-data} event listener. * This means that it will be executed every time the {@link CKEDITOR.plugins.widget#property-data widget data} changes. * * @property {Function} data */ /** * The method to be executed when the widget's command is executed in order to insert a new widget * (widget of this type is not focused). If not defined, then the default action will be * performed which means that: * * * An instance of the widget will be created in a detached {@link CKEDITOR.dom.documentFragment document fragment}, * * The {@link CKEDITOR.plugins.widget#method-edit} method will be called to trigger widget editing, * * The widget element will be inserted into DOM. * * @property {Function} insert * @param {Object} options Options object added in **4.11.0**. * @param {CKEDITOR.editor} options.editor The editor where the widget is going to be inserted to. * @param {Object} [options.commandData] Command data passed to the invoking command, if any. */ /** * The name of a dialog window which will be opened on {@link CKEDITOR.plugins.widget#method-edit}. * If not defined, then the {@link CKEDITOR.plugins.widget#method-edit} method will not perform any action and * widget's command will insert a new widget without opening a dialog window first. * * @property {String} dialog */ /** * The template which will be used to create a new widget element (when the widget's command is executed). * This string is populated with {@link #defaults default values} by using the {@link CKEDITOR.template} format. * Therefore it has to be a valid {@link CKEDITOR.template} argument. * * @property {String} template */ /** * The data object which will be used to populate the data of a newly created widget. * See {@link CKEDITOR.plugins.widget#property-data}. * * defaults: { * showCaption: true, * align: 'none' * } * * @property defaults */ /** * An object containing definitions of widget components (part name => CSS selector). * * parts: { * image: 'img', * caption: 'div.caption' * } * * @property parts */ /** * An object containing definitions of nested editables (editable name => {@link CKEDITOR.plugins.widget.nestedEditable.definition}). * Note that editables *have to* be defined in the same order as they are in DOM / {@link CKEDITOR.plugins.widget.definition#template template}. * Otherwise errors will occur when nesting widgets inside each other. * * editables: { * header: 'h1', * content: { * selector: 'div.content', * allowedContent: 'p strong em; a[!href]' * } * } * * @property editables */ /** * The function used to obtain an accessibility label for the widget. It might be used to make * the widget labels as precise as possible, since it has access to the widget instance. * * If not specified, the default implementation will use the {@link #pathName} or the main * {@link CKEDITOR.plugins.widget#element element} tag name. * * @property {Function} getLabel */ /** * The widget name displayed in the elements path. * * @property {String} pathName */ /** * If set to `true`, the widget's element will be covered with a transparent mask. * This will prevent its content from being clickable, which matters in case * of special elements like embedded iframes that generate a separate "context". * * If the value is a `string` type, then the partial mask covering only the given widget part * is created instead. The `string` mask should point to the name of one of the widget {@link CKEDITOR.plugins.widget#parts parts}. * * **Note**: Partial mask is available since the `4.13.0` version. * * @property {Boolean/String} mask */ /** * If set to `true`/`false`, it will force the widget to be either an inline or a block widget. * If not set, the widget type will be determined from the widget element. * * Widget type influences whether a block (`
          `) or an inline (``) element is used * for the wrapper. * * @property {Boolean} inline */ /** * The label for the widget toolbar button. * * editor.widgets.add( 'simplebox', { * button: 'Create a simple box' * } ); * * editor.widgets.add( 'simplebox', { * button: editor.lang.simplebox.title * } ); * * @property {String} button */ /** * Customizes widget HTML copied to the clipboard * during copy, cut and drop operations. * * If not set, the current widget HTML will be used instead. * * Note: This method will overwrite the HTML for the whole widget, **including** * any nested widgets. * * @method getClipboardHtml * @since 4.13.0 * @returns {String} Widget HTML. */ /** * Whether the widget should be draggable. Defaults to `true`. * If set to `false`, the drag handler will not be displayed when hovering the widget. * * @property {Boolean} draggable */ /** * Names of element(s) (separated by spaces) for which the {@link CKEDITOR.filter} should allow classes * defined in the widget styles. For example, if your widget is upcasted from a simple `
          ` * element, then in order to make it styleable you can set: * * editor.widgets.add( 'customWidget', { * upcast: function( element ) { * return element.name == 'div'; * }, * * // ... * * styleableElements: 'div' * } ); * * Then, when the following style is defined: * * { * name: 'Thick border', type: 'widget', widget: 'customWidget', * attributes: { 'class': 'thickBorder' } * } * * a rule allowing the `thickBorder` class for `div` elements will be registered in the {@link CKEDITOR.filter}. * * If you need to have more freedom when transforming widget style to allowed content rules, * you can use the {@link #styleToAllowedContentRules} callback. * * @since 4.4.0 * @property {String} styleableElements */ /** * Function transforming custom widget's {@link CKEDITOR.style} instance into * {@link CKEDITOR.filter.allowedContentRules}. It may be used when a static * {@link #styleableElements} property is not enough to inform the {@link CKEDITOR.filter} * what HTML features should be enabled when allowing the given style. * * In most cases, when style's classes just have to be added to element name(s) used by * the widget element, it is recommended to use simpler {@link #styleableElements} property. * * In order to get parsed classes from the style definition you can use * {@link CKEDITOR.style.customHandlers.widget#getClassesArray}. * * For example, if you want to use the [object format of allowed content rules](#!/guide/dev_allowed_content_rules-section-object-format), * to specify `match` validator, your implementation could look like this: * * editor.widgets.add( 'customWidget', { * // ... * * styleToAllowedContentRules: funciton( style ) { * // Retrieve classes defined in the style. * var classes = style.getClassesArray(); * * // Do something crazy - for example return allowed content rules in object format, * // with custom match property and propertiesOnly flag. * return { * h1: { * match: isWidgetElement, * propertiesOnly: true, * classes: classes * } * }; * } * } ); * * @since 4.4.0 * @property {Function} styleToAllowedContentRules * @param {CKEDITOR.style.customHandlers.widget} style The style to be transformed. * @returns {CKEDITOR.filter.allowedContentRules} */ /** * This is an abstract class that describes the definition of a widget's nested editable. * It is a type of values in the {@link CKEDITOR.plugins.widget.definition#editables} object. * * In the simplest case the definition is a string which is a CSS selector used to * find an element that will become a nested editable inside the widget. Note that * the widget element can be a nested editable, too. * * In the more advanced case a definition is an object with a required `selector` property. * * editables: { * header: 'h1', * content: { * selector: 'div.content', * allowedContent: 'p strong em; a[!href]' * } * } * * @class CKEDITOR.plugins.widget.nestedEditable.definition * @abstract */ /** * The CSS selector used to find an element which will become a nested editable. * * @property {String} selector */ /** * The {@glink guide/dev_advanced_content_filter Advanced Content Filter} rules * which will be used to limit the content allowed in this nested editable. * This option is similar to {@link CKEDITOR.config#allowedContent} and one can * use it to limit the editor features available in the nested editable. * * If no `allowedContent` is specified, the editable will use the editor default * {@link CKEDITOR.editor#filter}. * * @property {CKEDITOR.filter.allowedContentRules} allowedContent */ /** * The {@glink guide/dev_advanced_content_filter Advanced Content Filter} rules * which will be used to blacklist elements within this nested editable. * This option is similar to {@link CKEDITOR.config#disallowedContent}. * * Note that `disallowedContent` work on top of the definition's {@link #allowedContent}. * * @since 4.7.3 * @property {CKEDITOR.filter.disallowedContentRules} disallowedContent */ /** * Nested editable name displayed in the elements path. * * @property {String} pathName */ /** * Defines the keyboard shortcut for inserting a line before selected widget. Default combination * is `Shift+Alt+Enter`. New element tag is based on {@link CKEDITOR.config#enterMode} option. * * config.widget_keystrokeInsertLineBefore = 'CKEDITOR.SHIFT + 38'; // Shift + Arrow Up * * @since 4.17.0 * @cfg {Number} [widget_keystrokeInsertLineBefore=CKEDITOR.SHIFT+CKEDITOR.ALT+13] * @member CKEDITOR.config */ CKEDITOR.config.widget_keystrokeInsertLineBefore = CKEDITOR.SHIFT + CKEDITOR.ALT + 13; /** * Defines the keyboard shortcut for inserting a line after selected widget. Default combination * is `Shift+Enter`. New element tag is based on {@link CKEDITOR.config#enterMode} option. * * config.widget_keystrokeInsertLineAfter = 'CKEDITOR.SHIFT + 40'; // Shift + Arrow Down * * @since 4.17.0 * @cfg {Number} [widget_keystrokeInsertLineAfter=CKEDITOR.SHIFT+13] * @member CKEDITOR.config */ CKEDITOR.config.widget_keystrokeInsertLineAfter = CKEDITOR.SHIFT + 13; rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/0000755000201500020150000000000014515446713022315 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/console.js0000644000201500020150000000720514515446713024321 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /* global CKCONSOLE */ 'use strict'; ( function() { CKCONSOLE.add( 'widget', { panels: [ { type: 'box', content: '
            ', refresh: function( editor ) { var instances = obj2Array( editor.widgets.instances ); return { header: 'Instances (' + instances.length + ')', instances: generateInstancesList( instances ) }; }, refreshOn: function( editor, refresh ) { editor.widgets.on( 'instanceCreated', function( evt ) { refresh(); evt.data.on( 'data', refresh ); } ); editor.widgets.on( 'instanceDestroyed', refresh ); } }, { type: 'box', content: '
              ' + '
            • focused:
            • ' + '
            • selected:
            • ' + '
            ', refresh: function( editor ) { var focused = editor.widgets.focused, selected = editor.widgets.selected, selectedIds = []; for ( var i = 0; i < selected.length; ++i ) selectedIds.push( selected[ i ].id ); return { header: 'Focus & selection', focused: focused ? 'id: ' + focused.id : '-', selected: selectedIds.length ? 'id: ' + selectedIds.join( ', id: ' ) : '-' }; }, refreshOn: function( editor, refresh ) { editor.on( 'selectionCheck', refresh, null, null, 999 ); } }, { type: 'log', on: function( editor, log, logFn ) { // Add all listeners with high priorities to log // messages in the correct order when one event depends on another. // E.g. selectionChange triggers widget selection - if this listener // for selectionChange will be executed later than that one, then order // will be incorrect. editor.on( 'selectionChange', function( evt ) { var msg = 'selection change', sel = evt.data.selection, el = sel.getSelectedElement(), widget; if ( el && ( widget = editor.widgets.getByElement( el, true ) ) ) msg += ' (id: ' + widget.id + ')'; log( msg ); }, null, null, 1 ); editor.widgets.on( 'instanceDestroyed', function( evt ) { log( 'instance destroyed (id: ' + evt.data.id + ')' ); }, null, null, 1 ); editor.widgets.on( 'instanceCreated', function( evt ) { log( 'instance created (id: ' + evt.data.id + ')' ); }, null, null, 1 ); editor.widgets.on( 'widgetFocused', function( evt ) { log( 'widget focused (id: ' + evt.data.widget.id + ')' ); }, null, null, 1 ); editor.widgets.on( 'widgetBlurred', function( evt ) { log( 'widget blurred (id: ' + evt.data.widget.id + ')' ); }, null, null, 1 ); editor.widgets.on( 'checkWidgets', logFn( 'checking widgets' ), null, null, 1 ); editor.widgets.on( 'checkSelection', logFn( 'checking selection' ), null, null, 1 ); } } ] } ); function generateInstancesList( instances ) { var html = '', instance; for ( var i = 0; i < instances.length; ++i ) { instance = instances[ i ]; html += itemTpl.output( { id: instance.id, name: instance.name, data: JSON.stringify( instance.data ) } ); } return html; } function obj2Array( obj ) { var arr = []; for ( var id in obj ) arr.push( obj[ id ] ); return arr; } var itemTpl = new CKEDITOR.template( '
          • id: {id}, name: {name}, data: {data}
          • ' ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/nestedwidgets.html0000644000201500020150000002554514515446713026067 0ustar puckpuck Nested widgets — CKEditor Sample

            Nested widgets

            Classic (iframe-based) Sample

            Inline Sample

            Simple Box Sample

            Title

            Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

            The Eagle
            The Eagle in lunar orbit
            • Foo!
            • Bar!

            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

            Pellentesque vitae eleifend nisl, non accumsan tellus. Maecenas nec libero non tellus tincidunt mollis porttitor sed arcu. Donec ultricies nulla vitae eros lacinia, vel congue sem auctor. Vivamus convallis, urna ac tincidunt malesuada, lectus erat convallis metus, a hendrerit massa augue accumsan magna. Nulla mattis tellus elit, nec congue magna scelerisque eget. Aliquam posuere nisi augue, posuere sodales nisi iaculis eu. Donec fermentum urna id nibh sagittis fermentum sit amet sed enim. Aliquam neque elit, pretium elementum nunc a, faucibus accumsan lorem. Etiam pulvinar odio et hendrerit tincidunt. Suspendisse tempus eros lacus, in convallis velit mollis ut. Aenean congue, justo eleifend ultricies malesuada, nunc nunc molestie mauris, eget placerat libero eros vel nisi. Quisque diam arcu, mollis ac laoreet vitae, varius et sem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis in vehicula sapien. Nunc feugiat porta elit nec volutpat.

            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

            Title

            The EagleApollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

            • Foo!
            • Bar!

            Ut eget ipsum a sapien porta ultrices. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus mi lacus, pharetra eu bibendum blandit, tristique sit amet leo. Integer eu nulla nec magna vulputate blandit. Praesent mattis quis ante eget adipiscing. Nulla vel tempus risus, in placerat velit. Mauris sed nibh at elit posuere laoreet. Morbi non sapien sed nunc fringilla imperdiet.

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/0000755000201500020150000000000014101750137023604 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/0000755000201500020150000000000014503523375025616 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/contents.css0000644000201500020150000000117314101750137030157 0ustar puckpuck.simplebox { padding: 8px; margin: 10px; background: #eee; border-radius: 8px; border: 1px solid #ddd; box-shadow: 0 1px 1px #fff inset, 0 -1px 0px #ccc inset; } .simplebox-title, .simplebox-content { box-shadow: 0 1px 1px #ddd inset; border: 1px solid #cccccc; border-radius: 5px; background: #fff; } .simplebox-title { margin: 0 0 8px; padding: 5px 8px; } .simplebox-content { padding: 0 8px; } .simplebox-content::after { content: ''; display: block; clear: both; } .simplebox.align-right { float: right; } .simplebox.align-left { float: left; } .simplebox.align-center { margin-left: auto; margin-right: auto; }rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/plugin.js0000644000201500020150000001131714503523375027455 0ustar puckpuck'use strict'; // Register the plugin within the editor. CKEDITOR.plugins.add( 'simplebox', { // This plugin requires the Widgets System defined in the 'widget' plugin. requires: 'widget,dialog', // Register the icon used for the toolbar button. It must be the same // as the name of the widget. icons: 'simplebox', // The plugin initialization logic goes inside this method. init: function( editor ) { // Register the editing dialog. CKEDITOR.dialog.add( 'simplebox', this.path + 'dialogs/simplebox.js' ); // Register the simplebox widget. editor.widgets.add( 'simplebox', { // Allow all HTML elements, classes, and styles that this widget requires. // Read more about the Advanced Content Filter here: // * https://ckeditor.com/docs/ckeditor4/latest/guide/dev_advanced_content_filter.html // * https://ckeditor.com/docs/ckeditor4/latest/guide/plugin_sdk_integration_with_acf.html allowedContent: 'div(!simplebox,align-left,align-right,align-center){width};' + 'div(!simplebox-content); h2(!simplebox-title)', // Minimum HTML which is required by this widget to work. requiredContent: 'div(simplebox)', // Define two nested editable areas. editables: { title: { // Define CSS selector used for finding the element inside widget element. selector: '.simplebox-title', // Define content allowed in this nested editable. Its content will be // filtered accordingly and the toolbar will be adjusted when this editable // is focused. allowedContent: 'br strong em' }, content: { selector: '.simplebox-content' } }, // Define the template of a new Simple Box widget. // The template will be used when creating new instances of the Simple Box widget. template: '
            ' + '

            Title

            ' + '

            Content...

            ' + '
            ', // Define the label for a widget toolbar button which will be automatically // created by the Widgets System. This button will insert a new widget instance // created from the template defined above, or will edit selected widget // (see second part of this tutorial to learn about editing widgets). // // Note: In order to be able to translate your widget you should use the // editor.lang.simplebox.* property. A string was used directly here to simplify this tutorial. button: 'Create a simple box', // Set the widget dialog window name. This enables the automatic widget-dialog binding. // This dialog window will be opened when creating a new widget or editing an existing one. dialog: 'simplebox', // Check the elements that need to be converted to widgets. // // Note: The "element" argument is an instance of https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_htmlParser_element.html // so it is not a real DOM element yet. This is caused by the fact that upcasting is performed // during data processing which is done on DOM represented by JavaScript objects. upcast: function( element ) { // Return "true" (that element needs to converted to a Simple Box widget) // for all
            elements with a "simplebox" class. return element.name == 'div' && element.hasClass( 'simplebox' ); }, // When a widget is being initialized, we need to read the data ("align" and "width") // from DOM and set it by using the widget.setData() method. // More code which needs to be executed when DOM is available may go here. init: function() { var width = this.element.getStyle( 'width' ); if ( width ) this.setData( 'width', width ); if ( this.element.hasClass( 'align-left' ) ) this.setData( 'align', 'left' ); if ( this.element.hasClass( 'align-right' ) ) this.setData( 'align', 'right' ); if ( this.element.hasClass( 'align-center' ) ) this.setData( 'align', 'center' ); }, // Listen on the widget#data event which is fired every time the widget data changes // and updates the widget's view. // Data may be changed by using the widget.setData() method, which we use in the // Simple Box dialog window. data: function() { // Check whether "width" widget data is set and remove or set "width" CSS style. // The style is set on widget main element (div.simplebox). if ( !this.data.width ) this.element.removeStyle( 'width' ); else this.element.setStyle( 'width', this.data.width ); // Brutally remove all align classes and set a new one if "align" widget data is set. this.element.removeClass( 'align-left' ); this.element.removeClass( 'align-right' ); this.element.removeClass( 'align-center' ); if ( this.data.align ) this.element.addClass( 'align-' + this.data.align ); } } ); } } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/dialogs/0000755000201500020150000000000014503523375027240 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js0000644000201500020150000000305614503523375031604 0ustar puckpuck// Note: This automatic widget to dialog window binding (the fact that every field is set up from the widget // and is committed to the widget) is only possible when the dialog is opened by the Widgets System // (i.e. the widgetDef.dialog property is set). // When you are opening the dialog window by yourself, you need to take care of this by yourself too. CKEDITOR.dialog.add( 'simplebox', function( editor ) { return { title: 'Edit Simple Box', minWidth: 200, minHeight: 100, contents: [ { id: 'info', elements: [ { id: 'align', type: 'select', label: 'Align', items: [ [ editor.lang.common.notSet, '' ], [ editor.lang.common.left, 'left' ], [ editor.lang.common.right, 'right' ], [ editor.lang.common.center, 'center' ] ], // When setting up this field, set its value to the "align" value from widget data. // Note: Align values used in the widget need to be the same as those defined in the "items" array above. setup: function( widget ) { this.setValue( widget.data.align ); }, // When committing (saving) this field, set its value to the widget data. commit: function( widget ) { widget.setData( 'align', this.getValue() ); } }, { id: 'width', type: 'text', label: 'Width', width: '50px', setup: function( widget ) { this.setValue( widget.data.width ); }, commit: function( widget ) { widget.setData( 'width', this.getValue() ); } } ] } ] }; } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/icons/0000755000201500020150000000000014101750137026721 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/simplebox/icons/simplebox.png0000644000201500020150000000043614101750137031434 0ustar puckpuckPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8 BUPT*x<"M ,E?Kh`xS{/o6Rj89'sz s’;xW$ar2 }ߍfy693?21K1$@c@r=r@D"m4@cpRJZovIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/contents.css0000644000201500020150000000047314101750137026157 0ustar puckpuck.mediumBorder { border-width: 2px; } .thickBorder { border-width: 5px; } img.thickBorder, img.mediumBorder { border-style: solid; border-color: #CCC; } .important.soMuch { margin: 25px; padding: 25px; background: red; border: none; } span.redMarker { background-color: red; } .invisible { opacity: 0.1; }rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/assets/sample.jpg0000644000201500020150000004301414101750137025571 0ustar puckpuckJFIF,,KFile source: http://commons.wikimedia.org/wiki/File:Apollo_11_Launch2.jpg XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((A!1A"Qa2q#BR3Cbr$%c2!1AQ"aq#23RB ?ic*SK&N ֱB7͆^T##3'%;$Fdr9crs'XΠ%3o}@vN,J{1l>_f@pc[ym4TN=4WHBܷm]AYUJ'@>;}qzͭX[ml$&`Yi-:@i0C9% wo\H$I fTѣKC DǫG,=.~w'"nfmRT)*r:y(f?m fp7o bxF%S$2?}:E8j).cZF#aj*B#Uf~bA\pGN5̈IRJ?,xp`;G U.m[Pv!WtYAYyE_!.i,SnKN+>d1k |%%1fyrcp ? bL- uN_Ĭ1{z-8su%D..X|_'S $߀to9+Sb7ヿR^9 ;xs ;GaT$̞ycn@틦d'q$ LMG o(I >ınp>q iԟ@IV"yfnDj8ME-Х7 TWTG _*pŘ-FǽU+7"'d)SK9 =ݺ){XK 뵏a,14)9@ a*R#h$_q|TUM"aQ+1˪̲0 DLTq+`"ET=g"[vѤ@6(9JҲAeBK|'爴>MiW1!W2vIBZl~rA-Tr$!,FVS6RPseWPNCfmRD .߶^m WKPܠ6Q(/~ j$T;&$*M}1Eoi{aI!* NU2bQ[Q ox`\.1UM]C ]=>kDtiM[pq*(ḀTO>q]0dt/׮4J9JLo$l͝ÅAayJS&B6XN#Hei)?.Z-+ .I:^kq?VhӳEmЁ9sU~9&Q`'*]-+|DhV8 eD қ;t]0\Hqy ;Hʸ$jMWHKQ34ALn؋/~éV.*tӅjg%@C{2,0A)cxMYsjUC)=/s$Jy#*#.^*"n E Łi \eYMakz@יu2VGB j Hzd*G$vbC8ƽ 6.K͉&xjRz_OB*Tbc(<6ip-̍UEO؃mi)sP`焸us|Ũw3UU6N:Wܑ兞ͱ4N lV+Z4 [/ : z㉵k!|Ū1;D(51ut6~5X\AAw-(@Knw';uG8xc˳9%zze59sp*ʩA"Un#cG>'ɖ 4Juwǣ\hz /(*e422m[[aIĐʪ n犩]1-SE$-<ڀһlz}ŅK gׄ2HrLƸ;VgTecT` ARkH% 8ssQooF5/w3_1,laXC$ѻ$1۩==--N t H7/sa$dȲ( UBHCe$\o>^ 75ʬ(Rl4Әvk3ƀORy]>YBRS+ZuǟhK[^GUE Mۭ/x:9_t2SJ"x$Ea{ g<.̫* H㨒1?$2؁`#iN|Xb>;1[A0JOn-<A=3X7[(; ܛ $g<;E>cjs q\Fo}#sŃZJ'vכo&_p7Ck6W 2jc~}CseBhHTG * `0ᲀaL .#|-P 9>yfcrJx\.5&P6)S@@-qeM񰍨@=~Ucq`(ؓq/xu6u29cP15Սn}&!:x~gjp1p?jv3If+6vksI6@TPtp=LP4 n؁{C -$G*I}D812n%J _A"5ӾӠZh[[m-?Ѥ!=cp 9EW8i֭u7Z-i.`\sKNgLDh'tE! m’|µ?s-j2YtkWQR_Pdw욵ѣq~AvIuzv/p 0UM7=`oI3Br֞tȥ{ZpP<XHcP%&:z}pG[ k,Sf-xhW-teYE-}8^PG8dܨ5[K@!w;0+{AcacOPu 0$^صʑK QaHB,U͈LM?z~32%Ȩ l їEH YXdc D / pw eW[I E6b̡ ge?@ÅE&-}m?ﴹUU:il)*At|䁨 cMC L8Yͪ'F KJSZ礴4/NdRIî8B,LVjVNHZQßP@b0ͧz)k# nThv%alfq*{@PJjLjћ0WmȏhsZM]+SqM$KkO bI'#NybC#) }oZPdO4Wj:gy4i`MF J#Ie=9M;+ h/AT0ҊRIrer0ߟfoV] U[yFI,5Qe[k[ =!>3SnG+~}9b^iƪ|7 HQD1crsTdS~jlٯeLVUbH[> l׋)o/Z? juhc`HC/l^én6k}SӦr#JHi /ب~Jto{7Jdrd4n&у N@>5$e[+dL%J"D-']_\"2Vi}J)ʨK1z:qcp9Ry4Hd$`.pRN bQT]@ і_ L؛9k~]{  gN.Blm ʠG6QͶ(u=z ̤&"r0qN \V2gob A(\q]#Z"!pϦxb%n%=Fi@ӆJ957  M=+2CUT}l\%ºωs}S0f$E|1Z fgfM͸t`Ewԧtlӽř<J<9`G'鿋 !*B=&˖ft٫lMMN塊WE٣@{{EI78 maZv wç9-FPbZsdqM<*Я$J7VX\*(1-}}֞eZ?gF[$)h %[56f񕕪xC4bMI<\ 7YάCm Ӣ.>qƨH1C3YeJ$ekI=͈aoJlղ +=m$1 *擤hb.EC-)*@Ե.Խ'DE$sĻ,?" ޜTK9c JLO{J_{66x2. EֆeZ jbO9ͮ #Ϡ!w/Sr??A1,,L j)͊Uӆ 5 1rm` )ukqoxI UHRX[T 5 #敩RiT eC 8YM0F;3orVJTY9m($elR=ayS\҈ОT꒳ }VBw](p *LOR߾3sFZїyU$Zxuib\@t=;`N CNf]^dy2Pm$!'6ʂ t)X|C?8D3^,!I1c5LE[(*4vYz/^_Ze|[WfPeʪM/ QS6z 5S2csУgUPf2V4D0i|+aͶ HirXqU~x)d0:r# NU,6$Z9j᫭y6 .O]0p_s=i㚓/"//Bl (UB~!6dQQuS-cch 86Xc|/ן\ &:ӈ3(ΞxcQ RXK ll:\G > |Jdx[a}83kr)5QDkwm:-bZ7`Zxf4R)!o]-\3+[s4!-d-YԒ;]GB<ݷfK&#P}/߾h @),+Q܎b]I4A͡ZJj3jx4"P.ԿRsc9ZLTǿGE@d}L`1R-EEhXd VX!aE€NY8M;|:rc0:ü)c壬PRloM_7er͒JRER;z6oG5N*{!75[*wj]Y"PqtL 66ۨ_@m9&YuvcQU[41xlإ<fO$7Z:jM,u)>՜TQ5{ғ~~SN܏U R{ʔ+cͽ%.0.uufob." .z˶*m3jXCUiavQ۶ ~퍡2$dQ?1Ơ@,m$/*nG7DZ=1-ἂ*Z+- F1&Ś&oL`qnK-Ck_9E (.FyC3+f2G VHd7 ask$R|ǾQ)*O}qv3Z82i֚₵AA0}*𪴵;T |dzjeiݙu=TQĶe #QBЧg>q Cqz8Y2>) so^CL% ^grt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/dev/widgetstyles.html0000644000201500020150000002277514515446713025747 0ustar puckpuck Applying styles to widgets — CKEditor Sample

            Applying styles to widgets

            Classic (iframe-based) Sample

            Inline Sample

            Apollo 11

            Saturn V
            Roll out of Saturn V on launch pad

            Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

            Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

            Broadcasting and quotes

            Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

            One small step for [a] man, one giant leap for mankind.

            \( \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \)

            Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

            [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

            The Eagle
            The Eagle in lunar orbit

            Technical details

            Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

            1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
            2. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
            3. Lunar Module for landing on the Moon.

            After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/0000755000201500020150000000000014515446713022460 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/zh.js0000644000201500020150000000043014515446713023434 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'zh', { 'move': '拖曳以移動', 'label': '%1 小工具' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/nb.js0000644000201500020150000000044014515446713023413 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'nb', { 'move': 'Klikk og dra for å flytte', 'label': 'Widget %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/eo.js0000644000201500020150000000044314515446713023422 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'eo', { 'move': 'klaki kaj treni por movi', 'label': '%1 fenestraĵo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/es.js0000644000201500020150000000045214515446713023426 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'es', { 'move': 'Dar clic y arrastrar para mover', 'label': 'reproductor %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ro.js0000644000201500020150000000044414515446713023440 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ro', { 'move': 'Apasă și trage pentru a muta', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/hr.js0000644000201500020150000000044214515446713023427 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'hr', { 'move': 'Klikni i povuci za pomicanje', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/it.js0000644000201500020150000000045114515446713023432 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'it', { 'move': 'Fare clic e trascinare per spostare', 'label': 'Widget %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/de-ch.js0000644000201500020150000000046414515446713024002 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'de-ch', { 'move': 'Zum Verschieben anwählen und ziehen', 'label': '%1 Steuerelement' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/sk.js0000644000201500020150000000045214515446713023434 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'sk', { 'move': 'Kliknite a potiahnite pre presunutie', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/az.js0000644000201500020150000000043414515446713023431 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'az', { 'move': 'Tıklayın və aparın', 'label': '%1 vidjet' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/pt.js0000644000201500020150000000045414515446713023444 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'pt', { 'move': 'Clique e arraste para mover', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ko.js0000644000201500020150000000046414515446713023433 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ko', { 'move': '움직이려면 클릭 후 드래그 하세요', 'label': '%1 위젯' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/cy.js0000644000201500020150000000044714515446713023436 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'cy', { 'move': 'Clcio a llusgo i symud', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/uk.js0000644000201500020150000000052014515446713023432 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'uk', { 'move': 'Клікніть і потягніть для переміщення', 'label': '%1 віджет' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/zh-cn.js0000644000201500020150000000044414515446713024037 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'zh-cn', { 'move': '点击并拖拽以移动', 'label': '%1 小部件' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/sv.js0000644000201500020150000000044514515446713023451 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'sv', { 'move': 'Klicka och drag för att flytta', 'label': '%1-widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/lt.js0000644000201500020150000000046214515446713023437 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'lt', { 'move': 'Paspauskite ir tempkite kad perkeltumėte', 'label': '%1 valdiklis' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/et.js0000644000201500020150000000044514515446713023431 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'et', { 'move': 'Liigutamiseks klõpsa ja lohista', 'label': '%1 vidin' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/pl.js0000644000201500020150000000045514515446713023435 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'pl', { 'move': 'Kliknij i przeciągnij, by przenieść.', 'label': 'Widget %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/bg.js0000644000201500020150000000051214515446713023404 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'bg', { 'move': 'Кликни и влачи, за да преместиш', 'label': '%1 приставка' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/fa.js0000644000201500020150000000047214515446713023407 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'fa', { 'move': 'کلیک و کشیدن برای جابجایی', 'label': 'ابزارک %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ku.js0000644000201500020150000000050014515446713023430 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ku', { 'move': 'کرتەبکە و ڕایبکێشە بۆ جوڵاندن', 'label': '%1 ویجێت' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/el.js0000644000201500020150000000054614515446713023423 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'el', { 'move': 'Κάνετε κλικ και σύρετε το ποντίκι για να μετακινήστε', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/fi.js0000644000201500020150000000046414515446713023420 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'fi', { 'move': 'Siirrä klikkaamalla ja raahaamalla', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ru.js0000644000201500020150000000052514515446713023446 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ru', { 'move': 'Нажмите и перетащите, чтобы переместить', 'label': '%1 виджет' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/gl.js0000644000201500020150000000044314515446713023421 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'gl', { 'move': 'Prema e arrastre para mover', 'label': 'Trebello %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/sr-latn.js0000644000201500020150000000045414515446713024401 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'sr-latn', { 'move': 'Kliknite i povucite da bi pomerali', 'label': '%1 modul' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/oc.js0000644000201500020150000000044414515446713023421 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'oc', { 'move': 'Clicar e lisar per desplaçar', 'label': 'Element %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/sq.js0000644000201500020150000000045114515446713023441 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'sq', { 'move': 'Kliko dhe tërhiqe për ta lëvizur', 'label': '%1 vegël' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/pt-br.js0000644000201500020150000000044314515446713024043 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'pt-br', { 'move': 'Click e arraste para mover', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/af.js0000644000201500020150000000045214515446713023405 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'af', { 'move': 'Klik en trek on te beweeg', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/km.js0000644000201500020150000000054514515446713023431 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'km', { 'move': 'ចុច​ហើយ​ទាញ​ដើម្បី​ផ្លាស់​ទី', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/nl.js0000644000201500020150000000044514515446713023432 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'nl', { 'move': 'Klik en sleep om te verplaatsen', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/es-mx.js0000644000201500020150000000044714515446713024054 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'es-mx', { 'move': 'Presiona y arrastra para mover', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/da.js0000644000201500020150000000044114515446713023401 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'da', { 'move': 'Klik og træk for at flytte', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/he.js0000644000201500020150000000045514515446713023416 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'he', { 'move': 'לחץ וגרור להזזה', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ca.js0000644000201500020150000000044314515446713023402 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ca', { 'move': 'Clicar i arrossegar per moure', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/de.js0000644000201500020150000000046114515446713023407 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'de', { 'move': 'Zum Verschieben anwählen und ziehen', 'label': '%1 Steuerelement' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/tt.js0000644000201500020150000000051714515446713023450 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'tt', { 'move': 'Күчереп куер өчен басып шудырыгыз', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/vi.js0000644000201500020150000000047214515446713023437 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'vi', { 'move': 'Nhấp chuột và kéo để di chuyển', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/cs.js0000644000201500020150000000046514515446713023430 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'cs', { 'move': 'Klepněte a táhněte pro přesunutí', 'label': 'Ovládací prvek %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/tr.js0000644000201500020150000000047314515446713023447 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'tr', { 'move': 'Taşımak için, tıklayın ve sürükleyin', 'label': '%1 Grafik Beleşeni' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ja.js0000644000201500020150000000045214515446713023411 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ja', { 'move': 'ドラッグして移動', 'label': '%1 ウィジェット' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/sl.js0000644000201500020150000000046514515446713023441 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'sl', { 'move': 'Kliknite in povlecite, da premaknete', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/lv.js0000644000201500020150000000045414515446713023442 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'lv', { 'move': 'Klikšķina un velc, lai pārvietotu', 'label': 'logrīks %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/en-au.js0000644000201500020150000000043714515446713024027 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'en-au', { 'move': 'Click and drag to move', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/en.js0000644000201500020150000000043414515446713023421 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'en', { 'move': 'Click and drag to move', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/no.js0000644000201500020150000000044014515446713023430 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'no', { 'move': 'Klikk og dra for å flytte', 'label': 'Widget %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/fr.js0000644000201500020150000000045214515446713023426 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'fr', { 'move': 'Cliquer et glisser pour déplacer', 'label': 'Élément %1' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/id.js0000644000201500020150000000046214515446713023414 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'id', { 'move': 'Tekan dan geser untuk memindahkan', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ug.js0000644000201500020150000000046014515446713023431 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ug', { 'move': 'يۆتكەشتە چېكىپ سۆرەڭ', 'label': '1% بېزەك' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/ar.js0000644000201500020150000000046414515446713023424 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'ar', { 'move': 'إضغط و إسحب للتحريك', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/sr.js0000644000201500020150000000051114515446713023437 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'sr', { 'move': 'Кликните и повуците да би померали', 'label': '%1 модул' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/eu.js0000644000201500020150000000045314515446713023431 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'eu', { 'move': 'Klikatu eta arrastatu lekuz aldatzeko', 'label': '%1 widget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/en-gb.js0000644000201500020150000000045214515446713024007 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'en-gb', { 'move': 'Click and drag to move', 'label': '%1 widget' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/lang/hu.js0000644000201500020150000000044614515446713023436 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'widget', 'hu', { 'move': 'Kattints és húzd a mozgatáshoz', 'label': '%1 modul' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/images/0000755000201500020150000000000014101750137022771 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/widget/images/handle.png0000644000201500020150000000033414101750137024732 0ustar puckpuckPNG  IHDRy*PLTE$$$&&&$$$###%%%$$$&&&%%%%%%%%%%%%%%%%%%2O tRNS8<@HLTIDATcйa  .00̝ ^c  ܻ`id@낛7. 0"$IENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/0000755000201500020150000000000014515446705021367 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/about/plugin.js0000644000201500020150000000206714515446705023230 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.add( 'about', { requires: 'dialog', // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'about', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { var command = editor.addCommand( 'about', new CKEDITOR.dialogCommand( 'about' ) ); command.modes = { wysiwyg: 1, source: 1 }; command.canUndo = false; command.readOnly = 1; editor.ui.addButton && editor.ui.addButton( 'About', { label: editor.lang.about.dlgTitle, command: 'about', toolbar: 'about' } ); CKEDITOR.dialog.add( 'about', this.path + 'dialogs/about.js' ); } } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/0000755000201500020150000000000014515446705022310 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/zh.js0000644000201500020150000000054314515446705023271 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'zh', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: '關於 CKEditor 4', moreInfo: '關於授權資訊,請參閱我們的網站:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/nb.js0000644000201500020150000000056414515446705023252 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'nb', { copy: 'Copyright © $1. Alle rettigheter reservert.', dlgTitle: 'Om CKEditor 4', moreInfo: 'For lisensieringsinformasjon, vennligst besøk vårt nettsted:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/eo.js0000644000201500020150000000055614515446705023257 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'eo', { copy: 'Copyright © $1. Ĉiuj rajtoj rezervitaj.', dlgTitle: 'Pri CKEditor 4', moreInfo: 'Por informoj pri licenco, bonvolu viziti nian retpaĝaron:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/es.js0000644000201500020150000000060214515446705023253 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'es', { copy: 'Copyright © $1. Todos los derechos reservados.', dlgTitle: 'Acerca de CKEditor 4', moreInfo: 'Para información de licencia, por favor visite nuestro sitio web:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ro.js0000644000201500020150000000061214515446705023265 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ro', { copy: 'Copyright © $1. Toate drepturile rezervate.', dlgTitle: 'Despre CKEeditor 4', moreInfo: 'Pentru informații despre licențiere, vă rugăm vizitați web site-ul nostru:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/hr.js0000644000201500020150000000055514515446705023264 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'hr', { copy: 'Autorsko pravo © $1. Sva prava pridržana.', dlgTitle: 'O CKEditoru 4', moreInfo: 'Za informacije o licencama posjetite našu web stranicu:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/it.js0000644000201500020150000000061014515446705023257 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'it', { copy: 'Copyright © $1. Tutti i diritti riservati.', dlgTitle: 'Informazioni su CKEditor 4', moreInfo: 'Per le informazioni sulla licenza si prega di visitare il nostro sito:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/de-ch.js0000644000201500020150000000061714515446705023632 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'de-ch', { copy: 'Copyright © $1. Alle Rechte vorbehalten.', dlgTitle: 'Über CKEditor 4', moreInfo: 'Für Informationen über unsere Lizenzbestimmungen besuchen Sie bitte unsere Webseite:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/sk.js0000644000201500020150000000060714515446705023266 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'sk', { copy: 'Copyright © $1. Všetky práva vyhradené.', dlgTitle: 'O aplikácii CKEditor 4', moreInfo: 'Pre informácie o licenciách, prosíme, navštívte našu web stránku:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/az.js0000644000201500020150000000060614515446705023262 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'az', { copy: 'Copyright © $1. Bütün hüquqlar qorunur.', dlgTitle: 'CKEditor haqqında', moreInfo: 'Lisenziya informasiyası üçün zəhmət olmasa saytımızı ziyarət edin:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/pt.js0000644000201500020150000000060514515446705023272 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'pt', { copy: 'Direitos de Autor © $1. Todos os direitos reservados.', dlgTitle: 'Sobre o CKEditor 4', moreInfo: 'Para informação sobre licenciamento visite o nosso sítio web:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/si.js0000644000201500020150000000113314515446705023257 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'si', { copy: 'පිටපත් අයිතිය සහ පිටපත් කිරීම;$1 .සියලුම හිමිකම් ඇවිරිණි.', dlgTitle: 'CKEditor ගැන විස්තර', moreInfo: 'බලපත්‍ර තොරතුරු සදහා කරුණාකර අපගේ විද්‍යුත් ලිපිනයට පිවිසෙන්න:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ko.js0000644000201500020150000000057414515446705023265 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ko', { copy: '저작권 © $1 . 판권 소유.', dlgTitle: 'CKEditor 에 대하여', moreInfo: '라이선스에 대한 정보는 저희 웹 사이트를 참고하세요:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/mk.js0000644000201500020150000000073014515446705023255 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'mk', { copy: 'Авторски права © $1. Сите права се задржани.', dlgTitle: 'За CKEditor 4', moreInfo: 'За информации околу лиценцата, ве молиме посетете го нашиот веб-сајт: ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/cy.js0000644000201500020150000000055514515446705023266 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'cy', { copy: 'Hawlfraint © $1. Cedwir pob hawl.', dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'Am wybodaeth ynghylch trwyddedau, ewch i\'n gwefan:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/uk.js0000644000201500020150000000065214515446705023270 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'uk', { copy: 'Copyright © $1. Всі права застережено.', dlgTitle: 'Про CKEditor 4', moreInfo: 'Щодо інформації з ліцензування завітайте на наш сайт:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/zh-cn.js0000644000201500020150000000056414515446705023672 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'zh-cn', { copy: '版权所有 © $1。
            保留所有权利。', dlgTitle: '关于 CKEditor 4', moreInfo: '相关授权许可信息请访问我们的网站:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/sv.js0000644000201500020150000000055614515446705023304 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'sv', { copy: 'Copyright © $1. Alla rättigheter reserverade.', dlgTitle: 'Om CKEditor 4', moreInfo: 'För information om licensiering besök vår hemsida:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/lt.js0000644000201500020150000000054614515446705023272 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'lt', { copy: 'Copyright © $1. Visos teiss saugomos.', dlgTitle: 'Apie CKEditor 4', moreInfo: 'Dėl licencijavimo apsilankykite mūsų svetainėje:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/is.js0000644000201500020150000000060714515446705023264 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'is', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/fr-ca.js0000644000201500020150000000057714515446705023647 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'fr-ca', { copy: 'Copyright © $1. Tous droits réservés.', dlgTitle: 'À propos de CKEditor 4', moreInfo: 'Pour les informations de licence, consulter notre site internet:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/et.js0000644000201500020150000000054414515446705023261 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'et', { copy: 'Copyright © $1. Kõik õigused kaitstud.', dlgTitle: 'CKEditor 4st lähemalt', moreInfo: 'Litsentsi andmed leiab meie veebilehelt:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/bs.js0000644000201500020150000000060714515446705023255 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'bs', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/pl.js0000644000201500020150000000061314515446705023261 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'pl', { copy: 'Copyright © $1. Wszelkie prawa zastrzeżone.', dlgTitle: 'Informacje o programie CKEditor 4', moreInfo: 'Informacje na temat licencji można znaleźć na naszej stronie:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/bg.js0000644000201500020150000000067514515446705023246 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'bg', { copy: 'Авторско право © $1. Всички права запазени.', dlgTitle: 'Относно CKEditor 4', moreInfo: 'За лицензионна информация моля посетете сайта ни:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/fa.js0000644000201500020150000000065014515446705023235 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'fa', { copy: 'حق نشر © $1. کلیه حقوق محفوظ است.', dlgTitle: 'درباره CKEditor', moreInfo: 'برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ku.js0000644000201500020150000000106214515446705023264 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ku', { copy: 'مافی لەبەرگەرتنەوەی © $1. گشتی پارێزراوه. ورگێڕانی بۆ کوردی لەلایەن هۆژە کۆیی.', dlgTitle: 'دەربارەی CKEditor 4', moreInfo: 'بۆ زانیاری زیاتر دەربارەی مۆڵەتی بەکارهێنان، تکایه سەردانی ماڵپەڕەکەمان بکه:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/bn.js0000644000201500020150000000060714515446705023250 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'bn', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/el.js0000644000201500020150000000105214515446705023244 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'el', { copy: 'Πνευματικά δικαιώματα © $1 Με επιφύλαξη παντός δικαιώματος.', dlgTitle: 'Περί του CKEditor 4', moreInfo: 'Για πληροφορίες σχετικές με την άδεια χρήσης, παρακαλούμε επισκεφθείτε την ιστοσελίδα μας:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/fi.js0000644000201500020150000000055114515446705023245 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'fi', { copy: 'Copyright © $1. Kaikki oikeuden pidätetään.', dlgTitle: 'Tietoa CKEditorista', moreInfo: 'Lisenssitiedot löytyvät kotisivuiltamme:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ru.js0000644000201500020150000000070014515446705023271 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ru', { copy: 'Copyright © $1. Все права защищены.', dlgTitle: 'О CKEditor 4', moreInfo: 'Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/gl.js0000644000201500020150000000057714515446705023261 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'gl', { copy: 'Copyright © $1. Todos os dereitos reservados.', dlgTitle: 'Sobre o CKEditor 4', moreInfo: 'Para obter información sobre a licenza, visite o noso sitio web:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/sr-latn.js0000644000201500020150000000055014515446705024226 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'sr-latn', { copy: 'Copyright © $1. Sva prava zadržana.', dlgTitle: 'O CKEditor 4', moreInfo: 'Za informacije o licenci posetite našu web stranicu:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/oc.js0000644000201500020150000000057614515446705023257 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'oc', { copy: 'Copyright © $1. Totes los dreits reservats.', dlgTitle: 'A prepaus de CKEditor 4', moreInfo: 'Per las informacions de licéncia, visitatz nòstre site web :' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/sq.js0000644000201500020150000000060214515446705023267 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'sq', { copy: 'Të drejtat e autorit © $1. Të gjitha të drejtat e rezervuara.', dlgTitle: 'Rreth CKEditor 4', moreInfo: 'Për informacione rreth licencave shih faqen tonë:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/pt-br.js0000644000201500020150000000060214515446705023670 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'pt-br', { copy: 'Copyright © $1. Todos os direitos reservados.', dlgTitle: 'Sobre o CKEditor 4', moreInfo: 'Para informações sobre a licença por favor visite o nosso site:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/fo.js0000644000201500020150000000054114515446705023252 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'fo', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'Um CKEditor 4', moreInfo: 'Licens upplýsingar finnast á heimasíðu okkara:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/af.js0000644000201500020150000000054614515446705023241 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'af', { copy: 'Kopiereg © $1. Alle regte voorbehou.', dlgTitle: 'Meer oor CKEditor 4', moreInfo: 'Vir lisensie-informasie, besoek asb. ons webwerf:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/hi.js0000644000201500020150000000060714515446705023251 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'hi', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/km.js0000644000201500020150000000111714515446705023255 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'km', { copy: 'រក្សាសិទ្ធិ © $1។ រក្សា​សិទ្ធិ​គ្រប់​បែប​យ៉ាង។', dlgTitle: 'អំពី CKEditor', moreInfo: 'សម្រាប់​ព័ត៌មាន​អំពី​អាជ្ញាបណញណ សូម​មើល​ក្នុង​គេហទំព័រ​របស់​យើង៖' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/nl.js0000644000201500020150000000054314515446705023261 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'nl', { copy: 'Copyright © $1. Alle rechten voorbehouden.', dlgTitle: 'Over CKEditor 4', moreInfo: 'Bezoek onze website voor licentieinformatie:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ka.js0000644000201500020150000000075114515446705023244 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ka', { copy: 'Copyright © $1. ყველა უფლება დაცულია.', dlgTitle: 'CKEditor-ის შესახებ', moreInfo: 'ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/es-mx.js0000644000201500020150000000062314515446705023700 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'es-mx', { copy: 'Derechos reservados © $1. Todos los derechos reservados', dlgTitle: 'Acerca de CKEditor 4', moreInfo: 'Para información sobre la licencia por favor visita nuestro sitio web:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/mn.js0000644000201500020150000000060714515446705023263 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'mn', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/da.js0000644000201500020150000000060514515446705023233 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'da', { copy: 'Copyright © $1. Alle rettigheder forbeholdes.', dlgTitle: 'Om CKEditor 4', moreInfo: 'For informationer omkring licens, se venligst vores hjemmeside (på engelsk):' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/he.js0000644000201500020150000000055414515446705023246 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'he', { copy: 'Copyright © $1. כל הזכויות שמורות.', dlgTitle: 'אודות CKEditor', moreInfo: 'למידע נוסף בקרו באתרנו:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ca.js0000644000201500020150000000056714515446705023241 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ca', { copy: 'Copyright © $1. Tots els drets reservats.', dlgTitle: 'Quant al CKEditor 4', moreInfo: 'Per informació sobre llicències visiteu el nostre lloc web:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/gu.js0000644000201500020150000000065314515446705023265 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'gu', { copy: 'કોપીરાઈટ © $1. ઓલ રાઈટ્સ ', dlgTitle: 'CKEditor વિષે', moreInfo: 'લાયસનસની માહિતી માટે અમારી વેબ સાઈટ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ms.js0000644000201500020150000000060714515446705023270 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ms', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/th.js0000644000201500020150000000060714515446705023264 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'th', { copy: 'Copyright © $1. All rights reserved.', // MISSING dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/de.js0000644000201500020150000000061414515446705023237 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'de', { copy: 'Copyright © $1. Alle Rechte vorbehalten.', dlgTitle: 'Über CKEditor 4', moreInfo: 'Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/en-ca.js0000644000201500020150000000056414515446705023636 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'en-ca', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/tt.js0000644000201500020150000000061614515446705023300 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'tt', { copy: 'Copyright © $1. Бар хокуклар сакланган', dlgTitle: 'CKEditor турында', moreInfo: 'For licensing information please visit our web site:' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/vi.js0000644000201500020150000000063014515446705023263 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'vi', { copy: 'Bản quyền © $1. Giữ toàn quyền.', dlgTitle: 'Thông tin về CKEditor 4', moreInfo: 'Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/cs.js0000644000201500020150000000056214515446705023256 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'cs', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'O aplikaci CKEditor 4', moreInfo: 'Pro informace o lincenci navštivte naši webovou stránku:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/tr.js0000644000201500020150000000061114515446705023271 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'tr', { copy: 'Copyright © $1. Tüm hakları saklıdır.', dlgTitle: 'CKEditor Hakkında', moreInfo: 'Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ja.js0000644000201500020150000000061014515446705023235 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ja', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'CKEditorについて', moreInfo: 'ライセンス情報の詳細はウェブサイトにて確認してください:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/sl.js0000644000201500020150000000057714515446705023275 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'sl', { copy: 'Copyright © $1. Vse pravice pridržane.', dlgTitle: 'O programu CKEditor 4', moreInfo: 'Za informacije o licenciranju prosimo obiščite našo spletno stran:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/lv.js0000644000201500020150000000060314515446705023266 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'lv', { copy: 'Kopēšanas tiesības © $1. Visas tiesības rezervētas.', dlgTitle: 'Par CKEditor 4', moreInfo: 'Informācijai par licenzēšanu apmeklējiet mūsu mājas lapu:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/en-au.js0000644000201500020150000000055114515446705023654 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'en-au', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'About CKEditor 4', moreInfo: 'For licensing information please visit our web site:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/en.js0000644000201500020150000000054614515446705023255 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'en', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'About CKEditor 4', moreInfo: 'For licensing information please visit our web site:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/no.js0000644000201500020150000000056414515446705023267 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'no', { copy: 'Copyright © $1. Alle rettigheter reservert.', dlgTitle: 'Om CKEditor 4', moreInfo: 'For lisensieringsinformasjon, vennligst besøk vårt nettsted:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/fr.js0000644000201500020150000000060014515446705023251 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'fr', { copy: 'Copyright © $1. Tous droits réservés.', dlgTitle: 'À propos de CKEditor 4', moreInfo: 'Pour les informations de licence, veuillez visiter notre site web :' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/id.js0000644000201500020150000000055414515446705023246 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'id', { copy: 'Hak cipta © $1. All rights reserved.', dlgTitle: 'Tentang CKEditor 4', moreInfo: 'Untuk informasi lisensi silahkan kunjungi web site kami:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ug.js0000644000201500020150000000074714515446705023271 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ug', { copy: 'Copyright © $1. نەشر ھوقۇقىغا ئىگە', dlgTitle: 'CKEditor تەھرىرلىگۈچى 4 ھەقىدە', moreInfo: 'تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/ar.js0000644000201500020150000000063614515446705023255 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'ar', { copy: 'حقوق النشر © $1. جميع الحقوق محفوظة.', dlgTitle: 'عن CKEditor', moreInfo: 'للحصول على معلومات الترخيص ، يرجى زيارة موقعنا:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/sr.js0000644000201500020150000000063614515446705023277 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'sr', { copy: 'Copyright © $1. Сва права задржана.', dlgTitle: 'О CKEditor 4', moreInfo: 'За информације о лиценци посетите нашу веб страницу:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/eu.js0000644000201500020150000000055714515446705023266 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'eu', { copy: 'Copyright © $1. Eskubide guztiak erreserbaturik.', dlgTitle: 'CKEditor 4ri buruz', moreInfo: 'Lizentziari buruzko informazioa gure webgunean:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/en-gb.js0000644000201500020150000000056414515446705023643 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'en-gb', { copy: 'Copyright © $1. All rights reserved.', dlgTitle: 'About CKEditor 4', // MISSING moreInfo: 'For licensing information please visit our web site:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/lang/hu.js0000644000201500020150000000057314515446705023267 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'about', 'hu', { copy: 'Copyright © $1. Minden jog fenntartva.', dlgTitle: 'A CKEditor 4-ről', moreInfo: 'Licenszelési információkért kérjük látogassa meg weboldalunkat:' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/dialogs/0000755000201500020150000000000014515446705023011 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/about/dialogs/logo_ckeditor.png0000644000201500020150000001302214503523375026335 0ustar puckpuckPNG  IHDR: EbKGD pHYs  IDATx]{tSU}/*0 /ET|$)IZ"8kqL[uz]i@FsgFGQ\̫M&)|( IiAJtZgd}}|gd \րŗ`+M,r"@MDU{%9[[ՠtۯkꑶ44KxDVQ .PSTHfgdQ^F&C;? )??uB ޠiCw_3ސ-%ǝ0"UTgGRMߧ"G[iW÷ {`>!Gf?3Җ-i&q*֥glZ|~ЕoFle5$#hw]՛׾23OHDStҎlC!DKr+ʂoe?v` ewRLSw~a#T4 oց9;1F+D;ji5qADɐJnPL,##j$Mz#dUlub{)5'# Yuwe.ߚetB*#x)JJԭwN'dtx̧IJ:D= t/L\)[eE<̧;uuF! Z ~P~r kP7:{lf<ǒH E[c%Ȩ:(I'm+o `hBJ^RSN-B =d"$@*5EP8tnYt4GS!|K&"m RM|N 27 Αk"i,7iԶ.T!E/3w RU~* >)%jqǚ̐Qi\Cb": Tox@2(,m_qOy#ghr @FcRYHĐڒGdyش K]2tC?4kHH;S^J9nXcyQ"`$#MخHSHS#89E%\M:ērEf?LQF ycVK5kHf Tv281uc%m`lǂ jIo㆚L כl'2}z}䙭IF9Em'ehl6͢&۷}Hםz*yYZYK~]됥@}YnzkQ?۔!%9ǰp!<F<_ |d`/@> ^ʓ0ZwTTYf j,Jн}#`ZGMy I"Y]Tƙk.b0s; &o*>cϹDoDC?I0|\2xMߍMi,mBۧBK5 v*n N5}Y1'L͇$kH'Rrެ8އ(կ;HC]C')>Af\3pd}$8>sL|&&^7f-R1Uv̰p!} =%W8%"H\ӖT= f+**7GJy>T&\+WbJ~1U_iѦ@}#B's&[wJta+/O)\%3,q Η*4>]x)LS5 Rf}7Q$YMA>)rv(#,7~)+zpkH7biWyDr qsF<ql~i*5Q .IAXQu``U.6L-7XɎ ; A\Ps~d6o@e|V[W7Yƃy^vMu3[Qu#dI :iuGi牕ЁC [pϽؾ[k{ 23 )< 5.&<S~Ց}?|%ʪ. {G&Ѷ q_Q|Y١]e:@3@DJ~۾<2E,5j:>J:̙3msxߧXaCR;uZqeFIraJmћIEH-(F$_Q#K\L9{3_J'_HU>C@MȚF_^-՛:{ ^]=WD@hjc[/όD" 趠۽`],' %JB6c+\|f=)cof/@m6`傠giDÉp}n5(,DÁX j ܳ&mW"ʰz͆豸ѹ zL03oڙ,r"lDTAUUAzf?]x>Hйҩղ3\T0yk-T\IDn]m*Wm2h4&ct} ~ %melʕ+QXX1%]ͮ{(w}=g%/#"GyӻO)]./Ir~,<$U,v&wΔ,a'k!uuwjd"F@c>ՋmATz5̆(wUe4h/ɂzYc5Xq( \\cA|7AVfQPX_cʍhEi?m}}n^YE(%w|zO' Dd])n~_,h 3MW BYW lwy j*7NA9U$ KgDNf~gt*t-4c #ԩsNƙ3-[1~ ERP玑YLhYqRĒ@,|\IJm*AU}y|P冏Z=G O׾%/˰by> B$c,GjSw_NToČks-ӆ<wĽqJY܂i#d8>3p8Of~T/2KXrjPO.ezA;յUf^kNJg0YE<<8o ¾_Qiz/0cHɉ鸒/vb^SsZcQEUUz皭骐pr[|5x:EZNo>w嚭?]v=L;k׮m`o rͶ˥}~2`?qǿ;+`=o:\>wezewfUk6D /`Gf~@Zkh'%Wmkhԩs:d4S @*M[ + FUR5U-=^;L֟]va 74[rCJ8+&+`^7F L♛zQ0!%9fIM&|{*VtN1֦NHuI5vL-UmÕ_WTۼ)52V\,Xfz0~-J C83f5gn})ct:Uds!C~D[d8IV9NdgɋANҽ%bAst+"B)ȧoLh׎ ͛?ϾxOCdH6cGI܀$HP“y8h0Z2x<88Ljd9ؚ?T8=("EEEX[Mzkw2x.@׃|^o26iHxآrq5ko$B< T% s:FaCF7 ` R{0a fKݕ"tUnI:s,SѿumXU@gu1z2̞]cXi^%ۓ/ho@lWLGYY6.`-D9~}g)]珞c I-ץ^?áMJ5BGO~_3TWD`H?@~"z哟 nv+8q0wfxMCŻC8x_EAKQtqBf6Mzo0z?00eDҜe5"|rܷ9 hY+yNT-(mPH񥁬4WNGBcXj"DZs pr[v NEhG` 8ۜ}fO&" @D#hH!,BgL?w#!l_H5hH]'ӭ*Ѝ!B7D%̱ 4yҡ{5tKRJD b9 ^iDwXT,Y 'ڬ6 ОtA%j*#p brdddj"-ihVӍǧפj!IENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/dialogs/about.js0000644000201500020150000000450614515446705024466 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.dialog.add( 'about', function( editor ) { var lang = editor.lang.about, imagePath = CKEDITOR.getUrl( CKEDITOR.plugins.get( 'about' ).path + 'dialogs/' + ( CKEDITOR.env.hidpi ? 'hidpi/' : '' ) + 'logo_ckeditor.png' ); return { title: lang.dlgTitle, minWidth: 390, minHeight: 210, contents: [ { id: 'tab1', label: '', title: '', expand: true, padding: 0, elements: [ { type: 'html', html: '' + '
            ' + '' + '

            ' + 'CKEditor ' + CKEDITOR.version + ' (revision ' + CKEDITOR.revision + ')
            ' + 'https://ckeditor.com' + '

            ' + '

            ' + lang.moreInfo + '
            ' + 'https://ckeditor.com/legal/ckeditor-oss-license/' + '

            ' + '

            ' + lang.copy.replace( '$1', 'CKSource Holding sp. z o.o' ) + '

            ' + '
            ' } ] } ], buttons: [ CKEDITOR.dialog.cancelButton ] }; } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/dialogs/hidpi/0000755000201500020150000000000014503523375024102 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/about/dialogs/hidpi/logo_ckeditor.png0000644000201500020150000002771414503523375027447 0ustar puckpuckPNG  IHDRtg^bKGD pHYs   IDATxy|T?Ͻ3IEP*ʖ$3̝Eת.V[mn $j[~kjZOVR$3! "jQ@@v{c  $L_^;3w}ι-DK}Чr5LGC}ȤaUr0- K$Tsc70l=By=M_@H]3zecT*~a!^Xgl x8 kD"b`]0J -/8)7+MW^y 3:tǢ aR,- >!z=FK$NmDX}F߮5SZee&(y424!<5D|d@\1f$-"2g4Y){6. |G'P |@ OE-[Oͅ:ڈ@Cj8' dlbD"9&MU*px 3/s\h1|rI{O7^q`s[G4˪-Hz^ ~ +ϊqhωFy O} lݽe#'@6qxHY%IHI7QfJeS!0N=!Կ5R$IDoTx`B{9Gf0VD'N D(esүL$I{0ujQ2f BiƘ~4g,*J͡T6Ao{<*KE"vuyn 2frԙ^! GOV;,wq8#` cjY0$5b;vn%Nio E3. :ڈ'g˱D%1xԣ̚VU+C@?i6dv!kظ4b3S`eH$NZF"sv°a_8 /.?s :ԍF@SoO{Z_XY2b0 kgD,E@/tt|{?jި_reH$p"vȀ cn6w*h$S 3C >U #H:NP3K!xh`nh (p`JH$Y+] 1H!dh0 %ڨȽ1rd'MdǯKY.b>je]̰ItV ľs߀@ѵXE*t[?gzK"«$/ F"]k;[SZtAxro6nCz 63CĀ`$I#~*%1Y6V!QeЧ^*E"y4 o80m׃pGKGy(je, @Q oT_%KE")C A w_oR*G \vo~2g2=OD"9*Di oĆā<tV_7: FyR$I#&'w_5s ^o!EyXZφʐ ڟ0##s\` H:0\iT4+lSKfs}An}_'B"R*ȔHQcz;3D"ՙ:t)?dAH$vc:B΄O{WtU{s<[/-Qy vG>a MfUQ AcYYn?c!p7v'_S/o3f5'OƼy[kX5 A]ߵijYIP4~p|2@tNCۥH E%Z5 z VZlťCuCcPj{r4l!!wa>Z5ai-g0RVС]fw( JXT@w!cNhWKƸU VG |M0*@y)B?54LL{EJ+!s.72Bp8O jnݰv먿͵-'6qI8eXMu$]eRf`V1"/΁I 3mT],?h1jPP\MX"[Q_[[фBʼnG^^A0{翇wE57 a end"-Q7BLMxTl8}ƺO".l &C0]=O':' [dh  7>[} l. M0 rf<7C+S\{(B2јj_C(>hUGrLcEǶTe nkܰ:\W/Ą``0}F6)xleֺQZQzb nB` Qw{24Yq\^u;Fys7mJ3TfV`ry?K%(򺲻 Mjx`e;R T'ڝLw diߩx.KhѢnq,CS+#ݤ d-jmc@nP[p`N4Eym7G15@%= ȈUٵ|`( UTKt@Zz ޻/YB=CO4H|D@ٴ:@fONjIJglQ]KZE RK[YjVEғ Z⺘u5QU Go P̅{9jeh-o+L+@QXB:1lT$D:#6g=x[fYMtE|70гH-hw) leyIoP*Zm!pEsIOr"ЯOȟ[lv?|4e\.  `q/X+;oD߭os<3/ C9FD\/?^bgh ֺBK+Ӆɓ''4iRJ9qb$?v8&y¾e` úJ@G% }!5{Mi~(}w/մ3v:Xt) .{@I=gϷD*[[9yɆ6_oiw[=[wb.M,~LjQ`w]n;-Fڐۜ0Q8zWiQIY]ì6|ŦkiwolV6thkzq]giŮ%B&(9vfM{*=n8J28D ggG%$]&ҲNnaƻ&MB*eqy63ʺXNߒ%;6An׸?L?lƟHd$RLJ5Xl}~:cƌOB o@~1 tcNL^Ϗ6$GW VTQX\z!g!J/n] *B uǦ jȱڜkVv. p923 Kj۵BMr^[-lO0Hk\.њ`XpAL~ɮJ,AAq-l# q5e{,5akBD8VFG++??):mefǻ)\a a >>}BBG6gƻ`ujVCV65q5`kw2zoC#=~ ;2*t8;,R $],d$:u~*0EQ`{wS8q"磰x0HoSQ}m̛7r*>`'3Rf* f1=Xr8TRf=Hۗ#YM{\[B5V!#&$fF3QXvTAHe] O%6rC]ק2K{6rUڽ߹(VvI:M8hn0-k x7u?DW\ ^0l4#@`EPSUg9P 5xha2ļؽNP~YauŮ ! fDHu6׿Al/3X_ iFUq#˭5XxZ;@x!kkLDWI3aa4/pFK:2#MexDSQ^V1N6k'~jE5Y},(PtR $]vmL<)ZK>'껸 y(()֍]C@% 5UKIieswS_|ExeF}pna=?]E4_ p/dssֿ~a}7qᬄ-zw.-nn"fL(*e<# rdq.!H~<8.*t6YTR. =ص^+.vx [_y/"~@05)D9&೏"GcEϹpg{z*)WY>_o-EDg<[GPb׬ՇQ~vwy5~F*)F.n~'Y2:.ufuOɉy]z5(a>>x`츥Jђf(V[i.Yhv*UDjA]`Mm⫼-vh&C6'e)vzngpV_pX#{,ESk#G]C5q:;-@rnN֙qǚ3f jnaJrD. ieMIdJ\toڵk'_UU#,.¬*c,CgdJL<ݐum`mDO:EW]Is靠_ rk%t~ܺhvRTeU`|ӿfkX;rVaǨalTܖti;_NȀ"8(wy40.k(fزHL| +;']ș`dn"IOic{`hnR-%1o6>=(P9-Z~Ksڜ/k} .=iWs0Dv=٧/ZSwb:-Hg]ECh'V| GZ-22b7S[mYݵd09'<},oFߜ@%ZVT\:(Xhΰw휂GO%S۸Tpbp֟t]#G0x̔b6`IDAT 2Iy2pɼyZ;HmŽ9[_l$X( -q7Y=-Ӆ`o'yKj1iSǠ%I]x謜AbN*ڵGCV#4߉P); ʹ{|DNH$-&$U;v &M¢t,6FbS~&G $).{bp̜m9߲xR7 d/G[>KD/z`uIڕeIzynթD`5n:ǝ /]mPvf"4%-UcuygEooo E)yZtlY/r Jj"16].ljf2'M`Űu6Zs2[ ڵ[-Z(}'OFڏ|yX0JD+{l&V_-^qtSVh @,PY)8J:}_B0YC@'뀙p](MORv8lkvɦgX?ouL=!jg] ű7y/He_dovg*>`W6lފx:hONgTh/ D=PVc clu~Z<3n EV  ^vF9&7ޓtm]mۃb@+{1 }rm/6K2GDZi44?-T@f3 }0 q6\z{HJ]ah ~wQ2r\0h/aފ t]k& ƞ62uխ+ʰxɲ}E6b4yŦsyajf(*Ն-3u-IY@ CX3b V6<`9+1n3O:h0U9aVխ3U\kn].ڶobnU".}Ц%Hb0 Rt34!<5LȕZp/:6}o~6M`p#̷q΃CDDф3Ҳ`Rnx6Ac`xK!]RM0>!#MØ=nljk: 6'QnbܖD|n>@k#.2rЉ¦oRrAf,1GnnG I' h֑"6wŦ'flr\ނu?)@}jw.pԅthw\/wғeY;p݅ɯ4OEdl*йDD1ř挳sti %`Su_~ ~ҽ:CCCs_ z@xmARRjO@! zʉV}jbE7ػ#@Öuǃ>6e|fKz/{Kj>u?,U:% x]h]ݭ})IJ=w=g3~vϯ}O^QpSP\ !D1_DsGZ̾k7/ 1 AL1r{T8m'`;C (*^|:3۽hTXo@(Pޥy+.=xVroNm?}H&pևl5#Θ13f8nmluN@з;ewl5p҉P]ogbP Fl21ă&}Q&͐Z$I1>fHKtJTDD"90HOPx4D"1PI],͐m2- !Hz&2b A$I9zE6͗HYQC" ̸!͑6< zyD"91)IsCX@yOICH$Y+a>IZicʾ1 䘈Axhw`Z)rlP\s_$~f/2̣yz67{5M)-"Hz>23`f`D|"<(#,W60I D"9b"fw05>fꖠl㘣H$oFWc}#5k L3[mtz@5$IZAaĬv7ږtڴT׸?ICF$Mh׶g `(vcbR Dyx&LD{#dPg3P(xX }nM5A_D"饑A[FE~BtҔѿ߳2FH$o_dL#B_IR CQol>j=dlBH$ _y6g#!Hh]0 GQ[/*L[ WIQ1D}H$)q({b%ssCtQw}V&6$߷D"J~<{(ag^l 70+o#u&D䘀D"A F{(OAtR$ Bӫ35ngOhINTƁrYT"ȠpOQL82F!jQwѮ!)DF)&sn#ZX1Aq`f]h4*zIl>4c̻Y}>33f"`vے$AǢvi61S?Y yX?0?T$yκ:VKߓ$IhO|"Q! \uJ הR_A@A ,((aU{_'[fث%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/about/icons/about.png0000644000201500020150000000132514503523375024317 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->IDAT8mS1}3^*Uz z+4U) :@:RhD&ODk8{Xv5gL&PUHyhcPUXDڦBiag{*bh{0YU`UO1%1%I "0KU=&ws+" "B41>LsU}?<2\e ga>iޤף^cv0ƜȞ3|Ȯ솪bـȋ uL$?/Lp Dgkrkfet:r WU=!>uk'XVp 9Bknw&n(UރF#־.N!ΝGz?t(%|z}SUU&]k6ۘADk-bx_}^ߚ%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/richcombo/0000755000201500020150000000000014515446712022220 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/richcombo/plugin.js0000644000201500020150000003224214515446712024057 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.add( 'richcombo', { requires: 'floatpanel,listblock,button', beforeInit: function( editor ) { editor.ui.addHandler( CKEDITOR.UI_RICHCOMBO, CKEDITOR.ui.richCombo.handler ); } } ); ( function() { var template = '' + '{label}' + '' + '{label}' + '' + '' + // BLACK DOWN-POINTING TRIANGLE ( CKEDITOR.env.hc ? '▼' : CKEDITOR.env.air ? ' ' : '' ) + '' + '' + '' + ''; var rcomboTpl = CKEDITOR.addTemplate( 'combo', template ); /** * Button UI element. * * @readonly * @property {String} [='richcombo'] * @member CKEDITOR */ CKEDITOR.UI_RICHCOMBO = 'richcombo'; /** * @class * @todo */ CKEDITOR.ui.richCombo = CKEDITOR.tools.createClass( { $: function( definition ) { // Copy all definition properties to this object. CKEDITOR.tools.extend( this, definition, // Set defaults. { // The combo won't participate in toolbar grouping. canGroup: false, title: definition.label, modes: { wysiwyg: 1 }, editorFocus: 1 } ); // We don't want the panel definition in this object. var panelDefinition = this.panel || {}; delete this.panel; this.id = CKEDITOR.tools.getNextNumber(); this.document = ( panelDefinition.parent && panelDefinition.parent.getDocument() ) || CKEDITOR.document; panelDefinition.className = 'cke_combopanel'; panelDefinition.block = { multiSelect: panelDefinition.multiSelect, attributes: panelDefinition.attributes }; panelDefinition.toolbarRelated = true; this._ = { panelDefinition: panelDefinition, items: {}, listeners: [] }; }, proto: { renderHtml: function( editor ) { var output = []; this.render( editor, output ); return output.join( '' ); }, /** * Renders the rich combo. * * @param {CKEDITOR.editor} editor The editor instance which this button is * to be used by. * @param {Array} output The output array that the HTML relative * to this button will be appended to. */ render: function( editor, output ) { var env = CKEDITOR.env, instance, selLocked; var id = 'cke_' + this.id; var clickFn = CKEDITOR.tools.addFunction( function( el ) { // Restore locked selection in Opera. if ( selLocked ) { editor.unlockSelection( 1 ); selLocked = 0; } instance.execute( el ); }, this ); var combo = this; instance = { id: id, combo: this, focus: function() { var element = CKEDITOR.document.getById( id ).getChild( 1 ); element.focus(); }, execute: function( el ) { var _ = combo._; if ( _.state == CKEDITOR.TRISTATE_DISABLED ) return; combo.createPanel( editor ); if ( _.on ) { _.panel.hide(); return; } combo.commit(); var value = combo.getValue(); if ( value ) _.list.mark( value ); else _.list.unmarkAll(); _.panel.showBlock( combo.id, new CKEDITOR.dom.element( el ), 4 ); }, clickFn: clickFn }; function updateState() { // Don't change state while richcombo is active (https://dev.ckeditor.com/ticket/11793). if ( this.getState() == CKEDITOR.TRISTATE_ON ) return; var state = this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; if ( editor.readOnly && !this.readOnly ) state = CKEDITOR.TRISTATE_DISABLED; this.setState( state ); this.setValue( '' ); // Let plugin to disable button. if ( state != CKEDITOR.TRISTATE_DISABLED && this.refresh ) this.refresh(); } // Update status when activeFilter, mode, selection or readOnly changes. this._.listeners.push( editor.on( 'activeFilterChange', updateState, this ) ); this._.listeners.push( editor.on( 'mode', updateState, this ) ); this._.listeners.push( editor.on( 'selectionChange', updateState, this ) ); // If this combo is sensitive to readOnly state, update it accordingly. !this.readOnly && this._.listeners.push( editor.on( 'readOnly', updateState, this ) ); var keyDownFn = CKEDITOR.tools.addFunction( function( ev, element ) { ev = new CKEDITOR.dom.event( ev ); var keystroke = ev.getKeystroke(); switch ( keystroke ) { case 13: // ENTER case 32: // SPACE case 40: // ARROW-DOWN // Show panel CKEDITOR.tools.callFunction( clickFn, element ); break; default: // Delegate the default behavior to toolbar button key handling. instance.onkey( instance, keystroke ); } // Avoid subsequent focus grab on editor document. ev.preventDefault(); } ); var focusFn = CKEDITOR.tools.addFunction( function() { instance.onfocus && instance.onfocus(); } ); selLocked = 0; // For clean up instance.keyDownFn = keyDownFn; var params = { id: id, name: this.name || this.command, label: this.label, title: this.title, cls: this.className || '', titleJs: env.gecko && !env.hc ? '' : ( this.title || '' ).replace( "'", '' ), keydownFn: keyDownFn, focusFn: focusFn, clickFn: clickFn }; rcomboTpl.output( params, output ); if ( this.onRender ) this.onRender(); return instance; }, createPanel: function( editor ) { if ( this._.panel ) return; var panelDefinition = this._.panelDefinition, panelBlockDefinition = this._.panelDefinition.block, panelParentElement = panelDefinition.parent || CKEDITOR.document.getBody(), namedPanelCls = 'cke_combopanel__' + this.name, panel = new CKEDITOR.ui.floatPanel( editor, panelParentElement, panelDefinition ), list = panel.addListBlock( this.id, panelBlockDefinition ), me = this; panel.onShow = function() { this.element.addClass( namedPanelCls ); me.setState( CKEDITOR.TRISTATE_ON ); me._.on = 1; me.editorFocus && !editor.focusManager.hasFocus && editor.focus(); if ( me.onOpen ) me.onOpen(); }; panel.onHide = function( preventOnClose ) { this.element.removeClass( namedPanelCls ); me.setState( me.modes && me.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); me._.on = 0; if ( !preventOnClose && me.onClose ) me.onClose(); }; panel.onEscape = function() { // Hide drop-down with focus returned. panel.hide( 1 ); }; list.onClick = function( value, marked ) { if ( me.onClick ) me.onClick.call( me, value, marked ); panel.hide(); }; this._.panel = panel; this._.list = list; panel.getBlock( this.id ).onHide = function() { me._.on = 0; me.setState( CKEDITOR.TRISTATE_OFF ); }; if ( this.init ) this.init(); }, setValue: function( value, text ) { this._.value = value; var textElement = this.document.getById( 'cke_' + this.id + '_text' ); if ( textElement ) { if ( !( value || text ) ) { text = this.label; textElement.addClass( 'cke_combo_inlinelabel' ); } else { textElement.removeClass( 'cke_combo_inlinelabel' ); } textElement.setText( typeof text != 'undefined' ? text : value ); } var newLabel = createLabel( typeof text != 'undefined' ? text : value, this.label ), labelElement = this.document.getById( 'cke_' + this.id + '_label' ); if ( labelElement ) { labelElement.setText( newLabel ); } function createLabel( newLabel, initialLabel ) { if ( newLabel === initialLabel ) { return newLabel; } return newLabel + ', ' + initialLabel; } }, getValue: function() { return this._.value || ''; }, unmarkAll: function() { this._.list.unmarkAll(); }, mark: function( value ) { this._.list.mark( value ); }, hideItem: function( value ) { this._.list.hideItem( value ); }, hideGroup: function( groupTitle ) { this._.list.hideGroup( groupTitle ); }, showAll: function() { this._.list.showAll(); }, /** * Adds an entry displayed inside the rich combo panel. * * @param {String} value * @param {String} html * @param {String} text */ add: function( value, html, text ) { this._.items[ value ] = text || value; this._.list.add( value, html, text ); }, startGroup: function( title ) { this._.list.startGroup( title ); }, commit: function() { if ( !this._.committed ) { this._.list.commit(); this._.committed = 1; CKEDITOR.ui.fire( 'ready', this ); } this._.committed = 1; }, setState: function( state ) { if ( this._.state == state ) return; var el = this.document.getById( 'cke_' + this.id ), linkEl = el.getElementsByTag( 'a' ).getItem( 0 ); el.setState( state, 'cke_combo' ); state == CKEDITOR.TRISTATE_DISABLED ? el.setAttribute( 'aria-disabled', true ) : el.removeAttribute( 'aria-disabled' ); if ( linkEl ) { linkEl.setAttribute( 'aria-expanded', state == CKEDITOR.TRISTATE_ON ); } this._.state = state; }, getState: function() { return this._.state; }, enable: function() { if ( this._.state == CKEDITOR.TRISTATE_DISABLED ) this.setState( this._.lastState ); }, disable: function() { if ( this._.state != CKEDITOR.TRISTATE_DISABLED ) { this._.lastState = this._.state; this.setState( CKEDITOR.TRISTATE_DISABLED ); } }, /** * Removes all listeners from a rich combo element. * * @since 4.11.0 */ destroy: function() { CKEDITOR.tools.array.forEach( this._.listeners, function( listener ) { listener.removeListener(); } ); this._.listeners = []; }, /** * Selects a rich combo item based on the first matching result from the given filter function. * The filter function takes an object as an argument with `value` and `text` fields. The values of these * fields match to arguments passed in the {@link #add} method. * In order to obtain a correct result with this method, it is required to open or initialize the rich combo panel. * * ```js * var richCombo = editor.ui.get( 'Font' ); * * // Required when 'richcombo' was never open in a given editor instance. * richCombo.createPanel( editor ); * * richCombo.select( function( item ) { * return item.value === 'Tahoma' || item.text === 'Tahoma'; * } ); * ``` * * @since 4.14.0 * @param {Function} callback The function should return `true` if a matching element is found. * @param {Object} callback.item An object containing the `value` and `text` fields which are compared by this callback. */ select: function( callback ) { if ( CKEDITOR.tools.isEmpty( this._.items ) ) { return; } for ( var value in this._.items ) { if ( callback( { value: value, text: this._.items[ value ] } ) ) { this.setValue( value ); return; } } } }, /** * Represents a rich combo handler object. * * @class CKEDITOR.ui.richCombo.handler * @singleton * @extends CKEDITOR.ui.handlerDefinition */ statics: { handler: { /** * Transforms a rich combo definition into a {@link CKEDITOR.ui.richCombo} instance. * * @param {Object} definition * @returns {CKEDITOR.ui.richCombo} */ create: function( definition ) { return new CKEDITOR.ui.richCombo( definition ); } } } } ); /** * @param {String} name * @param {Object} definition * @member CKEDITOR.ui * @todo */ CKEDITOR.ui.prototype.addRichCombo = function( name, definition ) { this.add( name, CKEDITOR.UI_RICHCOMBO, definition ); }; } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/lineutils/0000755000201500020150000000000014515446707022267 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/lineutils/plugin.js0000644000201500020150000007055014515446707024132 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview A set of utilities to find and create horizontal spaces in edited content. */ 'use strict'; ( function() { CKEDITOR.plugins.add( 'lineutils' ); /** * Determines a position relative to an element in DOM (before). * * @readonly * @property {Number} [=0] * @member CKEDITOR */ CKEDITOR.LINEUTILS_BEFORE = 1; /** * Determines a position relative to an element in DOM (after). * * @readonly * @property {Number} [=2] * @member CKEDITOR */ CKEDITOR.LINEUTILS_AFTER = 2; /** * Determines a position relative to an element in DOM (inside). * * @readonly * @property {Number} [=4] * @member CKEDITOR */ CKEDITOR.LINEUTILS_INSIDE = 4; /** * A utility that traverses the DOM tree and discovers elements * (relations) matching user-defined lookups. * * @private * @class CKEDITOR.plugins.lineutils.finder * @constructor Creates a Finder class instance. * @param {CKEDITOR.editor} editor Editor instance that the Finder belongs to. * @param {Object} def Finder's definition. * @since 4.3.0 */ function Finder( editor, def ) { CKEDITOR.tools.extend( this, { editor: editor, editable: editor.editable(), doc: editor.document, win: editor.window }, def, true ); this.inline = this.editable.isInline(); if ( !this.inline ) { this.frame = this.win.getFrame(); } this.target = this[ this.inline ? 'editable' : 'doc' ]; } Finder.prototype = { /** * Initializes searching for elements with every mousemove event fired. * To stop searching use {@link #stop}. * * @param {Function} [callback] Function executed on every iteration. */ start: function( callback ) { var that = this, editor = this.editor, doc = this.doc, el, elfp, x, y; var moveBuffer = CKEDITOR.tools.eventsBuffer( 50, function() { if ( editor.readOnly || editor.mode != 'wysiwyg' ) return; that.relations = {}; // Sometimes it happens that elementFromPoint returns null (especially on IE). // Any further traversal makes no sense if there's no start point. Abort. // Note: In IE8 elementFromPoint may return zombie nodes of undefined nodeType, // so rejecting those as well. if ( !( elfp = doc.$.elementFromPoint( x, y ) ) || !elfp.nodeType ) { return; } el = new CKEDITOR.dom.element( elfp ); that.traverseSearch( el ); if ( !isNaN( x + y ) ) { that.pixelSearch( el, x, y ); } callback && callback( that.relations, x, y ); } ); // Searching starting from element from point on mousemove. this.listener = this.editable.attachListener( this.target, 'mousemove', function( evt ) { x = evt.data.$.clientX; y = evt.data.$.clientY; moveBuffer.input(); } ); this.editable.attachListener( this.inline ? this.editable : this.frame, 'mouseout', function() { moveBuffer.reset(); } ); }, /** * Stops observing mouse events attached by {@link #start}. */ stop: function() { if ( this.listener ) { this.listener.removeListener(); } }, /** * Returns a range representing the relation, according to its element * and type. * * @param {Object} location Location containing a unique identifier and type. * @returns {CKEDITOR.dom.range} Range representing the relation. */ getRange: ( function() { var where = {}; where[ CKEDITOR.LINEUTILS_BEFORE ] = CKEDITOR.POSITION_BEFORE_START; where[ CKEDITOR.LINEUTILS_AFTER ] = CKEDITOR.POSITION_AFTER_END; where[ CKEDITOR.LINEUTILS_INSIDE ] = CKEDITOR.POSITION_AFTER_START; return function( location ) { var range = this.editor.createRange(); range.moveToPosition( this.relations[ location.uid ].element, where[ location.type ] ); return range; }; } )(), /** * Stores given relation in a {@link #relations} object. Processes the relation * to normalize and avoid duplicates. * * @param {CKEDITOR.dom.element} el Element of the relation. * @param {Number} type Relation, one of `CKEDITOR.LINEUTILS_AFTER`, `CKEDITOR.LINEUTILS_BEFORE`, `CKEDITOR.LINEUTILS_INSIDE`. */ store: ( function() { function merge( el, type, relations ) { var uid = el.getUniqueId(); if ( uid in relations ) { relations[ uid ].type |= type; } else { relations[ uid ] = { element: el, type: type }; } } return function( el, type ) { var alt; // Normalization to avoid duplicates: // CKEDITOR.LINEUTILS_AFTER becomes CKEDITOR.LINEUTILS_BEFORE of el.getNext(). if ( is( type, CKEDITOR.LINEUTILS_AFTER ) && isStatic( alt = el.getNext() ) && alt.isVisible() ) { merge( alt, CKEDITOR.LINEUTILS_BEFORE, this.relations ); type ^= CKEDITOR.LINEUTILS_AFTER; } // Normalization to avoid duplicates: // CKEDITOR.LINEUTILS_INSIDE becomes CKEDITOR.LINEUTILS_BEFORE of el.getFirst(). if ( is( type, CKEDITOR.LINEUTILS_INSIDE ) && isStatic( alt = el.getFirst() ) && alt.isVisible() ) { merge( alt, CKEDITOR.LINEUTILS_BEFORE, this.relations ); type ^= CKEDITOR.LINEUTILS_INSIDE; } merge( el, type, this.relations ); }; } )(), /** * Traverses the DOM tree towards root, checking all ancestors * with lookup rules, avoiding duplicates. Stores positive relations * in the {@link #relations} object. * * @param {CKEDITOR.dom.element} el Element which is the starting point. */ traverseSearch: function( el ) { var l, type, uid; // Go down DOM towards root (or limit). do { uid = el.$[ 'data-cke-expando' ]; // This element was already visited and checked. if ( uid && uid in this.relations ) { continue; } if ( el.equals( this.editable ) ) { return; } if ( isStatic( el ) ) { // Collect all addresses yielded by lookups for that element. for ( l in this.lookups ) { if ( ( type = this.lookups[ l ]( el ) ) ) { this.store( el, type ); } } } } while ( !isLimit( el ) && ( el = el.getParent() ) ); }, /** * Iterates vertically pixel-by-pixel within a given element starting * from given coordinates, searching for elements in the neighborhood. * Once an element is found it is processed by {@link #traverseSearch}. * * @param {CKEDITOR.dom.element} el Element which is the starting point. * @param {Number} [x] Horizontal mouse coordinate relative to the viewport. * @param {Number} [y] Vertical mouse coordinate relative to the viewport. */ pixelSearch: ( function() { var contains = CKEDITOR.env.ie || CKEDITOR.env.webkit ? function( el, found ) { return el.contains( found ); } : function( el, found ) { return !!( el.compareDocumentPosition( found ) & 16 ); }; // Iterates pixel-by-pixel from starting coordinates, moving by defined // step and getting elementFromPoint in every iteration. Iteration stops when: // * A valid element is found. // * Condition function returns `false` (i.e. reached boundaries of viewport). // * No element is found (i.e. coordinates out of viewport). // * Element found is ascendant of starting element. // // @param {Object} doc Native DOM document. // @param {Object} el Native DOM element. // @param {Number} xStart Horizontal starting coordinate to use. // @param {Number} yStart Vertical starting coordinate to use. // @param {Number} step Step of the algorithm. // @param {Function} condition A condition relative to current vertical coordinate. function iterate( el, xStart, yStart, step, condition ) { var y = yStart, tryouts = 0, found; while ( condition( y ) ) { y += step; // If we try and we try, and still nothing's found, let's end // that party. if ( ++tryouts == 25 ) { return; } found = this.doc.$.elementFromPoint( xStart, y ); // Nothing found. This is crazy... but... // It might be that a line, which is in different document, // covers that pixel (elementFromPoint is doc-sensitive). // Better let's have another try. if ( !found ) { continue; } // Still in the same element. else if ( found == el ) { tryouts = 0; continue; } // Reached the edge of an element and found an ancestor or... // A line, that covers that pixel. Better let's have another try. else if ( !contains( el, found ) ) { continue; } tryouts = 0; // Found a valid element. Stop iterating. if ( isStatic( ( found = new CKEDITOR.dom.element( found ) ) ) ) { return found; } } } return function( el, x, y ) { var paneHeight = this.win.getViewPaneSize().height, // Try to find an element iterating *up* from the starting point. neg = iterate.call( this, el.$, x, y, -1, function( y ) { return y > 0; } ), // Try to find an element iterating *down* from the starting point. pos = iterate.call( this, el.$, x, y, 1, function( y ) { return y < paneHeight; } ); if ( neg ) { this.traverseSearch( neg ); // Iterate towards DOM root until neg is a direct child of el. while ( !neg.getParent().equals( el ) ) { neg = neg.getParent(); } } if ( pos ) { this.traverseSearch( pos ); // Iterate towards DOM root until pos is a direct child of el. while ( !pos.getParent().equals( el ) ) { pos = pos.getParent(); } } // Iterate forwards starting from neg and backwards from // pos to harvest all children of el between those elements. // Stop when neg and pos meet each other or there's none of them. // TODO (?) reduce number of hops forwards/backwards. while ( neg || pos ) { if ( neg ) { neg = neg.getNext( isStatic ); } if ( !neg || neg.equals( pos ) ) { break; } this.traverseSearch( neg ); if ( pos ) { pos = pos.getPrevious( isStatic ); } if ( !pos || pos.equals( neg ) ) { break; } this.traverseSearch( pos ); } }; } )(), /** * Unlike {@link #traverseSearch}, it collects **all** elements from editable's DOM tree * and runs lookups for every one of them, collecting relations. * * @returns {Object} {@link #relations}. */ greedySearch: function() { this.relations = {}; var all = this.editable.getElementsByTag( '*' ), i = 0, el, type, l; while ( ( el = all.getItem( i++ ) ) ) { // Don't consider editable, as it might be inline, // and i.e. checking it's siblings is pointless. if ( el.equals( this.editable ) ) { continue; } // On IE8 element.getElementsByTagName returns comments... sic! (https://dev.ckeditor.com/ticket/13176) if ( el.type != CKEDITOR.NODE_ELEMENT ) { continue; } // Don't visit non-editable internals, for example widget's // guts (above wrapper, below nested). Still check editable limits, // as they are siblings with editable contents. if ( !el.hasAttribute( 'contenteditable' ) && el.isReadOnly() ) { continue; } if ( isStatic( el ) && el.isVisible() ) { // Collect all addresses yielded by lookups for that element. for ( l in this.lookups ) { if ( ( type = this.lookups[ l ]( el ) ) ) { this.store( el, type ); } } } } return this.relations; } /** * Relations express elements in DOM that match user-defined {@link #lookups}. * Every relation has its own `type` that determines whether * it refers to the space before, after or inside the `element`. * This object stores relations found by {@link #traverseSearch} or {@link #greedySearch}, structured * in the following way: * * relations: { * // Unique identifier of the element. * Number: { * // Element of this relation. * element: {@link CKEDITOR.dom.element} * // Conjunction of CKEDITOR.LINEUTILS_BEFORE, CKEDITOR.LINEUTILS_AFTER and CKEDITOR.LINEUTILS_INSIDE. * type: Number * }, * ... * } * * @property {Object} relations * @readonly */ /** * A set of user-defined functions used by Finder to check if an element * is a valid relation, belonging to {@link #relations}. * When the criterion is met, lookup returns a logical conjunction of `CKEDITOR.LINEUTILS_BEFORE`, * `CKEDITOR.LINEUTILS_AFTER` or `CKEDITOR.LINEUTILS_INSIDE`. * * Lookups are passed along with Finder's definition. * * lookups: { * 'some lookup': function( el ) { * if ( someCondition ) * return CKEDITOR.LINEUTILS_BEFORE; * }, * ... * } * * @property {Object} lookups */ }; /** * A utility that analyses relations found by * CKEDITOR.plugins.lineutils.finder and locates them * in the viewport as horizontal lines of specific coordinates. * * @private * @class CKEDITOR.plugins.lineutils.locator * @constructor Creates a Locator class instance. * @param {CKEDITOR.editor} editor Editor instance that Locator belongs to. * @since 4.3.0 */ function Locator( editor, def ) { CKEDITOR.tools.extend( this, def, { editor: editor }, true ); } Locator.prototype = { /** * Locates the Y coordinate for all types of every single relation and stores * them in an object. * * @param {Object} relations {@link CKEDITOR.plugins.lineutils.finder#relations}. * @returns {Object} {@link #locations}. */ locate: ( function() { function locateSibling( rel, type ) { var sib = rel.element[ type === CKEDITOR.LINEUTILS_BEFORE ? 'getPrevious' : 'getNext' ](); // Return the middle point between siblings. if ( sib && isStatic( sib ) ) { rel.siblingRect = sib.getClientRect(); if ( type == CKEDITOR.LINEUTILS_BEFORE ) { return ( rel.siblingRect.bottom + rel.elementRect.top ) / 2; } else { return ( rel.elementRect.bottom + rel.siblingRect.top ) / 2; } } // If there's no sibling, use the edge of an element. else { if ( type == CKEDITOR.LINEUTILS_BEFORE ) { return rel.elementRect.top; } else { return rel.elementRect.bottom; } } } return function( relations ) { var rel; this.locations = {}; for ( var uid in relations ) { rel = relations[ uid ]; rel.elementRect = rel.element.getClientRect(); if ( is( rel.type, CKEDITOR.LINEUTILS_BEFORE ) ) { this.store( uid, CKEDITOR.LINEUTILS_BEFORE, locateSibling( rel, CKEDITOR.LINEUTILS_BEFORE ) ); } if ( is( rel.type, CKEDITOR.LINEUTILS_AFTER ) ) { this.store( uid, CKEDITOR.LINEUTILS_AFTER, locateSibling( rel, CKEDITOR.LINEUTILS_AFTER ) ); } // The middle point of the element. if ( is( rel.type, CKEDITOR.LINEUTILS_INSIDE ) ) { this.store( uid, CKEDITOR.LINEUTILS_INSIDE, ( rel.elementRect.top + rel.elementRect.bottom ) / 2 ); } } return this.locations; }; } )(), /** * Calculates distances from every location to given vertical coordinate * and sorts locations according to that distance. * * @param {Number} y The vertical coordinate used for sorting, used as a reference. * @param {Number} [howMany] Determines the number of "closest locations" to be returned. * @returns {Array} Sorted, array representation of {@link #locations}. */ sort: ( function() { var locations, sorted, dist, i; function distance( y, uid, type ) { return Math.abs( y - locations[ uid ][ type ] ); } return function( y, howMany ) { locations = this.locations; sorted = []; for ( var uid in locations ) { for ( var type in locations[ uid ] ) { dist = distance( y, uid, type ); // An array is empty. if ( !sorted.length ) { sorted.push( { uid: +uid, type: type, dist: dist } ); } else { // Sort the array on fly when it's populated. for ( i = 0; i < sorted.length; i++ ) { if ( dist < sorted[ i ].dist ) { sorted.splice( i, 0, { uid: +uid, type: type, dist: dist } ); break; } } // Nothing was inserted, so the distance is bigger than // any of already calculated: push to the end. if ( i == sorted.length ) { sorted.push( { uid: +uid, type: type, dist: dist } ); } } } } if ( typeof howMany != 'undefined' ) { return sorted.slice( 0, howMany ); } else { return sorted; } }; } )(), /** * Stores the location in a collection. * * @param {Number} uid Unique identifier of the relation. * @param {Number} type One of `CKEDITOR.LINEUTILS_BEFORE`, `CKEDITOR.LINEUTILS_AFTER` and `CKEDITOR.LINEUTILS_INSIDE`. * @param {Number} y Vertical position of the relation. */ store: function( uid, type, y ) { if ( !this.locations[ uid ] ) { this.locations[ uid ] = {}; } this.locations[ uid ][ type ] = y; } /** * @readonly * @property {Object} locations */ }; var tipCss = { display: 'block', width: '0px', height: '0px', 'border-color': 'transparent', 'border-style': 'solid', position: 'absolute', top: '-6px' }, lineStyle = { height: '0px', 'border-top': '1px dashed red', position: 'absolute', 'z-index': 9999 }, lineTpl = '
            ' + ' ' + ' ' + '
            '; /** * A utility that draws horizontal lines in DOM according to locations * returned by CKEDITOR.plugins.lineutils.locator. * * @private * @class CKEDITOR.plugins.lineutils.liner * @constructor Creates a Liner class instance. * @param {CKEDITOR.editor} editor Editor instance that Liner belongs to. * @param {Object} def Liner's definition. * @since 4.3.0 */ function Liner( editor, def ) { var editable = editor.editable(); CKEDITOR.tools.extend( this, { editor: editor, editable: editable, inline: editable.isInline(), doc: editor.document, win: editor.window, container: CKEDITOR.document.getBody(), winTop: CKEDITOR.document.getWindow() }, def, true ); this.hidden = {}; this.visible = {}; if ( !this.inline ) { this.frame = this.win.getFrame(); } this.queryViewport(); // Callbacks must be wrapped. Otherwise they're not attached // to global DOM objects (i.e. topmost window) for every editor // because they're treated as duplicates. They belong to the // same prototype shared among Liner instances. var queryViewport = CKEDITOR.tools.bind( this.queryViewport, this ), hideVisible = CKEDITOR.tools.bind( this.hideVisible, this ), removeAll = CKEDITOR.tools.bind( this.removeAll, this ); editable.attachListener( this.winTop, 'resize', queryViewport ); editable.attachListener( this.winTop, 'scroll', queryViewport ); editable.attachListener( this.winTop, 'resize', hideVisible ); editable.attachListener( this.win, 'scroll', hideVisible ); editable.attachListener( this.inline ? editable : this.frame, 'mouseout', function( evt ) { var x = evt.data.$.clientX, y = evt.data.$.clientY; this.queryViewport(); // Check if mouse is out of the element (iframe/editable). if ( x <= this.rect.left || x >= this.rect.right || y <= this.rect.top || y >= this.rect.bottom ) { this.hideVisible(); } // Check if mouse is out of the top-window vieport. if ( x <= 0 || x >= this.winTopPane.width || y <= 0 || y >= this.winTopPane.height ) { this.hideVisible(); } }, this ); editable.attachListener( editor, 'resize', queryViewport ); editable.attachListener( editor, 'mode', removeAll ); editor.on( 'destroy', removeAll ); this.lineTpl = new CKEDITOR.template( lineTpl ).output( { lineStyle: CKEDITOR.tools.writeCssText( CKEDITOR.tools.extend( {}, lineStyle, this.lineStyle, true ) ), tipLeftStyle: CKEDITOR.tools.writeCssText( CKEDITOR.tools.extend( {}, tipCss, { left: '0px', 'border-left-color': 'red', 'border-width': '6px 0 6px 6px' }, this.tipCss, this.tipLeftStyle, true ) ), tipRightStyle: CKEDITOR.tools.writeCssText( CKEDITOR.tools.extend( {}, tipCss, { right: '0px', 'border-right-color': 'red', 'border-width': '6px 6px 6px 0' }, this.tipCss, this.tipRightStyle, true ) ) } ); } Liner.prototype = { /** * Permanently removes all lines (both hidden and visible) from DOM. */ removeAll: function() { var l; for ( l in this.hidden ) { this.hidden[ l ].remove(); delete this.hidden[ l ]; } for ( l in this.visible ) { this.visible[ l ].remove(); delete this.visible[ l ]; } }, /** * Hides a given line. * * @param {CKEDITOR.dom.element} line The line to be hidden. */ hideLine: function( line ) { var uid = line.getUniqueId(); line.hide(); this.hidden[ uid ] = line; delete this.visible[ uid ]; }, /** * Shows a given line. * * @param {CKEDITOR.dom.element} line The line to be shown. */ showLine: function( line ) { var uid = line.getUniqueId(); line.show(); this.visible[ uid ] = line; delete this.hidden[ uid ]; }, /** * Hides all visible lines. */ hideVisible: function() { for ( var l in this.visible ) { this.hideLine( this.visible[ l ] ); } }, /** * Shows a line at given location. * * @param {Object} location Location object containing the unique identifier of the relation * and its type. Usually returned by {@link CKEDITOR.plugins.lineutils.locator#sort}. * @param {Function} [callback] A callback to be called once the line is shown. */ placeLine: function( location, callback ) { var styles, line, l; // No style means that line would be out of viewport. if ( !( styles = this.getStyle( location.uid, location.type ) ) ) { return; } // Search for any visible line of a different hash first. // It's faster to re-position visible line than to show it. for ( l in this.visible ) { if ( this.visible[ l ].getCustomData( 'hash' ) !== this.hash ) { line = this.visible[ l ]; break; } } // Search for any hidden line of a different hash. if ( !line ) { for ( l in this.hidden ) { if ( this.hidden[ l ].getCustomData( 'hash' ) !== this.hash ) { this.showLine( ( line = this.hidden[ l ] ) ); break; } } } // If no line available, add the new one. if ( !line ) { this.showLine( ( line = this.addLine() ) ); } // Mark the line with current hash. line.setCustomData( 'hash', this.hash ); // Mark the line as visible. this.visible[ line.getUniqueId() ] = line; line.setStyles( styles ); callback && callback( line ); }, /** * Creates a style set to be used by the line, representing a particular * relation (location). * * @param {Number} uid Unique identifier of the relation. * @param {Number} type Type of the relation. * @returns {Object} An object containing styles. */ getStyle: function( uid, type ) { var rel = this.relations[ uid ], loc = this.locations[ uid ][ type ], styles = {}, hdiff; // Line should be between two elements. if ( rel.siblingRect ) { styles.width = Math.max( rel.siblingRect.width, rel.elementRect.width ); } // Line is relative to a single element. else { styles.width = rel.elementRect.width; } // Let's calculate the vertical position of the line. if ( this.inline ) { // (https://dev.ckeditor.com/ticket/13155) styles.top = loc + this.winTopScroll.y - this.rect.relativeY; } else { styles.top = this.rect.top + this.winTopScroll.y + loc; } // Check if line would be vertically out of the viewport. if ( styles.top - this.winTopScroll.y < this.rect.top || styles.top - this.winTopScroll.y > this.rect.bottom ) { return false; } // Now let's calculate the horizontal alignment (left and width). if ( this.inline ) { // (https://dev.ckeditor.com/ticket/13155) styles.left = rel.elementRect.left - this.rect.relativeX; } else { if ( rel.elementRect.left > 0 ) styles.left = this.rect.left + rel.elementRect.left; // H-scroll case. Left edge of element may be out of viewport. else { styles.width += rel.elementRect.left; styles.left = this.rect.left; } // H-scroll case. Right edge of element may be out of viewport. if ( ( hdiff = styles.left + styles.width - ( this.rect.left + this.winPane.width ) ) > 0 ) { styles.width -= hdiff; } } // Finally include horizontal scroll of the global window. styles.left += this.winTopScroll.x; // Append 'px' to style values. for ( var style in styles ) { styles[ style ] = CKEDITOR.tools.cssLength( styles[ style ] ); } return styles; }, /** * Adds a new line to DOM. * * @returns {CKEDITOR.dom.element} A brand-new line. */ addLine: function() { var line = CKEDITOR.dom.element.createFromHtml( this.lineTpl ); line.appendTo( this.container ); return line; }, /** * Assigns a unique hash to the instance that is later used * to tell unwanted lines from new ones. This method **must** be called * before a new set of relations is to be visualized so {@link #cleanup} * eventually hides obsolete lines. This is because lines * are re-used between {@link #placeLine} calls and the number of * necessary ones may vary depending on the number of relations. * * @param {Object} relations {@link CKEDITOR.plugins.lineutils.finder#relations}. * @param {Object} locations {@link CKEDITOR.plugins.lineutils.locator#locations}. */ prepare: function( relations, locations ) { this.relations = relations; this.locations = locations; this.hash = Math.random(); }, /** * Hides all visible lines that do not belong to current hash * and no longer represent relations (locations). * * See also: {@link #prepare}. */ cleanup: function() { var line; for ( var l in this.visible ) { line = this.visible[ l ]; if ( line.getCustomData( 'hash' ) !== this.hash ) { this.hideLine( line ); } } }, /** * Queries dimensions of the viewport, editable, frame etc. * that are used for correct positioning of the line. */ queryViewport: function() { this.winPane = this.win.getViewPaneSize(); this.winTopScroll = this.winTop.getScrollPosition(); this.winTopPane = this.winTop.getViewPaneSize(); // (https://dev.ckeditor.com/ticket/13155) this.rect = this.getClientRect( this.inline ? this.editable : this.frame ); }, /** * Returns `boundingClientRect` of an element, shifted by the position * of `container` when the container is not `static` (https://dev.ckeditor.com/ticket/13155). * * See also: {@link CKEDITOR.dom.element#getClientRect}. * * @param {CKEDITOR.dom.element} el A DOM element. * @returns {Object} A shifted rect, extended by `relativeY` and `relativeX` properties. */ getClientRect: function( el ) { var rect = el.getClientRect(), relativeContainerDocPosition = this.container.getDocumentPosition(), relativeContainerComputedPosition = this.container.getComputedStyle( 'position' ); // Static or not, those values are used to offset the position of the line so they cannot be undefined. rect.relativeX = rect.relativeY = 0; if ( relativeContainerComputedPosition != 'static' ) { // Remember the offset used to shift the clientRect. rect.relativeY = relativeContainerDocPosition.y; rect.relativeX = relativeContainerDocPosition.x; rect.top -= rect.relativeY; rect.bottom -= rect.relativeY; rect.left -= rect.relativeX; rect.right -= rect.relativeX; } return rect; } }; function is( type, flag ) { return type & flag; } var floats = { left: 1, right: 1, center: 1 }, positions = { absolute: 1, fixed: 1 }; function isElement( node ) { return node && node.type == CKEDITOR.NODE_ELEMENT; } function isFloated( el ) { return !!( floats[ el.getComputedStyle( 'float' ) ] || floats[ el.getAttribute( 'align' ) ] ); } function isPositioned( el ) { return !!positions[ el.getComputedStyle( 'position' ) ]; } function isLimit( node ) { return isElement( node ) && node.getAttribute( 'contenteditable' ) == 'true'; } function isStatic( node ) { return isElement( node ) && !isFloated( node ) && !isPositioned( node ); } /** * Global namespace storing definitions and global helpers for the Line Utilities plugin. * * @private * @class * @singleton * @since 4.3.0 */ CKEDITOR.plugins.lineutils = { finder: Finder, locator: Locator, liner: Liner }; } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/lineutils/dev/0000755000201500020150000000000014515446707023045 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/lineutils/dev/magicfinger.html0000644000201500020150000002161314515446707026211 0ustar puckpuck Lineutils — CKEditor Sample

            CKEditor Samples » Lineutils

            Classic (iframe-based) Editor

            Inline Editor

            This table is the very first element of the document.
            We are still able to acces the space before it.
            This table is inside of a cell of another table.
            We can type either before or after it though.

            Two succesive horizontal lines (HR tags). We can access the space in between:



            1. This numbered list...
            2. ...is a neighbour of a horizontal line...
              1. Nested list!
            • We can type between the lists...
            • ...thanks to Magicline.

            Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.

            Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.

            Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.

            This text is wrapped in a DIV element. We can type after this element though.

            Extreme inline

            Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim.
            Position static
            foo
            Key
            Value
            Whatever

            Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies



            Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies

            foo

            Classic (iframe-based) Editor, H-scroll

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/lineutils/dev/dnd.html0000644000201500020150000001741514515446707024510 0ustar puckpuck Widget Drag & Drop with Lineutils — CKEditor Sample

            CKEditor Samples » Widget Drag & Drop with Lineutils

            Classic (iframe-based) Editor

            Inline Editor

            This table is the very first element of the document.
            We are still able to acces the space before it.
            This table is inside of a cell of another table.
            We can type either before or after it though.


            1. This numbered list...
            2. ...is a neighbour of a horizontal line...
              1. Nested list!
            Saturn V
            Roll out of Saturn V on launch pad
            • We can type between the lists...
            • ...thanks to Magicline.

            Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.

            Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.

            Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.

            This text is wrapped in a DIV element. We can type after this element though.

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/panel/0000755000201500020150000000000014515446711021351 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/panel/plugin.js0000644000201500020150000003076314515446711023216 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ ( function() { CKEDITOR.plugins.add( 'panel', { beforeInit: function( editor ) { editor.ui.addHandler( CKEDITOR.UI_PANEL, CKEDITOR.ui.panel.handler ); } } ); /** * Panel UI element. * * @readonly * @property {String} [='panel'] * @member CKEDITOR */ CKEDITOR.UI_PANEL = 'panel'; /** * @class * @constructor Creates a panel class instance. * @param {CKEDITOR.dom.document} document * @param {Object} definition */ CKEDITOR.ui.panel = function( document, definition ) { // Copy all definition properties to this object. if ( definition ) CKEDITOR.tools.extend( this, definition ); // Set defaults. CKEDITOR.tools.extend( this, { className: '', css: [] } ); this.id = CKEDITOR.tools.getNextId(); this.document = document; this.isFramed = this.forceIFrame || this.css.length; this._ = { blocks: {} }; }; /** * Represents panel handler object. * * @class * @singleton * @extends CKEDITOR.ui.handlerDefinition */ CKEDITOR.ui.panel.handler = { /** * Transforms a panel definition in a {@link CKEDITOR.ui.panel} instance. * * @param {Object} definition * @returns {CKEDITOR.ui.panel} */ create: function( definition ) { return new CKEDITOR.ui.panel( definition ); } }; var panelTpl = CKEDITOR.addTemplate( 'panel', '' ); var frameTpl = CKEDITOR.addTemplate( 'panel-frame', '' ); var frameDocTpl = CKEDITOR.addTemplate( 'panel-frame-inner', '' + '' + '{css}' + '' + '<\/html>' ); /** @class CKEDITOR.ui.panel */ CKEDITOR.ui.panel.prototype = { /** * Renders the combo. * * @param {CKEDITOR.editor} editor The editor instance which this button is * to be used by. * @param {Array} [output] The output array to which append the HTML relative * to this button. */ render: function( editor, output ) { var data = { editorId: editor.id, id: this.id, langCode: editor.langCode, dir: editor.lang.dir, cls: this.className, frame: '', env: CKEDITOR.env.cssClass, 'z-index': editor.config.baseFloatZIndex + 1 }; this.getHolderElement = function() { var holder = this._.holder; if ( !holder ) { if ( this.isFramed ) { var iframe = this.document.getById( this.id + '_frame' ), parentDiv = iframe.getParent(), doc = iframe.getFrameDocument(); // Make it scrollable on iOS. (https://dev.ckeditor.com/ticket/8308) CKEDITOR.env.iOS && parentDiv.setStyles( { 'overflow': 'scroll', '-webkit-overflow-scrolling': 'touch' } ); var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function() { this.isLoaded = true; if ( this.onLoad ) this.onLoad(); }, this ) ); doc.write( frameDocTpl.output( CKEDITOR.tools.extend( { css: CKEDITOR.tools.buildStyleHtml( this.css ), onload: 'window.parent.CKEDITOR.tools.callFunction(' + onLoad + ');' }, data ) ) ); var win = doc.getWindow(); // Register the CKEDITOR global. win.$.CKEDITOR = CKEDITOR; // Arrow keys for scrolling is only preventable with 'keypress' event in Opera (https://dev.ckeditor.com/ticket/4534). doc.on( 'keydown', function( evt ) { var keystroke = evt.data.getKeystroke(), dir = this.document.getById( this.id ).getAttribute( 'dir' ); // Arrow left and right should use native behaviour inside input element if ( evt.data.getTarget().getName() === 'input' && ( keystroke === 37 || keystroke === 39 ) ) { return; } // Delegate key processing to block. if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false ) { if ( !( evt.data.getTarget().getName() === 'input' && keystroke === 32 ) ) { // Don't prevent space when is pressed on a input filed. evt.data.preventDefault(); } return; } // ESC/ARROW-LEFT(ltr) OR ARROW-RIGHT(rtl) if ( keystroke == 27 || keystroke == ( dir == 'rtl' ? 39 : 37 ) ) { if ( this.onEscape && this.onEscape( keystroke ) === false ) evt.data.preventDefault(); } }, this ); holder = doc.getBody(); holder.unselectable(); CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad ); } else { holder = this.document.getById( this.id ); } this._.holder = holder; } return holder; }; if ( this.isFramed ) { // With IE, the custom domain has to be taken care at first, // for other browers, the 'src' attribute should be left empty to // trigger iframe's 'load' event. var src = CKEDITOR.env.air ? 'javascript:void(0)' : // jshint ignore:line ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) ? 'javascript:void(function(){' + encodeURIComponent( // jshint ignore:line 'document.open();' + // In IE, the document domain must be set any time we call document.open(). '(' + CKEDITOR.tools.fixDomain + ')();' + 'document.close();' ) + '}())' : ''; data.frame = frameTpl.output( { id: this.id + '_frame', src: src } ); } var html = panelTpl.output( data ); if ( output ) output.push( html ); return html; }, /** * @todo */ addBlock: function( name, block ) { block = this._.blocks[ name ] = block instanceof CKEDITOR.ui.panel.block ? block : new CKEDITOR.ui.panel.block( this.getHolderElement(), block ); if ( !this._.currentBlock ) this.showBlock( name ); return block; }, /** * @todo */ getBlock: function( name ) { return this._.blocks[ name ]; }, /** * @todo */ showBlock: function( name ) { var blocks = this._.blocks, block = blocks[ name ], current = this._.currentBlock; // ARIA role works better in IE on the body element, while on the iframe // for FF. (https://dev.ckeditor.com/ticket/8864) var holder = !this.forceIFrame || CKEDITOR.env.ie ? this._.holder : this.document.getById( this.id + '_frame' ); if ( current ) current.hide(); this._.currentBlock = block; CKEDITOR.fire( 'ariaWidget', holder ); // Reset the focus index, so it will always go into the first one. block._.focusIndex = -1; this._.onKeyDown = block.onKeyDown && CKEDITOR.tools.bind( block.onKeyDown, block ); block.show(); return block; }, /** * @todo */ destroy: function() { this.element && this.element.remove(); } }; /** * @class * * @todo class and all methods */ CKEDITOR.ui.panel.block = CKEDITOR.tools.createClass( { /** * Creates a block class instances. * * @constructor * @todo */ $: function( blockHolder, blockDefinition ) { this.element = blockHolder.append( blockHolder.getDocument().createElement( 'div', { attributes: { 'tabindex': -1, 'class': 'cke_panel_block' }, styles: { display: 'none' } } ) ); // Copy all definition properties to this object. if ( blockDefinition ) CKEDITOR.tools.extend( this, blockDefinition ); // Set the a11y attributes of this element ... this.element.setAttributes( { 'role': this.attributes.role || 'presentation', 'aria-label': this.attributes[ 'aria-label' ], 'title': this.attributes.title || this.attributes[ 'aria-label' ] } ); this.keys = {}; this._.focusIndex = -1; // Disable context menu for panels. this.element.disableContextMenu(); }, _: { /** * Mark the item specified by the index as current activated. */ markItem: function( index ) { if ( index == -1 ) return; var focusables = this._.getItems(); var item = focusables.getItem( this._.focusIndex = index ); // Safari need focus on the iframe window first(https://dev.ckeditor.com/ticket/3389), but we need // lock the blur to avoid hiding the panel. if ( CKEDITOR.env.webkit ) item.getDocument().getWindow().focus(); item.focus(); this.onMark && this.onMark( item ); }, /** * Marks the first visible item or the one whose `aria-selected` attribute is set to `true`. * The latter has priority over the former. * * @private * @param beforeMark function to be executed just before marking. * Used in cases when any preparatory cleanup (like unmarking all items) would simultaneously * destroy the information that is needed to determine the focused item. */ markFirstDisplayed: function( beforeMark ) { var notDisplayed = function( element ) { return element.type == CKEDITOR.NODE_ELEMENT && element.getStyle( 'display' ) == 'none'; }, focusables = this._.getItems(), item, focused; for ( var i = focusables.count() - 1; i >= 0; i-- ) { item = focusables.getItem( i ); if ( !item.getAscendant( notDisplayed ) ) { focused = item; this._.focusIndex = i; } if ( item.getAttribute( 'aria-selected' ) == 'true' ) { focused = item; this._.focusIndex = i; break; } } if ( !focused ) { return; } if ( beforeMark ) { beforeMark(); } if ( CKEDITOR.env.webkit ) focused.getDocument().getWindow().focus(); focused.focus(); this.onMark && this.onMark( focused ); }, /** * Returns a `CKEDITOR.dom.nodeList` of block items. * * @returns {CKEDITOR.dom.nodeList} */ getItems: function() { return this.element.find( 'a,input' ); } }, proto: { show: function() { this.element.setStyle( 'display', '' ); }, hide: function() { if ( !this.onHide || this.onHide.call( this ) !== true ) this.element.setStyle( 'display', 'none' ); }, onKeyDown: function( keystroke, noCycle ) { var keyAction = this.keys[ keystroke ]; switch ( keyAction ) { // Move forward. case 'next': var index = this._.focusIndex, focusables = this._.getItems(), focusable; while ( ( focusable = focusables.getItem( ++index ) ) ) { // Move the focus only if the element is marked with // the _cke_focus and it it's visible (check if it has // width). if ( focusable.getAttribute( '_cke_focus' ) && focusable.$.offsetWidth ) { this._.focusIndex = index; focusable.focus( true ); break; } } // If no focusable was found, cycle and restart from the top. (https://dev.ckeditor.com/ticket/11125) if ( !focusable && !noCycle ) { this._.focusIndex = -1; return this.onKeyDown( keystroke, 1 ); } return false; // Move backward. case 'prev': index = this._.focusIndex; focusables = this._.getItems(); while ( index > 0 && ( focusable = focusables.getItem( --index ) ) ) { // Move the focus only if the element is marked with // the _cke_focus and it it's visible (check if it has // width). if ( focusable.getAttribute( '_cke_focus' ) && focusable.$.offsetWidth ) { this._.focusIndex = index; focusable.focus( true ); break; } // Make sure focusable is null when the loop ends and nothing was // found (https://dev.ckeditor.com/ticket/11125). focusable = null; } // If no focusable was found, cycle and restart from the bottom. (https://dev.ckeditor.com/ticket/11125) if ( !focusable && !noCycle ) { this._.focusIndex = focusables.count(); return this.onKeyDown( keystroke, 1 ); } return false; case 'click': case 'mouseup': index = this._.focusIndex; focusable = index >= 0 && this._.getItems().getItem( index ); if ( focusable ) { // We must pass info about clicked button (#2857). focusable.fireEventHandler( keyAction, { button: CKEDITOR.tools.normalizeMouseButton( CKEDITOR.MOUSE_BUTTON_LEFT, true ) } ); } return false; } return true; } } } ); } )(); /** * Fired when a panel is added to the document. * * @event ariaWidget * @member CKEDITOR * @param {Object} data The element wrapping the panel. */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/floatpanel/0000755000201500020150000000000014515446705022402 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/floatpanel/plugin.js0000644000201500020150000005003614515446705024242 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.add( 'floatpanel', { requires: 'panel' } ); ( function() { var panels = {}; function getPanel( editor, doc, parentElement, definition, level ) { // Generates the panel key: docId-eleId-skinName-langDir[-uiColor][-CSSs][-level] var key = CKEDITOR.tools.genKey( doc.getUniqueId(), parentElement.getUniqueId(), editor.lang.dir, editor.uiColor || '', definition.css || '', level || '' ), panel = panels[ key ]; if ( !panel ) { panel = panels[ key ] = new CKEDITOR.ui.panel( doc, definition ); panel.element = parentElement.append( CKEDITOR.dom.element.createFromHtml( panel.render( editor ), doc ) ); panel.element.setStyles( { display: 'none', position: 'absolute' } ); } return panel; } /** * Represents a floating panel UI element. * * It is reused by rich combos, color combos, menus, etc. * and it renders its content using {@link CKEDITOR.ui.panel}. * * @class * @todo */ CKEDITOR.ui.floatPanel = CKEDITOR.tools.createClass( { /** * Creates a floatPanel class instance. * * @constructor * @param {CKEDITOR.editor} editor * @param {CKEDITOR.dom.element} parentElement * @param {Object} definition Definition of the panel that will be floating. * @param {Number} level */ $: function( editor, parentElement, definition, level ) { definition.forceIFrame = 1; // In case of editor with floating toolbar append panels that should float // to the main UI element. if ( definition.toolbarRelated && editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ) parentElement = CKEDITOR.document.getById( 'cke_' + editor.name ); var doc = parentElement.getDocument(), panel = getPanel( editor, doc, parentElement, definition, level || 0 ), element = panel.element, iframe = element.getFirst(), that = this; // Disable native browser menu. (https://dev.ckeditor.com/ticket/4825) element.disableContextMenu(); this.element = element; this._ = { editor: editor, // The panel that will be floating. panel: panel, parentElement: parentElement, definition: definition, document: doc, iframe: iframe, children: [], dir: editor.lang.dir, showBlockParams: null, markFirst: definition.markFirst !== undefined ? definition.markFirst : true }; editor.on( 'mode', hide ); editor.on( 'resize', hide ); // When resize of the window is triggered floatpanel should be repositioned according to new dimensions. // https://dev.ckeditor.com/ticket/11724. Fixes issue with undesired panel hiding on Android and iOS. doc.getWindow().on( 'resize', function() { this.reposition(); }, this ); // We need a wrapper because events implementation doesn't allow to attach // one listener more than once for the same event on the same object. // Remember that floatPanel#hide is shared between all instances. function hide() { that.hide(); } }, proto: { /** * @todo */ addBlock: function( name, block ) { return this._.panel.addBlock( name, block ); }, /** * @todo */ addListBlock: function( name, multiSelect ) { return this._.panel.addListBlock( name, multiSelect ); }, /** * @todo */ getBlock: function( name ) { return this._.panel.getBlock( name ); }, /** * Shows the panel block. * * @param {String} name * @param {CKEDITOR.dom.element} offsetParent Positioned parent. * @param {Number} corner * * * For LTR (left to right) oriented editor: * * `1` = top-left * * `2` = top-right * * `3` = bottom-right * * `4` = bottom-left * * For RTL (right to left): * * `1` = top-right * * `2` = top-left * * `3` = bottom-left * * `4` = bottom-right * * @param {Number} [offsetX=0] * @param {Number} [offsetY=0] * @param {Function} [callback] A callback function executed when block positioning is done. * @todo what do exactly these params mean (especially corner)? */ showBlock: function( name, offsetParent, corner, offsetX, offsetY, callback ) { var panel = this._.panel, block = panel.showBlock( name ); this._.showBlockParams = [].slice.call( arguments ); this.allowBlur( false ); // Record from where the focus is when open panel. var editable = this._.editor.editable(); this._.returnFocus = editable.hasFocus ? editable : new CKEDITOR.dom.element( CKEDITOR.document.$.activeElement ); this._.hideTimeout = 0; var element = this.element, iframe = this._.iframe, // Edge prefers iframe's window to the iframe, just like the rest of the browsers (https://dev.ckeditor.com/ticket/13143). focused = CKEDITOR.env.ie && !CKEDITOR.env.edge ? iframe : new CKEDITOR.dom.window( iframe.$.contentWindow ), doc = element.getDocument(), positionedAncestor = this._.parentElement.getPositionedAncestor(), position = offsetParent.getDocumentPosition( doc ), positionedAncestorPosition = positionedAncestor ? positionedAncestor.getDocumentPosition( doc ) : { x: 0, y: 0 }, rtl = this._.dir == 'rtl', left = position.x + ( offsetX || 0 ) - positionedAncestorPosition.x, top = position.y + ( offsetY || 0 ) - positionedAncestorPosition.y; // Floating panels are off by (-1px, 0px) in RTL mode. (https://dev.ckeditor.com/ticket/3438) if ( rtl && ( corner == 1 || corner == 4 ) ) left += offsetParent.$.offsetWidth; else if ( !rtl && ( corner == 2 || corner == 3 ) ) left += offsetParent.$.offsetWidth - 1; if ( corner == 3 || corner == 4 ) top += offsetParent.$.offsetHeight - 1; // Memorize offsetParent by it's ID. this._.panel._.offsetParentId = offsetParent.getId(); element.setStyles( { top: top + 'px', left: 0, display: '' } ); // Don't use display or visibility style because we need to // calculate the rendering layout later and focus the element. element.setOpacity( 0 ); // To allow the context menu to decrease back their width element.getFirst().removeStyle( 'width' ); // Report to focus manager. this._.editor.focusManager.add( focused ); // Configure the IFrame blur event. Do that only once. if ( !this._.blurSet ) { // With addEventListener compatible browsers, we must // useCapture when registering the focus/blur events to // guarantee they will be firing in all situations. (https://dev.ckeditor.com/ticket/3068, https://dev.ckeditor.com/ticket/3222 ) CKEDITOR.event.useCapture = true; focused.on( 'blur', function( ev ) { // As we are using capture to register the listener, // the blur event may get fired even when focusing // inside the window itself, so we must ensure the // target is out of it. if ( !this.allowBlur() || ev.data.getPhase() != CKEDITOR.EVENT_PHASE_AT_TARGET ) return; if ( this.visible && !this._.activeChild ) { // [iOS] Allow hide to be prevented if touch is bound // to any parent of the iframe blur happens before touch (https://dev.ckeditor.com/ticket/10714). if ( CKEDITOR.env.iOS ) { if ( !this._.hideTimeout ) this._.hideTimeout = CKEDITOR.tools.setTimeout( doHide, 0, this ); } else { doHide.call( this ); } } function doHide() { // Panel close is caused by user's navigating away the focus, e.g. click outside the panel. // DO NOT restore focus in this case. delete this._.returnFocus; this.hide(); } }, this ); focused.on( 'focus', function() { this._.focused = true; this.hideChild(); this.allowBlur( true ); }, this ); // [iOS] if touch is bound to any parent of the iframe blur // happens twice before touchstart and before touchend (https://dev.ckeditor.com/ticket/10714). if ( CKEDITOR.env.iOS ) { // Prevent false hiding on blur. // We don't need to return focus here because touchend will fire anyway. // If user scrolls and pointer gets out of the panel area touchend will also fire. focused.on( 'touchstart', function() { clearTimeout( this._.hideTimeout ); }, this ); // Set focus back to handle blur and hide panel when needed. focused.on( 'touchend', function() { this._.hideTimeout = 0; this.focus(); }, this ); } CKEDITOR.event.useCapture = false; this._.blurSet = 1; } panel.onEscape = CKEDITOR.tools.bind( function( keystroke ) { if ( this.onEscape && this.onEscape( keystroke ) === false ) return false; }, this ); CKEDITOR.tools.setTimeout( function() { var panelLoad = CKEDITOR.tools.bind( function() { var target = element; // Reset panel width as the new content can be narrower // than the old one. (https://dev.ckeditor.com/ticket/9355) target.removeStyle( 'width' ); if ( block.autoSize ) { var panelDoc = block.element.getDocument(), width = ( ( CKEDITOR.env.webkit || CKEDITOR.env.edge ) ? block.element : panelDoc.getBody() ).$.scrollWidth; // Account for extra height needed due to IE quirks box model bug: // http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug // (https://dev.ckeditor.com/ticket/3426) if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && width > 0 ) width += ( target.$.offsetWidth || 0 ) - ( target.$.clientWidth || 0 ) + 3; // Add some extra pixels to improve the appearance. width += 10; target.setStyle( 'width', width + 'px' ); var height = block.element.$.scrollHeight; // Account for extra height needed due to IE quirks box model bug: // http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug // (https://dev.ckeditor.com/ticket/3426) if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && height > 0 ) height += ( target.$.offsetHeight || 0 ) - ( target.$.clientHeight || 0 ) + 3; target.setStyle( 'height', height + 'px' ); // Fix IE < 8 visibility. panel._.currentBlock.element.setStyle( 'display', 'none' ).removeStyle( 'display' ); } else { target.removeStyle( 'height' ); } // Flip panel layout horizontally in RTL with known width. if ( rtl ) left -= element.$.offsetWidth; // Pop the style now for measurement. element.setStyle( 'left', left + 'px' ); /* panel layout smartly fit the viewport size. */ var panelElement = panel.element, panelWindow = panelElement.getWindow(), rect = element.$.getBoundingClientRect(), viewportSize = panelWindow.getViewPaneSize(); // Compensation for browsers that dont support "width" and "height". var rectWidth = rect.width || rect.right - rect.left, rectHeight = rect.height || rect.bottom - rect.top; // Check if default horizontal layout is impossible. var spaceAfter = rtl ? rect.right : viewportSize.width - rect.left, spaceBefore = rtl ? viewportSize.width - rect.right : rect.left; if ( rtl ) { if ( spaceAfter < rectWidth ) { // Flip to show on right. if ( spaceBefore > rectWidth ) left += rectWidth; // Align to window left. else if ( viewportSize.width > rectWidth ) left = left - rect.left; // Align to window right, never cutting the panel at right. else left = left - rect.right + viewportSize.width; } } else if ( spaceAfter < rectWidth ) { // Flip to show on left. if ( spaceBefore > rectWidth ) left -= rectWidth; // Align to window right. else if ( viewportSize.width > rectWidth ) left = left - rect.right + viewportSize.width; // Align to window left, never cutting the panel at left. else left = left - rect.left; } // Check if the default vertical layout is possible. var spaceBelow = viewportSize.height - rect.top, spaceAbove = rect.top; if ( spaceBelow < rectHeight ) { // Flip to show above. if ( spaceAbove > rectHeight ) top -= rectHeight; // Align to window bottom. else if ( viewportSize.height > rectHeight ) top = top - rect.bottom + viewportSize.height; // Align to top, never cutting the panel at top. else top = top - rect.top; } // If IE is in RTL, we have troubles with absolute // position and horizontal scrolls. Here we have a // series of hacks to workaround it. (https://dev.ckeditor.com/ticket/6146) if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) { var offsetParent = element.$.offsetParent && new CKEDITOR.dom.element( element.$.offsetParent ), scrollParent = offsetParent; // Quirks returns , but standards returns . if ( scrollParent && scrollParent.getName() == 'html' ) { scrollParent = scrollParent.getDocument().getBody(); } if ( scrollParent && scrollParent.getComputedStyle( 'direction' ) == 'rtl' ) { // For IE8, there is not much logic on this, but it works. if ( CKEDITOR.env.ie8Compat ) { left -= element.getDocument().getDocumentElement().$.scrollLeft * 2; } else { left -= ( offsetParent.$.scrollWidth - offsetParent.$.clientWidth ); } } } // Trigger the onHide event of the previously active panel to prevent // incorrect styles from being applied (https://dev.ckeditor.com/ticket/6170) var innerElement = element.getFirst(), activePanel; if ( ( activePanel = innerElement.getCustomData( 'activePanel' ) ) ) activePanel.onHide && activePanel.onHide.call( this, 1 ); innerElement.setCustomData( 'activePanel', this ); element.setStyles( { top: top + 'px', left: left + 'px' } ); element.setOpacity( 1 ); callback && callback(); }, this ); panel.isLoaded ? panelLoad() : panel.onLoad = panelLoad; CKEDITOR.tools.setTimeout( function() { var scrollTop = CKEDITOR.env.webkit && CKEDITOR.document.getWindow().getScrollPosition().y; // Focus the panel frame first, so blur gets fired. this.focus(); // Focus the block now. block.element.focus(); // https://dev.ckeditor.com/ticket/10623, https://dev.ckeditor.com/ticket/10951 - restore the viewport's scroll position after focusing list element. if ( CKEDITOR.env.webkit ) CKEDITOR.document.getBody().$.scrollTop = scrollTop; // We need this get fired manually because of unfired focus() function. this.allowBlur( true ); // Ensure that the first item is focused (https://dev.ckeditor.com/ticket/16804). if ( this._.markFirst ) { if ( CKEDITOR.env.ie ) { CKEDITOR.tools.setTimeout( function() { block.markFirstDisplayed ? block.markFirstDisplayed() : block._.markFirstDisplayed(); }, 0 ); } else { block.markFirstDisplayed ? block.markFirstDisplayed() : block._.markFirstDisplayed(); } } this._.editor.fire( 'panelShow', this ); }, 0, this ); }, CKEDITOR.env.air ? 200 : 0, this ); this.visible = 1; if ( this.onShow ) this.onShow.call( this ); }, /** * Repositions the panel with the same parameters that were used in the last {@link #showBlock} call. * * @since 4.5.4 */ reposition: function() { var blockParams = this._.showBlockParams; if ( this.visible && this._.showBlockParams ) { this.hide(); this.showBlock.apply( this, blockParams ); } }, /** * Restores the last focused element or simply focuses the panel window. */ focus: function() { // Webkit requires to blur any previous focused page element, in // order to properly fire the "focus" event. if ( CKEDITOR.env.webkit ) { var active = CKEDITOR.document.getActive(); active && !active.equals( this._.iframe ) && active.$.blur(); } // Restore last focused element or simply focus panel window. var focus = this._.lastFocused || this._.iframe.getFrameDocument().getWindow(); focus.focus(); }, /** * @todo */ blur: function() { var doc = this._.iframe.getFrameDocument(), active = doc.getActive(); active && active.is( 'a' ) && ( this._.lastFocused = active ); }, /** * Hides the panel. * * @todo */ hide: function( returnFocus ) { if ( this.visible && ( !this.onHide || this.onHide.call( this ) !== true ) ) { this.hideChild(); // Blur previously focused element. (https://dev.ckeditor.com/ticket/6671) CKEDITOR.env.gecko && this._.iframe.getFrameDocument().$.activeElement.blur(); this.element.setStyle( 'display', 'none' ); this.visible = 0; this.element.getFirst().removeCustomData( 'activePanel' ); // Return focus properly. (https://dev.ckeditor.com/ticket/6247) var focusReturn = returnFocus && this._.returnFocus; if ( focusReturn ) { // Webkit requires focus moved out panel iframe first. if ( CKEDITOR.env.webkit && focusReturn.type ) focusReturn.getWindow().$.focus(); focusReturn.focus(); } delete this._.lastFocused; this._.showBlockParams = null; this._.editor.fire( 'panelHide', this ); } }, /** * @todo */ allowBlur: function( allow ) { // Prevent editor from hiding the panel. (https://dev.ckeditor.com/ticket/3222) var panel = this._.panel; if ( allow !== undefined ) panel.allowBlur = allow; return panel.allowBlur; }, /** * Shows the specified panel as a child of one block of this one. * * @param {CKEDITOR.ui.floatPanel} panel * @param {String} blockName * @param {CKEDITOR.dom.element} offsetParent Positioned parent. * @param {Number} corner * * * For LTR (left to right) oriented editor: * * `1` = top-left * * `2` = top-right * * `3` = bottom-right * * `4` = bottom-left * * For RTL (right to left): * * `1` = top-right * * `2` = top-left * * `3` = bottom-left * * `4` = bottom-right * * @param {Number} [offsetX=0] * @param {Number} [offsetY=0] * @todo */ showAsChild: function( panel, blockName, offsetParent, corner, offsetX, offsetY ) { // Skip reshowing of child which is already visible. if ( this._.activeChild == panel && panel._.panel._.offsetParentId == offsetParent.getId() ) return; this.hideChild(); panel.onHide = CKEDITOR.tools.bind( function() { // Use a timeout, so we give time for this menu to get // potentially focused. CKEDITOR.tools.setTimeout( function() { if ( !this._.focused ) this.hide(); }, 0, this ); }, this ); this._.activeChild = panel; this._.focused = false; panel.showBlock( blockName, offsetParent, corner, offsetX, offsetY ); this.blur(); /* https://dev.ckeditor.com/ticket/3767 IE: Second level menu may not have borders */ if ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) { setTimeout( function() { panel.element.getChild( 0 ).$.style.cssText += ''; }, 100 ); } }, /** * @todo */ hideChild: function( restoreFocus ) { var activeChild = this._.activeChild; if ( activeChild ) { delete activeChild.onHide; delete this._.activeChild; activeChild.hide(); // At this point focus should be moved back to parent panel. restoreFocus && this.focus(); } } } } ); CKEDITOR.on( 'instanceDestroyed', function() { var isLastInstance = CKEDITOR.tools.isEmpty( CKEDITOR.instances ); for ( var i in panels ) { var panel = panels[ i ]; // Safe to destroy it since there're no more instances.(https://dev.ckeditor.com/ticket/4241) if ( isLastInstance ) panel.destroy(); // Panel might be used by other instances, just hide them.(https://dev.ckeditor.com/ticket/4552) else panel.element.hide(); } // Remove the registration. isLastInstance && ( panels = {} ); } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/notificationaggregator/0000755000201500020150000000000014515446711025003 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/notificationaggregator/plugin.js0000644000201500020150000003537714515446711026656 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview The "Notification Aggregator" plugin. * */ ( function() { 'use strict'; CKEDITOR.plugins.add( 'notificationaggregator', { requires: 'notification' } ); /** * An aggregator of multiple tasks (progresses) which should be displayed using one * {@link CKEDITOR.plugins.notification notification}. * * Once all the tasks are done, it means that the whole process is finished and the {@link #finished} * event will be fired. * * New tasks can be created after the previous set of tasks is finished. This will continue the process and * fire the {@link #finished} event again when it is done. * * Simple usage example: * * // Declare one aggregator that will be used for all tasks. * var aggregator; * * // ... * * // Create a new aggregator if the previous one finished all tasks. * if ( !aggregator || aggregator.isFinished() ) { * // Create a new notification aggregator instance. * aggregator = new CKEDITOR.plugins.notificationAggregator( editor, 'Loading process, step {current} of {max}...' ); * * // Change the notification type to 'success' on finish. * aggregator.on( 'finished', function() { * aggregator.notification.update( { message: 'Done', type: 'success' } ); * } ); * } * * // Create 3 tasks. * var taskA = aggregator.createTask(), * taskB = aggregator.createTask(), * taskC = aggregator.createTask(); * * // At this point the notification contains a message: "Loading process, step 0 of 3...". * * // Let's close the first one immediately. * taskA.done(); // "Loading process, step 1 of 3...". * * // One second later the message will be: "Loading process, step 2 of 3...". * setTimeout( function() { * taskB.done(); * }, 1000 ); * * // Two seconds after the previous message the last task will be completed, meaning that * // the notification will be closed. * setTimeout( function() { * taskC.done(); * }, 3000 ); * * @since 4.5.0 * @class CKEDITOR.plugins.notificationAggregator * @mixins CKEDITOR.event * @constructor Creates a notification aggregator instance. * @param {CKEDITOR.editor} editor * @param {String} message The template for the message to be displayed in the notification. The template can use * the following variables: * * * `{current}` – The number of completed tasks. * * `{max}` – The number of tasks. * * `{percentage}` – The progress (number 0-100). * * @param {String/null} [singularMessage=null] An optional template for the message to be displayed in the notification * when there is only one task remaining. This template can use the same variables as the `message` template. * If `null`, then the `message` template will be used. */ function Aggregator( editor, message, singularMessage ) { /** * @readonly * @property {CKEDITOR.editor} editor */ this.editor = editor; /** * Notification created by the aggregator. * * The notification object is modified as aggregator tasks are being closed. * * @readonly * @property {CKEDITOR.plugins.notification/null} */ this.notification = null; /** * A template for the notification message. * * The template can use the following variables: * * * `{current}` – The number of completed tasks. * * `{max}` – The number of tasks. * * `{percentage}` – The progress (number 0-100). * * @private * @property {CKEDITOR.template} */ this._message = new CKEDITOR.template( message ); /** * A template for the notification message used when only one task is loading. * * Sometimes there might be a need to specify a special message when there * is only one task loading, and to display standard messages in other cases. * * For example, you might want to show a message "Translating a widget" rather than * "Translating widgets (1 of 1)", but still you would want to have a message * "Translating widgets (2 of 3)" if more widgets are being translated at the same * time. * * Template variables are the same as in {@link #_message}. * * @private * @property {CKEDITOR.template/null} */ this._singularMessage = singularMessage ? new CKEDITOR.template( singularMessage ) : null; // Set the _tasks, _totalWeights, _doneWeights, _doneTasks properties. this._tasks = []; this._totalWeights = 0; this._doneWeights = 0; this._doneTasks = 0; /** * Array of tasks tracked by the aggregator. * * @private * @property {CKEDITOR.plugins.notificationAggregator.task[]} _tasks */ /** * Stores the sum of declared weights for all contained tasks. * * @private * @property {Number} _totalWeights */ /** * Stores the sum of done weights for all contained tasks. * * @private * @property {Number} _doneWeights */ /** * Stores the count of tasks done. * * @private * @property {Number} _doneTasks */ } Aggregator.prototype = { /** * Creates a new task that can be updated to indicate the progress. * * @param [options] Options object for the task creation. * @param [options.weight] For more information about weight, see the * {@link CKEDITOR.plugins.notificationAggregator.task} overview. * @returns {CKEDITOR.plugins.notificationAggregator.task} An object that represents the task state, and allows * for its manipulation. */ createTask: function( options ) { options = options || {}; var initialTask = !this.notification, task; if ( initialTask ) { // It's a first call. this.notification = this._createNotification(); } task = this._addTask( options ); task.on( 'updated', this._onTaskUpdate, this ); task.on( 'done', this._onTaskDone, this ); task.on( 'canceled', function() { this._removeTask( task ); }, this ); // Update the aggregator. this.update(); if ( initialTask ) { this.notification.show(); } return task; }, /** * Triggers an update on the aggregator, meaning that its UI will be refreshed. * * When all the tasks are done, the {@link #finished} event is fired. */ update: function() { this._updateNotification(); if ( this.isFinished() ) { this.fire( 'finished' ); } }, /** * Returns a number from `0` to `1` representing the done weights to total weights ratio * (showing how many of the tasks are done). * * Note: For an empty aggregator (without any tasks created) it will return `1`. * * @returns {Number} Returns the percentage of tasks done as a number ranging from `0` to `1`. */ getPercentage: function() { // In case there are no weights at all we'll return 1. if ( this.getTaskCount() === 0 ) { return 1; } return this._doneWeights / this._totalWeights; }, /** * @returns {Boolean} Returns `true` if all notification tasks are done * (or there are no tasks at all). */ isFinished: function() { return this.getDoneTaskCount() === this.getTaskCount(); }, /** * @returns {Number} Returns a total tasks count. */ getTaskCount: function() { return this._tasks.length; }, /** * @returns {Number} Returns the number of tasks done. */ getDoneTaskCount: function() { return this._doneTasks; }, /** * Updates the notification content. * * @private */ _updateNotification: function() { this.notification.update( { message: this._getNotificationMessage(), progress: this.getPercentage() } ); }, /** * Returns a message used in the notification. * * @private * @returns {String} */ _getNotificationMessage: function() { var tasksCount = this.getTaskCount(), doneTasks = this.getDoneTaskCount(), templateParams = { current: doneTasks, max: tasksCount, percentage: Math.round( this.getPercentage() * 100 ) }, template; // If there's only one remaining task and we have a singular message, we should use it. if ( tasksCount == 1 && this._singularMessage ) { template = this._singularMessage; } else { template = this._message; } return template.output( templateParams ); }, /** * Creates a notification object. * * @private * @returns {CKEDITOR.plugins.notification} */ _createNotification: function() { return new CKEDITOR.plugins.notification( this.editor, { type: 'progress' } ); }, /** * Creates a {@link CKEDITOR.plugins.notificationAggregator.task} instance based * on `options`, and adds it to the task list. * * @private * @param options Options object coming from the {@link #createTask} method. * @returns {CKEDITOR.plugins.notificationAggregator.task} */ _addTask: function( options ) { var task = new Task( options.weight ); this._tasks.push( task ); this._totalWeights += task._weight; return task; }, /** * Removes a given task from the {@link #_tasks} array and updates the UI. * * @private * @param {CKEDITOR.plugins.notificationAggregator.task} task Task to be removed. */ _removeTask: function( task ) { var index = CKEDITOR.tools.indexOf( this._tasks, task ); if ( index !== -1 ) { // If task was already updated with some weight, we need to remove // this weight from our cache. if ( task._doneWeight ) { this._doneWeights -= task._doneWeight; } this._totalWeights -= task._weight; this._tasks.splice( index, 1 ); // And we also should inform the UI about this change. this.update(); } }, /** * A listener called on the {@link CKEDITOR.plugins.notificationAggregator.task#update} event. * * @private * @param {CKEDITOR.eventInfo} evt Event object of the {@link CKEDITOR.plugins.notificationAggregator.task#update} event. */ _onTaskUpdate: function( evt ) { this._doneWeights += evt.data; this.update(); }, /** * A listener called on the {@link CKEDITOR.plugins.notificationAggregator.task#event-done} event. * * @private * @param {CKEDITOR.eventInfo} evt Event object of the {@link CKEDITOR.plugins.notificationAggregator.task#event-done} event. */ _onTaskDone: function() { this._doneTasks += 1; this.update(); } }; CKEDITOR.event.implementOn( Aggregator.prototype ); /** * # Overview * * This type represents a single task in the aggregator, and exposes methods to manipulate its state. * * ## Weights * * Task progess is based on its **weight**. * * As you create a task, you need to declare its weight. As you want the update to inform about the * progress, you will need to {@link #update} the task, telling how much of this weight is done. * * For example, if you declare that your task has a weight that equals `50` and then call `update` with `10`, * you will end up with telling that the task is done in 20%. * * ### Example Usage of Weights * * Let us say that you use tasks for file uploading. * * A single task is associated with a single file upload. You can use the file size in bytes as a weight, * and then as the file upload progresses you just call the `update` method with the number of bytes actually * downloaded. * * @since 4.5.0 * @class CKEDITOR.plugins.notificationAggregator.task * @mixins CKEDITOR.event * @constructor Creates a task instance for notification aggregator. * @param {Number} [weight=1] */ function Task( weight ) { /** * Total weight of the task. * * @private * @property {Number} */ this._weight = weight || 1; /** * Done weight of the task. * * @private * @property {Number} */ this._doneWeight = 0; /** * Indicates when the task is canceled. * * @private * @property {Boolean} */ this._isCanceled = false; } Task.prototype = { /** * Marks the task as done. */ done: function() { this.update( this._weight ); }, /** * Updates the done weight of a task. * * @param {Number} weight Number indicating how much of the total task {@link #_weight} is done. */ update: function( weight ) { // If task is already done or canceled there is no need to update it, and we don't expect // progress to be reversed. if ( this.isDone() || this.isCanceled() ) { return; } // Note that newWeight can't be higher than _doneWeight. var newWeight = Math.min( this._weight, weight ), weightChange = newWeight - this._doneWeight; this._doneWeight = newWeight; // Fire updated event even if task is done in order to correctly trigger updating the // notification's message. If we wouldn't do this, then the last weight change would be ignored. this.fire( 'updated', weightChange ); if ( this.isDone() ) { this.fire( 'done' ); } }, /** * Cancels the task (the task will be removed from the aggregator). */ cancel: function() { // If task is already done or canceled. if ( this.isDone() || this.isCanceled() ) { return; } // Mark task as canceled. this._isCanceled = true; // We'll fire cancel event it's up to aggregator to listen for this event, // and remove the task. this.fire( 'canceled' ); }, /** * Checks if the task is done. * * @returns {Boolean} */ isDone: function() { return this._weight === this._doneWeight; }, /** * Checks if the task is canceled. * * @returns {Boolean} */ isCanceled: function() { return this._isCanceled; } }; CKEDITOR.event.implementOn( Task.prototype ); /** * Fired when all tasks are done. When this event occurs, the notification may change its type to `success` or be hidden: * * aggregator.on( 'finished', function() { * if ( aggregator.getTaskCount() == 0 ) { * aggregator.notification.hide(); * } else { * aggregator.notification.update( { message: 'Done', type: 'success' } ); * } * } ); * * @event finished * @member CKEDITOR.plugins.notificationAggregator */ /** * Fired upon each weight update of the task. * * var myTask = new Task( 100 ); * myTask.update( 30 ); * // Fires updated event with evt.data = 30. * myTask.update( 40 ); * // Fires updated event with evt.data = 10. * myTask.update( 20 ); * // Fires updated event with evt.data = -20. * * @event updated * @param {Number} data The difference between the new weight and the previous one. * @member CKEDITOR.plugins.notificationAggregator.task */ /** * Fired when the task is done. * * @event done * @member CKEDITOR.plugins.notificationAggregator.task */ /** * Fired when the task is canceled. * * @event canceled * @member CKEDITOR.plugins.notificationAggregator.task */ // Expose Aggregator type. CKEDITOR.plugins.notificationAggregator = Aggregator; CKEDITOR.plugins.notificationAggregator.task = Task; } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/0000755000201500020150000000000014515446712021342 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/table/plugin.js0000755000201500020150000001147214515446712023206 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.add( 'table', { requires: 'dialog', // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'table', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { if ( editor.blockless ) return; var lang = editor.lang.table; editor.addCommand( 'table', new CKEDITOR.dialogCommand( 'table', { context: 'table', allowedContent: 'table{width,height,border-collapse}[align,border,cellpadding,cellspacing,summary];' + 'caption tbody thead tfoot;' + 'th td tr[scope];' + 'td{border*,background-color,vertical-align,width,height}[colspan,rowspan];' + ( editor.plugins.dialogadvtab ? 'table' + editor.plugins.dialogadvtab.allowedContent() : '' ), requiredContent: 'table', contentTransformations: [ [ 'table{width}: sizeToStyle', 'table[width]: sizeToAttribute' ], [ 'td: splitBorderShorthand' ], [ { element: 'table', right: function( element ) { if ( element.styles ) { var parsedStyle; if ( element.styles.border ) { parsedStyle = CKEDITOR.tools.style.parse.border( element.styles.border ); } else if ( CKEDITOR.env.ie && CKEDITOR.env.version === 8 ) { var styleData = element.styles; // Workaround for IE8 browser. It transforms CSS border shorthand property // to the longer one, consisting of border-top, border-right, etc. We have to check // if all those properties exists and have the same value (#566). if ( styleData[ 'border-left' ] && styleData[ 'border-left' ] === styleData[ 'border-right' ] && styleData[ 'border-right' ] === styleData[ 'border-top' ] && styleData[ 'border-top' ] === styleData[ 'border-bottom' ] ) { parsedStyle = CKEDITOR.tools.style.parse.border( styleData[ 'border-top' ] ); } } if ( parsedStyle && parsedStyle.style && parsedStyle.style === 'solid' && parsedStyle.width && parseFloat( parsedStyle.width ) !== 0 ) { element.attributes.border = 1; } if ( element.styles[ 'border-collapse' ] == 'collapse' ) { element.attributes.cellspacing = 0; } } } } ] ] } ) ); function createDef( def ) { return CKEDITOR.tools.extend( def || {}, { contextSensitive: 1, refresh: function( editor, path ) { this.setState( path.contains( 'table', 1 ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); } } ); } editor.addCommand( 'tableProperties', new CKEDITOR.dialogCommand( 'tableProperties', createDef() ) ); editor.addCommand( 'tableDelete', createDef( { exec: function( editor ) { var path = editor.elementPath(), table = path.contains( 'table', 1 ); if ( !table ) return; // If the table's parent has only one child remove it as well (unless it's a table cell, or the editable element) //(https://dev.ckeditor.com/ticket/5416, https://dev.ckeditor.com/ticket/6289, https://dev.ckeditor.com/ticket/12110) var parent = table.getParent(), editable = editor.editable(); if ( parent.getChildCount() == 1 && !parent.is( 'td', 'th' ) && !parent.equals( editable ) ) table = parent; var range = editor.createRange(); range.moveToPosition( table, CKEDITOR.POSITION_BEFORE_START ); table.remove(); range.select(); } } ) ); editor.ui.addButton && editor.ui.addButton( 'Table', { label: lang.toolbar, command: 'table', toolbar: 'insert,30' } ); CKEDITOR.dialog.add( 'table', this.path + 'dialogs/table.js' ); CKEDITOR.dialog.add( 'tableProperties', this.path + 'dialogs/table.js' ); // If the "menu" plugin is loaded, register the menu items. if ( editor.addMenuItems ) { editor.addMenuItems( { table: { label: lang.menu, command: 'tableProperties', group: 'table', order: 5 }, tabledelete: { label: lang.deleteTable, command: 'tableDelete', group: 'table', order: 1 } } ); } editor.on( 'doubleclick', function( evt ) { var element = evt.data.element; if ( element.is( 'table' ) ) evt.data.dialog = 'tableProperties'; } ); // If the "contextmenu" plugin is loaded, register the listeners. if ( editor.contextMenu ) { editor.contextMenu.addListener( function() { // menu item state is resolved on commands. return { tabledelete: CKEDITOR.TRISTATE_OFF, table: CKEDITOR.TRISTATE_OFF }; } ); } } } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/0000755000201500020150000000000014515446712022263 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/zh.js0000644000201500020150000000430714515446712023246 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'zh', { border: '框線大小', caption: '標題', cell: { menu: '儲存格', insertBefore: '前方插入儲存格', insertAfter: '後方插入儲存格', deleteCell: '刪除儲存格', merge: '合併儲存格', mergeRight: '向右合併', mergeDown: '向下合併', splitHorizontal: '水平分割儲存格', splitVertical: '垂直分割儲存格', title: '儲存格屬性', cellType: '儲存格類型', rowSpan: '行全長', colSpan: '列全長', wordWrap: '自動斷行', hAlign: '水平對齊', vAlign: '垂直對齊', alignBaseline: '基準線', bgColor: '背景顏色', borderColor: '框線顏色', data: '資料', header: '頁首', columnHeader: '欄標題', rowHeader: '列標題', yes: '是', no: '否', invalidWidth: '儲存格寬度必須為數字。', invalidHeight: '儲存格高度必須為數字。', invalidRowSpan: '行全長必須是整數。', invalidColSpan: '列全長必須是整數。', chooseColor: '選擇' }, cellPad: '儲存格邊距', cellSpace: '儲存格間距', column: { menu: '列', insertBefore: '左方插入列', insertAfter: '右方插入列', deleteColumn: '刪除列' }, columns: '列', deleteTable: '刪除表格', headers: '頁首', headersBoth: '同時', headersColumn: '第一列', headersNone: '無', headersRow: '第一行', heightUnit: '高度單位', invalidBorder: '框線大小必須是整數。', invalidCellPadding: '儲存格邊距必須為正數。', invalidCellSpacing: '儲存格間距必須為正數。', invalidCols: '列數須為大於 0 的正整數。', invalidHeight: '表格高度必須為數字。', invalidRows: '行數須為大於 0 的正整數。', invalidWidth: '表格寬度必須為數字。', menu: '表格屬性', row: { menu: '行', insertBefore: '上方插入行', insertAfter: '下方插入行', deleteRow: '刪除行' }, rows: '行', summary: '總結', title: '表格屬性', toolbar: '表格', widthPc: '百分比', widthPx: '像素', widthUnit: '寬度單位' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/nb.js0000644000201500020150000000455114515446712023225 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'nb', { border: 'Rammestørrelse', caption: 'Tittel', cell: { menu: 'Celle', insertBefore: 'Sett inn celle før', insertAfter: 'Sett inn celle etter', deleteCell: 'Slett celler', merge: 'Slå sammen celler', mergeRight: 'Slå sammen høyre', mergeDown: 'Slå sammen ned', splitHorizontal: 'Del celle horisontalt', splitVertical: 'Del celle vertikalt', title: 'Celleegenskaper', cellType: 'Celletype', rowSpan: 'Radspenn', colSpan: 'Kolonnespenn', wordWrap: 'Tekstbrytning', hAlign: 'Horisontal justering', vAlign: 'Vertikal justering', alignBaseline: 'Grunnlinje', bgColor: 'Bakgrunnsfarge', borderColor: 'Rammefarge', data: 'Data', header: 'Overskrift', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nei', invalidWidth: 'Cellebredde må være et tall.', invalidHeight: 'Cellehøyde må være et tall.', invalidRowSpan: 'Radspenn må være et heltall.', invalidColSpan: 'Kolonnespenn må være et heltall.', chooseColor: 'Velg' }, cellPad: 'Cellepolstring', cellSpace: 'Cellemarg', column: { menu: 'Kolonne', insertBefore: 'Sett inn kolonne før', insertAfter: 'Sett inn kolonne etter', deleteColumn: 'Slett kolonner' }, columns: 'Kolonner', deleteTable: 'Slett tabell', headers: 'Overskrifter', headersBoth: 'Begge', headersColumn: 'Første kolonne', headersNone: 'Ingen', headersRow: 'Første rad', heightUnit: 'height unit', // MISSING invalidBorder: 'Rammestørrelse må være et tall.', invalidCellPadding: 'Cellepolstring må være et positivt tall.', invalidCellSpacing: 'Cellemarg må være et positivt tall.', invalidCols: 'Antall kolonner må være et tall større enn 0.', invalidHeight: 'Tabellhøyde må være et tall.', invalidRows: 'Antall rader må være et tall større enn 0.', invalidWidth: 'Tabellbredde må være et tall.', menu: 'Egenskaper for tabell', row: { menu: 'Rader', insertBefore: 'Sett inn rad før', insertAfter: 'Sett inn rad etter', deleteRow: 'Slett rader' }, rows: 'Rader', summary: 'Sammendrag', title: 'Egenskaper for tabell', toolbar: 'Tabell', widthPc: 'prosent', widthPx: 'piksler', widthUnit: 'Bredde-enhet' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/eo.js0000644000201500020150000000473614515446712023236 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'eo', { border: 'Bordero', caption: 'Tabeltitolo', cell: { menu: 'Ĉelo', insertBefore: 'Enmeti Ĉelon Antaŭ', insertAfter: 'Enmeti Ĉelon Post', deleteCell: 'Forigi la Ĉelojn', merge: 'Kunfandi la Ĉelojn', mergeRight: 'Kunfandi dekstren', mergeDown: 'Kunfandi malsupren ', splitHorizontal: 'Horizontale dividi', splitVertical: 'Vertikale dividi', title: 'Ĉelatributoj', cellType: 'Ĉeltipo', rowSpan: 'Kunfando de linioj', colSpan: 'Kunfando de kolumnoj', wordWrap: 'Cezuro', hAlign: 'Horizontala ĝisrandigo', vAlign: 'Vertikala ĝisrandigo', alignBaseline: 'Malsupro de la teksto', bgColor: 'Fonkoloro', borderColor: 'Borderkoloro', data: 'Datenoj', header: 'Supra paĝotitolo', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Jes', no: 'No', invalidWidth: 'Ĉellarĝo devas esti nombro.', invalidHeight: 'Ĉelalto devas esti nombro.', invalidRowSpan: 'Kunfando de linioj devas esti entjera nombro.', invalidColSpan: 'Kunfando de kolumnoj devas esti entjera nombro.', chooseColor: 'Elektu' }, cellPad: 'Interna Marĝeno de la ĉeloj', cellSpace: 'Spaco inter la Ĉeloj', column: { menu: 'Kolumno', insertBefore: 'Enmeti kolumnon antaŭ', insertAfter: 'Enmeti kolumnon post', deleteColumn: 'Forigi Kolumnojn' }, columns: 'Kolumnoj', deleteTable: 'Forigi Tabelon', headers: 'Supraj Paĝotitoloj', headersBoth: 'Ambaŭ', headersColumn: 'Unua kolumno', headersNone: 'Neniu', headersRow: 'Unua linio', heightUnit: 'height unit', // MISSING invalidBorder: 'La bordergrando devas esti nombro.', invalidCellPadding: 'La interna marĝeno en la ĉeloj devas esti pozitiva nombro.', invalidCellSpacing: 'La spaco inter la ĉeloj devas esti pozitiva nombro.', invalidCols: 'La nombro de la kolumnoj devas superi 0.', invalidHeight: 'La tabelalto devas esti nombro.', invalidRows: 'La nombro de la linioj devas superi 0.', invalidWidth: 'La tabellarĝo devas esti nombro.', menu: 'Atributoj de Tabelo', row: { menu: 'Linio', insertBefore: 'Enmeti linion antaŭ', insertAfter: 'Enmeti linion post', deleteRow: 'Forigi Liniojn' }, rows: 'Linioj', summary: 'Resumo', title: 'Atributoj de Tabelo', toolbar: 'Tabelo', widthPc: 'elcentoj', widthPx: 'Rastrumeroj', widthUnit: 'unuo de larĝo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/es.js0000644000201500020150000000516114515446712023233 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'es', { border: 'Tamaño de Borde', caption: 'Título', cell: { menu: 'Celda', insertBefore: 'Insertar celda a la izquierda', insertAfter: 'Insertar celda a la derecha', deleteCell: 'Eliminar Celdas', merge: 'Combinar Celdas', mergeRight: 'Combinar a la derecha', mergeDown: 'Combinar hacia abajo', splitHorizontal: 'Dividir la celda horizontalmente', splitVertical: 'Dividir la celda verticalmente', title: 'Propiedades de celda', cellType: 'Tipo de Celda', rowSpan: 'Expandir filas', colSpan: 'Expandir columnas', wordWrap: 'Ajustar al contenido', hAlign: 'Alineación Horizontal', vAlign: 'Alineación Vertical', alignBaseline: 'Linea de base', bgColor: 'Color de fondo', borderColor: 'Color de borde', data: 'Datos', header: 'Encabezado', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Sí', no: 'No', invalidWidth: 'La anchura de celda debe ser un número.', invalidHeight: 'La altura de celda debe ser un número.', invalidRowSpan: 'La expansión de filas debe ser un número entero.', invalidColSpan: 'La expansión de columnas debe ser un número entero.', chooseColor: 'Elegir' }, cellPad: 'Esp. interior', cellSpace: 'Esp. e/celdas', column: { menu: 'Columna', insertBefore: 'Insertar columna a la izquierda', insertAfter: 'Insertar columna a la derecha', deleteColumn: 'Eliminar Columnas' }, columns: 'Columnas', deleteTable: 'Eliminar Tabla', headers: 'Encabezados', headersBoth: 'Ambas', headersColumn: 'Primera columna', headersNone: 'Ninguno', headersRow: 'Primera fila', heightUnit: 'height unit', // MISSING invalidBorder: 'El tamaño del borde debe ser un número.', invalidCellPadding: 'El espaciado interior debe ser un número.', invalidCellSpacing: 'El espaciado entre celdas debe ser un número.', invalidCols: 'El número de columnas debe ser un número mayor que 0.', invalidHeight: 'La altura de tabla debe ser un número.', invalidRows: 'El número de filas debe ser un número mayor que 0.', invalidWidth: 'La anchura de tabla debe ser un número.', menu: 'Propiedades de Tabla', row: { menu: 'Fila', insertBefore: 'Insertar fila en la parte superior', insertAfter: 'Insertar fila en la parte inferior', deleteRow: 'Eliminar Filas' }, rows: 'Filas', summary: 'Síntesis', title: 'Propiedades de Tabla', toolbar: 'Tabla', widthPc: 'porcentaje', widthPx: 'pixeles', widthUnit: 'unidad de la anchura' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ro.js0000644000201500020150000000510614515446712023243 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ro', { border: 'Mărimea marginii', caption: 'Titlu (Caption)', cell: { menu: 'Celulă', insertBefore: 'Inserează celulă înainte', insertAfter: 'Inserează celulă după', deleteCell: 'Şterge celule', merge: 'Uneşte celule', mergeRight: 'Uneşte la dreapta', mergeDown: 'Uneşte jos', splitHorizontal: 'Împarte celula pe orizontală', splitVertical: 'Împarte celula pe verticală', title: 'Proprietăți celulă', cellType: 'Tipul celulei', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Aliniament orizontal', vAlign: 'Aliniament vertical', alignBaseline: 'Baseline', bgColor: 'Culoare fundal', borderColor: 'Culoare bordură', data: 'Data', header: 'Antet', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Da', no: 'Nu', invalidWidth: 'Lățimea celulei trebuie să fie un număr.', invalidHeight: 'Înălțimea celulei trebuie să fie un număr.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Alege' }, cellPad: 'Spaţiu în cadrul celulei', cellSpace: 'Spaţiu între celule', column: { menu: 'Coloană', insertBefore: 'Inserează coloană înainte', insertAfter: 'Inserează coloană după', deleteColumn: 'Şterge celule' }, columns: 'Coloane', deleteTable: 'Şterge tabel', headers: 'Antente', headersBoth: 'Ambele', headersColumn: 'Prima coloană', headersNone: 'Nimic', headersRow: 'Primul rând', heightUnit: 'height unit', // MISSING invalidBorder: 'Dimensiunea bordurii trebuie să aibe un număr.', invalidCellPadding: 'Spațierea celulei trebuie sa fie un număr pozitiv', invalidCellSpacing: 'Spațierea celului trebuie să fie un număr pozitiv.', invalidCols: 'Numărul coloanelor trebuie să fie mai mare decât 0.', invalidHeight: 'Inaltimea celulei trebuie sa fie un numar.', invalidRows: 'Numărul rândurilor trebuie să fie mai mare decât 0.', invalidWidth: 'Lățimea tabelului trebuie să fie un număr.', menu: 'Proprietăţile tabelului', row: { menu: 'Rând', insertBefore: 'Inserează rând înainte', insertAfter: 'Inserează rând după', deleteRow: 'Şterge rânduri' }, rows: 'Rânduri', summary: 'Rezumat', title: 'Proprietăţile tabelului', toolbar: 'Tabel', widthPc: 'procente', widthPx: 'pixeli', widthUnit: 'unitate lățime' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/hr.js0000644000201500020150000000452314515446712023236 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'hr', { border: 'Veličina okvira', caption: 'Naslov', cell: { menu: 'Ćelija', insertBefore: 'Ubaci ćeliju prije', insertAfter: 'Ubaci ćeliju poslije', deleteCell: 'Izbriši ćelije', merge: 'Spoji ćelije', mergeRight: 'Spoji desno', mergeDown: 'Spoji dolje', splitHorizontal: 'Podijeli ćeliju vodoravno', splitVertical: 'Podijeli ćeliju okomito', title: 'Svojstva ćelije', cellType: 'Vrsta ćelije', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Prelazak u novi red', hAlign: 'Vodoravno poravnanje', vAlign: 'Okomito poravnanje', alignBaseline: 'Osnovna linija', bgColor: 'Boja pozadine', borderColor: 'Boja ruba', data: 'Podatak', header: 'Zaglavlje', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Da', no: 'Ne', invalidWidth: 'Širina ćelije mora biti broj.', invalidHeight: 'Visina ćelije mora biti broj.', invalidRowSpan: 'Rows span mora biti cijeli broj.', invalidColSpan: 'Columns span mora biti cijeli broj.', chooseColor: 'Odaberi' }, cellPad: 'Razmak ćelija', cellSpace: 'Prostornost ćelija', column: { menu: 'Kolona', insertBefore: 'Ubaci kolonu prije', insertAfter: 'Ubaci kolonu poslije', deleteColumn: 'Izbriši kolone' }, columns: 'Kolona', deleteTable: 'Izbriši tablicu', headers: 'Zaglavlje', headersBoth: 'Oba', headersColumn: 'Prva kolona', headersNone: 'Ništa', headersRow: 'Prvi red', heightUnit: 'height unit', // MISSING invalidBorder: 'Debljina ruba mora biti broj.', invalidCellPadding: 'Razmak ćelija mora biti broj.', invalidCellSpacing: 'Prostornost ćelija mora biti broj.', invalidCols: 'Broj kolona mora biti broj veći od 0.', invalidHeight: 'Visina tablice mora biti broj.', invalidRows: 'Broj redova mora biti broj veći od 0.', invalidWidth: 'Širina tablice mora biti broj.', menu: 'Svojstva tablice', row: { menu: 'Red', insertBefore: 'Ubaci red prije', insertAfter: 'Ubaci red poslije', deleteRow: 'Izbriši redove' }, rows: 'Redova', summary: 'Sažetak', title: 'Svojstva tablice', toolbar: 'Tablica', widthPc: 'postotaka', widthPx: 'piksela', widthUnit: 'jedinica širine' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/it.js0000644000201500020150000000505414515446712023241 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'it', { border: 'Dimensione bordo', caption: 'Intestazione', cell: { menu: 'Cella', insertBefore: 'Inserisci Cella Prima', insertAfter: 'Inserisci Cella Dopo', deleteCell: 'Elimina celle', merge: 'Unisce celle', mergeRight: 'Unisci a Destra', mergeDown: 'Unisci in Basso', splitHorizontal: 'Dividi Cella Orizzontalmente', splitVertical: 'Dividi Cella Verticalmente', title: 'Proprietà della cella', cellType: 'Tipo di cella', rowSpan: 'Su più righe', colSpan: 'Su più colonne', wordWrap: 'Ritorno a capo', hAlign: 'Allineamento orizzontale', vAlign: 'Allineamento verticale', alignBaseline: 'Linea Base', bgColor: 'Colore di Sfondo', borderColor: 'Colore del Bordo', data: 'Dati', header: 'Intestazione', columnHeader: 'Intestazione colonna', rowHeader: 'Intestazione riga', yes: 'Si', no: 'No', invalidWidth: 'La larghezza della cella dev\'essere un numero.', invalidHeight: 'L\'altezza della cella dev\'essere un numero.', invalidRowSpan: 'Il numero di righe dev\'essere un numero intero.', invalidColSpan: 'Il numero di colonne dev\'essere un numero intero.', chooseColor: 'Scegli' }, cellPad: 'Padding celle', cellSpace: 'Spaziatura celle', column: { menu: 'Colonna', insertBefore: 'Inserisci Colonna Prima', insertAfter: 'Inserisci Colonna Dopo', deleteColumn: 'Elimina colonne' }, columns: 'Colonne', deleteTable: 'Cancella Tabella', headers: 'Intestazione', headersBoth: 'Entrambe', headersColumn: 'Prima Colonna', headersNone: 'Nessuna', headersRow: 'Prima Riga', heightUnit: 'unità altezza', invalidBorder: 'La dimensione del bordo dev\'essere un numero.', invalidCellPadding: 'Il paging delle celle dev\'essere un numero', invalidCellSpacing: 'La spaziatura tra le celle dev\'essere un numero.', invalidCols: 'Il numero di colonne dev\'essere un numero maggiore di 0.', invalidHeight: 'L\'altezza della tabella dev\'essere un numero.', invalidRows: 'Il numero di righe dev\'essere un numero maggiore di 0.', invalidWidth: 'La larghezza della tabella dev\'essere un numero.', menu: 'Proprietà tabella', row: { menu: 'Riga', insertBefore: 'Inserisci Riga Prima', insertAfter: 'Inserisci Riga Dopo', deleteRow: 'Elimina righe' }, rows: 'Righe', summary: 'Indice', title: 'Proprietà tabella', toolbar: 'Tabella', widthPc: 'percento', widthPx: 'pixel', widthUnit: 'unità larghezza' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/de-ch.js0000644000201500020150000000506114515446712023603 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'de-ch', { border: 'Rahmengrösse', caption: 'Überschrift', cell: { menu: 'Zelle', insertBefore: 'Zelle davor einfügen', insertAfter: 'Zelle danach einfügen', deleteCell: 'Zelle löschen', merge: 'Zellen verbinden', mergeRight: 'Nach rechts verbinden', mergeDown: 'Nach unten verbinden', splitHorizontal: 'Zelle horizontal teilen', splitVertical: 'Zelle vertikal teilen', title: 'Zelleneigenschaften', cellType: 'Zellart', rowSpan: 'Anzahl Zeilen verbinden', colSpan: 'Anzahl Spalten verbinden', wordWrap: 'Zeilenumbruch', hAlign: 'Horizontale Ausrichtung', vAlign: 'Vertikale Ausrichtung', alignBaseline: 'Grundlinie', bgColor: 'Hintergrundfarbe', borderColor: 'Rahmenfarbe', data: 'Daten', header: 'Überschrift', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nein', invalidWidth: 'Zellenbreite muss eine Zahl sein.', invalidHeight: 'Zellenhöhe muss eine Zahl sein.', invalidRowSpan: '"Anzahl Zeilen verbinden" muss eine Ganzzahl sein.', invalidColSpan: '"Anzahl Spalten verbinden" muss eine Ganzzahl sein.', chooseColor: 'Wählen' }, cellPad: 'Zellenabstand innen', cellSpace: 'Zellenabstand aussen', column: { menu: 'Spalte', insertBefore: 'Spalte links davor einfügen', insertAfter: 'Spalte rechts danach einfügen', deleteColumn: 'Spalte löschen' }, columns: 'Spalte', deleteTable: 'Tabelle löschen', headers: 'Kopfzeile', headersBoth: 'Beide', headersColumn: 'Erste Spalte', headersNone: 'Keine', headersRow: 'Erste Zeile', heightUnit: 'Höheneinheit', invalidBorder: 'Die Rahmenbreite muss eine Zahl sein.', invalidCellPadding: 'Der Zellenabstand innen muss eine positive Zahl sein.', invalidCellSpacing: 'Der Zellenabstand aussen muss eine positive Zahl sein.', invalidCols: 'Die Anzahl der Spalten muss grösser als 0 sein..', invalidHeight: 'Die Tabellenbreite muss eine Zahl sein.', invalidRows: 'Die Anzahl der Zeilen muss grösser als 0 sein.', invalidWidth: 'Die Tabellenbreite muss eine Zahl sein.', menu: 'Tabellen-Eigenschaften', row: { menu: 'Zeile', insertBefore: 'Zeile oberhalb einfügen', insertAfter: 'Zeile unterhalb einfügen', deleteRow: 'Zeile entfernen' }, rows: 'Zeile', summary: 'Inhaltsübersicht', title: 'Tabellen-Eigenschaften', toolbar: 'Tabelle', widthPc: '%', widthPx: 'Pixel', widthUnit: 'Breiteneinheit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/sk.js0000644000201500020150000000506414515446712023243 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'sk', { border: 'Šírka orámovania', caption: 'Popis', cell: { menu: 'Bunka', insertBefore: 'Vložiť bunku pred', insertAfter: 'Vložiť bunku za', deleteCell: 'Vymazať bunky', merge: 'Zlúčiť bunky', mergeRight: 'Zlúčiť doprava', mergeDown: 'Zlúčiť dole', splitHorizontal: 'Rozdeliť bunky horizontálne', splitVertical: 'Rozdeliť bunky vertikálne', title: 'Vlastnosti bunky', cellType: 'Typ bunky', rowSpan: 'Rozsah riadkov', colSpan: 'Rozsah stĺpcov', wordWrap: 'Zalamovanie riadkov', hAlign: 'Horizontálne zarovnanie', vAlign: 'Vertikálne zarovnanie', alignBaseline: 'Základná čiara (baseline)', bgColor: 'Farba pozadia', borderColor: 'Farba orámovania', data: 'Dáta', header: 'Hlavička', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Áno', no: 'Nie', invalidWidth: 'Šírka bunky musí byť číslo.', invalidHeight: 'Výška bunky musí byť číslo.', invalidRowSpan: 'Rozsah riadkov musí byť celé číslo.', invalidColSpan: 'Rozsah stĺpcov musí byť celé číslo.', chooseColor: 'Vybrať' }, cellPad: 'Odsadenie obsahu (cell padding)', cellSpace: 'Vzdialenosť buniek (cell spacing)', column: { menu: 'Stĺpec', insertBefore: 'Vložiť stĺpec pred', insertAfter: 'Vložiť stĺpec po', deleteColumn: 'Zmazať stĺpce' }, columns: 'Stĺpce', deleteTable: 'Vymazať tabuľku', headers: 'Hlavička', headersBoth: 'Obe', headersColumn: 'Prvý stĺpec', headersNone: 'Žiadne', headersRow: 'Prvý riadok', heightUnit: 'jednotka výšky', invalidBorder: 'Šírka orámovania musí byť číslo.', invalidCellPadding: 'Odsadenie v bunkách (cell padding) musí byť kladné číslo.', invalidCellSpacing: 'Medzera mädzi bunkami (cell spacing) musí byť kladné číslo.', invalidCols: 'Počet stĺpcov musí byť číslo väčšie ako 0.', invalidHeight: 'Výška tabuľky musí byť číslo.', invalidRows: 'Počet riadkov musí byť číslo väčšie ako 0.', invalidWidth: 'Širka tabuľky musí byť číslo.', menu: 'Vlastnosti tabuľky', row: { menu: 'Riadok', insertBefore: 'Vložiť riadok pred', insertAfter: 'Vložiť riadok po', deleteRow: 'Vymazať riadky' }, rows: 'Riadky', summary: 'Prehľad', title: 'Vlastnosti tabuľky', toolbar: 'Tabuľka', widthPc: 'percent', widthPx: 'pixelov', widthUnit: 'jednotka šírky' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/az.js0000644000201500020150000000526614515446712023244 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'az', { border: 'Sərhədlərin eni', caption: 'Cədvəlin başlığı', cell: { menu: 'Xana', insertBefore: 'Burdan əvvələ xanası çək', insertAfter: 'Burdan sonra xanası çək', deleteCell: 'Xanaları sil', merge: 'Xanaları birləşdir', mergeRight: 'Sağdan birləşdir', mergeDown: 'Soldan birləşdir', splitHorizontal: 'Üfüqi böl', splitVertical: 'Şaquli böl', title: 'Xanaların seçimləri', cellType: 'Xana növü', rowSpan: 'Sətirləri birləşdir', colSpan: 'Sütunları birləşdir', wordWrap: 'Sətirlərin sınması', hAlign: 'Üfüqi düzləndirmə', vAlign: 'Şaquli düzləndirmə', alignBaseline: 'Mətn xətti', bgColor: 'Doldurma rəngi', borderColor: 'Sərhədin rəngi', data: 'Məlumatlar', header: 'Başlıq', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Bəli', no: 'Xeyr', invalidWidth: 'Xanasın eni rəqəm olmalıdır.', invalidHeight: 'Xanasın hündürlüyü rəqəm olmalıdır.', invalidRowSpan: 'Birləşdirdiyiniz sütun xanaların sayı tam və müsbət rəqəm olmalıdır.', invalidColSpan: 'Birləşdirdiyiniz sətir xanaların sayı tam və müsbət rəqəm olmalıdır.', chooseColor: 'Seç' }, cellPad: 'Xanalardakı kənar boşluqlar', cellSpace: 'Xanalararası interval', column: { menu: 'Sütun', insertBefore: 'Sola sütun əlavə et', insertAfter: 'Sağa sütun əlavə et', deleteColumn: 'Sütunları sil' }, columns: 'Sütunlar', deleteTable: 'Cədvəli sil', headers: 'Başlıqlar', headersBoth: 'Hər ikisi', headersColumn: 'Birinci sütun', headersNone: 'yox', headersRow: 'Birinci sətir', heightUnit: 'height unit', // MISSING invalidBorder: 'Sərhədlərin eni müsbət rəqəm olmalıdır.', invalidCellPadding: 'Xanalardakı kənar boşluqlar müsbət rəqəm olmalıdır.', invalidCellSpacing: 'Xanalararası interval müsbət rəqəm olmalıdır.', invalidCols: 'Sütunlarin sayı tam və müsbət olmalıdır.', invalidHeight: 'Cədvəlin hündürlüyü rəqəm olmalıdır.', invalidRows: 'Sətirlətin sayı tam və müsbət olmalıdır.', invalidWidth: 'Cədvəlin eni rəqəm olmalıdır.', menu: 'Cədvəl alətləri', row: { menu: 'Sətir', insertBefore: 'Yuxarıya sətir əlavə et', insertAfter: 'Aşağıya sətir əlavə et', deleteRow: 'Sətirləri sil' }, rows: 'Sətirlər', summary: 'Xülasə', title: 'Cədvəl alətləri', toolbar: 'Cədvəl', widthPc: 'faiz', widthPx: 'piksel', widthUnit: 'en vahidi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/pt.js0000644000201500020150000000511314515446712023244 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'pt', { border: 'Tamanho do contorno', caption: 'Legenda', cell: { menu: 'Célula', insertBefore: 'Inserir célula antes', insertAfter: 'Inserir célula depois', deleteCell: 'Apagar células', merge: 'Unir células', mergeRight: 'Unir à direita', mergeDown: 'Fundir abaixo', splitHorizontal: 'Dividir célula horizontalmente', splitVertical: 'Dividir célula verticalmente', title: 'Propriedades da célula', cellType: 'Tipo de célula', rowSpan: 'Linhas na célula', colSpan: 'Colunas na célula', wordWrap: 'Moldar texto', hAlign: 'Alinhamento horizontal', vAlign: 'Alinhamento vertical', alignBaseline: 'Linha base', bgColor: 'Cor de fundo', borderColor: 'Cor da margem', data: 'Dados', header: 'Cabeçalho', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Sim', no: 'Não', invalidWidth: 'A largura da célula deve ser um número.', invalidHeight: 'A altura da célula deve ser um número.', invalidRowSpan: 'As linhas da célula devem ser um número inteiro.', invalidColSpan: 'As colunas da célula devem ter um número inteiro.', chooseColor: 'Escolher' }, cellPad: 'Espaço interior', cellSpace: 'Espaçamento de célula', column: { menu: 'Coluna', insertBefore: 'Inserir coluna antes', insertAfter: 'Inserir coluna depois', deleteColumn: 'Apagar colunas' }, columns: 'Colunas', deleteTable: 'Apagar tabela', headers: 'Cabeçalhos', headersBoth: 'Ambos', headersColumn: 'Primeira coluna', headersNone: 'Nenhum', headersRow: 'Primeira linha', heightUnit: 'height unit', // MISSING invalidBorder: 'O tamanho da margem tem de ser um número.', invalidCellPadding: 'A criação do espaço na célula deve ser um número positivo.', invalidCellSpacing: 'O espaçamento da célula deve ser um número positivo.', invalidCols: 'O número de colunas tem de ser um número maior que 0.', invalidHeight: 'A altura da tabela tem de ser um número.', invalidRows: 'O número de linhas tem de ser maior que 0.', invalidWidth: 'A largura da tabela tem de ser um número.', menu: 'Propriedades da tabela', row: { menu: 'Linha', insertBefore: 'Inserir linha antes', insertAfter: 'Inserir linha depois', deleteRow: 'Apagar linhas' }, rows: 'Linhas', summary: 'Resumo', title: 'Propriedades da tabela', toolbar: 'Tabela', widthPc: 'percentagem', widthPx: 'píxeis', widthUnit: 'unidade da largura' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/si.js0000644000201500020150000000642014515446712023236 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'si', { border: 'සීමාවවල විශාලත්වය', caption: 'Caption', // MISSING cell: { menu: 'කොටුව', insertBefore: 'පෙර කොටුවක් ඇතුල්කිරිම', insertAfter: 'පසුව කොටුවක් ඇතුලත් ', deleteCell: 'කොටුව මැකීම', merge: 'කොටු එකට යාකිරිම', mergeRight: 'දකුණට ', mergeDown: 'පහලට ', splitHorizontal: 'තිරස්ව කොටු පැතිරීම', splitVertical: 'සිරස්ව කොටු පැතිරීම', title: 'කොටු ', cellType: 'කොටු වර්ගය', rowSpan: 'පේළි පළල', colSpan: 'සිරස් පළල', wordWrap: 'වචන ගැලපුම', hAlign: 'තිරස්ව ', vAlign: 'සිරස්ව ', alignBaseline: 'පාද රේඛාව', bgColor: 'පසුබිම් වර්ණය', borderColor: 'මායිම් ', data: 'Data', // MISSING header: 'ශීර්ෂක', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'ඔව්', no: 'නැත', invalidWidth: 'කොටු පළල සංඛ්‍ය්ත්මක වටිනාකමක් විය යුතුය', invalidHeight: 'කොටු උස සංඛ්‍ය්ත්මක වටිනාකමක් විය යුතුය', invalidRowSpan: 'Rows span must be a whole number.', // MISSING invalidColSpan: 'Columns span must be a whole number.', // MISSING chooseColor: 'තෝරන්න' }, cellPad: 'Cell padding', // MISSING cellSpace: 'Cell spacing', // MISSING column: { menu: 'Column', // MISSING insertBefore: 'Insert Column Before', // MISSING insertAfter: 'Insert Column After', // MISSING deleteColumn: 'Delete Columns' // MISSING }, columns: 'සිරස් ', deleteTable: 'වගුව මකන්න', headers: 'ශීර්ෂක', headersBoth: 'දෙකම', headersColumn: 'පළමූ සිරස් තීරුව', headersNone: 'කිසිවක්ම නොවේ', headersRow: 'පළමූ පේළිය', heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'Table Properties', // MISSING row: { menu: 'Row', // MISSING insertBefore: 'Insert Row Before', // MISSING insertAfter: 'Insert Row After', // MISSING deleteRow: 'Delete Rows' // MISSING }, rows: 'Rows', // MISSING summary: 'Summary', // MISSING title: 'Table Properties', // MISSING toolbar: 'Table', // MISSING widthPc: 'percent', // MISSING widthPx: 'pixels', // MISSING widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ko.js0000644000201500020150000000452014515446712023233 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ko', { border: '테두리 두께', caption: '주석', cell: { menu: '셀', insertBefore: '앞에 셀 삽입', insertAfter: '뒤에 셀 삽입', deleteCell: '셀 삭제', merge: '셀 합치기', mergeRight: '오른쪽 합치기', mergeDown: '왼쪽 합치기', splitHorizontal: '수평 나누기', splitVertical: '수직 나누기', title: '셀 속성', cellType: '셀 종류', rowSpan: '행 간격', colSpan: '열 간격', wordWrap: '줄 끝 단어 줄 바꿈', hAlign: '가로 정렬', vAlign: '세로 정렬', alignBaseline: '영문 글꼴 기준선', bgColor: '배경색', borderColor: '테두리 색', data: '자료', header: '머릿칸', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: '예', no: '아니오', invalidWidth: '셀 너비는 숫자여야 합니다.', invalidHeight: '셀 높이는 숫자여야 합니다.', invalidRowSpan: '행 간격은 정수여야 합니다.', invalidColSpan: '열 간격은 정수여야 합니다.', chooseColor: '선택' }, cellPad: '셀 여백', cellSpace: '셀 간격', column: { menu: '열', insertBefore: '왼쪽에 열 삽입', insertAfter: '오른쪽에 열 삽입', deleteColumn: '열 삭제' }, columns: '열', deleteTable: '표 삭제', headers: '머릿칸', headersBoth: '모두', headersColumn: '첫 열', headersNone: '없음', headersRow: '첫 행', heightUnit: 'height unit', // MISSING invalidBorder: '테두리 두께는 숫자여야 합니다.', invalidCellPadding: '셀 여백은 0 이상이어야 합니다.', invalidCellSpacing: '셀 간격은 0 이상이어야 합니다.', invalidCols: '열 번호는 0보다 커야 합니다.', invalidHeight: '표 높이는 숫자여야 합니다.', invalidRows: '행 번호는 0보다 커야 합니다.', invalidWidth: '표의 너비는 숫자여야 합니다.', menu: '표 속성', row: { menu: '행', insertBefore: '위에 행 삽입', insertAfter: '아래에 행 삽입', deleteRow: '행 삭제' }, rows: '행', summary: '요약', title: '표 속성', toolbar: '표', widthPc: '백분율', widthPx: '픽셀', widthUnit: '너비 단위' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/mk.js0000644000201500020150000000504214515446712023231 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'mk', { border: 'Border size', // MISSING caption: 'Caption', // MISSING cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Delete Cells', merge: 'Merge Cells', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Cell padding', // MISSING cellSpace: 'Cell spacing', // MISSING column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Delete Columns' }, columns: 'Columns', deleteTable: 'Delete Table', // MISSING headers: 'Headers', // MISSING headersBoth: 'Both', // MISSING headersColumn: 'First column', // MISSING headersNone: 'None', headersRow: 'First Row', // MISSING heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'Table Properties', // MISSING row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Delete Rows' }, rows: 'Rows', summary: 'Summary', // MISSING title: 'Table Properties', // MISSING toolbar: 'Table', // MISSING widthPc: 'percent', // MISSING widthPx: 'pixels', // MISSING widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/cy.js0000644000201500020150000000465414515446712023245 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'cy', { border: 'Maint yr Ymyl', caption: 'Pennawd', cell: { menu: 'Cell', insertBefore: 'Mewnosod Cell Cyn', insertAfter: 'Mewnosod Cell Ar Ôl', deleteCell: 'Dileu Celloedd', merge: 'Cyfuno Celloedd', mergeRight: 'Cyfuno i\'r Dde', mergeDown: 'Cyfuno i Lawr', splitHorizontal: 'Hollti\'r Gell yn Lorweddol', splitVertical: 'Hollti\'r Gell yn Fertigol', title: 'Priodweddau\'r Gell', cellType: 'Math y Gell', rowSpan: 'Rhychwant Rhesi', colSpan: 'Rhychwant Colofnau', wordWrap: 'Lapio Geiriau', hAlign: 'Aliniad Llorweddol', vAlign: 'Aliniad Fertigol', alignBaseline: 'Baslinell', bgColor: 'Lliw Cefndir', borderColor: 'Lliw Ymyl', data: 'Data', header: 'Pennyn', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ie', no: 'Na', invalidWidth: 'Mae\'n rhaid i led y gell fod yn rhif.', invalidHeight: 'Mae\'n rhaid i uchder y gell fod yn rhif.', invalidRowSpan: 'Mae\'n rhaid i rychwant y rhesi fod yn gyfanrif.', invalidColSpan: 'Mae\'n rhaid i rychwant y colofnau fod yn gyfanrif.', chooseColor: 'Dewis' }, cellPad: 'Padio\'r gell', cellSpace: 'Bylchiad y gell', column: { menu: 'Colofn', insertBefore: 'Mewnosod Colofn Cyn', insertAfter: 'Mewnosod Colofn Ar Ôl', deleteColumn: 'Dileu Colofnau' }, columns: 'Colofnau', deleteTable: 'Dileu Tabl', headers: 'Penynnau', headersBoth: 'Y Ddau', headersColumn: 'Colofn gyntaf', headersNone: 'Dim', headersRow: 'Rhes gyntaf', heightUnit: 'height unit', // MISSING invalidBorder: 'Mae\'n rhaid i faint yr ymyl fod yn rhif.', invalidCellPadding: 'Mae\'n rhaid i badiad y gell fod yn rhif positif.', invalidCellSpacing: 'Mae\'n rhaid i fylchiad y gell fod yn rhif positif.', invalidCols: 'Mae\'n rhaid cael o leiaf un golofn.', invalidHeight: 'Mae\'n rhaid i uchder y tabl fod yn rhif.', invalidRows: 'Mae\'n rhaid cael o leiaf un rhes.', invalidWidth: 'Mae\'n rhaid i led y tabl fod yn rhif.', menu: 'Priodweddau\'r Tabl', row: { menu: 'Rhes', insertBefore: 'Mewnosod Rhes Cyn', insertAfter: 'Mewnosod Rhes Ar Ôl', deleteRow: 'Dileu Rhesi' }, rows: 'Rhesi', summary: 'Crynodeb', title: 'Priodweddau\'r Tabl', toolbar: 'Tabl', widthPc: 'y cant', widthPx: 'picsel', widthUnit: 'uned lled' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/uk.js0000644000201500020150000000726514515446712023252 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'uk', { border: 'Розмір рамки', caption: 'Заголовок таблиці', cell: { menu: 'Комірки', insertBefore: 'Вставити комірку перед', insertAfter: 'Вставити комірку після', deleteCell: 'Видалити комірки', merge: 'Об\'єднати комірки', mergeRight: 'Об\'єднати справа', mergeDown: 'Об\'єднати донизу', splitHorizontal: 'Розділити комірку по горизонталі', splitVertical: 'Розділити комірку по вертикалі', title: 'Властивості комірки', cellType: 'Тип комірки', rowSpan: 'Об\'єднання рядків', colSpan: 'Об\'єднання стовпців', wordWrap: 'Автоперенесення тексту', hAlign: 'Гориз. вирівнювання', vAlign: 'Верт. вирівнювання', alignBaseline: 'По базовій лінії', bgColor: 'Колір фону', borderColor: 'Колір рамки', data: 'Дані', header: 'Заголовок', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Так', no: 'Ні', invalidWidth: 'Ширина комірки повинна бути цілим числом.', invalidHeight: 'Висота комірки повинна бути цілим числом.', invalidRowSpan: 'Кількість об\'єднуваних рядків повинна бути цілим числом.', invalidColSpan: 'Кількість об\'єднуваних стовбців повинна бути цілим числом.', chooseColor: 'Обрати' }, cellPad: 'Внутр. відступ', cellSpace: 'Проміжок', column: { menu: 'Стовбці', insertBefore: 'Вставити стовбець перед', insertAfter: 'Вставити стовбець після', deleteColumn: 'Видалити стовбці' }, columns: 'Стовбці', deleteTable: 'Видалити таблицю', headers: 'Заголовки стовбців/рядків', headersBoth: 'Стовбці і рядки', headersColumn: 'Стовбці', headersNone: 'Без заголовків', headersRow: 'Рядки', heightUnit: 'одиниця висоти', invalidBorder: 'Розмір рамки повинен бути цілим числом.', invalidCellPadding: 'Внутр. відступ комірки повинен бути цілим числом.', invalidCellSpacing: 'Проміжок між комірками повинен бути цілим числом.', invalidCols: 'Кількість стовбців повинна бути більшою 0.', invalidHeight: 'Висота таблиці повинна бути цілим числом.', invalidRows: 'Кількість рядків повинна бути більшою 0.', invalidWidth: 'Ширина таблиці повинна бути цілим числом.', menu: 'Властивості таблиці', row: { menu: 'Рядки', insertBefore: 'Вставити рядок перед', insertAfter: 'Вставити рядок після', deleteRow: 'Видалити рядки' }, rows: 'Рядки', summary: 'Детальний опис заголовку таблиці', title: 'Властивості таблиці', toolbar: 'Таблиця', widthPc: 'відсотків', widthPx: 'пікселів', widthUnit: 'одиниця ширини' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/zh-cn.js0000644000201500020150000000444114515446712023643 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'zh-cn', { border: '边框', caption: '标题', cell: { menu: '单元格', insertBefore: '在左侧插入单元格', insertAfter: '在右侧插入单元格', deleteCell: '删除单元格', merge: '合并单元格', mergeRight: '向右合并单元格', mergeDown: '向下合并单元格', splitHorizontal: '水平拆分单元格', splitVertical: '垂直拆分单元格', title: '单元格属性', cellType: '单元格类型', rowSpan: '纵跨行数', colSpan: '横跨列数', wordWrap: '自动换行', hAlign: '水平对齐', vAlign: '垂直对齐', alignBaseline: '基线', bgColor: '背景颜色', borderColor: '边框颜色', data: '数据', header: '表头', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: '是', no: '否', invalidWidth: '单元格宽度必须为数字格式', invalidHeight: '单元格高度必须为数字格式', invalidRowSpan: '行跨度必须为整数格式', invalidColSpan: '列跨度必须为整数格式', chooseColor: '选择' }, cellPad: '边距', cellSpace: '间距', column: { menu: '列', insertBefore: '在左侧插入列', insertAfter: '在右侧插入列', deleteColumn: '删除列' }, columns: '列数', deleteTable: '删除表格', headers: '标题单元格', headersBoth: '第一列和第一行', headersColumn: '第一列', headersNone: '无', headersRow: '第一行', heightUnit: '高度单位', invalidBorder: '边框粗细必须为数字格式', invalidCellPadding: '单元格填充必须为数字格式', invalidCellSpacing: '单元格间距必须为数字格式', invalidCols: '指定的行数必须大于零', invalidHeight: '表格高度必须为数字格式', invalidRows: '指定的列数必须大于零', invalidWidth: '表格宽度必须为数字格式', menu: '表格属性', row: { menu: '行', insertBefore: '在上方插入行', insertAfter: '在下方插入行', deleteRow: '删除行' }, rows: '行数', summary: '摘要', title: '表格属性', toolbar: '表格', widthPc: '百分比', widthPx: '像素', widthUnit: '宽度单位' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/sv.js0000644000201500020150000000453314515446712023256 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'sv', { border: 'Kantstorlek', caption: 'Rubrik', cell: { menu: 'Cell', insertBefore: 'Lägg till cell före', insertAfter: 'Lägg till cell efter', deleteCell: 'Radera celler', merge: 'Sammanfoga celler', mergeRight: 'Sammanfoga höger', mergeDown: 'Sammanfoga ner', splitHorizontal: 'Dela cell horisontellt', splitVertical: 'Dela cell vertikalt', title: 'Egenskaper för cell', cellType: 'Celltyp', rowSpan: 'Rad spann', colSpan: 'Kolumnen spann', wordWrap: 'Radbrytning', hAlign: 'Horisontell justering', vAlign: 'Vertikal justering', alignBaseline: 'Baslinje', bgColor: 'Bakgrundsfärg', borderColor: 'Ramfärg', data: 'Data', header: 'Rubrik', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nej', invalidWidth: 'Cellens bredd måste vara ett nummer.', invalidHeight: 'Cellens höjd måste vara ett nummer.', invalidRowSpan: 'Radutvidgning måste vara ett heltal.', invalidColSpan: 'Kolumn måste vara ett heltal.', chooseColor: 'Välj' }, cellPad: 'Cellutfyllnad', cellSpace: 'Cellavstånd', column: { menu: 'Kolumn', insertBefore: 'Lägg till kolumn före', insertAfter: 'Lägg till kolumn efter', deleteColumn: 'Radera kolumn' }, columns: 'Kolumner', deleteTable: 'Radera tabell', headers: 'Rubriker', headersBoth: 'Båda', headersColumn: 'Första kolumnen', headersNone: 'Ingen', headersRow: 'Första raden', heightUnit: 'Enhetshöjd', invalidBorder: 'Ram måste vara ett nummer.', invalidCellPadding: 'Luft i cell måste vara ett nummer.', invalidCellSpacing: 'Luft i cell måste vara ett nummer.', invalidCols: 'Antal kolumner måste vara ett nummer större än 0.', invalidHeight: 'Tabellens höjd måste vara ett nummer.', invalidRows: 'Antal rader måste vara större än 0.', invalidWidth: 'Tabell måste vara ett nummer.', menu: 'Tabellegenskaper', row: { menu: 'Rad', insertBefore: 'Lägg till rad före', insertAfter: 'Lägg till rad efter', deleteRow: 'Radera rad' }, rows: 'Rader', summary: 'Sammanfattning', title: 'Tabellegenskaper', toolbar: 'Tabell', widthPc: 'procent', widthPx: 'pixlar', widthUnit: 'enhet bredd' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/lt.js0000644000201500020150000000500714515446712023242 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'lt', { border: 'Rėmelio dydis', caption: 'Antraštė', cell: { menu: 'Langelis', insertBefore: 'Įterpti langelį prieš', insertAfter: 'Įterpti langelį po', deleteCell: 'Šalinti langelius', merge: 'Sujungti langelius', mergeRight: 'Sujungti su dešine', mergeDown: 'Sujungti su apačia', splitHorizontal: 'Skaidyti langelį horizontaliai', splitVertical: 'Skaidyti langelį vertikaliai', title: 'Cell nustatymai', cellType: 'Cell rūšis', rowSpan: 'Eilučių Span', colSpan: 'Stulpelių Span', wordWrap: 'Sutraukti raides', hAlign: 'Horizontalus lygiavimas', vAlign: 'Vertikalus lygiavimas', alignBaseline: 'Apatinė linija', bgColor: 'Fono spalva', borderColor: 'Rėmelio spalva', data: 'Data', header: 'Antraštė', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Taip', no: 'Ne', invalidWidth: 'Reikšmė turi būti skaičius.', invalidHeight: 'Reikšmė turi būti skaičius.', invalidRowSpan: 'Reikšmė turi būti skaičius.', invalidColSpan: 'Reikšmė turi būti skaičius.', chooseColor: 'Pasirinkite' }, cellPad: 'Tarpas nuo langelio rėmo iki teksto', cellSpace: 'Tarpas tarp langelių', column: { menu: 'Stulpelis', insertBefore: 'Įterpti stulpelį prieš', insertAfter: 'Įterpti stulpelį po', deleteColumn: 'Šalinti stulpelius' }, columns: 'Stulpeliai', deleteTable: 'Šalinti lentelę', headers: 'Antraštės', headersBoth: 'Abu', headersColumn: 'Pirmas stulpelis', headersNone: 'Nėra', headersRow: 'Pirma eilutė', heightUnit: 'height unit', // MISSING invalidBorder: 'Reikšmė turi būti nurodyta skaičiumi.', invalidCellPadding: 'Reikšmė turi būti nurodyta skaičiumi.', invalidCellSpacing: 'Reikšmė turi būti nurodyta skaičiumi.', invalidCols: 'Skaičius turi būti didesnis nei 0.', invalidHeight: 'Reikšmė turi būti nurodyta skaičiumi.', invalidRows: 'Skaičius turi būti didesnis nei 0.', invalidWidth: 'Reikšmė turi būti nurodyta skaičiumi.', menu: 'Lentelės savybės', row: { menu: 'Eilutė', insertBefore: 'Įterpti eilutę prieš', insertAfter: 'Įterpti eilutę po', deleteRow: 'Šalinti eilutes' }, rows: 'Eilutės', summary: 'Santrauka', title: 'Lentelės savybės', toolbar: 'Lentelė', widthPc: 'procentais', widthPx: 'taškais', widthUnit: 'pločio vienetas' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/is.js0000644000201500020150000000476514515446712023250 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'is', { border: 'Breidd ramma', caption: 'Titill', cell: { menu: 'Reitur', insertBefore: 'Skjóta inn reiti fyrir aftan', insertAfter: 'Skjóta inn reiti fyrir framan', deleteCell: 'Fella reit', merge: 'Sameina reiti', mergeRight: 'Sameina til hægri', mergeDown: 'Sameina niður á við', splitHorizontal: 'Kljúfa reit lárétt', splitVertical: 'Kljúfa reit lóðrétt', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Reitaspássía', cellSpace: 'Bil milli reita', column: { menu: 'Dálkur', insertBefore: 'Skjóta inn dálki vinstra megin', insertAfter: 'Skjóta inn dálki hægra megin', deleteColumn: 'Fella dálk' }, columns: 'Dálkar', deleteTable: 'Fella töflu', headers: 'Fyrirsagnir', headersBoth: 'Hvort tveggja', headersColumn: 'Fyrsti dálkur', headersNone: 'Engar', headersRow: 'Fyrsta röð', heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'Eigindi töflu', row: { menu: 'Röð', insertBefore: 'Skjóta inn röð fyrir ofan', insertAfter: 'Skjóta inn röð fyrir neðan', deleteRow: 'Eyða röð' }, rows: 'Raðir', summary: 'Áfram', title: 'Eigindi töflu', toolbar: 'Tafla', widthPc: 'prósent', widthPx: 'myndeindir', widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/fr-ca.js0000644000201500020150000000532114515446712023612 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'fr-ca', { border: 'Taille de la bordure', caption: 'Titre', cell: { menu: 'Cellule', insertBefore: 'Insérer une cellule avant', insertAfter: 'Insérer une cellule après', deleteCell: 'Supprimer des cellules', merge: 'Fusionner les cellules', mergeRight: 'Fusionner à droite', mergeDown: 'Fusionner en bas', splitHorizontal: 'Scinder la cellule horizontalement', splitVertical: 'Scinder la cellule verticalement', title: 'Propriétés de la cellule', cellType: 'Type de cellule', rowSpan: 'Fusion de lignes', colSpan: 'Fusion de colonnes', wordWrap: 'Retour à la ligne', hAlign: 'Alignement horizontal', vAlign: 'Alignement vertical', alignBaseline: 'Bas du texte', bgColor: 'Couleur d\'arrière plan', borderColor: 'Couleur de bordure', data: 'Données', header: 'En-tête', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Oui', no: 'Non', invalidWidth: 'La largeur de cellule doit être un nombre.', invalidHeight: 'La hauteur de cellule doit être un nombre.', invalidRowSpan: 'La fusion de lignes doit être un nombre entier.', invalidColSpan: 'La fusion de colonnes doit être un nombre entier.', chooseColor: 'Sélectionner' }, cellPad: 'Marge interne des cellules', cellSpace: 'Espacement des cellules', column: { menu: 'Colonne', insertBefore: 'Insérer une colonne avant', insertAfter: 'Insérer une colonne après', deleteColumn: 'Supprimer des colonnes' }, columns: 'Colonnes', deleteTable: 'Supprimer le tableau', headers: 'En-têtes', headersBoth: 'Les deux.', headersColumn: 'Première colonne', headersNone: 'Aucun', headersRow: 'Première ligne', heightUnit: 'height unit', // MISSING invalidBorder: 'La taille de bordure doit être un nombre.', invalidCellPadding: 'La marge interne des cellules doit être un nombre positif.', invalidCellSpacing: 'L\'espacement des cellules doit être un nombre positif.', invalidCols: 'Le nombre de colonnes doit être supérieur à 0.', invalidHeight: 'La hauteur du tableau doit être un nombre.', invalidRows: 'Le nombre de lignes doit être supérieur à 0.', invalidWidth: 'La largeur du tableau doit être un nombre.', menu: 'Propriétés du tableau', row: { menu: 'Ligne', insertBefore: 'Insérer une ligne avant', insertAfter: 'Insérer une ligne après', deleteRow: 'Supprimer des lignes' }, rows: 'Lignes', summary: 'Résumé', title: 'Propriétés du tableau', toolbar: 'Tableau', widthPc: 'pourcentage', widthPx: 'pixels', widthUnit: 'unité de largeur' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/et.js0000644000201500020150000000455014515446712023235 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'et', { border: 'Joone suurus', caption: 'Tabeli tiitel', cell: { menu: 'Lahter', insertBefore: 'Sisesta lahter enne', insertAfter: 'Sisesta lahter peale', deleteCell: 'Eemalda lahtrid', merge: 'Ühenda lahtrid', mergeRight: 'Ühenda paremale', mergeDown: 'Ühenda alla', splitHorizontal: 'Poolita lahter horisontaalselt', splitVertical: 'Poolita lahter vertikaalselt', title: 'Lahtri omadused', cellType: 'Lahtri liik', rowSpan: 'Ridade vahe', colSpan: 'Tulpade vahe', wordWrap: 'Sõnade murdmine', hAlign: 'Horisontaalne joondus', vAlign: 'Vertikaalne joondus', alignBaseline: 'Baasjoon', bgColor: 'Tausta värv', borderColor: 'Äärise värv', data: 'Andmed', header: 'Päis', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Jah', no: 'Ei', invalidWidth: 'Lahtri laius peab olema number.', invalidHeight: 'Lahtri kõrgus peab olema number.', invalidRowSpan: 'Ridade vahe peab olema täisarv.', invalidColSpan: 'Tulpade vahe peab olema täisarv.', chooseColor: 'Vali' }, cellPad: 'Lahtri täidis', cellSpace: 'Lahtri vahe', column: { menu: 'Veerg', insertBefore: 'Sisesta veerg enne', insertAfter: 'Sisesta veerg peale', deleteColumn: 'Eemalda veerud' }, columns: 'Veerud', deleteTable: 'Kustuta tabel', headers: 'Päised', headersBoth: 'Mõlemad', headersColumn: 'Esimene tulp', headersNone: 'Puudub', headersRow: 'Esimene rida', heightUnit: 'kõrgusühik', invalidBorder: 'Äärise suurus peab olema number.', invalidCellPadding: 'Lahtrite polsterdus (padding) peab olema positiivne arv.', invalidCellSpacing: 'Lahtrite vahe peab olema positiivne arv.', invalidCols: 'Tulpade arv peab olema nullist suurem.', invalidHeight: 'Tabeli kõrgus peab olema number.', invalidRows: 'Ridade arv peab olema nullist suurem.', invalidWidth: 'Tabeli laius peab olema number.', menu: 'Tabeli omadused', row: { menu: 'Rida', insertBefore: 'Sisesta rida enne', insertAfter: 'Sisesta rida peale', deleteRow: 'Eemalda read' }, rows: 'Read', summary: 'Kokkuvõte', title: 'Tabeli omadused', toolbar: 'Tabel', widthPc: 'protsenti', widthPx: 'pikslit', widthUnit: 'laiuse ühik' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/bs.js0000644000201500020150000000467614515446712023242 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'bs', { border: 'Okvir', caption: 'Naslov', cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Briši æelije', merge: 'Spoji æelije', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Uvod æelija', cellSpace: 'Razmak æelija', column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Briši kolone' }, columns: 'Kolona', deleteTable: 'Delete Table', // MISSING headers: 'Headers', // MISSING headersBoth: 'Both', // MISSING headersColumn: 'First column', // MISSING headersNone: 'None', headersRow: 'First Row', // MISSING heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'Svojstva tabele', row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Briši redove' }, rows: 'Redova', summary: 'Summary', // MISSING title: 'Svojstva tabele', toolbar: 'Tabela', widthPc: 'posto', widthPx: 'piksela', widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/pl.js0000644000201500020150000000511214515446712023233 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'pl', { border: 'Grubość obramowania', caption: 'Tytuł', cell: { menu: 'Komórka', insertBefore: 'Wstaw komórkę z lewej', insertAfter: 'Wstaw komórkę z prawej', deleteCell: 'Usuń komórki', merge: 'Połącz komórki', mergeRight: 'Połącz z komórką z prawej', mergeDown: 'Połącz z komórką poniżej', splitHorizontal: 'Podziel komórkę poziomo', splitVertical: 'Podziel komórkę pionowo', title: 'Właściwości komórki', cellType: 'Typ komórki', rowSpan: 'Scalenie wierszy', colSpan: 'Scalenie komórek', wordWrap: 'Zawijanie słów', hAlign: 'Wyrównanie poziome', vAlign: 'Wyrównanie pionowe', alignBaseline: 'Linia bazowa', bgColor: 'Kolor tła', borderColor: 'Kolor obramowania', data: 'Dane', header: 'Nagłówek', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Tak', no: 'Nie', invalidWidth: 'Szerokość komórki musi być liczbą.', invalidHeight: 'Wysokość komórki musi być liczbą.', invalidRowSpan: 'Scalenie wierszy musi być liczbą całkowitą.', invalidColSpan: 'Scalenie komórek musi być liczbą całkowitą.', chooseColor: 'Wybierz' }, cellPad: 'Dopełnienie komórek', cellSpace: 'Odstęp pomiędzy komórkami', column: { menu: 'Kolumna', insertBefore: 'Wstaw kolumnę z lewej', insertAfter: 'Wstaw kolumnę z prawej', deleteColumn: 'Usuń kolumny' }, columns: 'Liczba kolumn', deleteTable: 'Usuń tabelę', headers: 'Nagłówki', headersBoth: 'Oba', headersColumn: 'Pierwsza kolumna', headersNone: 'Brak', headersRow: 'Pierwszy wiersz', heightUnit: 'jednostka wysokości', invalidBorder: 'Wartość obramowania musi być liczbą.', invalidCellPadding: 'Dopełnienie komórek musi być liczbą dodatnią.', invalidCellSpacing: 'Odstęp pomiędzy komórkami musi być liczbą dodatnią.', invalidCols: 'Liczba kolumn musi być większa niż 0.', invalidHeight: 'Wysokość tabeli musi być liczbą.', invalidRows: 'Liczba wierszy musi być większa niż 0.', invalidWidth: 'Szerokość tabeli musi być liczbą.', menu: 'Właściwości tabeli', row: { menu: 'Wiersz', insertBefore: 'Wstaw wiersz powyżej', insertAfter: 'Wstaw wiersz poniżej', deleteRow: 'Usuń wiersze' }, rows: 'Liczba wierszy', summary: 'Podsumowanie', title: 'Właściwości tabeli', toolbar: 'Tabela', widthPc: '%', widthPx: 'piksele', widthUnit: 'jednostka szerokości' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/bg.js0000644000201500020150000000710414515446712023213 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'bg', { border: 'Размер на рамката', caption: 'Заглавие', cell: { menu: 'Клетка', insertBefore: 'Вмъкване на клетка преди', insertAfter: 'Вмъкване на клетка след', deleteCell: 'Изтриване на клетки', merge: 'Сливане на клетки', mergeRight: 'Сливане надясно', mergeDown: 'Сливане надолу', splitHorizontal: 'Разделяне клетката хоризонтално', splitVertical: 'Разделяне клетката вертикално', title: 'Настройки на клетката', cellType: 'Тип на клетката', rowSpan: 'Редове обединени', colSpan: 'Колони обединени', wordWrap: 'Авто. пренос', hAlign: 'Хоризонтално подравняване', vAlign: 'Вертикално подравняване', alignBaseline: 'Базова линия', bgColor: 'Фон', borderColor: 'Цвят на рамката', data: 'Данни', header: 'Заглавие', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Да', no: 'Не', invalidWidth: 'Ширината на клетката трябва да е число.', invalidHeight: 'Височината на клетката трябва да е число.', invalidRowSpan: 'Редове обединени трябва да е цяло число.', invalidColSpan: 'Колони обединени трябва да е цяло число.', chooseColor: 'Изберете' }, cellPad: 'Отделяне на клетките', cellSpace: 'Разстояние между клетките', column: { menu: 'Колона', insertBefore: 'Вмъкване на колона преди', insertAfter: 'Вмъкване на колона след', deleteColumn: 'Изтриване на колони' }, columns: 'Колони', deleteTable: 'Изтриване на таблица', headers: 'Заглавия', headersBoth: 'И двете', headersColumn: 'Първа колона', headersNone: 'Няма', headersRow: 'Първи ред', heightUnit: 'height unit', // MISSING invalidBorder: 'Размерът на рамката трябва да е число.', invalidCellPadding: 'Отстоянието на клетките трябва да е положително число.', invalidCellSpacing: 'Интервалът в клетките трябва да е положително число.', invalidCols: 'Броят колони трябва да е по-голям от 0.', invalidHeight: 'Височината на таблицата трябва да е число.', invalidRows: 'Броят редове трябва да е по-голям от 0.', invalidWidth: 'Ширината на таблицата трябва да е число.', menu: 'Настройки на таблицата', row: { menu: 'Ред', insertBefore: 'Вмъкване на ред преди', insertAfter: 'Вмъкване на ред след', deleteRow: 'Изтриване на редове' }, rows: 'Редове', summary: 'Обща информация', title: 'Настройки на таблицата', toolbar: 'Таблица', widthPc: 'процент', widthPx: 'пиксела', widthUnit: 'единица за ширина' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/fa.js0000644000201500020150000000576214515446712023221 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'fa', { border: 'اندازهٴ لبه', caption: 'عنوان', cell: { menu: 'سلول', insertBefore: 'افزودن سلول قبل از', insertAfter: 'افزودن سلول بعد از', deleteCell: 'حذف سلولها', merge: 'ادغام سلولها', mergeRight: 'ادغام به راست', mergeDown: 'ادغام به پایین', splitHorizontal: 'جدا کردن افقی سلول', splitVertical: 'جدا کردن عمودی سلول', title: 'ویژگیهای سلول', cellType: 'نوع سلول', rowSpan: 'محدوده ردیفها', colSpan: 'محدوده ستونها', wordWrap: 'شکستن کلمه', hAlign: 'چینش افقی', vAlign: 'چینش عمودی', alignBaseline: 'خط مبنا', bgColor: 'رنگ زمینه', borderColor: 'رنگ خطوط', data: 'اطلاعات', header: 'سرنویس', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'بله', no: 'خیر', invalidWidth: 'عرض سلول باید یک عدد باشد.', invalidHeight: 'ارتفاع سلول باید عدد باشد.', invalidRowSpan: 'مقدار محدوده ردیفها باید یک عدد باشد.', invalidColSpan: 'مقدار محدوده ستونها باید یک عدد باشد.', chooseColor: 'انتخاب' }, cellPad: 'فاصلهٴ پرشده در سلول', cellSpace: 'فاصلهٴ میان سلولها', column: { menu: 'ستون', insertBefore: 'افزودن ستون قبل از', insertAfter: 'افزودن ستون بعد از', deleteColumn: 'حذف ستونها' }, columns: 'ستونها', deleteTable: 'پاک کردن جدول', headers: 'سرنویسها', headersBoth: 'هردو', headersColumn: 'اولین ستون', headersNone: 'هیچ', headersRow: 'اولین ردیف', heightUnit: 'واحد ارتفاع', invalidBorder: 'مقدار اندازه خطوط باید یک عدد باشد.', invalidCellPadding: 'بالشتک سلول باید یک عدد باشد.', invalidCellSpacing: 'مقدار فاصلهگذاری سلول باید یک عدد باشد.', invalidCols: 'تعداد ستونها باید یک عدد بزرگتر از 0 باشد.', invalidHeight: 'مقدار ارتفاع جدول باید یک عدد باشد.', invalidRows: 'تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.', invalidWidth: 'مقدار پهنای جدول باید یک عدد باشد.', menu: 'ویژگیهای جدول', row: { menu: 'سطر', insertBefore: 'افزودن سطر قبل از', insertAfter: 'افزودن سطر بعد از', deleteRow: 'حذف سطرها' }, rows: 'سطرها', summary: 'خلاصه', title: 'ویژگیهای جدول', toolbar: 'جدول', widthPc: 'درصد', widthPx: 'پیکسل', widthUnit: 'واحد پهنا' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ku.js0000644000201500020150000000635514515446712023251 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ku', { border: 'گەورەیی پەراوێز', caption: 'سەردێڕ', cell: { menu: 'خانه', insertBefore: 'دانانی خانه لەپێش', insertAfter: 'دانانی خانه لەپاش', deleteCell: 'سڕینەوەی خانه', merge: 'تێکەڵکردنی خانە', mergeRight: 'تێکەڵکردنی لەگەڵ ڕاست', mergeDown: 'تێکەڵکردنی لەگەڵ خوارەوە', splitHorizontal: 'دابەشکردنی خانەی ئاسۆیی', splitVertical: 'دابەشکردنی خانەی ئەستونی', title: 'خاسیەتی خانه', cellType: 'جۆری خانه', rowSpan: 'ماوەی نێوان ڕیز', colSpan: 'بستی ئەستونی', wordWrap: 'پێچانەوەی وشە', hAlign: 'ڕیزکردنی ئاسۆیی', vAlign: 'ڕیزکردنی ئەستونی', alignBaseline: 'هێڵەبنەڕەت', bgColor: 'ڕەنگی پاشبنەما', borderColor: 'ڕەنگی پەراوێز', data: 'داتا', header: 'سەرپەڕه', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'بەڵێ', no: 'نەخێر', invalidWidth: 'پانی خانه دەبێت بەتەواوی ژماره بێت.', invalidHeight: 'درێژی خانه بەتەواوی دەبێت ژمارە بێت.', invalidRowSpan: 'ماوەی نێوان ڕیز بەتەواوی دەبێت ژمارە بێت.', invalidColSpan: 'ماوەی نێوان ئەستونی بەتەواوی دەبێت ژمارە بێت.', chooseColor: 'هەڵبژێرە' }, cellPad: 'بۆشایی ناوپۆش', cellSpace: 'بۆشایی خانه', column: { menu: 'ئەستون', insertBefore: 'دانانی ئەستون لەپێش', insertAfter: 'دانانی ئەستوون لەپاش', deleteColumn: 'سڕینەوەی ئەستوون' }, columns: 'ستوونەکان', deleteTable: 'سڕینەوەی خشتە', headers: 'سەرپەڕه', headersBoth: 'هەردووك', headersColumn: 'یەکەم ئەستوون', headersNone: 'هیچ', headersRow: 'یەکەم ڕیز', heightUnit: 'یەکەی بەرز', invalidBorder: 'ژمارەی پەراوێز دەبێت تەنها ژماره بێت.', invalidCellPadding: 'ناوپۆشی خانه دەبێت ژمارەکی درووست بێت.', invalidCellSpacing: 'بۆشایی خانه دەبێت ژمارەکی درووست بێت.', invalidCols: 'ژمارەی ئەستوونی دەبێت گەورەتر بێت لەژمارەی 0.', invalidHeight: 'درێژی خشته دهبێت تهنها ژماره بێت.', invalidRows: 'ژمارەی ڕیز دەبێت گەورەتر بێت لەژمارەی 0.', invalidWidth: 'پانی خشته دەبێت تەنها ژماره بێت.', menu: 'خاسیەتی خشتە', row: { menu: 'ڕیز', insertBefore: 'دانانی ڕیز لەپێش', insertAfter: 'دانانی ڕیز لەپاش', deleteRow: 'سڕینەوەی ڕیز' }, rows: 'ڕیز', summary: 'کورتە', title: 'خاسیەتی خشتە', toolbar: 'خشتە', widthPc: 'لەسەدا', widthPx: 'وێنەخاڵ - پیکسل', widthUnit: 'پانی یەکە' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/bn.js0000644000201500020150000000542414515446712023225 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'bn', { border: 'বর্ডারের সাইজ', caption: 'শীর্ষক', cell: { menu: 'সেল', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'সেল মুছে দাও', merge: 'সেল জোড়া দাও', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'পৃষ্ঠতলের রং', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'সেল প্যাডিং', cellSpace: 'সেল স্পেস', column: { menu: 'কলাম', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'কলাম মুছে দাও' }, columns: 'কলাম', deleteTable: 'টেবিল ডিলীট কর', headers: 'Headers', // MISSING headersBoth: 'Both', // MISSING headersColumn: 'First column', // MISSING headersNone: 'None', headersRow: 'First Row', // MISSING heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'টেবিল প্রোপার্টি', row: { menu: 'রো', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'রো মুছে দাও' }, rows: 'রো', summary: 'সারাংশ', title: 'টেবিল প্রোপার্টি', toolbar: 'টেবিলের লেবেল যুক্ত কর', widthPc: 'শতকরা', widthPx: 'পিক্সেল', widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/el.js0000644000201500020150000000724414515446712023230 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'el', { border: 'Πάχος Περιγράμματος', caption: 'Λεζάντα', cell: { menu: 'Κελί', insertBefore: 'Εισαγωγή Κελιού Πριν', insertAfter: 'Εισαγωγή Κελιού Μετά', deleteCell: 'Διαγραφή Κελιών', merge: 'Ενοποίηση Κελιών', mergeRight: 'Συγχώνευση Με Δεξιά', mergeDown: 'Συγχώνευση Με Κάτω', splitHorizontal: 'Οριζόντια Διαίρεση Κελιού', splitVertical: 'Κατακόρυφη Διαίρεση Κελιού', title: 'Ιδιότητες Κελιού', cellType: 'Τύπος Κελιού', rowSpan: 'Εύρος Γραμμών', colSpan: 'Εύρος Στηλών', wordWrap: 'Αναδίπλωση Λέξεων', hAlign: 'Οριζόντια Στοίχιση', vAlign: 'Κάθετη Στοίχιση', alignBaseline: 'Γραμμή Βάσης', bgColor: 'Χρώμα Φόντου', borderColor: 'Χρώμα Περιγράμματος', data: 'Δεδομένα', header: 'Κεφαλίδα', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ναι', no: 'Όχι', invalidWidth: 'Το πλάτος του κελιού πρέπει να είναι αριθμός.', invalidHeight: 'Το ύψος του κελιού πρέπει να είναι αριθμός.', invalidRowSpan: 'Το εύρος των γραμμών πρέπει να είναι ακέραιος αριθμός.', invalidColSpan: 'Το εύρος των στηλών πρέπει να είναι ακέραιος αριθμός.', chooseColor: 'Επιλέξτε' }, cellPad: 'Αναπλήρωση κελιών', cellSpace: 'Απόσταση κελιών', column: { menu: 'Στήλη', insertBefore: 'Εισαγωγή Στήλης Πριν', insertAfter: 'Εισαγωγή Στήλης Μετά', deleteColumn: 'Διαγραφή Στηλών' }, columns: 'Στήλες', deleteTable: 'Διαγραφή Πίνακα', headers: 'Κεφαλίδες', headersBoth: 'Και τα δύο', headersColumn: 'Πρώτη στήλη', headersNone: 'Κανένα', headersRow: 'Πρώτη Γραμμή', heightUnit: 'μονάδα ύψους', invalidBorder: 'Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.', invalidCellPadding: 'Η αναπλήρωση των κελιών πρέπει να είναι θετικός αριθμός.', invalidCellSpacing: 'Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.', invalidCols: 'Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.', invalidHeight: 'Το ύψος του πίνακα πρέπει να είναι αριθμός.', invalidRows: 'Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.', invalidWidth: 'Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.', menu: 'Ιδιότητες Πίνακα', row: { menu: 'Γραμμή', insertBefore: 'Εισαγωγή Γραμμής Πριν', insertAfter: 'Εισαγωγή Γραμμής Μετά', deleteRow: 'Διαγραφή Γραμμών' }, rows: 'Γραμμές', summary: 'Περίληψη', title: 'Ιδιότητες Πίνακα', toolbar: 'Πίνακας', widthPc: 'τοις εκατό', widthPx: 'pixel', widthUnit: 'μονάδα πλάτους' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/fi.js0000644000201500020150000000476114515446712023227 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'fi', { border: 'Rajan paksuus', caption: 'Otsikko', cell: { menu: 'Solu', insertBefore: 'Lisää solu eteen', insertAfter: 'Lisää solu perään', deleteCell: 'Poista solut', merge: 'Yhdistä solut', mergeRight: 'Yhdistä oikealla olevan kanssa', mergeDown: 'Yhdistä alla olevan kanssa', splitHorizontal: 'Jaa solu vaakasuunnassa', splitVertical: 'Jaa solu pystysuunnassa', title: 'Solun ominaisuudet', cellType: 'Solun tyyppi', rowSpan: 'Rivin jatkuvuus', colSpan: 'Solun jatkuvuus', wordWrap: 'Rivitys', hAlign: 'Horisontaali kohdistus', vAlign: 'Vertikaali kohdistus', alignBaseline: 'Alas (teksti)', bgColor: 'Taustan väri', borderColor: 'Reunan väri', data: 'Data', header: 'Ylätunniste', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Kyllä', no: 'Ei', invalidWidth: 'Solun leveyden täytyy olla numero.', invalidHeight: 'Solun korkeuden täytyy olla numero.', invalidRowSpan: 'Rivin jatkuvuuden täytyy olla kokonaisluku.', invalidColSpan: 'Solun jatkuvuuden täytyy olla kokonaisluku.', chooseColor: 'Valitse' }, cellPad: 'Solujen sisennys', cellSpace: 'Solujen väli', column: { menu: 'Sarake', insertBefore: 'Lisää sarake vasemmalle', insertAfter: 'Lisää sarake oikealle', deleteColumn: 'Poista sarakkeet' }, columns: 'Sarakkeet', deleteTable: 'Poista taulu', headers: 'Ylätunnisteet', headersBoth: 'Molemmat', headersColumn: 'Ensimmäinen sarake', headersNone: 'Ei', headersRow: 'Ensimmäinen rivi', heightUnit: 'height unit', // MISSING invalidBorder: 'Reunan koon täytyy olla numero.', invalidCellPadding: 'Solujen sisennyksen täytyy olla numero.', invalidCellSpacing: 'Solujen välin täytyy olla numero.', invalidCols: 'Sarakkeiden määrän täytyy olla suurempi kuin 0.', invalidHeight: 'Taulun korkeuden täytyy olla numero.', invalidRows: 'Rivien määrän täytyy olla suurempi kuin 0.', invalidWidth: 'Taulun leveyden täytyy olla numero.', menu: 'Taulun ominaisuudet', row: { menu: 'Rivi', insertBefore: 'Lisää rivi yläpuolelle', insertAfter: 'Lisää rivi alapuolelle', deleteRow: 'Poista rivit' }, rows: 'Rivit', summary: 'Yhteenveto', title: 'Taulun ominaisuudet', toolbar: 'Taulu', widthPc: 'prosenttia', widthPx: 'pikseliä', widthUnit: 'leveysyksikkö' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ru.js0000644000201500020150000000712514515446712023254 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ru', { border: 'Размер границ', caption: 'Заголовок', cell: { menu: 'Ячейка', insertBefore: 'Вставить ячейку слева', insertAfter: 'Вставить ячейку справа', deleteCell: 'Удалить ячейки', merge: 'Объединить ячейки', mergeRight: 'Объединить с правой', mergeDown: 'Объединить с нижней', splitHorizontal: 'Разделить ячейку по вертикали', splitVertical: 'Разделить ячейку по горизонтали', title: 'Свойства ячейки', cellType: 'Тип ячейки', rowSpan: 'Объединяет строк', colSpan: 'Объединяет колонок', wordWrap: 'Перенос по словам', hAlign: 'Горизонтальное выравнивание', vAlign: 'Вертикальное выравнивание', alignBaseline: 'По базовой линии', bgColor: 'Цвет фона', borderColor: 'Цвет границ', data: 'Данные', header: 'Заголовок', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Да', no: 'Нет', invalidWidth: 'Ширина ячейки должна быть числом.', invalidHeight: 'Высота ячейки должна быть числом.', invalidRowSpan: 'Количество объединяемых строк должно быть задано числом.', invalidColSpan: 'Количество объединяемых колонок должно быть задано числом.', chooseColor: 'Выберите' }, cellPad: 'Внутренний отступ ячеек', cellSpace: 'Внешний отступ ячеек', column: { menu: 'Колонка', insertBefore: 'Вставить колонку слева', insertAfter: 'Вставить колонку справа', deleteColumn: 'Удалить колонки' }, columns: 'Колонки', deleteTable: 'Удалить таблицу', headers: 'Заголовки', headersBoth: 'Сверху и слева', headersColumn: 'Левая колонка', headersNone: 'Без заголовков', headersRow: 'Верхняя строка', heightUnit: 'height unit', // MISSING invalidBorder: 'Размер границ должен быть числом.', invalidCellPadding: 'Внутренний отступ ячеек (cellpadding) должен быть числом.', invalidCellSpacing: 'Внешний отступ ячеек (cellspacing) должен быть числом.', invalidCols: 'Количество столбцов должно быть больше 0.', invalidHeight: 'Высота таблицы должна быть числом.', invalidRows: 'Количество строк должно быть больше 0.', invalidWidth: 'Ширина таблицы должна быть числом.', menu: 'Свойства таблицы', row: { menu: 'Строка', insertBefore: 'Вставить строку сверху', insertAfter: 'Вставить строку снизу', deleteRow: 'Удалить строки' }, rows: 'Строки', summary: 'Итоги', title: 'Свойства таблицы', toolbar: 'Таблица', widthPc: 'процентов', widthPx: 'пикселей', widthUnit: 'единица измерения' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/gl.js0000644000201500020150000000506614515446712023232 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'gl', { border: 'Tamaño do bordo', caption: 'Título', cell: { menu: 'Cela', insertBefore: 'Inserir a cela á esquerda', insertAfter: 'Inserir a cela á dereita', deleteCell: 'Eliminar celas', merge: 'Combinar celas', mergeRight: 'Combinar á dereita', mergeDown: 'Combinar cara abaixo', splitHorizontal: 'Dividir a cela en horizontal', splitVertical: 'Dividir a cela en vertical', title: 'Propiedades da cela', cellType: 'Tipo de cela', rowSpan: 'Expandir filas', colSpan: 'Expandir columnas', wordWrap: 'Axustar ao contido', hAlign: 'Aliñación horizontal', vAlign: 'Aliñación vertical', alignBaseline: 'Liña de base', bgColor: 'Cor do fondo', borderColor: 'Cor do bordo', data: 'Datos', header: 'Cabeceira', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Si', no: 'Non', invalidWidth: 'O largo da cela debe ser un número.', invalidHeight: 'O alto da cela debe ser un número.', invalidRowSpan: 'A expansión de filas debe ser un número enteiro.', invalidColSpan: 'A expansión de columnas debe ser un número enteiro.', chooseColor: 'Escoller' }, cellPad: 'Marxe interior da cela', cellSpace: 'Marxe entre celas', column: { menu: 'Columna', insertBefore: 'Inserir a columna á esquerda', insertAfter: 'Inserir a columna á dereita', deleteColumn: 'Borrar Columnas' }, columns: 'Columnas', deleteTable: 'Borrar Táboa', headers: 'Cabeceiras', headersBoth: 'Ambas', headersColumn: 'Primeira columna', headersNone: 'Ningún', headersRow: 'Primeira fila', heightUnit: 'unidade do alto', invalidBorder: 'O tamaño do bordo debe ser un número.', invalidCellPadding: 'A marxe interior debe ser un número positivo.', invalidCellSpacing: 'A marxe entre celas debe ser un número positivo.', invalidCols: 'O número de columnas debe ser un número maior que 0.', invalidHeight: 'O alto da táboa debe ser un número.', invalidRows: 'O número de filas debe ser un número maior que 0', invalidWidth: 'O largo da táboa debe ser un número.', menu: 'Propiedades da táboa', row: { menu: 'Fila', insertBefore: 'Inserir a fila por riba', insertAfter: 'Inserir a fila por baixo', deleteRow: 'Eliminar filas' }, rows: 'Filas', summary: 'Resumo', title: 'Propiedades da táboa', toolbar: 'Taboa', widthPc: 'porcentaxe', widthPx: 'píxeles', widthUnit: 'unidade do largo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/sr-latn.js0000644000201500020150000000461014515446712024202 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'sr-latn', { border: 'Veličina okvira', caption: 'Naslov tabele', cell: { menu: 'Ćelija', insertBefore: 'Ubaci levo', insertAfter: 'Ubaci desno', deleteCell: 'Obriši ćelije', merge: 'Spoj ćelije', mergeRight: 'Spolj ćelije desno', mergeDown: 'Spolj čelije na dole', splitHorizontal: 'Razdvoji ćelije vodoravno', splitVertical: 'Razdvoji ćelije uspravno', title: 'Karakteristike ćelija', cellType: 'Tip ćelija', rowSpan: 'Spoj uzdužno', colSpan: 'Spoj vodoravno', wordWrap: 'Brisanje dugačkih redova', hAlign: 'Ravnanje vodoravno', vAlign: 'Ravnanje uspravno', alignBaseline: 'Bazna linija', bgColor: 'Boja pozadine', borderColor: 'Boja okvira', data: 'Podatak', header: 'Zaglavlje', columnHeader: 'Zaglavlje kolone', rowHeader: 'Zaglavlje reda', yes: 'Da', no: 'Nе', invalidWidth: 'U polje širina možete upisati samo brojeve. ', invalidHeight: 'U polje visina možete upisati samo brojeve.', invalidRowSpan: 'U polje spoj uspravno možete upistai samo brojeve.', invalidColSpan: 'U polje spoj vodoravno možete upistai samo brojeve.', chooseColor: 'Izaberi' }, cellPad: 'Razmak ćelija', cellSpace: 'Ćelijski prostor', column: { menu: 'Kolona', insertBefore: 'Ubaci levo', insertAfter: 'Ubaci desno', deleteColumn: 'Obriši kolone' }, columns: 'Kolona', deleteTable: 'Izbriši tabelu', headers: 'Zaglavlja', headersBoth: 'Oba', headersColumn: 'Prva kolona', headersNone: 'Nema', headersRow: 'Prvi red', heightUnit: 'Jedinica visine', invalidBorder: 'Veličina okvira mora biti broj.', invalidCellPadding: 'Padding polja mora biti pozitivan broj.', invalidCellSpacing: 'Razmak između ćelija mora biti pozitivan broj.', invalidCols: 'Broj kolona mora biti broj veći od 0.', invalidHeight: 'Visina tabele mora biti broj.', invalidRows: 'Broj redova mora biti veći od 0.', invalidWidth: 'Širina tabele mora biti broj.', menu: 'Osobine tabele', row: { menu: 'Red', insertBefore: 'Ubaci iznad', insertAfter: 'Ubaci ispod', deleteRow: 'Obriši redove' }, rows: 'Redovi', summary: 'Opis', title: 'Karakteristike tabele', toolbar: 'Tabela', widthPc: 'procenata', widthPx: 'piksela', widthUnit: 'jedinica za širinu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/oc.js0000644000201500020150000000535514515446712023232 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'oc', { border: 'Talha de la bordadura', caption: 'Títol del tablèu', cell: { menu: 'Cellula', insertBefore: 'Inserir una cellula abans', insertAfter: 'Inserir una cellula aprèp', deleteCell: 'Suprimir las cellulas', merge: 'Fusionar las cellulas', mergeRight: 'Fusionar cap a dreita', mergeDown: 'Fusionar cap aval', splitHorizontal: 'Separar la cellula orizontalament', splitVertical: 'Separar la cellula verticalament', title: 'Proprietats de la cellula', cellType: 'Tipe de cellula', rowSpan: 'Linhas ocupadas', colSpan: 'Colomnas ocupadas', wordWrap: 'Cesura', hAlign: 'Alinhament orizontal', vAlign: 'Alinhament vertical', alignBaseline: 'Linha de basa', bgColor: 'Color de rèireplan', borderColor: 'Color de bordadura', data: 'Donadas', header: 'Entèsta', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Òc', no: 'Non', invalidWidth: 'La largor de la cellula deu èsser un nombre.', invalidHeight: 'La nautor de la cellula deu èsser un nombre.', invalidRowSpan: 'Lo nombre de linhas ocupadas deu èsser un nombre entièr.', invalidColSpan: 'Lo nombre de colomnas ocupadas deu èsser un nombre entièr.', chooseColor: 'Causir' }, cellPad: 'Marge intèrne de las cellulas', cellSpace: 'Espaçament entre las cellulas', column: { menu: 'Colomna', insertBefore: 'Inserir una colomna abans', insertAfter: 'Inserir una colomna aprèp', deleteColumn: 'Suprimir las colomnas' }, columns: 'Colomnas', deleteTable: 'Suprimir lo tablèu', headers: 'Entèstas', headersBoth: 'Los dos', headersColumn: 'Primièra colomna', headersNone: 'Pas cap', headersRow: 'Primièra linha', heightUnit: 'height unit', // MISSING invalidBorder: 'La talha de la bordadura deu èsser un nombre.', invalidCellPadding: 'Lo marge intèrne de las cellulas deu èsser un nombre positiu.', invalidCellSpacing: 'L\'espaçament entre las cellulas deu èsser un nombre positiu.', invalidCols: 'Lo nombre de colomnas deu èsser superior a 0.', invalidHeight: 'La nautor del tablèu deu èsser un nombre.', invalidRows: 'Lo nombre de linhas deu èsser superior a 0.', invalidWidth: 'La largor del tablèu deu èsser un nombre.', menu: 'Proprietats del tablèu', row: { menu: 'Linha', insertBefore: 'Inserir una linha abans', insertAfter: 'Inserir una linha aprèp', deleteRow: 'Suprimir las linhas' }, rows: 'Linhas', summary: 'Resumit (descripcion)', title: 'Proprietats del tablèu', toolbar: 'Tablèu', widthPc: 'per cent', widthPx: 'pixèls', widthUnit: 'unitat de largor' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/sq.js0000644000201500020150000000507414515446712023252 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'sq', { border: 'Madhësia e kornizave', caption: 'Titull', cell: { menu: 'Qeli', insertBefore: 'Shto Qeli Para', insertAfter: 'Shto Qeli Prapa', deleteCell: 'Gris Qelitë', merge: 'Bashko Qelitë', mergeRight: 'Bashko Djathtas', mergeDown: 'Bashko Poshtë', splitHorizontal: 'Ndaj Qelinë Horizontalisht', splitVertical: 'Ndaj Qelinë Vertikalisht', title: 'Rekuizitat e Qelisë', cellType: 'Lloji i Qelisë', rowSpan: 'Bashko Rreshtat', colSpan: 'Bashko Kolonat', wordWrap: 'Fund i Fjalës', hAlign: 'Bashkimi Horizontal', vAlign: 'Bashkimi Vertikal', alignBaseline: 'Baza', bgColor: 'Ngjyra e Prapavijës', borderColor: 'Ngjyra e Kornizave', data: 'Të dhënat', header: 'Koka', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Po', no: 'Jo', invalidWidth: 'Gjerësia e qelisë duhet të jetë numër.', invalidHeight: 'Lartësia e qelisë duhet të jetë numër.', invalidRowSpan: 'Hapësira e rreshtave duhet të jetë numër i plotë.', invalidColSpan: 'Hapësira e kolonave duhet të jetë numër i plotë.', chooseColor: 'Përzgjidh' }, cellPad: 'Mbushja e qelisë', cellSpace: 'Hapësira e qelisë', column: { menu: 'Kolona', insertBefore: 'Vendos Kolonë Para', insertAfter: 'Vendos Kolonë Pas', deleteColumn: 'Gris Kolonat' }, columns: 'Kolonat', deleteTable: 'Gris Tabelën', headers: 'Kokat', headersBoth: 'Së bashku', headersColumn: 'Kolona e parë', headersNone: 'Asnjë', headersRow: 'Rreshti i Parë', heightUnit: 'height unit', // MISSING invalidBorder: 'Madhësia e kufinjve duhet të jetë numër.', invalidCellPadding: 'Mbushja e qelisë duhet të jetë numër pozitiv.', invalidCellSpacing: 'Hapësira e qelisë duhet të jetë numër pozitiv.', invalidCols: 'Numri i kolonave duhet të jetë numër më i madh se 0.', invalidHeight: 'Lartësia e tabelës duhet të jetë numër.', invalidRows: 'Numri i rreshtave duhet të jetë numër më i madh se 0.', invalidWidth: 'Gjerësia e tabelës duhet të jetë numër.', menu: 'Karakteristikat e Tabelës', row: { menu: 'Rreshti', insertBefore: 'Shto Rresht Para', insertAfter: 'Shto Rresht Prapa', deleteRow: 'Gris Rreshtat' }, rows: 'Rreshtat', summary: 'Përmbledhje', title: 'Karakteristikat e Tabelës', toolbar: 'Tabela', widthPc: 'përqind', widthPx: 'piksell', widthUnit: 'njësia e gjerësisë' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/pt-br.js0000644000201500020150000000511514515446712023647 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'pt-br', { border: 'Borda', caption: 'Legenda', cell: { menu: 'Célula', insertBefore: 'Inserir célula a esquerda', insertAfter: 'Inserir célula a direita', deleteCell: 'Remover Células', merge: 'Mesclar Células', mergeRight: 'Mesclar com célula a direita', mergeDown: 'Mesclar com célula abaixo', splitHorizontal: 'Dividir célula horizontalmente', splitVertical: 'Dividir célula verticalmente', title: 'Propriedades da célula', cellType: 'Tipo de célula', rowSpan: 'Linhas cobertas', colSpan: 'Colunas cobertas', wordWrap: 'Quebra de palavra', hAlign: 'Alinhamento horizontal', vAlign: 'Alinhamento vertical', alignBaseline: 'Patamar de alinhamento', bgColor: 'Cor de fundo', borderColor: 'Cor das bordas', data: 'Dados', header: 'Cabeçalho', columnHeader: 'Cabeçalho da Coluna', rowHeader: 'Cabeçalho da Linha', yes: 'Sim', no: 'Não', invalidWidth: 'A largura da célula tem que ser um número.', invalidHeight: 'A altura da célula tem que ser um número.', invalidRowSpan: 'Linhas cobertas tem que ser um número inteiro.', invalidColSpan: 'Colunas cobertas tem que ser um número inteiro.', chooseColor: 'Escolher' }, cellPad: 'Margem interna', cellSpace: 'Espaçamento', column: { menu: 'Coluna', insertBefore: 'Inserir coluna a esquerda', insertAfter: 'Inserir coluna a direita', deleteColumn: 'Remover Colunas' }, columns: 'Colunas', deleteTable: 'Apagar Tabela', headers: 'Cabeçalho', headersBoth: 'Ambos', headersColumn: 'Primeira coluna', headersNone: 'Nenhum', headersRow: 'Primeira linha', heightUnit: 'Unidade para altura', invalidBorder: 'O tamanho da borda tem que ser um número.', invalidCellPadding: 'A margem interna das células tem que ser um número.', invalidCellSpacing: 'O espaçamento das células tem que ser um número.', invalidCols: 'O número de colunas tem que ser um número maior que 0.', invalidHeight: 'A altura da tabela tem que ser um número.', invalidRows: 'O número de linhas tem que ser um número maior que 0.', invalidWidth: 'A largura da tabela tem que ser um número.', menu: 'Formatar Tabela', row: { menu: 'Linha', insertBefore: 'Inserir linha acima', insertAfter: 'Inserir linha abaixo', deleteRow: 'Remover Linhas' }, rows: 'Linhas', summary: 'Resumo', title: 'Formatar Tabela', toolbar: 'Tabela', widthPc: '%', widthPx: 'pixels', widthUnit: 'unidade largura' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/fo.js0000644000201500020150000000463614515446712023236 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'fo', { border: 'Bordabreidd', caption: 'Tabellfrágreiðing', cell: { menu: 'Meski', insertBefore: 'Set meska inn áðrenn', insertAfter: 'Set meska inn aftaná', deleteCell: 'Strika meskar', merge: 'Flætta meskar', mergeRight: 'Flætta meskar til høgru', mergeDown: 'Flætta saman', splitHorizontal: 'Kloyv meska vatnrætt', splitVertical: 'Kloyv meska loddrætt', title: 'Mesku eginleikar', cellType: 'Mesku slag', rowSpan: 'Ræð spenni', colSpan: 'Kolonnu spenni', wordWrap: 'Orðkloyving', hAlign: 'Horisontal plasering', vAlign: 'Loddrøtt plasering', alignBaseline: 'Basislinja', bgColor: 'Bakgrundslitur', borderColor: 'Bordalitur', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nei', invalidWidth: 'Meskubreidd má vera eitt tal.', invalidHeight: 'Meskuhædd má vera eitt tal.', invalidRowSpan: 'Raðspennið má vera eitt heiltal.', invalidColSpan: 'Kolonnuspennið má vera eitt heiltal.', chooseColor: 'Vel' }, cellPad: 'Meskubreddi', cellSpace: 'Fjarstøða millum meskar', column: { menu: 'Kolonna', insertBefore: 'Set kolonnu inn áðrenn', insertAfter: 'Set kolonnu inn aftaná', deleteColumn: 'Strika kolonnur' }, columns: 'Kolonnur', deleteTable: 'Strika tabell', headers: 'Yvirskriftir', headersBoth: 'Báðir', headersColumn: 'Fyrsta kolonna', headersNone: 'Eingin', headersRow: 'Fyrsta rað', heightUnit: 'height unit', // MISSING invalidBorder: 'Borda-stødd má vera eitt tal.', invalidCellPadding: 'Cell padding má vera eitt tal.', invalidCellSpacing: 'Cell spacing má vera eitt tal.', invalidCols: 'Talið av kolonnum má vera eitt tal størri enn 0.', invalidHeight: 'Tabell-hædd má vera eitt tal.', invalidRows: 'Talið av røðum má vera eitt tal størri enn 0.', invalidWidth: 'Tabell-breidd má vera eitt tal.', menu: 'Eginleikar fyri tabell', row: { menu: 'Rað', insertBefore: 'Set rað inn áðrenn', insertAfter: 'Set rað inn aftaná', deleteRow: 'Strika røðir' }, rows: 'Røðir', summary: 'Samandráttur', title: 'Eginleikar fyri tabell', toolbar: 'Tabell', widthPc: 'prosent', widthPx: 'pixels', widthUnit: 'breiddar unit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/af.js0000644000201500020150000000445514515446712023217 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'af', { border: 'Randbreedte', caption: 'Naam', cell: { menu: 'Sel', insertBefore: 'Voeg sel in voor', insertAfter: 'Voeg sel in na', deleteCell: 'Verwyder sel', merge: 'Voeg selle saam', mergeRight: 'Voeg saam na regs', mergeDown: 'Voeg saam ondertoe', splitHorizontal: 'Splits sel horisontaal', splitVertical: 'Splits sel vertikaal', title: 'Sel eienskappe', cellType: 'Sel tipe', rowSpan: 'Omspan rye', colSpan: 'Omspan kolomme', wordWrap: 'Woord terugloop', hAlign: 'Horisontale oplyning', vAlign: 'Vertikale oplyning', alignBaseline: 'Basislyn', bgColor: 'Agtergrondkleur', borderColor: 'Randkleur', data: 'Inhoud', header: 'Opskrif', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nee', invalidWidth: 'Selbreedte moet \'n getal wees.', invalidHeight: 'Selhoogte moet \'n getal wees.', invalidRowSpan: 'Omspan rye moet \'n heelgetal wees.', invalidColSpan: 'Omspan kolomme moet \'n heelgetal wees.', chooseColor: 'Kies' }, cellPad: 'Sel-spasie', cellSpace: 'Sel-afstand', column: { menu: 'Kolom', insertBefore: 'Voeg kolom in voor', insertAfter: 'Voeg kolom in na', deleteColumn: 'Verwyder kolom' }, columns: 'Kolomme', deleteTable: 'Verwyder tabel', headers: 'Opskrifte', headersBoth: 'Beide ', headersColumn: 'Eerste kolom', headersNone: 'Geen', headersRow: 'Eerste ry', heightUnit: 'height unit', // MISSING invalidBorder: 'Randbreedte moet \'n getal wees.', invalidCellPadding: 'Sel-spasie moet \'n getal wees.', invalidCellSpacing: 'Sel-afstand moet \'n getal wees.', invalidCols: 'Aantal kolomme moet \'n getal groter as 0 wees.', invalidHeight: 'Tabelhoogte moet \'n getal wees.', invalidRows: 'Aantal rye moet \'n getal groter as 0 wees.', invalidWidth: 'Tabelbreedte moet \'n getal wees.', menu: 'Tabel eienskappe', row: { menu: 'Ry', insertBefore: 'Voeg ry in voor', insertAfter: 'Voeg ry in na', deleteRow: 'Verwyder ry' }, rows: 'Rye', summary: 'Opsomming', title: 'Tabel eienskappe', toolbar: 'Tabel', widthPc: 'persent', widthPx: 'piksels', widthUnit: 'breedte-eenheid' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/hi.js0000644000201500020150000000616614515446712023232 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'hi', { border: 'बॉर्डर साइज़', caption: 'शीर्षक', cell: { menu: 'खाना', insertBefore: 'पहले सैल डालें', insertAfter: 'बाद में सैल डालें', deleteCell: 'सैल डिलीट करें', merge: 'सैल मिलायें', mergeRight: 'बाँया विलय', mergeDown: 'नीचे विलय करें', splitHorizontal: 'सैल को क्षैतिज स्थिति में विभाजित करें', splitVertical: 'सैल को लम्बाकार में विभाजित करें', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'सैल पैडिंग', cellSpace: 'सैल अंतर', column: { menu: 'कालम', insertBefore: 'पहले कालम डालें', insertAfter: 'बाद में कालम डालें', deleteColumn: 'कालम डिलीट करें' }, columns: 'कालम', deleteTable: 'टेबल डिलीट करें', headers: 'Headers', // MISSING headersBoth: 'Both', // MISSING headersColumn: 'First column', // MISSING headersNone: 'None', headersRow: 'First Row', // MISSING heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'टेबल प्रॉपर्टीज़', row: { menu: 'पंक्ति', insertBefore: 'पहले पंक्ति डालें', insertAfter: 'बाद में पंक्ति डालें', deleteRow: 'पंक्तियाँ डिलीट करें' }, rows: 'पंक्तियाँ', summary: 'सारांश', title: 'टेबल प्रॉपर्टीज़', toolbar: 'टेबल', widthPc: 'प्रतिशत', widthPx: 'पिक्सैल', widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/km.js0000644000201500020150000001056514515446712023237 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'km', { border: 'ទំហំ​បន្ទាត់​ស៊ុម', caption: 'ចំណងជើង', cell: { menu: 'ក្រឡា', insertBefore: 'បញ្ចូល​ក្រឡា​ពីមុខ', insertAfter: 'បញ្ចូល​ក្រឡា​ពី​ក្រោយ', deleteCell: 'លុប​ក្រឡា', merge: 'បញ្ចូល​ក្រឡា​ចូល​គ្នា', mergeRight: 'បញ្ចូល​គ្នា​ខាង​ស្ដាំ', mergeDown: 'បញ្ចូល​គ្នា​ចុះ​ក្រោម', splitHorizontal: 'ពុះ​ក្រឡា​ផ្ដេក', splitVertical: 'ពុះ​ក្រឡា​បញ្ឈរ', title: 'លក្ខណៈ​ក្រឡា', cellType: 'ប្រភេទ​ក្រឡា', rowSpan: 'ចំនួន​ជួរ​ដេក​លាយ​ចូល​គ្នា', colSpan: 'ចំនួន​ជួរ​ឈរ​លាយ​ចូល​គ្នា', wordWrap: 'រុំ​ពាក្យ', hAlign: 'ការ​តម្រឹម​ផ្ដេក', vAlign: 'ការ​តម្រឹម​បញ្ឈរ', alignBaseline: 'ខ្សែ​បន្ទាត់​គោល', bgColor: 'ពណ៌​ផ្ទៃ​ក្រោយ', borderColor: 'ពណ៌​បន្ទាត់​ស៊ុម', data: 'ទិន្នន័យ', header: 'ក្បាល', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'ព្រម', no: 'ទេ', invalidWidth: 'ទទឹង​ក្រឡា​ត្រូវ​តែ​ជា​លេខ។', invalidHeight: 'កម្ពស់​ក្រឡា​ត្រូវ​តែ​ជា​លេខ។', invalidRowSpan: 'ចំនួន​ជួរ​ដេក​លាយ​ចូល​គ្នា​ត្រូវ​តែ​ជា​លេខ​ទាំង​អស់។', invalidColSpan: 'ចំនួន​ជួរ​ឈរ​លាយ​ចូល​គ្នា​ត្រូវ​តែ​ជា​លេខ​ទាំង​អស់។', chooseColor: 'រើស' }, cellPad: 'ចន្លោះ​ក្រឡា', cellSpace: 'គម្លាត​ក្រឡា', column: { menu: 'ជួរ​ឈរ', insertBefore: 'បញ្ចូល​ជួរ​ឈរ​ពីមុខ', insertAfter: 'បញ្ចូល​ជួរ​ឈរ​ពី​ក្រោយ', deleteColumn: 'លុប​ជួរ​ឈរ' }, columns: 'ជួរឈរ', deleteTable: 'លុប​តារាង', headers: 'ក្បាល', headersBoth: 'ទាំង​ពីរ', headersColumn: 'ជួរ​ឈរ​ដំបូង', headersNone: 'មិន​មាន', headersRow: 'ជួរ​ដេក​ដំបូង', heightUnit: 'height unit', // MISSING invalidBorder: 'ទំហំ​បន្ទាត់​ស៊ុម​ត្រូវ​តែ​ជា​លេខ។', invalidCellPadding: 'ចន្លោះ​ក្រឡា​ត្រូវ​តែជា​លេខ​វិជ្ជមាន។', invalidCellSpacing: 'គម្លាត​ក្រឡា​ត្រូវ​តែ​ជា​លេខ​វិជ្ជមាន។', invalidCols: 'ចំនួន​ជួរ​ឈរ​ត្រូវ​តែ​ជា​លេខ​ធំ​ជាង 0។', invalidHeight: 'កម្ពស់​តារាង​ត្រូវ​តែ​ជា​លេខ', invalidRows: 'ចំនួន​ជួរ​ដេក​ត្រូវ​តែ​ជា​លេខ​ធំ​ជាង 0។', invalidWidth: 'ទទឹង​តារាង​ត្រូវ​តែ​ជា​លេខ។', menu: 'លក្ខណៈ​តារាង', row: { menu: 'ជួរ​ដេក', insertBefore: 'បញ្ចូល​ជួរ​ដេក​ពីមុខ', insertAfter: 'បញ្ចូល​ជួរ​ដេក​ពី​ក្រោយ', deleteRow: 'លុប​ជួរ​ដេក' }, rows: 'ជួរ​ដេក', summary: 'សេចក្តី​សង្ខេប', title: 'លក្ខណៈ​តារាង', toolbar: 'តារាង', widthPc: 'ភាគរយ', widthPx: 'ភីកសែល', widthUnit: 'ឯកតា​ទទឹង' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/nl.js0000644000201500020150000000463614515446712023243 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'nl', { border: 'Randdikte', caption: 'Bijschrift', cell: { menu: 'Cel', insertBefore: 'Voeg cel in voor', insertAfter: 'Voeg cel in na', deleteCell: 'Cellen verwijderen', merge: 'Cellen samenvoegen', mergeRight: 'Voeg samen naar rechts', mergeDown: 'Voeg samen naar beneden', splitHorizontal: 'Splits cel horizontaal', splitVertical: 'Splits cel vertikaal', title: 'Celeigenschappen', cellType: 'Celtype', rowSpan: 'Rijen samenvoegen', colSpan: 'Kolommen samenvoegen', wordWrap: 'Automatische terugloop', hAlign: 'Horizontale uitlijning', vAlign: 'Verticale uitlijning', alignBaseline: 'Tekstregel', bgColor: 'Achtergrondkleur', borderColor: 'Randkleur', data: 'Gegevens', header: 'Kop', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nee', invalidWidth: 'De celbreedte moet een getal zijn.', invalidHeight: 'De celhoogte moet een getal zijn.', invalidRowSpan: 'Rijen samenvoegen moet een heel getal zijn.', invalidColSpan: 'Kolommen samenvoegen moet een heel getal zijn.', chooseColor: 'Kies' }, cellPad: 'Celopvulling', cellSpace: 'Celafstand', column: { menu: 'Kolom', insertBefore: 'Voeg kolom in voor', insertAfter: 'Voeg kolom in na', deleteColumn: 'Kolommen verwijderen' }, columns: 'Kolommen', deleteTable: 'Tabel verwijderen', headers: 'Koppen', headersBoth: 'Beide', headersColumn: 'Eerste kolom', headersNone: 'Geen', headersRow: 'Eerste rij', heightUnit: 'height unit', // MISSING invalidBorder: 'De randdikte moet een getal zijn.', invalidCellPadding: 'Celopvulling moet een getal zijn.', invalidCellSpacing: 'Celafstand moet een getal zijn.', invalidCols: 'Het aantal kolommen moet een getal zijn groter dan 0.', invalidHeight: 'De tabelhoogte moet een getal zijn.', invalidRows: 'Het aantal rijen moet een getal zijn groter dan 0.', invalidWidth: 'De tabelbreedte moet een getal zijn.', menu: 'Tabeleigenschappen', row: { menu: 'Rij', insertBefore: 'Voeg rij in voor', insertAfter: 'Voeg rij in na', deleteRow: 'Rijen verwijderen' }, rows: 'Rijen', summary: 'Samenvatting', title: 'Tabeleigenschappen', toolbar: 'Tabel', widthPc: 'procent', widthPx: 'pixels', widthUnit: 'eenheid breedte' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ka.js0000644000201500020150000001115714515446712023221 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ka', { border: 'ჩარჩოს ზომა', caption: 'სათაური', cell: { menu: 'უჯრა', insertBefore: 'უჯრის ჩასმა მანამდე', insertAfter: 'უჯრის ჩასმა მერე', deleteCell: 'უჯრების წაშლა', merge: 'უჯრების შეერთება', mergeRight: 'შეერთება მარჯვენასთან', mergeDown: 'შეერთება ქვემოთასთან', splitHorizontal: 'გაყოფა ჰორიზონტალურად', splitVertical: 'გაყოფა ვერტიკალურად', title: 'უჯრის პარამეტრები', cellType: 'უჯრის ტიპი', rowSpan: 'სტრიქონების ოდენობა', colSpan: 'სვეტების ოდენობა', wordWrap: 'სტრიქონის გადატანა (Word Wrap)', hAlign: 'ჰორიზონტალური სწორება', vAlign: 'ვერტიკალური სწორება', alignBaseline: 'ძირითადი ხაზის გასწვრივ', bgColor: 'ფონის ფერი', borderColor: 'ჩარჩოს ფერი', data: 'მონაცემები', header: 'სათაური', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'დიახ', no: 'არა', invalidWidth: 'უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.', invalidHeight: 'უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.', invalidRowSpan: 'სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.', invalidColSpan: 'სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.', chooseColor: 'არჩევა' }, cellPad: 'უჯრის კიდე (padding)', cellSpace: 'უჯრის სივრცე (spacing)', column: { menu: 'სვეტი', insertBefore: 'სვეტის ჩამატება წინ', insertAfter: 'სვეტის ჩამატება მერე', deleteColumn: 'სვეტების წაშლა' }, columns: 'სვეტი', deleteTable: 'ცხრილის წაშლა', headers: 'სათაურები', headersBoth: 'ორივე', headersColumn: 'პირველი სვეტი', headersNone: 'არაფერი', headersRow: 'პირველი სტრიქონი', heightUnit: 'height unit', // MISSING invalidBorder: 'ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.', invalidCellPadding: 'უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.', invalidCellSpacing: 'უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.', invalidCols: 'სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.', invalidHeight: 'ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.', invalidRows: 'სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.', invalidWidth: 'ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.', menu: 'ცხრილის პარამეტრები', row: { menu: 'სტრიქონი', insertBefore: 'სტრიქონის ჩამატება წინ', insertAfter: 'სტრიქონის ჩამატება მერე', deleteRow: 'სტრიქონების წაშლა' }, rows: 'სტრიქონი', summary: 'შეჯამება', title: 'ცხრილის პარამეტრები', toolbar: 'ცხრილი', widthPc: 'პროცენტი', widthPx: 'წერტილი', widthUnit: 'საზომი ერთეული' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/es-mx.js0000644000201500020150000000513014515446712023651 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'es-mx', { border: 'Tamaño del borde', caption: 'Subtítulo', cell: { menu: 'Celda', insertBefore: 'Insertar una celda antes', insertAfter: 'Insertar una celda despues', deleteCell: 'Borrar celdas', merge: 'Unir celdas', mergeRight: 'Unir a la derecha', mergeDown: 'Unir abajo', splitHorizontal: 'Dividir celda horizontalmente', splitVertical: 'Dividir celda verticalmente', title: 'Propiedades de la celda', cellType: 'Tipo de celda', rowSpan: 'Extensión de las filas', colSpan: 'Extensión de las columnas', wordWrap: 'Ajuste de línea', hAlign: 'Alineación horizontal', vAlign: 'Alineación vertical', alignBaseline: 'Base', bgColor: 'Color de fondo', borderColor: 'Color de borde', data: 'Datos', header: 'Encabezado', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Si', no: 'No', invalidWidth: 'El ancho de la celda debe ser un número entero.', invalidHeight: 'El alto de la celda debe ser un número entero.', invalidRowSpan: 'El intervalo de filas debe ser un número entero.', invalidColSpan: 'El intervalo de columnas debe ser un número entero.', chooseColor: 'Escoger' }, cellPad: 'relleno de celda', cellSpace: 'Espacio de celda', column: { menu: 'Columna', insertBefore: 'Insertar columna antes', insertAfter: 'Insertar columna después', deleteColumn: 'Borrar columnas' }, columns: 'Columnas', deleteTable: 'Borrar tabla', headers: 'Encabezados', headersBoth: 'Ambos', headersColumn: 'Primera columna', headersNone: 'Ninguna', headersRow: 'Primera fila', heightUnit: 'height unit', // MISSING invalidBorder: 'El tamaño del borde debe ser un número entero.', invalidCellPadding: 'El relleno de la celda debe ser un número positivo.', invalidCellSpacing: 'El espacio de la celda debe ser un número positivo.', invalidCols: 'El número de columnas debe ser un número mayo que 0.', invalidHeight: 'La altura de la tabla debe ser un número.', invalidRows: 'El número de filas debe ser mayor a 0.', invalidWidth: 'El ancho de la tabla debe ser un número.', menu: 'Propiedades de la tabla', row: { menu: 'Fila', insertBefore: 'Inserta una fila antes', insertAfter: 'Inserta una fila después', deleteRow: 'Borrar filas' }, rows: 'Filas', summary: 'Resumen', title: 'Propiedades de la tabla', toolbar: 'Tabla', widthPc: 'porcentaje', widthPx: 'pixeles', widthUnit: 'Unidad de ancho' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/mn.js0000644000201500020150000000570714515446712023244 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'mn', { border: 'Хүрээний хэмжээ', caption: 'Тайлбар', cell: { menu: 'Нүх/зай', insertBefore: 'Нүх/зай өмнө нь оруулах', insertAfter: 'Нүх/зай дараа нь оруулах', deleteCell: 'Нүх устгах', merge: 'Нүх нэгтэх', mergeRight: 'Баруун тийш нэгтгэх', mergeDown: 'Доош нэгтгэх', splitHorizontal: 'Нүх/зайг босоогоор нь тусгаарлах', splitVertical: 'Нүх/зайг хөндлөнгөөр нь тусгаарлах', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Хэвтээд тэгшлэх арга', vAlign: 'Босоод тэгшлэх арга', alignBaseline: 'Baseline', bgColor: 'Дэвсгэр өнгө', borderColor: 'Хүрээний өнгө', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Тийм', no: 'Үгүй', invalidWidth: 'Нүдний өргөн нь тоо байх ёстой.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Сонгох' }, cellPad: 'Нүх доторлох(padding)', cellSpace: 'Нүх хоорондын зай (spacing)', column: { menu: 'Багана', insertBefore: 'Багана өмнө нь оруулах', insertAfter: 'Багана дараа нь оруулах', deleteColumn: 'Багана устгах' }, columns: 'Багана', deleteTable: 'Хүснэгт устгах', headers: 'Headers', // MISSING headersBoth: 'Both', // MISSING headersColumn: 'First column', // MISSING headersNone: 'None', headersRow: 'First Row', // MISSING heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Хүснэгтийн өргөн нь тоо байх ёстой.', menu: 'Хүснэгт', row: { menu: 'Мөр', insertBefore: 'Мөр өмнө нь оруулах', insertAfter: 'Мөр дараа нь оруулах', deleteRow: 'Мөр устгах' }, rows: 'Мөр', summary: 'Тайлбар', title: 'Хүснэгт', toolbar: 'Хүснэгт', widthPc: 'хувь', widthPx: 'цэг', widthUnit: 'өргөний нэгж' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/da.js0000644000201500020150000000447414515446712023216 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'da', { border: 'Rammebredde', caption: 'Titel', cell: { menu: 'Celle', insertBefore: 'Indsæt celle før', insertAfter: 'Indsæt celle efter', deleteCell: 'Slet celle', merge: 'Flet celler', mergeRight: 'Flet til højre', mergeDown: 'Flet nedad', splitHorizontal: 'Del celle vandret', splitVertical: 'Del celle lodret', title: 'Celleegenskaber', cellType: 'Celletype', rowSpan: 'Række span (rows span)', colSpan: 'Kolonne span (columns span)', wordWrap: 'Tekstombrydning', hAlign: 'Vandret justering', vAlign: 'Lodret justering', alignBaseline: 'Grundlinje', bgColor: 'Baggrundsfarve', borderColor: 'Rammefarve', data: 'Data', header: 'Hoved', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nej', invalidWidth: 'Cellebredde skal være et tal.', invalidHeight: 'Cellehøjde skal være et tal.', invalidRowSpan: 'Række span skal være et heltal.', invalidColSpan: 'Kolonne span skal være et heltal.', chooseColor: 'Vælg' }, cellPad: 'Cellemargen', cellSpace: 'Celleafstand', column: { menu: 'Kolonne', insertBefore: 'Indsæt kolonne før', insertAfter: 'Indsæt kolonne efter', deleteColumn: 'Slet kolonne' }, columns: 'Kolonner', deleteTable: 'Slet tabel', headers: 'Hoved', headersBoth: 'Begge', headersColumn: 'Første kolonne', headersNone: 'Ingen', headersRow: 'Første række', heightUnit: 'højde enhed', invalidBorder: 'Rammetykkelse skal være et tal.', invalidCellPadding: 'Cellemargen skal være et tal.', invalidCellSpacing: 'Celleafstand skal være et tal.', invalidCols: 'Antallet af kolonner skal være større end 0.', invalidHeight: 'Tabelhøjde skal være et tal.', invalidRows: 'Antallet af rækker skal være større end 0.', invalidWidth: 'Tabelbredde skal være et tal.', menu: 'Egenskaber for tabel', row: { menu: 'Række', insertBefore: 'Indsæt række før', insertAfter: 'Indsæt række efter', deleteRow: 'Slet række' }, rows: 'Rækker', summary: 'Resumé', title: 'Egenskaber for tabel', toolbar: 'Tabel', widthPc: 'procent', widthPx: 'pixels', widthUnit: 'Bredde på enhed' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/he.js0000644000201500020150000000562514515446712023225 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'he', { border: 'גודל מסגרת', caption: 'כיתוב', cell: { menu: 'מאפייני תא', insertBefore: 'הוספת תא לפני', insertAfter: 'הוספת תא אחרי', deleteCell: 'מחיקת תאים', merge: 'מיזוג תאים', mergeRight: 'מזג ימינה', mergeDown: 'מזג למטה', splitHorizontal: 'פיצול תא אופקית', splitVertical: 'פיצול תא אנכית', title: 'תכונות התא', cellType: 'סוג התא', rowSpan: 'מתיחת השורות', colSpan: 'מתיחת התאים', wordWrap: 'מניעת גלישת שורות', hAlign: 'יישור אופקי', vAlign: 'יישור אנכי', alignBaseline: 'שורת בסיס', bgColor: 'צבע רקע', borderColor: 'צבע מסגרת', data: 'מידע', header: 'כותרת', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'כן', no: 'לא', invalidWidth: 'שדה רוחב התא חייב להיות מספר.', invalidHeight: 'שדה גובה התא חייב להיות מספר.', invalidRowSpan: 'שדה מתיחת השורות חייב להיות מספר שלם.', invalidColSpan: 'שדה מתיחת העמודות חייב להיות מספר שלם.', chooseColor: 'בחר' }, cellPad: 'ריפוד תא', cellSpace: 'מרווח תא', column: { menu: 'עמודה', insertBefore: 'הוספת עמודה לפני', insertAfter: 'הוספת עמודה אחרי', deleteColumn: 'מחיקת עמודות' }, columns: 'עמודות', deleteTable: 'מחק טבלה', headers: 'כותרות', headersBoth: 'שניהם', headersColumn: 'עמודה ראשונה', headersNone: 'אין', headersRow: 'שורה ראשונה', heightUnit: 'height unit', // MISSING invalidBorder: 'שדה גודל המסגרת חייב להיות מספר.', invalidCellPadding: 'שדה ריפוד התאים חייב להיות מספר חיובי.', invalidCellSpacing: 'שדה ריווח התאים חייב להיות מספר חיובי.', invalidCols: 'שדה מספר העמודות חייב להיות מספר גדול מ 0.', invalidHeight: 'שדה גובה הטבלה חייב להיות מספר.', invalidRows: 'שדה מספר השורות חייב להיות מספר גדול מ 0.', invalidWidth: 'שדה רוחב הטבלה חייב להיות מספר.', menu: 'מאפייני טבלה', row: { menu: 'שורה', insertBefore: 'הוספת שורה לפני', insertAfter: 'הוספת שורה אחרי', deleteRow: 'מחיקת שורות' }, rows: 'שורות', summary: 'תקציר', title: 'מאפייני טבלה', toolbar: 'טבלה', widthPc: 'אחוז', widthPx: 'פיקסלים', widthUnit: 'יחידת רוחב' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ca.js0000644000201500020150000000507214515446712023210 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ca', { border: 'Mida vora', caption: 'Títol', cell: { menu: 'Cel·la', insertBefore: 'Insereix abans', insertAfter: 'Insereix després', deleteCell: 'Suprimeix', merge: 'Fusiona', mergeRight: 'Fusiona a la dreta', mergeDown: 'Fusiona avall', splitHorizontal: 'Divideix horitzontalment', splitVertical: 'Divideix verticalment', title: 'Propietats de la cel·la', cellType: 'Tipus de cel·la', rowSpan: 'Expansió de files', colSpan: 'Expansió de columnes', wordWrap: 'Ajustar al contingut', hAlign: 'Alineació Horizontal', vAlign: 'Alineació Vertical', alignBaseline: 'A la línia base', bgColor: 'Color de fons', borderColor: 'Color de la vora', data: 'Dades', header: 'Capçalera', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Sí', no: 'No', invalidWidth: 'L\'amplada de cel·la ha de ser un nombre.', invalidHeight: 'L\'alçada de cel·la ha de ser un nombre.', invalidRowSpan: 'L\'expansió de files ha de ser un nombre enter.', invalidColSpan: 'L\'expansió de columnes ha de ser un nombre enter.', chooseColor: 'Trieu' }, cellPad: 'Encoixinament de cel·les', cellSpace: 'Espaiat de cel·les', column: { menu: 'Columna', insertBefore: 'Insereix columna abans de', insertAfter: 'Insereix columna darrera', deleteColumn: 'Suprimeix una columna' }, columns: 'Columnes', deleteTable: 'Suprimeix la taula', headers: 'Capçaleres', headersBoth: 'Ambdues', headersColumn: 'Primera columna', headersNone: 'Cap', headersRow: 'Primera fila', heightUnit: 'height unit', // MISSING invalidBorder: 'El gruix de la vora ha de ser un nombre.', invalidCellPadding: 'L\'encoixinament de cel·la ha de ser un nombre.', invalidCellSpacing: 'L\'espaiat de cel·la ha de ser un nombre.', invalidCols: 'El nombre de columnes ha de ser un nombre major que 0.', invalidHeight: 'L\'alçada de la taula ha de ser un nombre.', invalidRows: 'El nombre de files ha de ser un nombre major que 0.', invalidWidth: 'L\'amplada de la taula ha de ser un nombre.', menu: 'Propietats de la taula', row: { menu: 'Fila', insertBefore: 'Insereix fila abans de', insertAfter: 'Insereix fila darrera', deleteRow: 'Suprimeix una fila' }, rows: 'Files', summary: 'Resum', title: 'Propietats de la taula', toolbar: 'Taula', widthPc: 'percentatge', widthPx: 'píxels', widthUnit: 'unitat d\'amplada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/gu.js0000644000201500020150000001026214515446712023235 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'gu', { border: 'કોઠાની બાજુ(બોર્ડર) સાઇઝ', caption: 'મથાળું/કૅપ્શન ', cell: { menu: 'કોષના ખાના', insertBefore: 'પહેલાં કોષ ઉમેરવો', insertAfter: 'પછી કોષ ઉમેરવો', deleteCell: 'કોષ ડિલીટ/કાઢી નાખવો', merge: 'કોષ ભેગા કરવા', mergeRight: 'જમણી બાજુ ભેગા કરવા', mergeDown: 'નીચે ભેગા કરવા', splitHorizontal: 'કોષને સમસ્તરીય વિભાજન કરવું', splitVertical: 'કોષને સીધું ને ઊભું વિભાજન કરવું', title: 'સેલના ગુણ', cellType: 'સેલનો પ્રકાર', rowSpan: 'આડી કટારની જગ્યા', colSpan: 'ઊભી કતારની જગ્યા', wordWrap: 'વર્ડ રેપ', hAlign: 'સપાટ લાઈનદોરી', vAlign: 'ઊભી લાઈનદોરી', alignBaseline: 'બસે લાઈન', bgColor: 'પાછાળનો રંગ', borderColor: 'બોર્ડેર રંગ', data: 'સ્વીકૃત માહિતી', header: 'મથાળું', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'હા', no: 'ના', invalidWidth: 'સેલની પોહલાઈ આંકડો હોવો જોઈએ.', invalidHeight: 'સેલની ઊંચાઈ આંકડો હોવો જોઈએ.', invalidRowSpan: 'રો સ્પાન આંકડો હોવો જોઈએ.', invalidColSpan: 'કોલમ સ્પાન આંકડો હોવો જોઈએ.', chooseColor: 'પસંદ કરવું' }, cellPad: 'સેલ પૅડિંગ', cellSpace: 'સેલ અંતર', column: { menu: 'કૉલમ/ઊભી કટાર', insertBefore: 'પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી', insertAfter: 'પછી કૉલમ/ઊભી કટાર ઉમેરવી', deleteColumn: 'કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી' }, columns: 'કૉલમ/ઊભી કટાર', deleteTable: 'કોઠો ડિલીટ/કાઢી નાખવું', headers: 'મથાળા', headersBoth: 'બેવું', headersColumn: 'પહેલી ઊભી કટાર', headersNone: 'નથી ', headersRow: 'પહેલી કટાર', heightUnit: 'height unit', // MISSING invalidBorder: 'બોર્ડર એક આંકડો હોવો જોઈએ', invalidCellPadding: 'સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.', invalidCellSpacing: 'સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.', invalidCols: 'ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.', invalidHeight: 'ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.', invalidRows: 'આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.', invalidWidth: 'ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.', menu: 'ટેબલ, કોઠાનું મથાળું', row: { menu: 'પંક્તિના ખાના', insertBefore: 'પહેલાં પંક્તિ ઉમેરવી', insertAfter: 'પછી પંક્તિ ઉમેરવી', deleteRow: 'પંક્તિઓ ડિલીટ/કાઢી નાખવી' }, rows: 'પંક્તિના ખાના', summary: 'ટૂંકો એહેવાલ', title: 'ટેબલ, કોઠાનું મથાળું', toolbar: 'ટેબલ, કોઠો', widthPc: 'પ્રતિશત', widthPx: 'પિકસલ', widthUnit: 'પોહાલાઈ એકમ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ms.js0000644000201500020150000000474614515446712023253 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ms', { border: 'Saiz Border', caption: 'Keterangan', cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Buangkan Sel-sel', merge: 'Cantumkan Sel-sel', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Tambahan Ruang Sel', cellSpace: 'Ruangan Antara Sel', column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Buangkan Lajur' }, columns: 'Jaluran', deleteTable: 'Delete Table', // MISSING headers: 'Headers', // MISSING headersBoth: 'Both', // MISSING headersColumn: 'First column', // MISSING headersNone: 'None', headersRow: 'First Row', // MISSING heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', // MISSING invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Cell spacing must be a positive number.', // MISSING invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Table height must be a number.', // MISSING invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Table width must be a number.', // MISSING menu: 'Ciri-ciri Jadual', row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Buangkan Baris' }, rows: 'Barisan', summary: 'Summary', // MISSING title: 'Ciri-ciri Jadual', toolbar: 'Jadual', widthPc: 'peratus', widthPx: 'piksel-piksel', widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/th.js0000644000201500020150000000615614515446712023244 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'th', { border: 'ขนาดเส้นขอบ', caption: 'หัวเรื่องของตาราง', cell: { menu: 'ช่องตาราง', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'ลบช่อง', merge: 'ผสานช่อง', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'ระยะแนวตั้ง', cellSpace: 'ระยะแนวนอนน', column: { menu: 'คอลัมน์', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'ลบสดมน์' }, columns: 'สดมน์', deleteTable: 'ลบตาราง', headers: 'ส่วนหัว', headersBoth: 'ทั้งสองอย่าง', headersColumn: 'คอลัมน์แรก', headersNone: 'None', headersRow: 'แถวแรก', heightUnit: 'height unit', // MISSING invalidBorder: 'ขนาดเส้นกรอบต้องเป็นจำนวนตัวเลข', invalidCellPadding: 'ช่องว่างภายในเซลล์ต้องเลขจำนวนบวก', invalidCellSpacing: 'ช่องว่างภายในเซลล์ต้องเป็นเลขจำนวนบวก', invalidCols: 'จำนวนคอลัมน์ต้องเป็นจำนวนมากกว่า 0', invalidHeight: 'ส่วนสูงของตารางต้องเป็นตัวเลข', invalidRows: 'จำนวนของแถวต้องเป็นจำนวนมากกว่า 0', invalidWidth: 'ความกว้างตารางต้องเป็นตัวเลข', menu: 'คุณสมบัติของ ตาราง', row: { menu: 'แถว', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'ลบแถว' }, rows: 'แถว', summary: 'สรุปความ', title: 'คุณสมบัติของ ตาราง', toolbar: 'ตาราง', widthPc: 'เปอร์เซ็น', widthPx: 'จุดสี', widthUnit: 'หน่วยความกว้าง' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/de.js0000644000201500020150000000505614515446712023217 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'de', { border: 'Rahmengröße', caption: 'Überschrift', cell: { menu: 'Zelle', insertBefore: 'Zelle davor einfügen', insertAfter: 'Zelle danach einfügen', deleteCell: 'Zelle löschen', merge: 'Zellen verbinden', mergeRight: 'Nach rechts verbinden', mergeDown: 'Nach unten verbinden', splitHorizontal: 'Zelle horizontal teilen', splitVertical: 'Zelle vertikal teilen', title: 'Zelleneigenschaften', cellType: 'Zellart', rowSpan: 'Anzahl Zeilen verbinden', colSpan: 'Anzahl Spalten verbinden', wordWrap: 'Zeilenumbruch', hAlign: 'Horizontale Ausrichtung', vAlign: 'Vertikale Ausrichtung', alignBaseline: 'Grundlinie', bgColor: 'Hintergrundfarbe', borderColor: 'Rahmenfarbe', data: 'Daten', header: 'Überschrift', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nein', invalidWidth: 'Zellenbreite muss eine Zahl sein.', invalidHeight: 'Zellenhöhe muss eine Zahl sein.', invalidRowSpan: '"Anzahl Zeilen verbinden" muss eine Ganzzahl sein.', invalidColSpan: '"Anzahl Spalten verbinden" muss eine Ganzzahl sein.', chooseColor: 'Wählen' }, cellPad: 'Zellenabstand innen', cellSpace: 'Zellenabstand außen', column: { menu: 'Spalte', insertBefore: 'Spalte links davor einfügen', insertAfter: 'Spalte rechts danach einfügen', deleteColumn: 'Spalte löschen' }, columns: 'Spalte', deleteTable: 'Tabelle löschen', headers: 'Kopfzeile', headersBoth: 'Beide', headersColumn: 'Erste Spalte', headersNone: 'Keine', headersRow: 'Erste Zeile', heightUnit: 'Höheneinheit', invalidBorder: 'Die Rahmenbreite muß eine Zahl sein.', invalidCellPadding: 'Der Zellenabstand innen muß eine positive Zahl sein.', invalidCellSpacing: 'Der Zellenabstand außen muß eine positive Zahl sein.', invalidCols: 'Die Anzahl der Spalten muß größer als 0 sein..', invalidHeight: 'Die Tabellenbreite muß eine Zahl sein.', invalidRows: 'Die Anzahl der Zeilen muß größer als 0 sein.', invalidWidth: 'Die Tabellenbreite muss eine Zahl sein.', menu: 'Tabellen-Eigenschaften', row: { menu: 'Zeile', insertBefore: 'Zeile oberhalb einfügen', insertAfter: 'Zeile unterhalb einfügen', deleteRow: 'Zeile entfernen' }, rows: 'Zeile', summary: 'Inhaltsübersicht', title: 'Tabellen-Eigenschaften', toolbar: 'Tabelle', widthPc: '%', widthPx: 'Pixel', widthUnit: 'Breite Einheit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/en-ca.js0000644000201500020150000000444114515446712023607 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'en-ca', { border: 'Border size', caption: 'Caption', cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Delete Cells', merge: 'Merge Cells', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Cell padding', cellSpace: 'Cell spacing', column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Delete Columns' }, columns: 'Columns', deleteTable: 'Delete Table', headers: 'Headers', headersBoth: 'Both', headersColumn: 'First column', headersNone: 'None', headersRow: 'First Row', heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', invalidCellPadding: 'Cell padding must be a number.', invalidCellSpacing: 'Cell spacing must be a number.', invalidCols: 'Number of columns must be a number greater than 0.', invalidHeight: 'Table height must be a number.', invalidRows: 'Number of rows must be a number greater than 0.', invalidWidth: 'Table width must be a number.', menu: 'Table Properties', row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Delete Rows' }, rows: 'Rows', summary: 'Summary', title: 'Table Properties', toolbar: 'Table', widthPc: 'percent', widthPx: 'pixels', widthUnit: 'width unit' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/tt.js0000644000201500020150000000632014515446712023251 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'tt', { border: 'Чик калынлыгы', caption: 'Исем', cell: { menu: 'Күзәнәк', insertBefore: 'Алдына күзәнәк өстәү', insertAfter: 'Артына күзәнәк өстәү', deleteCell: 'Күзәнәкләрне бетерү', merge: 'Күзәнәкләрне берләштерү', mergeRight: 'Уң яктагы белән берләштерү', mergeDown: 'Астагы белән берләштерү', splitHorizontal: 'Күзәнәкне юлларга бүлү', splitVertical: 'Күзәнәкне баганаларга бүлү', title: 'Күзәнәк үзлекләре', cellType: 'Күзәнәк төре', rowSpan: 'Юлларны берләштерү', colSpan: 'Баганаларны берләштерү', wordWrap: 'Текстны күчерү', hAlign: 'Ятма тигезләү', vAlign: 'Асма тигезләү', alignBaseline: 'Таяныч сызыгы', bgColor: 'Фон төсе', borderColor: 'Чик төсе', data: 'Мәгълүмат', header: 'Башлык', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Әйе', no: 'Юк', invalidWidth: 'Cell width must be a number.', // MISSING invalidHeight: 'Cell height must be a number.', // MISSING invalidRowSpan: 'Rows span must be a whole number.', // MISSING invalidColSpan: 'Columns span must be a whole number.', // MISSING chooseColor: 'Сайлау' }, cellPad: 'Cell padding', // MISSING cellSpace: 'Cell spacing', // MISSING column: { menu: 'Багана', insertBefore: 'Сулдан баганалар өстәү', insertAfter: 'Уңнан баганалар өстәү', deleteColumn: 'Баганаларны бетерү' }, columns: 'Баганалар', deleteTable: 'Таблицаны бетерү', headers: 'Башлыклар', headersBoth: 'Икесе дә', headersColumn: 'Беренче багана', headersNone: 'Һичбер', headersRow: 'Беренче юл', heightUnit: 'height unit', // MISSING invalidBorder: 'Чик киңлеге сан булырга тиеш.', invalidCellPadding: 'Cell padding must be a positive number.', // MISSING invalidCellSpacing: 'Күзәнәкләр аралары уңай сан булырга тиеш.', invalidCols: 'Number of columns must be a number greater than 0.', // MISSING invalidHeight: 'Таблица биеклеге сан булырга тиеш.', invalidRows: 'Number of rows must be a number greater than 0.', // MISSING invalidWidth: 'Таблица киңлеге сан булырга тиеш', menu: 'Таблица үзлекләре', row: { menu: 'Юл', insertBefore: 'Өстән юллар өстәү', insertAfter: 'Астан юллар өстәү', deleteRow: 'Юлларны бетерү' }, rows: 'Юллар', summary: 'Йомгаклау', title: 'Таблица үзлекләре', toolbar: 'Таблица', widthPc: 'процент', widthPx: 'Нокталар', widthUnit: 'киңлек берәмлеге' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/vi.js0000644000201500020150000000543514515446712023246 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'vi', { border: 'Kích thước đường viền', caption: 'Đầu đề', cell: { menu: 'Ô', insertBefore: 'Chèn ô Phía trước', insertAfter: 'Chèn ô Phía sau', deleteCell: 'Xoá ô', merge: 'Kết hợp ô', mergeRight: 'Kết hợp sang phải', mergeDown: 'Kết hợp xuống dưới', splitHorizontal: 'Phân tách ô theo chiều ngang', splitVertical: 'Phân tách ô theo chiều dọc', title: 'Thuộc tính của ô', cellType: 'Kiểu của ô', rowSpan: 'Kết hợp hàng', colSpan: 'Kết hợp cột', wordWrap: 'Chữ liền hàng', hAlign: 'Canh lề ngang', vAlign: 'Canh lề dọc', alignBaseline: 'Đường cơ sở', bgColor: 'Màu nền', borderColor: 'Màu viền', data: 'Dữ liệu', header: 'Đầu đề', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Có', no: 'Không', invalidWidth: 'Chiều rộng của ô phải là một số nguyên.', invalidHeight: 'Chiều cao của ô phải là một số nguyên.', invalidRowSpan: 'Số hàng kết hợp phải là một số nguyên.', invalidColSpan: 'Số cột kết hợp phải là một số nguyên.', chooseColor: 'Chọn màu' }, cellPad: 'Khoảng đệm giữ ô và nội dung', cellSpace: 'Khoảng cách giữa các ô', column: { menu: 'Cột', insertBefore: 'Chèn cột phía trước', insertAfter: 'Chèn cột phía sau', deleteColumn: 'Xoá cột' }, columns: 'Số cột', deleteTable: 'Xóa bảng', headers: 'Đầu đề', headersBoth: 'Cả hai', headersColumn: 'Cột đầu tiên', headersNone: 'Không có', headersRow: 'Hàng đầu tiên', heightUnit: 'height unit', // MISSING invalidBorder: 'Kích cỡ của đường biên phải là một số nguyên.', invalidCellPadding: 'Khoảng đệm giữa ô và nội dung phải là một số nguyên.', invalidCellSpacing: 'Khoảng cách giữa các ô phải là một số nguyên.', invalidCols: 'Số lượng cột phải là một số lớn hơn 0.', invalidHeight: 'Chiều cao của bảng phải là một số nguyên.', invalidRows: 'Số lượng hàng phải là một số lớn hơn 0.', invalidWidth: 'Chiều rộng của bảng phải là một số nguyên.', menu: 'Thuộc tính bảng', row: { menu: 'Hàng', insertBefore: 'Chèn hàng phía trước', insertAfter: 'Chèn hàng phía sau', deleteRow: 'Xoá hàng' }, rows: 'Số hàng', summary: 'Tóm lược', title: 'Thuộc tính bảng', toolbar: 'Bảng', widthPc: 'Phần trăm (%)', widthPx: 'Điểm ảnh (px)', widthUnit: 'Đơn vị' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/cs.js0000644000201500020150000000504014515446712023225 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'cs', { border: 'Ohraničení', caption: 'Popis', cell: { menu: 'Buňka', insertBefore: 'Vložit buňku před', insertAfter: 'Vložit buňku za', deleteCell: 'Smazat buňky', merge: 'Sloučit buňky', mergeRight: 'Sloučit doprava', mergeDown: 'Sloučit dolů', splitHorizontal: 'Rozdělit buňky vodorovně', splitVertical: 'Rozdělit buňky svisle', title: 'Vlastnosti buňky', cellType: 'Typ buňky', rowSpan: 'Spojit řádky', colSpan: 'Spojit sloupce', wordWrap: 'Zalamování', hAlign: 'Vodorovné zarovnání', vAlign: 'Svislé zarovnání', alignBaseline: 'Na účaří', bgColor: 'Barva pozadí', borderColor: 'Barva okraje', data: 'Data', header: 'Hlavička', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ano', no: 'Ne', invalidWidth: 'Šířka buňky musí být číslo.', invalidHeight: 'Zadaná výška buňky musí být číslená.', invalidRowSpan: 'Zadaný počet sloučených řádků musí být celé číslo.', invalidColSpan: 'Zadaný počet sloučených sloupců musí být celé číslo.', chooseColor: 'Výběr' }, cellPad: 'Odsazení obsahu v buňce', cellSpace: 'Vzdálenost buněk', column: { menu: 'Sloupec', insertBefore: 'Vložit sloupec před', insertAfter: 'Vložit sloupec za', deleteColumn: 'Smazat sloupec' }, columns: 'Sloupce', deleteTable: 'Smazat tabulku', headers: 'Záhlaví', headersBoth: 'Obojí', headersColumn: 'První sloupec', headersNone: 'Žádné', headersRow: 'První řádek', heightUnit: 'jednotka výšky', invalidBorder: 'Zdaná velikost okraje musí být číselná.', invalidCellPadding: 'Zadané odsazení obsahu v buňce musí být číselné.', invalidCellSpacing: 'Zadaná vzdálenost buněk musí být číselná.', invalidCols: 'Počet sloupců musí být číslo větší než 0.', invalidHeight: 'Zadaná výška tabulky musí být číselná.', invalidRows: 'Počet řádků musí být číslo větší než 0.', invalidWidth: 'Šířka tabulky musí být číslo.', menu: 'Vlastnosti tabulky', row: { menu: 'Řádek', insertBefore: 'Vložit řádek před', insertAfter: 'Vložit řádek za', deleteRow: 'Smazat řádky' }, rows: 'Řádky', summary: 'Souhrn', title: 'Vlastnosti tabulky', toolbar: 'Tabulka', widthPc: 'procent', widthPx: 'bodů', widthUnit: 'jednotka šířky' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/tr.js0000644000201500020150000000477714515446712023265 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'tr', { border: 'Kenar Kalınlığı', caption: 'Başlık', cell: { menu: 'Hücre', insertBefore: 'Hücre Ekle - Önce', insertAfter: 'Hücre Ekle - Sonra', deleteCell: 'Hücre Sil', merge: 'Hücreleri Birleştir', mergeRight: 'Birleştir - Sağdaki İle ', mergeDown: 'Birleştir - Aşağıdaki İle ', splitHorizontal: 'Hücreyi Yatay Böl', splitVertical: 'Hücreyi Dikey Böl', title: 'Hücre Özellikleri', cellType: 'Hücre Tipi', rowSpan: 'Satırlar Mesafesi (Span)', colSpan: 'Sütünlar Mesafesi (Span)', wordWrap: 'Kelime Kaydırma', hAlign: 'Düşey Hizalama', vAlign: 'Yataş Hizalama', alignBaseline: 'Tabana', bgColor: 'Arkaplan Rengi', borderColor: 'Çerçeve Rengi', data: 'Veri', header: 'Başlık', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Evet', no: 'Hayır', invalidWidth: 'Hücre genişliği sayı olmalıdır.', invalidHeight: 'Hücre yüksekliği sayı olmalıdır.', invalidRowSpan: 'Satırların mesafesi tam sayı olmalıdır.', invalidColSpan: 'Sütünların mesafesi tam sayı olmalıdır.', chooseColor: 'Seçiniz' }, cellPad: 'Izgara yazı arası', cellSpace: 'Izgara kalınlığı', column: { menu: 'Sütun', insertBefore: 'Kolon Ekle - Önce', insertAfter: 'Kolon Ekle - Sonra', deleteColumn: 'Sütun Sil' }, columns: 'Sütunlar', deleteTable: 'Tabloyu Sil', headers: 'Başlıklar', headersBoth: 'Her İkisi', headersColumn: 'İlk Sütun', headersNone: 'Yok', headersRow: 'İlk Satır', heightUnit: 'yükseklik birimi', invalidBorder: 'Çerceve büyüklüklüğü sayı olmalıdır.', invalidCellPadding: 'Hücre aralığı (padding) sayı olmalıdır.', invalidCellSpacing: 'Hücre boşluğu (spacing) sayı olmalıdır.', invalidCols: 'Sütün sayısı 0 sayısından büyük olmalıdır.', invalidHeight: 'Tablo yüksekliği sayı olmalıdır.', invalidRows: 'Satır sayısı 0 sayısından büyük olmalıdır.', invalidWidth: 'Tablo genişliği sayı olmalıdır.', menu: 'Tablo Özellikleri', row: { menu: 'Satır', insertBefore: 'Satır Ekle - Önce', insertAfter: 'Satır Ekle - Sonra', deleteRow: 'Satır Sil' }, rows: 'Satırlar', summary: 'Özet', title: 'Tablo Özellikleri', toolbar: 'Tablo', widthPc: 'yüzde', widthPx: 'piksel', widthUnit: 'genişlik birimi' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ja.js0000644000201500020150000000524314515446712023217 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ja', { border: '枠線の幅', caption: 'キャプション', cell: { menu: 'セル', insertBefore: 'セルを前に挿入', insertAfter: 'セルを後に挿入', deleteCell: 'セルを削除', merge: 'セルを結合', mergeRight: '右に結合', mergeDown: '下に結合', splitHorizontal: 'セルを水平方向に分割', splitVertical: 'セルを垂直方向に分割', title: 'セルのプロパティ', cellType: 'セルの種類', rowSpan: '行の結合数', colSpan: '列の結合数', wordWrap: '単語の折り返し', hAlign: '水平方向の配置', vAlign: '垂直方向の配置', alignBaseline: 'ベースライン', bgColor: '背景色', borderColor: 'ボーダーカラー', data: 'テーブルデータ (td)', header: 'ヘッダ', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'はい', no: 'いいえ', invalidWidth: 'セル幅は数値で入力してください。', invalidHeight: 'セル高さは数値で入力してください。', invalidRowSpan: '縦幅(行数)は数値で入力してください。', invalidColSpan: '横幅(列数)は数値で入力してください。', chooseColor: '色の選択' }, cellPad: 'セル内間隔', cellSpace: 'セル内余白', column: { menu: '列', insertBefore: '列を左に挿入', insertAfter: '列を右に挿入', deleteColumn: '列を削除' }, columns: '列数', deleteTable: '表を削除', headers: 'ヘッダ (th)', headersBoth: '両方', headersColumn: '最初の列のみ', headersNone: 'なし', headersRow: '最初の行のみ', heightUnit: 'height unit', // MISSING invalidBorder: '枠線の幅は数値で入力してください。', invalidCellPadding: 'セル内余白は数値で入力してください。', invalidCellSpacing: 'セル間余白は数値で入力してください。', invalidCols: '列数は0より大きな数値を入力してください。', invalidHeight: '高さは数値で入力してください。', invalidRows: '行数は0より大きな数値を入力してください。', invalidWidth: '幅は数値で入力してください。', menu: '表のプロパティ', row: { menu: '行', insertBefore: '行を上に挿入', insertAfter: '行を下に挿入', deleteRow: '行を削除' }, rows: '行数', summary: '表の概要', title: '表のプロパティ', toolbar: '表', widthPc: 'パーセント', widthPx: 'ピクセル', widthUnit: '幅の単位' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/sl.js0000644000201500020150000000462114515446712023242 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'sl', { border: 'Velikost obrobe', caption: 'Napis', cell: { menu: 'Celica', insertBefore: 'Vstavi celico pred', insertAfter: 'Vstavi celico za', deleteCell: 'Izbriši celice', merge: 'Združi celice', mergeRight: 'Združi desno', mergeDown: 'Združi navzdol', splitHorizontal: 'Razdeli celico vodoravno', splitVertical: 'Razdeli celico navpično', title: 'Lastnosti celice', cellType: 'Vrsta celice', rowSpan: 'Razpon vrstic', colSpan: 'Razpon stolpcev', wordWrap: 'Prelom besedila', hAlign: 'Vodoravna poravnava', vAlign: 'Navpična poravnava', alignBaseline: 'Osnovnica', bgColor: 'Barva ozadja', borderColor: 'Barva obrobe', data: 'Podatki', header: 'Glava', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Da', no: 'Ne', invalidWidth: 'Širina celice mora biti število.', invalidHeight: 'Višina celice mora biti število.', invalidRowSpan: 'Razpon vrstic mora biti celo število.', invalidColSpan: 'Razpon stolpcev mora biti celo število.', chooseColor: 'Izberi' }, cellPad: 'Odmik znotraj celic', cellSpace: 'Razmik med celicami', column: { menu: 'Stolpec', insertBefore: 'Vstavi stolpec pred', insertAfter: 'Vstavi stolpec za', deleteColumn: 'Izbriši stolpce' }, columns: 'Stolpci', deleteTable: 'Izbriši tabelo', headers: 'Glave', headersBoth: 'Oboje', headersColumn: 'Prvi stolpec', headersNone: 'Brez', headersRow: 'Prva vrstica', heightUnit: 'height unit', // MISSING invalidBorder: 'Širina obrobe mora biti število.', invalidCellPadding: 'Odmik znotraj celic mora biti pozitivno število.', invalidCellSpacing: 'Razmik med celicami mora biti pozitivno število.', invalidCols: 'Število stolpcev mora biti večje od 0.', invalidHeight: 'Višina tabele mora biti število.', invalidRows: 'Število vrstic mora biti večje od 0.', invalidWidth: 'Širina tabele mora biti število.', menu: 'Lastnosti tabele', row: { menu: 'Vrstica', insertBefore: 'Vstavi vrstico pred', insertAfter: 'Vstavi vrstico za', deleteRow: 'Izbriši vrstice' }, rows: 'Vrstice', summary: 'Povzetek', title: 'Lastnosti tabele', toolbar: 'Tabela', widthPc: 'odstotkov', widthPx: 'pik', widthUnit: 'enota širine' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/lv.js0000644000201500020150000000475414515446712023254 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'lv', { border: 'Rāmja izmērs', caption: 'Leģenda', cell: { menu: 'Šūna', insertBefore: 'Pievienot šūnu pirms', insertAfter: 'Pievienot šūnu pēc', deleteCell: 'Dzēst rūtiņas', merge: 'Apvienot rūtiņas', mergeRight: 'Apvieno pa labi', mergeDown: 'Apvienot uz leju', splitHorizontal: 'Sadalīt šūnu horizontāli', splitVertical: 'Sadalīt šūnu vertikāli', title: 'Šūnas uzstādījumi', cellType: 'Šūnas tips', rowSpan: 'Apvienotas rindas', colSpan: 'Apvienotas kolonas', wordWrap: 'Vārdu pārnese', hAlign: 'Horizontālais novietojums', vAlign: 'Vertikālais novietojums', alignBaseline: 'Pamatrinda', bgColor: 'Fona krāsa', borderColor: 'Rāmja krāsa', data: 'Dati', header: 'Virsraksts', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Jā', no: 'Nē', invalidWidth: 'Šūnas platumam jābūt skaitlim', invalidHeight: 'Šūnas augstumam jābūt skaitlim', invalidRowSpan: 'Apvienojamo rindu skaitam jābūt veselam skaitlim', invalidColSpan: 'Apvienojamo kolonu skaitam jābūt veselam skaitlim', chooseColor: 'Izvēlēties' }, cellPad: 'Rūtiņu nobīde', cellSpace: 'Rūtiņu atstatums', column: { menu: 'Kolonna', insertBefore: 'Ievietot kolonu pirms', insertAfter: 'Ievieto kolonu pēc', deleteColumn: 'Dzēst kolonnas' }, columns: 'Kolonnas', deleteTable: 'Dzēst tabulu', headers: 'Virsraksti', headersBoth: 'Abi', headersColumn: 'Pirmā kolona', headersNone: 'Nekas', headersRow: 'Pirmā rinda', heightUnit: 'height unit', // MISSING invalidBorder: 'Rāmju izmēram jābūt skaitlim', invalidCellPadding: 'Šūnu atkāpēm jābūt pozitīvam skaitlim', invalidCellSpacing: 'Šūnu atstarpēm jābūt pozitīvam skaitlim', invalidCols: 'Kolonu skaitam jābūt lielākam par 0', invalidHeight: 'Tabulas augstumam jābūt skaitlim', invalidRows: 'Rindu skaitam jābūt lielākam par 0', invalidWidth: 'Tabulas platumam jābūt skaitlim', menu: 'Tabulas īpašības', row: { menu: 'Rinda', insertBefore: 'Ievietot rindu pirms', insertAfter: 'Ievietot rindu pēc', deleteRow: 'Dzēst rindas' }, rows: 'Rindas', summary: 'Anotācija', title: 'Tabulas īpašības', toolbar: 'Tabula', widthPc: 'procentuāli', widthPx: 'pikseļos', widthUnit: 'platuma mērvienība' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/en-au.js0000644000201500020150000000442614515446712023634 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'en-au', { border: 'Border size', caption: 'Caption', cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Delete Cells', merge: 'Merge Cells', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Cell padding', cellSpace: 'Cell spacing', column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Delete Columns' }, columns: 'Columns', deleteTable: 'Delete Table', headers: 'Headers', headersBoth: 'Both', headersColumn: 'First column', headersNone: 'None', headersRow: 'First Row', heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', invalidCellPadding: 'Cell padding must be a number.', invalidCellSpacing: 'Cell spacing must be a number.', invalidCols: 'Number of columns must be a number greater than 0.', invalidHeight: 'Table height must be a number.', invalidRows: 'Number of rows must be a number greater than 0.', invalidWidth: 'Table width must be a number.', menu: 'Table Properties', row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Delete Rows' }, rows: 'Rows', summary: 'Summary', title: 'Table Properties', toolbar: 'Table', widthPc: 'percent', widthPx: 'pixels', widthUnit: 'width unit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/en.js0000644000201500020150000000440414515446712023225 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'en', { border: 'Border size', caption: 'Caption', cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Delete Cells', merge: 'Merge Cells', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', rowHeader: 'Row Header', yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Cell padding', cellSpace: 'Cell spacing', column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Delete Columns' }, columns: 'Columns', deleteTable: 'Delete Table', headers: 'Headers', headersBoth: 'Both', headersColumn: 'First column', headersNone: 'None', headersRow: 'First Row', heightUnit: 'height unit', invalidBorder: 'Border size must be a number.', invalidCellPadding: 'Cell padding must be a positive number.', invalidCellSpacing: 'Cell spacing must be a positive number.', invalidCols: 'Number of columns must be a number greater than 0.', invalidHeight: 'Table height must be a number.', invalidRows: 'Number of rows must be a number greater than 0.', invalidWidth: 'Table width must be a number.', menu: 'Table Properties', row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Delete Rows' }, rows: 'Rows', summary: 'Summary', title: 'Table Properties', toolbar: 'Table', widthPc: 'percent', widthPx: 'pixels', widthUnit: 'width unit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/no.js0000644000201500020150000000455114515446712023242 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'no', { border: 'Rammestørrelse', caption: 'Tittel', cell: { menu: 'Celle', insertBefore: 'Sett inn celle før', insertAfter: 'Sett inn celle etter', deleteCell: 'Slett celler', merge: 'Slå sammen celler', mergeRight: 'Slå sammen høyre', mergeDown: 'Slå sammen ned', splitHorizontal: 'Del celle horisontalt', splitVertical: 'Del celle vertikalt', title: 'Celleegenskaper', cellType: 'Celletype', rowSpan: 'Radspenn', colSpan: 'Kolonnespenn', wordWrap: 'Tekstbrytning', hAlign: 'Horisontal justering', vAlign: 'Vertikal justering', alignBaseline: 'Grunnlinje', bgColor: 'Bakgrunnsfarge', borderColor: 'Rammefarge', data: 'Data', header: 'Overskrift', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ja', no: 'Nei', invalidWidth: 'Cellebredde må være et tall.', invalidHeight: 'Cellehøyde må være et tall.', invalidRowSpan: 'Radspenn må være et heltall.', invalidColSpan: 'Kolonnespenn må være et heltall.', chooseColor: 'Velg' }, cellPad: 'Cellepolstring', cellSpace: 'Cellemarg', column: { menu: 'Kolonne', insertBefore: 'Sett inn kolonne før', insertAfter: 'Sett inn kolonne etter', deleteColumn: 'Slett kolonner' }, columns: 'Kolonner', deleteTable: 'Slett tabell', headers: 'Overskrifter', headersBoth: 'Begge', headersColumn: 'Første kolonne', headersNone: 'Ingen', headersRow: 'Første rad', heightUnit: 'height unit', // MISSING invalidBorder: 'Rammestørrelse må være et tall.', invalidCellPadding: 'Cellepolstring må være et positivt tall.', invalidCellSpacing: 'Cellemarg må være et positivt tall.', invalidCols: 'Antall kolonner må være et tall større enn 0.', invalidHeight: 'Tabellhøyde må være et tall.', invalidRows: 'Antall rader må være et tall større enn 0.', invalidWidth: 'Tabellbredde må være et tall.', menu: 'Egenskaper for tabell', row: { menu: 'Rader', insertBefore: 'Sett inn rad før', insertAfter: 'Sett inn rad etter', deleteRow: 'Slett rader' }, rows: 'Rader', summary: 'Sammendrag', title: 'Egenskaper for tabell', toolbar: 'Tabell', widthPc: 'prosent', widthPx: 'piksler', widthUnit: 'Bredde-enhet' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/fr.js0000644000201500020150000000540414515446712023233 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'fr', { border: 'Taille de la bordure', caption: 'Titre du tableau', cell: { menu: 'Cellule', insertBefore: 'Insérer une cellule avant', insertAfter: 'Insérer une cellule après', deleteCell: 'Supprimer les cellules', merge: 'Fusionner les cellules', mergeRight: 'Fusionner vers la droite', mergeDown: 'Fusionner vers le bas', splitHorizontal: 'Scinder la cellule horizontalement', splitVertical: 'Scinder la cellule verticalement', title: 'Propriétés de la cellule', cellType: 'Type de cellule', rowSpan: 'Lignes occupées', colSpan: 'Colonnes occupées', wordWrap: 'Césure', hAlign: 'Alignement horizontal', vAlign: 'Alignement vertical', alignBaseline: 'Ligne de base', bgColor: 'Couleur d\'arrière-plan', borderColor: 'Couleur de bordure', data: 'Données', header: 'En-tête', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Oui', no: 'Non', invalidWidth: 'La largeur de la cellule doit être un nombre.', invalidHeight: 'La hauteur de la cellule doit être un nombre.', invalidRowSpan: 'Le nombre de colonnes occupées doit être un nombre entier.', invalidColSpan: 'Le nombre de colonnes occupées doit être un nombre entier.', chooseColor: 'Choisir' }, cellPad: 'Marge interne des cellules', cellSpace: 'Espacement entre les cellules', column: { menu: 'Colonne', insertBefore: 'Insérer une colonne avant', insertAfter: 'Insérer une colonne après', deleteColumn: 'Supprimer les colonnes' }, columns: 'Colonnes', deleteTable: 'Supprimer le tableau', headers: 'En-têtes', headersBoth: 'Les deux', headersColumn: 'Première colonne', headersNone: 'Aucun', headersRow: 'Première ligne', heightUnit: 'unité de hauteur', invalidBorder: 'La taille de la bordure doit être un nombre.', invalidCellPadding: 'La marge interne des cellules doit être un nombre positif.', invalidCellSpacing: 'L\'espacement entre les cellules doit être un nombre positif.', invalidCols: 'Le nombre de colonnes doit être supérieur à 0.', invalidHeight: 'La hauteur du tableau doit être un nombre.', invalidRows: 'Le nombre de lignes doit être supérieur à 0.', invalidWidth: 'La largeur du tableau doit être un nombre.', menu: 'Propriétés du tableau', row: { menu: 'Ligne', insertBefore: 'Insérer une ligne avant', insertAfter: 'Insérer une ligne après', deleteRow: 'Supprimer les lignes' }, rows: 'Lignes', summary: 'Résumé (description)', title: 'Propriétés du tableau', toolbar: 'Tableau', widthPc: 'pour cent', widthPx: 'pixels', widthUnit: 'unité de largeur' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/id.js0000644000201500020150000000460214515446712023217 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'id', { border: 'Ukuran batas', caption: 'Judul halaman', cell: { menu: 'Sel', insertBefore: 'Sisip Sel Sebelum', insertAfter: 'Sisip Sel Setelah', deleteCell: 'Hapus Sel', merge: 'Gabungkan Sel', mergeRight: 'Gabungkan ke Kanan', mergeDown: 'Gabungkan ke Bawah', splitHorizontal: 'Pisahkan Sel Secara Horisontal', splitVertical: 'Pisahkan Sel Secara Vertikal', title: 'Properti Sel', cellType: 'Tipe Sel', rowSpan: 'Rentang antar baris', colSpan: 'Rentang antar kolom', wordWrap: 'Word Wrap', hAlign: 'Jajaran Horisontal', vAlign: 'Jajaran Vertikal', alignBaseline: 'Dasar', bgColor: 'Warna Latar Belakang', borderColor: 'Warna Batasan', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Ya', no: 'Tidak', invalidWidth: 'Lebar sel harus sebuah angka.', invalidHeight: 'Tinggi sel harus sebuah angka', invalidRowSpan: 'Rentang antar baris harus angka seluruhnya.', invalidColSpan: 'Rentang antar kolom harus angka seluruhnya', chooseColor: 'Pilih' }, cellPad: 'Sel spasi dalam', cellSpace: 'Spasi antar sel', column: { menu: 'Kolom', insertBefore: 'Sisip Kolom Sebelum', insertAfter: 'Sisip Kolom Sesudah', deleteColumn: 'Hapus Kolom' }, columns: 'Kolom', deleteTable: 'Hapus Tabel', headers: 'Headers', headersBoth: 'Keduanya', headersColumn: 'Kolom pertama', headersNone: 'Tidak ada', headersRow: 'Baris Pertama', heightUnit: 'height unit', // MISSING invalidBorder: 'Ukuran batasan harus sebuah angka', invalidCellPadding: '\'Spasi dalam\' sel harus angka positif.', invalidCellSpacing: 'Spasi antar sel harus angka positif.', invalidCols: 'Jumlah kolom harus sebuah angka lebih besar dari 0', invalidHeight: 'Tinggi tabel harus sebuah angka.', invalidRows: 'Jumlah barus harus sebuah angka dan lebih besar dari 0.', invalidWidth: 'Lebar tabel harus sebuah angka.', menu: 'Properti Tabel', row: { menu: 'Baris', insertBefore: 'Sisip Baris Sebelum', insertAfter: 'Sisip Baris Sesudah', deleteRow: 'Hapus Baris' }, rows: 'Baris', summary: 'Intisari', title: 'Properti Tabel', toolbar: 'Tabe', widthPc: 'persen', widthPx: 'piksel', widthUnit: 'lebar satuan' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ug.js0000644000201500020150000000662314515446712023243 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ug', { border: 'گىرۋەك', caption: 'ماۋزۇ', cell: { menu: 'كاتەكچە', insertBefore: 'سولغا كاتەكچە قىستۇر', insertAfter: 'ئوڭغا كاتەكچە قىستۇر', deleteCell: 'كەتەكچە ئۆچۈر', merge: 'كاتەكچە بىرلەشتۈر', mergeRight: 'كاتەكچىنى ئوڭغا بىرلەشتۈر', mergeDown: 'كاتەكچىنى ئاستىغا بىرلەشتۈر', splitHorizontal: 'كاتەكچىنى توغرىسىغا بىرلەشتۈر', splitVertical: 'كاتەكچىنى بويىغا بىرلەشتۈر', title: 'كاتەكچە خاسلىقى', cellType: 'كاتەكچە تىپى', rowSpan: 'بويىغا چات ئارىسى قۇر سانى', colSpan: 'توغرىسىغا چات ئارىسى ئىستون سانى', wordWrap: 'ئۆزلۈكىدىن قۇر قاتلا', hAlign: 'توغرىسىغا توغرىلا', vAlign: 'بويىغا توغرىلا', alignBaseline: 'ئاساسىي سىزىق', bgColor: 'تەگلىك رەڭگى', borderColor: 'گىرۋەك رەڭگى', data: 'سانلىق مەلۇمات', header: 'جەدۋەل باشى', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'ھەئە', no: 'ياق', invalidWidth: 'كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ', invalidHeight: 'كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ', invalidRowSpan: 'قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ', invalidColSpan: 'ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ', chooseColor: 'تاللاڭ' }, cellPad: 'يان ئارىلىق', cellSpace: 'ئارىلىق', column: { menu: 'ئىستون', insertBefore: 'سولغا ئىستون قىستۇر', insertAfter: 'ئوڭغا ئىستون قىستۇر', deleteColumn: 'ئىستون ئۆچۈر' }, columns: 'ئىستون سانى', deleteTable: 'جەدۋەل ئۆچۈر', headers: 'ماۋزۇ كاتەكچە', headersBoth: 'بىرىنچى ئىستون ۋە بىرىنچى قۇر', headersColumn: 'بىرىنچى ئىستون', headersNone: 'يوق', headersRow: 'بىرىنچى قۇر', heightUnit: 'height unit', // MISSING invalidBorder: 'گىرۋەك توملۇقى چوقۇم سان بولىدۇ', invalidCellPadding: 'كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ', invalidCellSpacing: 'كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ', invalidCols: 'بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ', invalidHeight: 'جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ', invalidRows: 'بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ', invalidWidth: 'جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ', menu: 'جەدۋەل خاسلىقى', row: { menu: 'قۇر', insertBefore: 'ئۈستىگە قۇر قىستۇر', insertAfter: 'ئاستىغا قۇر قىستۇر', deleteRow: 'قۇر ئۆچۈر' }, rows: 'قۇر سانى', summary: 'ئۈزۈندە', title: 'جەدۋەل خاسلىقى', toolbar: 'جەدۋەل', widthPc: 'پىرسەنت', widthPx: 'پىكسېل', widthUnit: 'كەڭلىك بىرلىكى' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/ar.js0000644000201500020150000000566214515446712023234 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'ar', { border: 'الحدود', caption: 'الوصف', cell: { menu: 'خلية', insertBefore: 'إدراج خلية قبل', insertAfter: 'إدراج خلية بعد', deleteCell: 'حذف خلية', merge: 'دمج خلايا', mergeRight: 'دمج لليمين', mergeDown: 'دمج للأسفل', splitHorizontal: 'تقسيم الخلية أفقياً', splitVertical: 'تقسيم الخلية عمودياً', title: 'خصائص الخلية', cellType: 'نوع الخلية', rowSpan: 'امتداد الصفوف', colSpan: 'امتداد الأعمدة', wordWrap: 'التفاف النص', hAlign: 'محاذاة أفقية', vAlign: 'محاذاة رأسية', alignBaseline: 'خط القاعدة', bgColor: 'لون الخلفية', borderColor: 'لون الحدود', data: 'بيانات', header: 'عنوان', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'نعم', no: 'لا', invalidWidth: 'عرض الخلية يجب أن يكون عدداً.', invalidHeight: 'ارتفاع الخلية يجب أن يكون عدداً.', invalidRowSpan: 'امتداد الصفوف يجب أن يكون عدداً صحيحاً.', invalidColSpan: 'امتداد الأعمدة يجب أن يكون عدداً صحيحاً.', chooseColor: 'اختر' }, cellPad: 'المسافة البادئة', cellSpace: 'تباعد الخلايا', column: { menu: 'عمود', insertBefore: 'إدراج عمود قبل', insertAfter: 'إدراج عمود بعد', deleteColumn: 'حذف أعمدة' }, columns: 'أعمدة', deleteTable: 'حذف الجدول', headers: 'العناوين', headersBoth: 'كلاهما', headersColumn: 'العمود الأول', headersNone: 'بدون', headersRow: 'الصف الأول', heightUnit: 'height unit', // MISSING invalidBorder: 'حجم الحد يجب أن يكون عدداً.', invalidCellPadding: 'المسافة البادئة يجب أن تكون عدداً', invalidCellSpacing: 'المسافة بين الخلايا يجب أن تكون عدداً.', invalidCols: 'عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.', invalidHeight: 'ارتفاع الجدول يجب أن يكون عدداً.', invalidRows: 'عدد الصفوف يجب أن يكون عدداً أكبر من صفر.', invalidWidth: 'عرض الجدول يجب أن يكون عدداً.', menu: 'خصائص الجدول', row: { menu: 'صف', insertBefore: 'إدراج صف قبل', insertAfter: 'إدراج صف بعد', deleteRow: 'حذف صفوف' }, rows: 'صفوف', summary: 'الخلاصة', title: 'خصائص الجدول', toolbar: 'جدول', widthPc: 'بالمئة', widthPx: 'بكسل', widthUnit: 'وحدة العرض' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/sr.js0000644000201500020150000000646114515446712023254 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'sr', { border: 'Величина оквира', caption: 'Наслов табеле', cell: { menu: 'Ћелија', insertBefore: 'Убаци лево', insertAfter: 'Убаци десно', deleteCell: 'Обриши ћелије', merge: 'Спој ћелије', mergeRight: 'Спој ћелије на десно', mergeDown: 'Спој ћелије на доле', splitHorizontal: 'Раздвој ћелије водоравно', splitVertical: 'Раздвој ћелије усправно', title: 'Карактеристика ћелија', cellType: 'Тип ћелија', rowSpan: 'Спој уздужно', colSpan: 'Спој водоравно', wordWrap: 'Брисање дугачких редова', hAlign: 'Равнање водоравно', vAlign: 'Равнање усправно', alignBaseline: 'Базна линија', bgColor: 'Боја позадине', borderColor: 'Боја оквира', data: 'Податак', header: 'Наслов', columnHeader: 'Заглавље колоне', rowHeader: 'Заглавље реда', yes: 'Да', no: 'Не', invalidWidth: 'У поље ширина можете уписати само бројеве.', invalidHeight: 'У поље висина можете уписати само бројеве.', invalidRowSpan: 'У поље спој усправно можете уписати само бројеве.', invalidColSpan: 'У поље спој водоравно можете уписати само бројеве.', chooseColor: 'Изабери' }, cellPad: 'Размак ћелија', cellSpace: 'Ћелијски простор', column: { menu: 'Колона', insertBefore: 'Убаци лево', insertAfter: 'Убаци десно', deleteColumn: 'Обриши колоне' }, columns: 'Kолона', deleteTable: 'Обриши таблу', headers: 'Поглавља', headersBoth: 'Оба', headersColumn: 'Прва колона', headersNone: 'Нема', headersRow: 'Први ред', heightUnit: 'Јединица висине', invalidBorder: 'Величина ивице треба да буде цифра.', invalidCellPadding: 'Пуњење ћелије треба да буде позитивна цифра.', invalidCellSpacing: 'Размак ћелије треба да буде позитивна цифра.', invalidCols: 'Број колона треба да буде цифра већа од 0.', invalidHeight: 'Висина табеле треба да буде цифра.', invalidRows: 'Број реда треба да буде цифра већа од 0.', invalidWidth: 'Ширина табеле треба да буде цифра.', menu: 'Карактеристике табеле', row: { menu: 'Ред', insertBefore: 'Убаци изнад', insertAfter: 'Убаци испод', deleteRow: 'Обриши редове' }, rows: 'Редови', summary: 'Oпис', title: 'Карактеристике табеле', toolbar: 'Табела', widthPc: 'процената', widthPx: 'пиксела', widthUnit: 'јединица ширине' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/eu.js0000644000201500020150000000517314515446712023240 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'eu', { border: 'Ertzaren zabalera', caption: 'Epigrafea', cell: { menu: 'Gelaxka', insertBefore: 'Txertatu gelaxka aurretik', insertAfter: 'Txertatu gelaxka ondoren', deleteCell: 'Ezabatu gelaxkak', merge: 'Batu gelaxkak', mergeRight: 'Batu eskuinetara', mergeDown: 'Batu behera', splitHorizontal: 'Banatu gelaxka horizontalki', splitVertical: 'Banatu gelaxka bertikalki', title: 'Gelaxkaren propietateak', cellType: 'Gelaxka-mota', rowSpan: 'Errenkaden hedadura', colSpan: 'Zutabeen hedadura', wordWrap: 'Itzulbira', hAlign: 'Lerrokatze horizontala', vAlign: 'Lerrokatze bertikala', alignBaseline: 'Oinarri-lerroan', bgColor: 'Atzeko planoaren kolorea', borderColor: 'Ertzaren kolorea', data: 'Data', header: 'Goiburua', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Bai', no: 'Ez', invalidWidth: 'Gelaxkaren zabalera zenbaki bat izan behar da.', invalidHeight: 'Gelaxkaren altuera zenbaki bat izan behar da.', invalidRowSpan: 'Errenkaden hedadura zenbaki osoa izan behar da.', invalidColSpan: 'Zutabeen hedadura zenbaki osoa izan behar da.', chooseColor: 'Aukeratu' }, cellPad: 'Gelaxken betegarria', cellSpace: 'Gelaxka arteko tartea', column: { menu: 'Zutabea', insertBefore: 'Txertatu zutabea aurretik', insertAfter: 'Txertatu zutabea ondoren', deleteColumn: 'Ezabatu zutabeak' }, columns: 'Zutabeak', deleteTable: 'Ezabatu taula', headers: 'Goiburuak', headersBoth: 'Biak', headersColumn: 'Lehen zutabea', headersNone: 'Bat ere ez', headersRow: 'Lehen errenkada', heightUnit: 'height unit', // MISSING invalidBorder: 'Ertzaren tamaina zenbaki bat izan behar da.', invalidCellPadding: 'Gelaxken betegarria zenbaki bat izan behar da.', invalidCellSpacing: 'Gelaxka arteko tartea zenbaki bat izan behar da.', invalidCols: 'Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.', invalidHeight: 'Taularen altuera zenbaki bat izan behar da.', invalidRows: 'Errenkada kopurua 0 baino handiagoa den zenbakia izan behar da.', invalidWidth: 'Taularen zabalera zenbaki bat izan behar da.', menu: 'Taularen propietateak', row: { menu: 'Errenkada', insertBefore: 'Txertatu errenkada aurretik', insertAfter: 'Txertatu errenkada ondoren', deleteRow: 'Ezabatu errenkadak' }, rows: 'Errenkadak', summary: 'Laburpena', title: 'Taularen propietateak', toolbar: 'Taula', widthPc: 'ehuneko', widthPx: 'pixel', widthUnit: 'zabalera unitatea' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/en-gb.js0000644000201500020150000000442614515446712023617 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'en-gb', { border: 'Border size', caption: 'Caption', cell: { menu: 'Cell', insertBefore: 'Insert Cell Before', insertAfter: 'Insert Cell After', deleteCell: 'Delete Cells', merge: 'Merge Cells', mergeRight: 'Merge Right', mergeDown: 'Merge Down', splitHorizontal: 'Split Cell Horizontally', splitVertical: 'Split Cell Vertically', title: 'Cell Properties', cellType: 'Cell Type', rowSpan: 'Rows Span', colSpan: 'Columns Span', wordWrap: 'Word Wrap', hAlign: 'Horizontal Alignment', vAlign: 'Vertical Alignment', alignBaseline: 'Baseline', bgColor: 'Background Color', borderColor: 'Border Color', data: 'Data', header: 'Header', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Yes', no: 'No', invalidWidth: 'Cell width must be a number.', invalidHeight: 'Cell height must be a number.', invalidRowSpan: 'Rows span must be a whole number.', invalidColSpan: 'Columns span must be a whole number.', chooseColor: 'Choose' }, cellPad: 'Cell padding', cellSpace: 'Cell spacing', column: { menu: 'Column', insertBefore: 'Insert Column Before', insertAfter: 'Insert Column After', deleteColumn: 'Delete Columns' }, columns: 'Columns', deleteTable: 'Delete Table', headers: 'Headers', headersBoth: 'Both', headersColumn: 'First column', headersNone: 'None', headersRow: 'First Row', heightUnit: 'height unit', // MISSING invalidBorder: 'Border size must be a number.', invalidCellPadding: 'Cell padding must be a number.', invalidCellSpacing: 'Cell spacing must be a number.', invalidCols: 'Number of columns must be a number greater than 0.', invalidHeight: 'Table height must be a number.', invalidRows: 'Number of rows must be a number greater than 0.', invalidWidth: 'Table width must be a number.', menu: 'Table Properties', row: { menu: 'Row', insertBefore: 'Insert Row Before', insertAfter: 'Insert Row After', deleteRow: 'Delete Rows' }, rows: 'Rows', summary: 'Summary', title: 'Table Properties', toolbar: 'Table', widthPc: 'percent', widthPx: 'pixels', widthUnit: 'width unit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/lang/hu.js0000644000201500020150000000521214515446712023235 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'table', 'hu', { border: 'Szegélyméret', caption: 'Felirat', cell: { menu: 'Cella', insertBefore: 'Beszúrás balra', insertAfter: 'Beszúrás jobbra', deleteCell: 'Cellák törlése', merge: 'Cellák egyesítése', mergeRight: 'Cellák egyesítése jobbra', mergeDown: 'Cellák egyesítése lefelé', splitHorizontal: 'Cellák szétválasztása vízszintesen', splitVertical: 'Cellák szétválasztása függőlegesen', title: 'Cella tulajdonságai', cellType: 'Cella típusa', rowSpan: 'Függőleges egyesítés', colSpan: 'Vízszintes egyesítés', wordWrap: 'Hosszú sorok törése', hAlign: 'Vízszintes igazítás', vAlign: 'Függőleges igazítás', alignBaseline: 'Alapvonalra', bgColor: 'Háttér színe', borderColor: 'Keret színe', data: 'Adat', header: 'Fejléc', columnHeader: 'Column Header', // MISSING rowHeader: 'Row Header', // MISSING yes: 'Igen', no: 'Nem', invalidWidth: 'A szélesség mezőbe csak számokat írhat.', invalidHeight: 'A magasság mezőbe csak számokat írhat.', invalidRowSpan: 'A függőleges egyesítés mezőbe csak számokat írhat.', invalidColSpan: 'A vízszintes egyesítés mezőbe csak számokat írhat.', chooseColor: 'Válasszon' }, cellPad: 'Cella belső margó', cellSpace: 'Cella térköz', column: { menu: 'Oszlop', insertBefore: 'Beszúrás balra', insertAfter: 'Beszúrás jobbra', deleteColumn: 'Oszlopok törlése' }, columns: 'Oszlopok', deleteTable: 'Táblázat törlése', headers: 'Fejlécek', headersBoth: 'Mindkettő', headersColumn: 'Első oszlop', headersNone: 'Nincsenek', headersRow: 'Első sor', heightUnit: 'Magasság egység', invalidBorder: 'A szegélyméret mezőbe csak számokat írhat.', invalidCellPadding: 'A cella belső margó mezőbe csak számokat írhat.', invalidCellSpacing: 'A cella térköz mezőbe csak számokat írhat.', invalidCols: 'Az oszlopok számának nagyobbnak kell lenni mint 0.', invalidHeight: 'A magasság mezőbe csak számokat írhat.', invalidRows: 'A sorok számának nagyobbnak kell lenni mint 0.', invalidWidth: 'A szélesség mezőbe csak számokat írhat.', menu: 'Táblázat tulajdonságai', row: { menu: 'Sor', insertBefore: 'Beszúrás fölé', insertAfter: 'Beszúrás alá', deleteRow: 'Sorok törlése' }, rows: 'Sorok', summary: 'Leírás', title: 'Táblázat tulajdonságai', toolbar: 'Táblázat', widthPc: 'százalék', widthPx: 'képpont', widthUnit: 'Szélesség egység' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/dialogs/0000755000201500020150000000000014515446712022764 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/table/dialogs/table.js0000755000201500020150000004434014515446712024421 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ ( function() { var defaultToPixel = CKEDITOR.tools.cssLength; var commitValue = function( data ) { var id = this.id; if ( !data.info ) data.info = {}; data.info[ id ] = this.getValue(); }; function tableColumns( table ) { var cols = 0, maxCols = 0; for ( var i = 0, row, rows = table.$.rows.length; i < rows; i++ ) { row = table.$.rows[ i ], cols = 0; for ( var j = 0, cell, cells = row.cells.length; j < cells; j++ ) { cell = row.cells[ j ]; cols += cell.colSpan; } cols > maxCols && ( maxCols = cols ); } return maxCols; } // Whole-positive-integer validator. function validatorNum( msg ) { return function() { var value = this.getValue(), pass = !!( CKEDITOR.dialog.validate.integer().call( this, value ) && value > 0 ); if ( !pass ) { alert( msg ); // jshint ignore:line this.select(); } return pass; }; } function tableDialog( editor, command ) { var makeElement = function( name ) { return new CKEDITOR.dom.element( name, editor.document ); }; var editable = editor.editable(); var dialogadvtab = editor.plugins.dialogadvtab; function shouldReplaceThByTd( cell, headers, index ) { return cell.type == CKEDITOR.NODE_ELEMENT && ( !headers || index !== 0 ); } return { title: editor.lang.table.title, minWidth: 310, minHeight: CKEDITOR.env.ie ? 310 : 280, getModel: function( editor ) { if ( this.dialog.getName() !== 'tableProperties' ) { return null; } var selection = editor.getSelection(), range = selection && selection.getRanges()[ 0 ]; return range ? range._getTableElement( { table: 1 } ) : null; }, onLoad: function() { var dialog = this; var styles = dialog.getContentElement( 'advanced', 'advStyles' ); if ( styles ) { styles.on( 'change', function() { // Synchronize width value. var width = this.getStyle( 'width', '' ), txtWidth = dialog.getContentElement( 'info', 'txtWidth' ); txtWidth && txtWidth.setValue( width, true ); // Synchronize height value. var height = this.getStyle( 'height', '' ), txtHeight = dialog.getContentElement( 'info', 'txtHeight' ); txtHeight && txtHeight.setValue( height, true ); } ); } }, onShow: function() { // Detect if there's a selected table. var selection = editor.getSelection(), ranges = selection.getRanges(), table; var rowsInput = this.getContentElement( 'info', 'txtRows' ), colsInput = this.getContentElement( 'info', 'txtCols' ), widthInput = this.getContentElement( 'info', 'txtWidth' ), heightInput = this.getContentElement( 'info', 'txtHeight' ); if ( command == 'tableProperties' ) { var selected = selection.getSelectedElement(); if ( selected && selected.is( 'table' ) ) table = selected; else if ( ranges.length > 0 ) { // Webkit could report the following range on cell selection (https://dev.ckeditor.com/ticket/4948): //
            ] if ( CKEDITOR.env.webkit ) ranges[ 0 ].shrink( CKEDITOR.NODE_ELEMENT ); table = editor.elementPath( ranges[ 0 ].getCommonAncestor( true ) ).contains( 'table', 1 ); } // Save a reference to the selected table, and push a new set of default values. this._.selectedElement = table; } // Enable or disable the row, cols, width fields. if ( table ) { this.setupContent( table ); rowsInput && rowsInput.disable(); colsInput && colsInput.disable(); } else { rowsInput && rowsInput.enable(); colsInput && colsInput.enable(); } // Call the onChange method for the widht and height fields so // they get reflected into the Advanced tab. widthInput && widthInput.onChange(); heightInput && heightInput.onChange(); }, onOk: function() { var selection = editor.getSelection(), bms = this._.selectedElement && selection.createBookmarks(); var table = this._.selectedElement || makeElement( 'table' ), data = {}; this.commitContent( data, table ); if ( data.info ) { var info = data.info; // Generate the rows and cols. if ( !this._.selectedElement ) { var tbody = table.append( makeElement( 'tbody' ) ), rows = parseInt( info.txtRows, 10 ) || 0, cols = parseInt( info.txtCols, 10 ) || 0; for ( var i = 0; i < rows; i++ ) { var row = tbody.append( makeElement( 'tr' ) ); for ( var j = 0; j < cols; j++ ) { var cell = row.append( makeElement( 'td' ) ); cell.appendBogus(); } } } // Modify the table headers. Depends on having rows and cols generated // correctly so it can't be done in commit functions. // Should we make a ? var headers = info.selHeaders; if ( !table.$.tHead && ( headers == 'row' || headers == 'both' ) ) { var thead = table.getElementsByTag( 'thead' ).getItem( 0 ); tbody = table.getElementsByTag( 'tbody' ).getItem( 0 ); var theRow = tbody.getElementsByTag( 'tr' ).getItem( 0 ); if ( !thead ) { thead = new CKEDITOR.dom.element( 'thead' ); thead.insertBefore( tbody ); } // Change TD to TH: for ( i = 0; i < theRow.getChildCount(); i++ ) { var th = theRow.getChild( i ); // Skip bookmark nodes. (https://dev.ckeditor.com/ticket/6155) if ( th.type == CKEDITOR.NODE_ELEMENT && !th.data( 'cke-bookmark' ) ) { th.renameNode( 'th' ); th.setAttribute( 'scope', 'col' ); } } thead.append( theRow.remove() ); } if ( table.$.tHead !== null && !( headers == 'row' || headers == 'both' ) ) { // Move the row out of the THead and put it in the TBody: thead = new CKEDITOR.dom.element( table.$.tHead ); tbody = table.getElementsByTag( 'tbody' ).getItem( 0 ); while ( thead.getChildCount() > 0 ) { theRow = thead.getFirst(); for ( i = 0; i < theRow.getChildCount(); i++ ) { var newCell = theRow.getChild( i ); // In case when header is replaced to td element, // check if the replaced cell should contain a 'row' scope (#2881). if ( shouldReplaceThByTd( newCell, headers, i ) ) { newCell.renameNode( 'td' ); newCell.removeAttribute( 'scope' ); } else { newCell.setAttribute( 'scope', 'row' ); } } // Append the row to the start (#1397). tbody.append( theRow, true ); } thead.remove(); } // Should we make all first cells in a row TH? if ( !this.hasColumnHeaders && ( headers == 'col' || headers == 'both' ) ) { for ( row = 0; row < table.$.rows.length; row++ ) { newCell = new CKEDITOR.dom.element( table.$.rows[ row ].cells[ 0 ] ); newCell.renameNode( 'th' ); // If "both" is set, the first cell in table head should have scope "col"(#2996). if ( headers === 'both' && row === 0 ) { newCell.setAttribute( 'scope', 'col' ); } else { newCell.setAttribute( 'scope', 'row' ); } } } // Should we make all first TH-cells in a row make TD? If 'yes' we do it the other way round :-) if ( ( this.hasColumnHeaders ) && !( headers == 'col' || headers == 'both' ) ) { for ( i = 0; i < table.$.rows.length; i++ ) { row = new CKEDITOR.dom.element( table.$.rows[ i ] ); if ( row.getParent().getName() == 'tbody' ) { newCell = new CKEDITOR.dom.element( row.$.cells[ 0 ] ); newCell.renameNode( 'td' ); newCell.removeAttribute( 'scope' ); } } } // Set the width and height. info.txtHeight ? table.setStyle( 'height', info.txtHeight ) : table.removeStyle( 'height' ); info.txtWidth ? table.setStyle( 'width', info.txtWidth ) : table.removeStyle( 'width' ); if ( !table.getAttribute( 'style' ) ) table.removeAttribute( 'style' ); } // Insert the table element if we're creating one. if ( !this._.selectedElement ) { editor.insertElement( table ); // Override the default cursor position after insertElement to place // cursor inside the first cell (https://dev.ckeditor.com/ticket/7959), IE needs a while. setTimeout( function() { var firstCell = new CKEDITOR.dom.element( table.$.rows[ 0 ].cells[ 0 ] ); var range = editor.createRange(); range.moveToPosition( firstCell, CKEDITOR.POSITION_AFTER_START ); range.select(); }, 0 ); } // Properly restore the selection, (https://dev.ckeditor.com/ticket/4822) but don't break // because of this, e.g. updated table caption. else { try { selection.selectBookmarks( bms ); } catch ( er ) { } } }, contents: [ { id: 'info', label: editor.lang.table.title, elements: [ { type: 'hbox', widths: [ null, null ], styles: [ 'vertical-align:top' ], children: [ { type: 'vbox', padding: 0, children: [ { type: 'text', id: 'txtRows', 'default': 3, label: editor.lang.table.rows, required: true, controlStyle: 'width:5em', validate: validatorNum( editor.lang.table.invalidRows ), setup: function( selectedElement ) { this.setValue( selectedElement.$.rows.length ); }, commit: commitValue }, { type: 'text', id: 'txtCols', 'default': 2, label: editor.lang.table.columns, required: true, controlStyle: 'width:5em', validate: validatorNum( editor.lang.table.invalidCols ), setup: function( selectedTable ) { this.setValue( tableColumns( selectedTable ) ); }, commit: commitValue }, { type: 'html', html: ' ' }, { type: 'select', id: 'selHeaders', requiredContent: 'th', 'default': '', label: editor.lang.table.headers, items: [ [ editor.lang.table.headersNone, '' ], [ editor.lang.table.headersRow, 'row' ], [ editor.lang.table.headersColumn, 'col' ], [ editor.lang.table.headersBoth, 'both' ] ], setup: function( selectedTable ) { // Fill in the headers field. var dialog = this.getDialog(); dialog.hasColumnHeaders = true; // Check if all the first cells in every row are TH for ( var row = 0; row < selectedTable.$.rows.length; row++ ) { // If just one cell isn't a TH then it isn't a header column var headCell = selectedTable.$.rows[ row ].cells[ 0 ]; if ( headCell && headCell.nodeName.toLowerCase() != 'th' ) { dialog.hasColumnHeaders = false; break; } } // Check if the table contains . if ( ( selectedTable.$.tHead !== null ) ) this.setValue( dialog.hasColumnHeaders ? 'both' : 'row' ); else this.setValue( dialog.hasColumnHeaders ? 'col' : '' ); }, commit: commitValue }, { type: 'text', id: 'txtBorder', requiredContent: 'table[border]', // Avoid setting border which will then disappear. 'default': editor.filter.check( 'table[border]' ) ? 1 : 0, label: editor.lang.table.border, controlStyle: 'width:3em', validate: CKEDITOR.dialog.validate.number( editor.lang.table.invalidBorder ), setup: function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'border' ) || '' ); }, commit: function( data, selectedTable ) { if ( this.getValue() ) selectedTable.setAttribute( 'border', this.getValue() ); else selectedTable.removeAttribute( 'border' ); } }, { id: 'cmbAlign', type: 'select', requiredContent: 'table[align]', 'default': '', label: editor.lang.common.align, items: [ [ editor.lang.common.notSet, '' ], [ editor.lang.common.left, 'left' ], [ editor.lang.common.center, 'center' ], [ editor.lang.common.right, 'right' ] ], setup: function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'align' ) || '' ); }, commit: function( data, selectedTable ) { if ( this.getValue() ) selectedTable.setAttribute( 'align', this.getValue() ); else selectedTable.removeAttribute( 'align' ); } } ] }, { type: 'vbox', padding: 0, children: [ { type: 'hbox', widths: [ '5em' ], children: [ { type: 'text', id: 'txtWidth', requiredContent: 'table{width}', controlStyle: 'width:5em', label: editor.lang.common.width, title: editor.lang.common.cssLengthTooltip, // Smarter default table width. (https://dev.ckeditor.com/ticket/9600) 'default': editor.filter.check( 'table{width}' ) ? ( editable.getSize( 'width' ) < 500 ? '100%' : 500 ) : 0, getValue: defaultToPixel, validate: CKEDITOR.dialog.validate.cssLength( editor.lang.common.invalidCssLength.replace( '%1', editor.lang.common.width ) ), onChange: function() { var styles = this.getDialog().getContentElement( 'advanced', 'advStyles' ); styles && styles.updateStyle( 'width', this.getValue() ); }, setup: function( selectedTable ) { var val = selectedTable.getStyle( 'width' ); this.setValue( val ); }, commit: commitValue } ] }, { type: 'hbox', widths: [ '5em' ], children: [ { type: 'text', id: 'txtHeight', requiredContent: 'table{height}', controlStyle: 'width:5em', label: editor.lang.common.height, title: editor.lang.common.cssLengthTooltip, 'default': '', getValue: defaultToPixel, validate: CKEDITOR.dialog.validate.cssLength( editor.lang.common.invalidCssLength.replace( '%1', editor.lang.common.height ) ), onChange: function() { var styles = this.getDialog().getContentElement( 'advanced', 'advStyles' ); styles && styles.updateStyle( 'height', this.getValue() ); }, setup: function( selectedTable ) { var val = selectedTable.getStyle( 'height' ); val && this.setValue( val ); }, commit: commitValue } ] }, { type: 'html', html: ' ' }, { type: 'text', id: 'txtCellSpace', requiredContent: 'table[cellspacing]', controlStyle: 'width:3em', label: editor.lang.table.cellSpace, 'default': editor.filter.check( 'table[cellspacing]' ) ? 1 : 0, validate: CKEDITOR.dialog.validate.number( editor.lang.table.invalidCellSpacing ), setup: function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'cellSpacing' ) || '' ); }, commit: function( data, selectedTable ) { if ( this.getValue() ) selectedTable.setAttribute( 'cellSpacing', this.getValue() ); else selectedTable.removeAttribute( 'cellSpacing' ); } }, { type: 'text', id: 'txtCellPad', requiredContent: 'table[cellpadding]', controlStyle: 'width:3em', label: editor.lang.table.cellPad, 'default': editor.filter.check( 'table[cellpadding]' ) ? 1 : 0, validate: CKEDITOR.dialog.validate.number( editor.lang.table.invalidCellPadding ), setup: function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'cellPadding' ) || '' ); }, commit: function( data, selectedTable ) { if ( this.getValue() ) selectedTable.setAttribute( 'cellPadding', this.getValue() ); else selectedTable.removeAttribute( 'cellPadding' ); } } ] } ] }, { type: 'html', align: 'right', html: '' }, { type: 'vbox', padding: 0, children: [ { type: 'text', id: 'txtCaption', requiredContent: 'caption', label: editor.lang.table.caption, setup: function( selectedTable ) { this.enable(); var nodeList = selectedTable.getElementsByTag( 'caption' ); if ( nodeList.count() > 0 ) { var caption = nodeList.getItem( 0 ); var firstElementChild = caption.getFirst( CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT ) ); if ( firstElementChild && !firstElementChild.equals( caption.getBogus() ) ) { this.disable(); this.setValue( caption.getText() ); return; } caption = CKEDITOR.tools.trim( caption.getText() ); this.setValue( caption ); } }, commit: function( data, table ) { if ( !this.isEnabled() ) return; var caption = this.getValue(), captionElement = table.getElementsByTag( 'caption' ); if ( caption ) { if ( captionElement.count() > 0 ) { captionElement = captionElement.getItem( 0 ); captionElement.setHtml( '' ); } else { captionElement = new CKEDITOR.dom.element( 'caption', editor.document ); table.append( captionElement, true ); } captionElement.append( new CKEDITOR.dom.text( caption, editor.document ) ); } else if ( captionElement.count() > 0 ) { for ( var i = captionElement.count() - 1; i >= 0; i-- ) captionElement.getItem( i ).remove(); } } }, { type: 'text', id: 'txtSummary', bidi: true, requiredContent: 'table[summary]', label: editor.lang.table.summary, setup: function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'summary' ) || '' ); }, commit: function( data, selectedTable ) { if ( this.getValue() ) selectedTable.setAttribute( 'summary', this.getValue() ); else selectedTable.removeAttribute( 'summary' ); } } ] } ] }, dialogadvtab && dialogadvtab.createAdvancedTab( editor, null, 'table' ) ] }; } CKEDITOR.dialog.add( 'table', function( editor ) { return tableDialog( editor, 'table' ); } ); CKEDITOR.dialog.add( 'tableProperties', function( editor ) { return tableDialog( editor, 'tableProperties' ); } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/icons/0000755000201500020150000000000014503523375022453 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/table/icons/table.png0000644000201500020150000000051314503523375024247 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->:IDAT8c`000&@iF4Ċ QbH@ddJ d'#%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/table/icons/hidpi/0000755000201500020150000000000014503523375023550 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/table/icons/hidpi/table.png0000644000201500020150000000115214503523375025344 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !nIDATXýVA!Z,ElJҬTQ V&"K\Ot ~fg?BDcZ27dM~O01K;|N>1cjyuMs'ӸA֯ƭY gTckI>#TUEm*zN#:r,_7<ـU.x=pb xrQY^66[{031w?T¤d.*Q>˱8@2JF׶ݣu(&a"ntB2$Z=Y nUcZ_{ [$i[DcS&y3HZ;|DU_㙽sA/>%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/ajax/0000755000201500020150000000000014515446705021200 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/ajax/plugin.js0000644000201500020150000001655214515446705023045 0ustar puckpuck/* global ActiveXObject */ /** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview Defines the {@link CKEDITOR.ajax} object, which stores Ajax methods for * data loading. */ ( function() { CKEDITOR.plugins.add( 'ajax', { requires: 'xml' } ); /** * Ajax methods for data loading. * * @class * @singleton */ CKEDITOR.ajax = ( function() { function createXMLHttpRequest() { // In IE, using the native XMLHttpRequest for local files may throw // "Access is Denied" errors. if ( !CKEDITOR.env.ie || location.protocol != 'file:' ) { try { return new XMLHttpRequest(); } catch ( e ) { } } try { return new ActiveXObject( 'Msxml2.XMLHTTP' ); } catch ( e ) {} try { return new ActiveXObject( 'Microsoft.XMLHTTP' ); } catch ( e ) {} return null; } function checkStatus( xhr ) { // HTTP Status Codes: // 2xx : Success // 304 : Not Modified // 0 : Returned when running locally (file://) // 1223 : IE may change 204 to 1223 (see http://dev.jquery.com/ticket/1450) return ( xhr.readyState == 4 && ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status === 0 || xhr.status == 1223 ) ); } function getResponse( xhr, type ) { if ( !checkStatus( xhr ) ) { return null; } switch ( type ) { case 'text': return xhr.responseText; case 'xml': var xml = xhr.responseXML; return new CKEDITOR.xml( xml && xml.firstChild ? xml : xhr.responseText ); case 'arraybuffer': return xhr.response; default: return null; } } function load( url, callback, responseType ) { var async = !!callback; var xhr = createXMLHttpRequest(); if ( !xhr ) return null; if ( async && responseType !== 'text' && responseType !== 'xml' ) { xhr.responseType = responseType; } xhr.open( 'GET', url, async ); if ( async ) { // TODO: perform leak checks on this closure. xhr.onreadystatechange = function() { if ( xhr.readyState == 4 ) { callback( getResponse( xhr, responseType ) ); xhr = null; } }; } xhr.send( null ); return async ? '' : getResponse( xhr, responseType ); } function post( url, data, contentType, callback, responseType ) { var xhr = createXMLHttpRequest(); if ( !xhr ) return null; xhr.open( 'POST', url, true ); xhr.onreadystatechange = function() { if ( xhr.readyState == 4 ) { if ( callback ) { callback( getResponse( xhr, responseType ) ); } xhr = null; } }; xhr.setRequestHeader( 'Content-type', contentType || 'application/x-www-form-urlencoded; charset=UTF-8' ); xhr.send( data ); } return { /** * Loads data from a given URL. * * // Load data synchronously. * var data = CKEDITOR.ajax.load( 'somedata.txt' ); * alert( data ); * * // Load data asynchronously. * var data = CKEDITOR.ajax.load( 'somedata.txt', function( data ) { * alert( data ); * } ); * * @param {String} url The URL from which the data is loaded. * @param {Function} [callback] A callback function to be called on * data load. If not provided, the data will be loaded synchronously. * @param {String} [responseType='text'] Defines type of returned data. * Currently supports: `text`, `xml`, `arraybuffer`. This parameter was introduced in `4.16.0`. * @returns {String/null} The loaded data for synchronous request. For asynchronous requests - * empty string. For invalid requests - `null`. */ load: function( url, callback, responseType ) { responseType = responseType || 'text'; return load( url, callback, responseType ); }, /** * Creates an asynchronous POST `XMLHttpRequest` of the given `url`, `data` and optional `contentType`. * Once the request is done, regardless if it is successful or not, the `callback` is called * with `XMLHttpRequest#responseText` or `null` as an argument. * * CKEDITOR.ajax.post( 'url/post.php', 'foo=bar', null, function( data ) { * console.log( data ); * } ); * * CKEDITOR.ajax.post( 'url/post.php', JSON.stringify( { foo: 'bar' } ), 'application/json', function( data ) { * console.log( data ); * } ); * * @since 4.4 * @param {String} url The URL of the request. * @param {String/Object/Array} data Data passed to `XMLHttpRequest#send`. * @param {String} [contentType='application/x-www-form-urlencoded; charset=UTF-8'] The value of the `Content-type` header. * @param {Function} [callback] A callback executed asynchronously with `XMLHttpRequest#responseText` or `null` as an argument, * depending on the `status` of the request. */ post: function( url, data, contentType, callback ) { return post( url, data, contentType, callback, 'text' ); }, /** * Loads data from a given URL as XML. * * // Load XML synchronously. * var xml = CKEDITOR.ajax.loadXml( 'somedata.xml' ); * alert( xml.getInnerXml( '//' ) ); * * // Load XML asynchronously. * var data = CKEDITOR.ajax.loadXml( 'somedata.xml', function( xml ) { * alert( xml.getInnerXml( '//' ) ); * } ); * * @param {String} url The URL from which the data is loaded. * @param {Function} [callback] A callback function to be called on * data load. If not provided, the data will be loaded synchronously. * @returns {CKEDITOR.xml} An XML object storing the loaded data for synchronous * request. For asynchronous requests - empty string. For invalid requests - `null`. */ loadXml: function( url, callback ) { return load( url, callback, 'xml' ); }, /** * Loads data from a given URL as text. * * // Load text synchronously. * var text = CKEDITOR.ajax.loadText( 'somedata.txt' ); * alert( text ); * * // Load text asynchronously. * var data = CKEDITOR.ajax.loadText( 'somedata.txt', function( textData ) { * alert( textData ); * } ); * * @param {String} url The URL from which the data is loaded. * @param {Function} [callback] A callback function to be called on * data load. If not provided, the data will be loaded synchronously. * @returns {String} String storing the loaded data for synchronous * request. For asynchronous requests - empty string. For invalid requests - `null`. */ loadText: function( url, callback ) { return load( url, callback, 'text' ); }, /** * Loads data from a given URL as binary data. * * // Load data synchronously. * var binaryData = CKEDITOR.ajax.loadBinary( 'somedata.png' ); * alert( binaryData ); * * // Load data asynchronously. * var data = CKEDITOR.ajax.loadBinary( 'somedata.png', function( binaryData ) { * alert( binaryData ); * } ); * * @param {String} url The URL from which the data is loaded. * @param {Function} [callback] A callback function to be called on * data load. If not provided, the data will be loaded synchronously. * @returns {ArrayBuffer} ArrayBuffer storing the loaded data for synchronous * request. For asynchronous requests - empty string. For invalid requests - `null`. */ loadBinary: function( url, callback ) { return load( url, callback, 'arraybuffer' ); } }; } )(); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/0000755000201500020150000000000014515446705021514 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/styles/0000755000201500020150000000000014503523375023033 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/styles/dialog.css0000644000201500020150000000034714503523375025010 0ustar puckpuck.cke_dialog_open { overflow: hidden; } .cke_dialog_container { position: fixed; overflow-y: auto; overflow-x: auto; width: 100%; height: 100%; top: 0; left: 0; z-index: 10010; } .cke_dialog_body { position: relative; } rt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/plugin.js0000644000201500020150000034531714515446705023365 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview The floating dialog plugin. */ /** * No resize for this dialog. * * @readonly * @property {Number} [=0] * @member CKEDITOR */ CKEDITOR.DIALOG_RESIZE_NONE = 0; /** * Only allow horizontal resizing for this dialog, disable vertical resizing. * * @readonly * @property {Number} [=1] * @member CKEDITOR */ CKEDITOR.DIALOG_RESIZE_WIDTH = 1; /** * Only allow vertical resizing for this dialog, disable horizontal resizing. * * @readonly * @property {Number} [=2] * @member CKEDITOR */ CKEDITOR.DIALOG_RESIZE_HEIGHT = 2; /** * Allow the dialog to be resized in both directions. * * @readonly * @property {Number} [=3] * @member CKEDITOR */ CKEDITOR.DIALOG_RESIZE_BOTH = 3; /** * Dialog state when idle. * * @readonly * @property {Number} [=1] * @member CKEDITOR */ CKEDITOR.DIALOG_STATE_IDLE = 1; /** * Dialog state when busy. * * @readonly * @property {Number} [=2] * @member CKEDITOR */ CKEDITOR.DIALOG_STATE_BUSY = 2; ( function() { 'use strict'; var cssLength = CKEDITOR.tools.cssLength, defaultDialogDefinition, currentCover, stylesLoaded = false; function focusActiveTab( dialog ) { dialog._.tabBarMode = true; dialog._.tabs[ dialog._.currentTabId ][ 0 ].focus(); dialog._.currentFocusIndex = -1; } function isTabVisible( tabId ) { return !!this._.tabs[ tabId ][ 0 ].$.offsetHeight; } function getPreviousVisibleTab() { var tabId = this._.currentTabId, length = this._.tabIdList.length, tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ) + length; for ( var i = tabIndex - 1; i > tabIndex - length; i-- ) { if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) ) return this._.tabIdList[ i % length ]; } return null; } function getNextVisibleTab() { var tabId = this._.currentTabId, length = this._.tabIdList.length, tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ); for ( var i = tabIndex + 1; i < tabIndex + length; i++ ) { if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) ) return this._.tabIdList[ i % length ]; } return null; } function clearOrRecoverTextInputValue( container, isRecover ) { var inputs = container.$.getElementsByTagName( 'input' ); for ( var i = 0, length = inputs.length; i < length; i++ ) { var item = new CKEDITOR.dom.element( inputs[ i ] ); if ( item.getAttribute( 'type' ).toLowerCase() == 'text' ) { if ( isRecover ) { item.setAttribute( 'value', item.getCustomData( 'fake_value' ) || '' ); item.removeCustomData( 'fake_value' ); } else { item.setCustomData( 'fake_value', item.getAttribute( 'value' ) ); item.setAttribute( 'value', '' ); } } } } // Handle dialog element validation state UI changes. function handleFieldValidated( isValid, msg ) { var input = this.getInputElement(); if ( input ) isValid ? input.removeAttribute( 'aria-invalid' ) : input.setAttribute( 'aria-invalid', true ); if ( !isValid ) { if ( this.select ) this.select(); else this.focus(); } msg && alert( msg ); // jshint ignore:line this.fire( 'validated', { valid: isValid, msg: msg } ); } function resetField() { var input = this.getInputElement(); input && input.removeAttribute( 'aria-invalid' ); } var useFlex = !CKEDITOR.env.ie || CKEDITOR.env.edge, templateSource = ''; function buildDialog( editor ) { var element = CKEDITOR.dom.element.createFromHtml( CKEDITOR.addTemplate( 'dialog', templateSource ).output( { id: CKEDITOR.tools.getNextNumber(), editorId: editor.id, langDir: editor.lang.dir, langCode: editor.langCode, editorDialogClass: 'cke_editor_' + editor.name.replace( /\./g, '\\.' ) + '_dialog', closeTitle: editor.lang.common.close, hidpi: CKEDITOR.env.hidpi ? 'cke_hidpi' : '' } ) ); // TODO: Change this to getById(), so it'll support custom templates. var body = element.getChild( [ 0, 0, 0, 0, 0 ] ), title = body.getChild( 0 ), close = body.getChild( 1 ); // Don't allow dragging on dialog (https://dev.ckeditor.com/ticket/13184). editor.plugins.clipboard && CKEDITOR.plugins.clipboard.preventDefaultDropOnElement( body ); // IFrame shim for dialog that masks activeX in IE. (https://dev.ckeditor.com/ticket/7619) if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks && !CKEDITOR.env.edge ) { var src = 'javascript:void(function(){' + encodeURIComponent( 'document.open();(' + CKEDITOR.tools.fixDomain + ')();document.close();' ) + '}())', // jshint ignore:line iframe = CKEDITOR.dom.element.createFromHtml( '' ); iframe.appendTo( body.getParent() ); } // Make the Title and Close Button unselectable. title.unselectable(); close.unselectable(); return { element: element, parts: { dialog: element.getChild( 0 ), title: title, close: close, tabs: body.getChild( 2 ), contents: body.getChild( [ 3, 0, 0, 0 ] ), footer: body.getChild( [ 3, 0, 1, 0 ] ) } }; } /** * This is the base class for runtime dialog objects. An instance of this * class represents a single named dialog for a single editor instance. * * var dialogObj = new CKEDITOR.dialog( editor, 'smiley' ); * * @class * @constructor Creates a dialog class instance. * @param {Object} editor The editor which created the dialog. * @param {String} dialogName The dialog's registered name. */ CKEDITOR.dialog = function( editor, dialogName ) { // Load the dialog definition. var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ], defaultDefinition = CKEDITOR.tools.clone( defaultDialogDefinition ), buttonsOrder = editor.config.dialog_buttonsOrder || 'OS', dir = editor.lang.dir, tabsToRemove = {}, i, processed, stopPropagation; if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) || // The buttons in MacOS Apps are in reverse order (https://dev.ckeditor.com/ticket/4750) ( buttonsOrder == 'rtl' && dir == 'ltr' ) || ( buttonsOrder == 'ltr' && dir == 'rtl' ) ) defaultDefinition.buttons.reverse(); // Completes the definition with the default values. definition = CKEDITOR.tools.extend( definition( editor ), defaultDefinition ); // Clone a functionally independent copy for this dialog. definition = CKEDITOR.tools.clone( definition ); // Create a complex definition object, extending it with the API // functions. definition = new definitionObject( this, definition ); var themeBuilt = buildDialog( editor ); // Initialize some basic parameters. this._ = { editor: editor, element: themeBuilt.element, name: dialogName, model: null, contentSize: { width: 0, height: 0 }, size: { width: 0, height: 0 }, contents: {}, buttons: {}, accessKeyMap: {}, // Default value is 0.5 which means a centered dialog. viewportRatio: { width: 0.5, height: 0.5 }, // Initialize the tab and page map. tabs: {}, tabIdList: [], currentTabId: null, currentTabIndex: null, pageCount: 0, lastTab: null, tabBarMode: false, // Initialize the tab order array for input widgets. focusList: [], currentFocusIndex: 0, hasFocus: false }; this.parts = themeBuilt.parts; CKEDITOR.tools.setTimeout( function() { editor.fire( 'ariaWidget', this.parts.contents ); }, 0, this ); // Set the startup styles for the dialog, avoiding it enlarging the // page size on the dialog creation. var startStyles = { top: 0, visibility: 'hidden' }; if ( CKEDITOR.env.ie6Compat ) { startStyles.position = 'absolute'; } startStyles[ dir == 'rtl' ? 'right' : 'left' ] = 0; this.parts.dialog.setStyles( startStyles ); // Call the CKEDITOR.event constructor to initialize this instance. CKEDITOR.event.call( this ); // Fire the "dialogDefinition" event, making it possible to customize // the dialog definition. this.definition = definition = CKEDITOR.fire( 'dialogDefinition', { name: dialogName, definition: definition, dialog: this }, editor ).definition; // Cache tabs that should be removed. if ( !( 'removeDialogTabs' in editor._ ) && editor.config.removeDialogTabs ) { var removeContents = editor.config.removeDialogTabs.split( ';' ); for ( i = 0; i < removeContents.length; i++ ) { var parts = removeContents[ i ].split( ':' ); if ( parts.length == 2 ) { var removeDialogName = parts[ 0 ]; if ( !tabsToRemove[ removeDialogName ] ) tabsToRemove[ removeDialogName ] = []; tabsToRemove[ removeDialogName ].push( parts[ 1 ] ); } } editor._.removeDialogTabs = tabsToRemove; } // Remove tabs of this dialog. if ( editor._.removeDialogTabs && ( tabsToRemove = editor._.removeDialogTabs[ dialogName ] ) ) { for ( i = 0; i < tabsToRemove.length; i++ ) definition.removeContents( tabsToRemove[ i ] ); } // Initialize load, show, hide, ok and cancel events. if ( definition.onLoad ) this.on( 'load', definition.onLoad ); if ( definition.onShow ) this.on( 'show', definition.onShow ); if ( definition.onHide ) this.on( 'hide', definition.onHide ); if ( definition.onOk ) { this.on( 'ok', function( evt ) { // Dialog confirm might probably introduce content changes (https://dev.ckeditor.com/ticket/5415). editor.fire( 'saveSnapshot' ); setTimeout( function() { editor.fire( 'saveSnapshot' ); }, 0 ); if ( definition.onOk.call( this, evt ) === false ) evt.data.hide = false; } ); } // Set default dialog state. this.state = CKEDITOR.DIALOG_STATE_IDLE; if ( definition.onCancel ) { this.on( 'cancel', function( evt ) { if ( definition.onCancel.call( this, evt ) === false ) evt.data.hide = false; } ); } var me = this; // Iterates over all items inside all content in the dialog, calling a // function for each of them. var iterContents = function( func ) { var contents = me._.contents, stop = false; for ( var i in contents ) { for ( var j in contents[ i ] ) { stop = func.call( this, contents[ i ][ j ] ); if ( stop ) return; } } }; this.on( 'ok', function( evt ) { iterContents( function( item ) { if ( item.validate ) { var retval = item.validate( this ), invalid = ( typeof retval == 'string' ) || retval === false; if ( invalid ) { evt.data.hide = false; evt.stop(); } handleFieldValidated.call( item, !invalid, typeof retval == 'string' ? retval : undefined ); return invalid; } } ); }, this, null, 0 ); this.on( 'cancel', function( evt ) { iterContents( function( item ) { if ( item.isChanged() ) { if ( !editor.config.dialog_noConfirmCancel && !confirm( editor.lang.common.confirmCancel ) ) // jshint ignore:line evt.data.hide = false; return true; } } ); }, this, null, 0 ); this.parts.close.on( 'click', function( evt ) { if ( this.fire( 'cancel', { hide: true } ).hide !== false ) this.hide(); evt.data.preventDefault(); }, this ); // Sort focus list according to tab order definitions. function setupFocus() { var focusList = me._.focusList; focusList.sort( function( a, b ) { // Mimics browser tab order logics; if ( a.tabIndex != b.tabIndex ) return b.tabIndex - a.tabIndex; // Sort is not stable in some browsers, // fall-back the comparator to 'focusIndex'; else return a.focusIndex - b.focusIndex; } ); var size = focusList.length; for ( var i = 0; i < size; i++ ) focusList[ i ].focusIndex = i; } // Expects 1 or -1 as an offset, meaning direction of the offset change. function changeFocus( offset ) { var focusList = me._.focusList; offset = offset || 0; if ( focusList.length < 1 ) return; var startIndex = me._.currentFocusIndex; if ( me._.tabBarMode && offset < 0 ) { // If we are in tab mode, we need to mimic that we started tabbing back from the first // focusList (so it will go to the last one). startIndex = 0; } // Trigger the 'blur' event of any input element before anything, // since certain UI updates may depend on it. try { focusList[ startIndex ].getInputElement().$.blur(); } catch ( e ) {} var currentIndex = startIndex, hasTabs = me._.pageCount > 1; do { currentIndex = currentIndex + offset; if ( hasTabs && !me._.tabBarMode && ( currentIndex == focusList.length || currentIndex == -1 ) ) { // If the dialog was not in tab mode, then focus the first tab (https://dev.ckeditor.com/ticket/13027). me._.tabBarMode = true; me._.tabs[ me._.currentTabId ][ 0 ].focus(); me._.currentFocusIndex = -1; // Early return, in order to avoid accessing focusList[ -1 ]. return; } currentIndex = ( currentIndex + focusList.length ) % focusList.length; if ( currentIndex == startIndex ) { break; } } while ( offset && !focusList[ currentIndex ].isFocusable() ); focusList[ currentIndex ].focus(); // Select whole field content. if ( focusList[ currentIndex ].type == 'text' ) focusList[ currentIndex ].select(); } this.changeFocus = changeFocus; function keydownHandler( evt ) { // If I'm not the top dialog, ignore. if ( me != CKEDITOR.dialog._.currentTop ) return; var keystroke = evt.data.getKeystroke(), rtl = editor.lang.dir == 'rtl', arrowKeys = [ 37, 38, 39, 40 ], button; processed = stopPropagation = 0; if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 ) { var shiftPressed = ( keystroke == CKEDITOR.SHIFT + 9 ); changeFocus( shiftPressed ? -1 : 1 ); processed = 1; } else if ( keystroke == CKEDITOR.ALT + 121 && !me._.tabBarMode && me.getPageCount() > 1 ) { // Alt-F10 puts focus into the current tab item in the tab bar. focusActiveTab( me ); processed = 1; } else if ( CKEDITOR.tools.indexOf( arrowKeys, keystroke ) != -1 && me._.tabBarMode ) { // Array with key codes that activate previous tab. var prevKeyCodes = [ // Depending on the lang dir: right or left key rtl ? 39 : 37, // Top/bot arrow: actually for both cases it's the same. 38 ], nextId = CKEDITOR.tools.indexOf( prevKeyCodes, keystroke ) != -1 ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me ); me.selectPage( nextId ); me._.tabs[ nextId ][ 0 ].focus(); processed = 1; } else if ( ( keystroke == 13 || keystroke == 32 ) && me._.tabBarMode ) { this.selectPage( this._.currentTabId ); this._.tabBarMode = false; this._.currentFocusIndex = -1; changeFocus( 1 ); processed = 1; } // If user presses enter key in a text box, it implies clicking OK for the dialog. else if ( keystroke == 13 /*ENTER*/ ) { // Don't do that for a target that handles ENTER. var target = evt.data.getTarget(); if ( !target.is( 'a', 'button', 'select', 'textarea' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) ) { button = this.getButton( 'ok' ); button && CKEDITOR.tools.setTimeout( button.click, 0, button ); processed = 1; } stopPropagation = 1; // Always block the propagation (https://dev.ckeditor.com/ticket/4269) } else if ( keystroke == 27 /*ESC*/ ) { button = this.getButton( 'cancel' ); // If there's a Cancel button, click it, else just fire the cancel event and hide the dialog. if ( button ) CKEDITOR.tools.setTimeout( button.click, 0, button ); else { if ( this.fire( 'cancel', { hide: true } ).hide !== false ) this.hide(); } stopPropagation = 1; // Always block the propagation (https://dev.ckeditor.com/ticket/4269) } else { return; } keypressHandler( evt ); } function keypressHandler( evt ) { if ( processed ) evt.data.preventDefault( 1 ); else if ( stopPropagation ) evt.data.stopPropagation(); } var dialogElement = this._.element; editor.focusManager.add( dialogElement, 1 ); // Add the dialog keyboard handlers. this.on( 'show', function() { dialogElement.on( 'keydown', keydownHandler, this ); // Some browsers instead, don't cancel key events in the keydown, but in the // keypress. So we must do a longer trip in those cases. (https://dev.ckeditor.com/ticket/4531,https://dev.ckeditor.com/ticket/8985) if ( CKEDITOR.env.gecko ) dialogElement.on( 'keypress', keypressHandler, this ); } ); this.on( 'hide', function() { dialogElement.removeListener( 'keydown', keydownHandler ); if ( CKEDITOR.env.gecko ) dialogElement.removeListener( 'keypress', keypressHandler ); // Reset fields state when closing dialog. iterContents( function( item ) { resetField.apply( item ); } ); } ); this.on( 'iframeAdded', function( evt ) { var doc = new CKEDITOR.dom.document( evt.data.iframe.$.contentWindow.document ); doc.on( 'keydown', keydownHandler, this, null, 0 ); } ); // Auto-focus logic in dialog. this.on( 'show', function() { // Setup tabIndex on showing the dialog instead of on loading // to allow dynamic tab order happen in dialog definition. setupFocus(); var hasTabs = me._.pageCount > 1; if ( editor.config.dialog_startupFocusTab && hasTabs ) { me._.tabBarMode = true; me._.tabs[ me._.currentTabId ][ 0 ].focus(); me._.currentFocusIndex = -1; } else if ( !this._.hasFocus ) { // https://dev.ckeditor.com/ticket/13114#comment:4. this._.currentFocusIndex = hasTabs ? -1 : this._.focusList.length - 1; // Decide where to put the initial focus. if ( definition.onFocus ) { var initialFocus = definition.onFocus.call( this ); // Focus the field that the user specified. initialFocus && initialFocus.focus(); } // Focus the first field in layout order. else { changeFocus( 1 ); } } }, this, null, 0xffffffff ); // IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (https://dev.ckeditor.com/ticket/2661). // This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken. if ( CKEDITOR.env.ie6Compat ) { this.on( 'load', function() { var outer = this.getElement(), inner = outer.getFirst(); inner.remove(); inner.appendTo( outer ); }, this ); } initDragAndDrop( this ); initResizeHandles( this ); // Insert the title. ( new CKEDITOR.dom.text( definition.title, CKEDITOR.document ) ).appendTo( this.parts.title ); // Insert the tabs and contents. for ( i = 0; i < definition.contents.length; i++ ) { var page = definition.contents[ i ]; page && this.addPage( page ); } this.parts.tabs.on( 'click', function( evt ) { var target = evt.data.getTarget(); // If we aren't inside a tab, bail out. if ( target.hasClass( 'cke_dialog_tab' ) ) { // Get the ID of the tab, without the 'cke_' prefix and the unique number suffix. var id = target.$.id; this.selectPage( id.substring( 4, id.lastIndexOf( '_' ) ) ); focusActiveTab( this ); evt.data.preventDefault(); } }, this ); // Insert buttons. var buttonsHtml = [], buttons = CKEDITOR.dialog._.uiElementBuilders.hbox.build( this, { type: 'hbox', className: 'cke_dialog_footer_buttons', widths: [], children: definition.buttons }, buttonsHtml ).getChild(); this.parts.footer.setHtml( buttonsHtml.join( '' ) ); for ( i = 0; i < buttons.length; i++ ) this._.buttons[ buttons[ i ].id ] = buttons[ i ]; /** * Current state of the dialog. Use the {@link #setState} method to update it. * See the {@link #event-state} event to know more. * * @readonly * @property {Number} [state=CKEDITOR.DIALOG_STATE_IDLE] */ }; // Focusable interface. Use it via dialog.addFocusable. function Focusable( dialog, element, index ) { this.element = element; this.focusIndex = index; // TODO: support tabIndex for focusables. this.tabIndex = 0; this.isFocusable = function() { return !element.getAttribute( 'disabled' ) && element.isVisible(); }; this.focus = function() { dialog._.currentFocusIndex = this.focusIndex; this.element.focus(); }; // Bind events element.on( 'keydown', function( e ) { if ( e.data.getKeystroke() in { 32: 1, 13: 1 } ) this.fire( 'click' ); } ); element.on( 'focus', function() { this.fire( 'mouseover' ); } ); element.on( 'blur', function() { this.fire( 'mouseout' ); } ); } // Re-layout the dialog on window resize. function resizeWithWindow( dialog ) { var win = CKEDITOR.document.getWindow(); function resizeHandler() { dialog.layout(); } win.on( 'resize', resizeHandler ); dialog.on( 'hide', function() { win.removeListener( 'resize', resizeHandler ); } ); } CKEDITOR.dialog.prototype = { destroy: function() { this.hide(); this._.element.remove(); }, /** * Resizes the dialog. * * dialogObj.resize( 800, 640 ); * * @method * @param {Number} width The width of the dialog in pixels. * @param {Number} height The height of the dialog in pixels. */ resize: function( width, height ) { if ( this._.contentSize && this._.contentSize.width == width && this._.contentSize.height == height ) return; CKEDITOR.dialog.fire( 'resize', { dialog: this, width: width, height: height }, this._.editor ); this.fire( 'resize', { width: width, height: height }, this._.editor ); var contents = this.parts.contents; contents.setStyles( { width: width + 'px', height: height + 'px' } ); // Update dialog position when dimension get changed in RTL. if ( this._.editor.lang.dir == 'rtl' && this._.position ) { var containerWidth = this.parts.dialog.getParent().getClientSize().width; this._.position.x = containerWidth - this._.contentSize.width - parseInt( this._.element.getFirst().getStyle( 'right' ), 10 ); } this._.contentSize = { width: width, height: height }; }, /** * Gets the current size of the dialog in pixels. * * var width = dialogObj.getSize().width; * * @returns {Object} * @returns {Number} return.width * @returns {Number} return.height */ getSize: function() { var element = this._.element.getFirst(); return { width: element.$.offsetWidth || 0, height: element.$.offsetHeight || 0 }; }, /** * Moves the dialog to an `(x, y)` coordinate relative to the window. * * dialogObj.move( 10, 40 ); * * @method * @param {Number} x The target x-coordinate. * @param {Number} y The target y-coordinate. * @param {Boolean} save Flag indicate whether the dialog position should be remembered on next open up. */ move: function( x, y, save ) { var element = this._.element.getFirst(), rtl = this._.editor.lang.dir == 'rtl'; // (https://dev.ckeditor.com/ticket/8888) In some cases of a very small viewport, dialog is incorrectly // positioned in IE7. It also happens that it remains sticky and user cannot // scroll down/up to reveal dialog's content below/above the viewport; this is // cumbersome. // The only way to fix this is to move mouse out of the browser and // go back to see that dialog position is automagically fixed. No events, // no style change - pure magic. This is a IE7 rendering issue, which can be // fixed with dummy style redraw on each move. if ( CKEDITOR.env.ie ) { element.setStyle( 'zoom', '100%' ); } var containerSize = this.parts.dialog.getParent().getClientSize(), dialogSize = this.getSize(), ratios = this._.viewportRatio, freeSpace = { width: Math.max( containerSize.width - dialogSize.width, 0 ), height: Math.max( containerSize.height - dialogSize.height, 0 ) }; if ( this._.position && this._.position.x == x && this._.position.y == y ) { // If position didn't change window might have been resized. x = Math.floor( freeSpace.width * ratios.width ); y = Math.floor( freeSpace.height * ratios.height ); } else { updateRatios( this, x, y ); } // Save the current position. this._.position = { x: x, y: y }; // Translate coordinate for RTL. if ( rtl ) { x = freeSpace.width - x; } var styles = { 'top': ( y > 0 ? y : 0 ) + 'px' }; styles[ rtl ? 'right' : 'left' ] = ( x > 0 ? x : 0 ) + 'px'; element.setStyles( styles ); save && ( this._.moved = 1 ); }, /** * Gets the dialog's position in the window. * * var dialogX = dialogObj.getPosition().x; * * @returns {Object} * @returns {Number} return.x * @returns {Number} return.y */ getPosition: function() { return CKEDITOR.tools.extend( {}, this._.position ); }, /** * Shows the dialog box. * * dialogObj.show(); */ show: function() { // Insert the dialog's element to the root document. var element = this._.element, definition = this.definition, documentBody = CKEDITOR.document.getBody(), baseFloatZIndex = this._.editor.config.baseFloatZIndex; if ( !( element.getParent() && element.getParent().equals( documentBody ) ) ) { element.appendTo( documentBody ); } else { element.setStyle( 'display', useFlex ? 'flex' : 'block' ); } // First, set the dialog to an appropriate size. this.resize( this._.contentSize && this._.contentSize.width || definition.width || definition.minWidth, this._.contentSize && this._.contentSize.height || definition.height || definition.minHeight ); // Reset all inputs back to their default value. this.reset(); // Selects the first tab if no tab is already selected. if ( this._.currentTabId === null ) { this.selectPage( this.definition.contents[ 0 ].id ); } // Set z-index to dialog and container (#3559). if ( CKEDITOR.dialog._.currentZIndex === null ) { CKEDITOR.dialog._.currentZIndex = baseFloatZIndex; } this._.element.getFirst().setStyle( 'z-index', CKEDITOR.dialog._.currentZIndex += 10 ); this.getElement().setStyle( 'z-index', CKEDITOR.dialog._.currentZIndex ); // Maintain the dialog ordering and dialog cover. if ( CKEDITOR.dialog._.currentTop === null ) { CKEDITOR.dialog._.currentTop = this; this._.parentDialog = null; showCover( this._.editor ); } else if ( CKEDITOR.dialog._.currentTop !== this ) { // Reposition the new dialog only if the current dialog is not already on the top (#3638). this._.parentDialog = CKEDITOR.dialog._.currentTop; var parentElement = this._.parentDialog.getElement().getFirst(); parentElement.$.style.zIndex -= Math.floor( baseFloatZIndex / 2 ); this._.parentDialog.getElement().setStyle( 'z-index', parentElement.$.style.zIndex ); CKEDITOR.dialog._.currentTop = this; } element.on( 'keydown', accessKeyDownHandler ); element.on( 'keyup', accessKeyUpHandler ); // Reset the hasFocus state. this._.hasFocus = false; for ( var i in definition.contents ) { if ( !definition.contents[ i ] ) { continue; } var content = definition.contents[ i ], tab = this._.tabs[ content.id ], requiredContent = content.requiredContent, enableElements = 0; if ( !tab ) { continue; } for ( var j in this._.contents[ content.id ] ) { var elem = this._.contents[ content.id ][ j ]; if ( elem.type == 'hbox' || elem.type == 'vbox' || !elem.getInputElement() ) { continue; } if ( elem.requiredContent && !this._.editor.activeFilter.check( elem.requiredContent ) ) { elem.disable(); } else { elem.enable(); enableElements++; } } if ( !enableElements || ( requiredContent && !this._.editor.activeFilter.check( requiredContent ) ) ) { tab[ 0 ].addClass( 'cke_dialog_tab_disabled' ); } else { tab[ 0 ].removeClass( 'cke_dialog_tab_disabled' ); } } CKEDITOR.tools.setTimeout( function() { this.layout(); resizeWithWindow( this ); this.parts.dialog.setStyle( 'visibility', '' ); // Execute onLoad for the first show. this.fireOnce( 'load', {} ); CKEDITOR.ui.fire( 'ready', this ); this.fire( 'show', {} ); this._.editor.fire( 'dialogShow', this ); if ( !this._.parentDialog ) { this._.editor.focusManager.lock(); } // Save the initial values of the dialog. this.foreach( function( contentObj ) { contentObj.setInitValue && contentObj.setInitValue(); } ); }, 100, this ); }, /** * Rearrange the dialog to its previous position or the middle of the window. * * @since 3.5.0 */ layout: function() { var el = this.parts.dialog; if ( !this._.moved && useFlex ) { return; } var dialogSize = this.getSize(), win = CKEDITOR.document.getWindow(), viewSize = win.getViewPaneSize(), posX, posY; if ( this._.moved && this._.position ) { posX = this._.position.x; posY = this._.position.y; } else { posX = ( viewSize.width - dialogSize.width ) / 2; posY = ( viewSize.height - dialogSize.height ) / 2; } if ( !CKEDITOR.env.ie6Compat ) { el.setStyle( 'position', 'absolute' ); el.removeStyle( 'margin' ); } posX = Math.floor( posX ); posY = Math.floor( posY ); this.move( posX, posY ); }, /** * Executes a function for each UI element. * * @param {Function} fn Function to execute for each UI element. * @returns {CKEDITOR.dialog} The current dialog object. */ foreach: function( fn ) { for ( var i in this._.contents ) { for ( var j in this._.contents[ i ] ) { fn.call( this, this._.contents[ i ][ j ] ); } } return this; }, /** * Resets all input values in the dialog. * * dialogObj.reset(); * * @method * @chainable */ reset: ( function() { var fn = function( widget ) { if ( widget.reset ) widget.reset( 1 ); }; return function() { this.foreach( fn ); return this; }; } )(), /** * Calls the {@link CKEDITOR.dialog.definition.uiElement#setup} method of each * of the UI elements, with the arguments passed through it. * It is usually being called when the dialog is opened, to put the initial value inside the field. * * dialogObj.setupContent(); * * var timestamp = ( new Date() ).valueOf(); * dialogObj.setupContent( timestamp ); */ setupContent: function() { var args = arguments; this.foreach( function( widget ) { if ( widget.setup ) widget.setup.apply( widget, args ); } ); }, /** * Calls the {@link CKEDITOR.dialog.definition.uiElement#commit} method of each * of the UI elements, with the arguments passed through it. * It is usually being called when the user confirms the dialog, to process the values. * * dialogObj.commitContent(); * * var timestamp = ( new Date() ).valueOf(); * dialogObj.commitContent( timestamp ); */ commitContent: function() { var args = arguments; this.foreach( function( widget ) { // Make sure IE triggers "change" event on last focused input before closing the dialog. (https://dev.ckeditor.com/ticket/7915) if ( CKEDITOR.env.ie && this._.currentFocusIndex == widget.focusIndex ) widget.getInputElement().$.blur(); if ( widget.commit ) widget.commit.apply( widget, args ); } ); }, /** * Hides the dialog box. * * dialogObj.hide(); */ hide: function() { if ( !this.parts.dialog.isVisible() ) { return; } this.fire( 'hide', {} ); this._.editor.fire( 'dialogHide', this ); // Reset the tab page. this.selectPage( this._.tabIdList[ 0 ] ); var element = this._.element; element.setStyle( 'display', 'none' ); this.parts.dialog.setStyle( 'visibility', 'hidden' ); // Unregister all access keys associated with this dialog. unregisterAccessKey( this ); // Close any child(top) dialogs first. while ( CKEDITOR.dialog._.currentTop != this ) { CKEDITOR.dialog._.currentTop.hide(); } // Maintain dialog ordering and remove cover if needed. if ( !this._.parentDialog ) { hideCover( this._.editor ); } else { var parentElement = this._.parentDialog.getElement().getFirst(), newZIndex = parseInt( parentElement.$.style.zIndex, 10 ) + Math.floor( this._.editor.config.baseFloatZIndex / 2 ); this._.parentDialog.getElement().setStyle( 'z-index', newZIndex ); parentElement.setStyle( 'z-index', newZIndex ); } CKEDITOR.dialog._.currentTop = this._.parentDialog; // Deduct or clear the z-index. if ( !this._.parentDialog ) { CKEDITOR.dialog._.currentZIndex = null; // Remove access key handlers. element.removeListener( 'keydown', accessKeyDownHandler ); element.removeListener( 'keyup', accessKeyUpHandler ); var editor = this._.editor; editor.focus(); // Give a while before unlock, waiting for focus to return to the editable. (https://dev.ckeditor.com/ticket/172) setTimeout( function() { editor.focusManager.unlock(); // Fixed iOS focus issue (https://dev.ckeditor.com/ticket/12381). // Keep in mind that editor.focus() does not work in this case. if ( CKEDITOR.env.iOS ) { editor.window.focus(); } }, 0 ); } else { CKEDITOR.dialog._.currentZIndex -= 10; } delete this._.parentDialog; // Reset the initial values of the dialog. this.foreach( function( contentObj ) { contentObj.resetInitValue && contentObj.resetInitValue(); } ); // Reset dialog state back to IDLE, if busy (https://dev.ckeditor.com/ticket/13213). this.setState( CKEDITOR.DIALOG_STATE_IDLE ); }, /** * Adds a tabbed page into the dialog. * * @param {Object} contents Content definition. */ addPage: function( contents ) { if ( contents.requiredContent && !this._.editor.filter.check( contents.requiredContent ) ) { return; } var pageHtml = [], titleHtml = contents.label ? ' title="' + CKEDITOR.tools.htmlEncode( contents.label ) + '"' : '', vbox = CKEDITOR.dialog._.uiElementBuilders.vbox.build( this, { type: 'vbox', className: 'cke_dialog_page_contents', children: contents.elements, expand: !!contents.expand, padding: contents.padding, style: contents.style || 'width: 100%;' }, pageHtml ), contentMap = this._.contents[ contents.id ] = {}, cursor, children = vbox.getChild(), enabledFields = 0; while ( ( cursor = children.shift() ) ) { // Count all allowed fields. if ( !cursor.notAllowed && cursor.type != 'hbox' && cursor.type != 'vbox' ) { enabledFields++; } contentMap[ cursor.id ] = cursor; if ( typeof cursor.getChild == 'function' ) { children.push.apply( children, cursor.getChild() ); } } // If all fields are disabled (because they are not allowed) hide this tab. if ( !enabledFields ) { contents.hidden = true; } // Create the HTML for the tab and the content block. var page = CKEDITOR.dom.element.createFromHtml( pageHtml.join( '' ) ); page.setAttribute( 'role', 'tabpanel' ); page.setStyle( 'min-height', '100%' ); var env = CKEDITOR.env, tabId = 'cke_' + contents.id + '_' + CKEDITOR.tools.getNextNumber(), tab = CKEDITOR.dom.element.createFromHtml( [ ' 0 ? ' cke_last' : 'cke_first' ), titleHtml, ( !!contents.hidden ? ' style="display:none"' : '' ), ' id="', tabId, '"', env.gecko && !env.hc ? '' : ' href="javascript:void(0)"', ' tabIndex="-1"', ' hidefocus="true"', ' role="tab">', contents.label, '' ].join( '' ) ); page.setAttribute( 'aria-labelledby', tabId ); // Take records for the tabs and elements created. this._.tabs[ contents.id ] = [ tab, page ]; this._.tabIdList.push( contents.id ); !contents.hidden && this._.pageCount++; this._.lastTab = tab; this.updateStyle(); // Attach the DOM nodes. page.setAttribute( 'name', contents.id ); page.appendTo( this.parts.contents ); tab.unselectable(); this.parts.tabs.append( tab ); // Add access key handlers if access key is defined. if ( contents.accessKey ) { registerAccessKey( this, this, 'CTRL+' + contents.accessKey, tabAccessKeyDown, tabAccessKeyUp ); this._.accessKeyMap[ 'CTRL+' + contents.accessKey ] = contents.id; } }, /** * Activates a tab page in the dialog by its id. * * dialogObj.selectPage( 'tab_1' ); * * @param {String} id The id of the dialog tab to be activated. */ selectPage: function( id ) { if ( this._.currentTabId == id ) return; if ( this._.tabs[ id ][ 0 ].hasClass( 'cke_dialog_tab_disabled' ) ) return; // If event was canceled - do nothing. if ( this.fire( 'selectPage', { page: id, currentPage: this._.currentTabId } ) === false ) return; // Hide the non-selected tabs and pages. for ( var i in this._.tabs ) { var tab = this._.tabs[ i ][ 0 ], page = this._.tabs[ i ][ 1 ]; if ( i != id ) { tab.removeClass( 'cke_dialog_tab_selected' ); tab.removeAttribute( 'aria-selected' ); page.hide(); } page.setAttribute( 'aria-hidden', i != id ); } var selected = this._.tabs[ id ]; selected[ 0 ].addClass( 'cke_dialog_tab_selected' ); selected[ 0 ].setAttribute( 'aria-selected', true ); // [IE] an invisible input[type='text'] will enlarge it's width // if it's value is long when it shows, so we clear it's value // before it shows and then recover it (https://dev.ckeditor.com/ticket/5649) if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat ) { clearOrRecoverTextInputValue( selected[ 1 ] ); selected[ 1 ].show(); setTimeout( function() { clearOrRecoverTextInputValue( selected[ 1 ], 1 ); }, 0 ); } else { selected[ 1 ].show(); } this._.currentTabId = id; this._.currentTabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, id ); }, /** * Dialog state-specific style updates. */ updateStyle: function() { // If only a single page shown, a different style is used in the central pane. this.parts.dialog[ ( this._.pageCount === 1 ? 'add' : 'remove' ) + 'Class' ]( 'cke_single_page' ); }, /** * Hides a page's tab away from the dialog. * * dialog.hidePage( 'tab_3' ); * * @param {String} id The page's Id. */ hidePage: function( id ) { var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ]; if ( !tab || this._.pageCount == 1 || !tab.isVisible() ) return; // Switch to other tab first when we're hiding the active tab. else if ( id == this._.currentTabId ) this.selectPage( getPreviousVisibleTab.call( this ) ); tab.hide(); this._.pageCount--; this.updateStyle(); }, /** * Unhides a page's tab. * * dialog.showPage( 'tab_2' ); * * @param {String} id The page's Id. */ showPage: function( id ) { var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ]; if ( !tab ) return; tab.show(); this._.pageCount++; this.updateStyle(); }, /** * Gets the root DOM element of the dialog. * * var dialogElement = dialogObj.getElement().getFirst(); * dialogElement.setStyle( 'padding', '5px' ); * * @returns {CKEDITOR.dom.element} The `` element containing this dialog. */ getElement: function() { return this._.element; }, /** * Gets the name of the dialog. * * var dialogName = dialogObj.getName(); * * @returns {String} The name of this dialog. */ getName: function() { return this._.name; }, /** * Gets a dialog UI element object from a dialog page. * * dialogObj.getContentElement( 'tabId', 'elementId' ).setValue( 'Example' ); * * @param {String} pageId id of dialog page. * @param {String} elementId id of UI element. * @returns {CKEDITOR.ui.dialog.uiElement} The dialog UI element. */ getContentElement: function( pageId, elementId ) { var page = this._.contents[ pageId ]; return page && page[ elementId ]; }, /** * Gets the value of a dialog UI element. * * alert( dialogObj.getValueOf( 'tabId', 'elementId' ) ); * * @param {String} pageId id of dialog page. * @param {String} elementId id of UI element. * @returns {Object} The value of the UI element. */ getValueOf: function( pageId, elementId ) { return this.getContentElement( pageId, elementId ).getValue(); }, /** * Sets the value of a dialog UI element. * * dialogObj.setValueOf( 'tabId', 'elementId', 'Example' ); * * @param {String} pageId id of the dialog page. * @param {String} elementId id of the UI element. * @param {Object} value The new value of the UI element. */ setValueOf: function( pageId, elementId, value ) { return this.getContentElement( pageId, elementId ).setValue( value ); }, /** * Gets the UI element of a button in the dialog's button row. * * @returns {CKEDITOR.ui.dialog.button} The button object. * * @param {String} id The id of the button. */ getButton: function( id ) { return this._.buttons[ id ]; }, /** * Simulates a click to a dialog button in the dialog's button row. * * @returns The return value of the dialog's `click` event. * * @param {String} id The id of the button. */ click: function( id ) { return this._.buttons[ id ].click(); }, /** * Disables a dialog button. * * @param {String} id The id of the button. */ disableButton: function( id ) { return this._.buttons[ id ].disable(); }, /** * Enables a dialog button. * * @param {String} id The id of the button. */ enableButton: function( id ) { return this._.buttons[ id ].enable(); }, /** * Gets the number of pages in the dialog. * * @returns {Number} Page count. */ getPageCount: function() { return this._.pageCount; }, /** * Gets the editor instance which opened this dialog. * * @returns {CKEDITOR.editor} Parent editor instances. */ getParentEditor: function() { return this._.editor; }, /** * Gets the element that was selected when opening the dialog, if any. * * @returns {CKEDITOR.dom.element} The element that was selected, or `null`. */ getSelectedElement: function() { return this.getParentEditor().getSelection().getSelectedElement(); }, /** * Adds element to dialog's focusable list. * * @param {CKEDITOR.dom.element} element * @param {Number} [index] */ addFocusable: function( element, index ) { if ( typeof index == 'undefined' ) { index = this._.focusList.length; this._.focusList.push( new Focusable( this, element, index ) ); } else { this._.focusList.splice( index, 0, new Focusable( this, element, index ) ); for ( var i = index + 1; i < this._.focusList.length; i++ ) this._.focusList[ i ].focusIndex++; } }, /** * Sets the dialog {@link #property-state}. * * @since 4.5.0 * @param {Number} state Either {@link CKEDITOR#DIALOG_STATE_IDLE} or {@link CKEDITOR#DIALOG_STATE_BUSY}. */ setState: function( state ) { var oldState = this.state; if ( oldState == state ) { return; } this.state = state; if ( state == CKEDITOR.DIALOG_STATE_BUSY ) { // Insert the spinner on demand. if ( !this.parts.spinner ) { var dir = this.getParentEditor().lang.dir, spinnerDef = { attributes: { 'class': 'cke_dialog_spinner' }, styles: { 'float': dir == 'rtl' ? 'right' : 'left' } }; spinnerDef.styles[ 'margin-' + ( dir == 'rtl' ? 'left' : 'right' ) ] = '8px'; this.parts.spinner = CKEDITOR.document.createElement( 'div', spinnerDef ); this.parts.spinner.setHtml( '⌛' ); this.parts.spinner.appendTo( this.parts.title, 1 ); } // Finally, show the spinner. this.parts.spinner.show(); if ( this.getButton( 'ok' ) ) { this.getButton( 'ok' ).disable(); } } else if ( state == CKEDITOR.DIALOG_STATE_IDLE ) { // Hide the spinner. But don't do anything if there is no spinner yet. this.parts.spinner && this.parts.spinner.hide(); if ( this.getButton( 'ok' ) ) { this.getButton( 'ok' ).enable(); } } this.fire( 'state', state ); }, /** * @inheritdoc CKEDITOR.dialog.definition#getModel */ getModel: function( editor ) { // Prioritize forced model. if ( this._.model ) { return this._.model; } if ( this.definition.getModel ) { return this.definition.getModel( editor ); } return null; }, /** * Sets the given model as the subject of the dialog. * * For most plugins, like the `table` or `link` plugin, the given model should be a * {@link CKEDITOR.dom.element DOM element instance} if there is an element related to the dialog. * For widget plugins (`image2`, `placeholder`) you should provide a {@link CKEDITOR.plugins.widget} instance that * is the subject of this dialog. * * @since 4.13.0 * @private * @param {CKEDITOR.dom.element/CKEDITOR.plugins.widget/Object/null} newModel The model to be set. */ setModel: function( newModel ) { this._.model = newModel; }, /** * Returns the current dialog mode based on the state of the feature used with this dialog. * * In case if the dialog definition did not define the {@link CKEDITOR.dialog.definition#getMode} * function, it will use the {@link #getModel} method to recognize the editor mode: * * The {@link CKEDITOR.dialog#EDITING_MODE editing mode} is used when the method returns: * * * A {@link CKEDITOR.dom.element} attached to the DOM. * * A {@link CKEDITOR.plugins.widget} instance. * * Otherwise the {@link CKEDITOR.dialog#CREATION_MODE creation mode} is used. * * @since 4.13.0 * @param {CKEDITOR.editor} editor * @returns {Number} Dialog mode. */ getMode: function( editor ) { if ( this.definition.getMode ) { return this.definition.getMode( editor ); } var model = this.getModel( editor ); if ( !model || ( model instanceof CKEDITOR.dom.element && !model.getParent() ) ) { return CKEDITOR.dialog.CREATION_MODE; } return CKEDITOR.dialog.EDITING_MODE; } }; CKEDITOR.tools.extend( CKEDITOR.dialog, { /** * Indicates that the dialog is introducing new changes to the editor, for example inserting * a newly created element as a part of a feature used with this dialog. * * @static * @since 4.13.0 */ CREATION_MODE: 0, /** * Indicates that the dialog is modifying the existing editor state, for example updating * an existing element as a part of a feature used with this dialog. * * @static * @since 4.13.0 */ EDITING_MODE: 1, /** * Registers a dialog. * * // Full sample plugin, which does not only register a dialog window but also adds an item to the context menu. * // To open the dialog window, choose "Open dialog" in the context menu. * CKEDITOR.plugins.add( 'myplugin', { * init: function( editor ) { * editor.addCommand( 'mydialog',new CKEDITOR.dialogCommand( 'mydialog' ) ); * * if ( editor.contextMenu ) { * editor.addMenuGroup( 'mygroup', 10 ); * editor.addMenuItem( 'My Dialog', { * label: 'Open dialog', * command: 'mydialog', * group: 'mygroup' * } ); * editor.contextMenu.addListener( function( element ) { * return { 'My Dialog': CKEDITOR.TRISTATE_OFF }; * } ); * } * * CKEDITOR.dialog.add( 'mydialog', function( api ) { * // CKEDITOR.dialog.definition * var dialogDefinition = { * title: 'Sample dialog', * minWidth: 390, * minHeight: 130, * contents: [ * { * id: 'tab1', * label: 'Label', * title: 'Title', * expand: true, * padding: 0, * elements: [ * { * type: 'html', * html: '

            This is some sample HTML content.

            ' * }, * { * type: 'textarea', * id: 'textareaId', * rows: 4, * cols: 40 * } * ] * } * ], * buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ], * onOk: function() { * // "this" is now a CKEDITOR.dialog object. * // Accessing dialog elements: * var textareaObj = this.getContentElement( 'tab1', 'textareaId' ); * alert( "You have entered: " + textareaObj.getValue() ); * } * }; * * return dialogDefinition; * } ); * } * } ); * * CKEDITOR.replace( 'editor1', { extraPlugins: 'myplugin' } ); * * @static * @param {String} name The dialog's name. * @param {Function/String} dialogDefinition * A function returning the dialog's definition, or the URL to the `.js` file holding the function. * The function should accept an argument `editor` which is the current editor instance, and * return an object conforming to {@link CKEDITOR.dialog.definition}. * @see CKEDITOR.dialog.definition */ add: function( name, dialogDefinition ) { // Avoid path registration from multiple instances override definition. if ( !this._.dialogDefinitions[ name ] || typeof dialogDefinition == 'function' ) this._.dialogDefinitions[ name ] = dialogDefinition; }, /** * @static * @todo */ exists: function( name ) { return !!this._.dialogDefinitions[ name ]; }, /** * @static * @todo */ getCurrent: function() { return CKEDITOR.dialog._.currentTop; }, /** * Check whether tab wasn't removed by {@link CKEDITOR.config#removeDialogTabs}. * * @since 4.1.0 * @static * @param {CKEDITOR.editor} editor * @param {String} dialogName * @param {String} tabName * @returns {Boolean} */ isTabEnabled: function( editor, dialogName, tabName ) { var cfg = editor.config.removeDialogTabs; return !( cfg && cfg.match( new RegExp( '(?:^|;)' + dialogName + ':' + tabName + '(?:$|;)', 'i' ) ) ); }, /** * The default OK button for dialogs. Fires the `ok` event and closes the dialog if the event succeeds. * * @static * @method */ okButton: ( function() { var retval = function( editor, override ) { override = override || {}; return CKEDITOR.tools.extend( { id: 'ok', type: 'button', label: editor.lang.common.ok, 'class': 'cke_dialog_ui_button_ok', onClick: function( evt ) { var dialog = evt.data.dialog; if ( dialog.fire( 'ok', { hide: true } ).hide !== false ) dialog.hide(); } }, override, true ); }; retval.type = 'button'; retval.override = function( override ) { return CKEDITOR.tools.extend( function( editor ) { return retval( editor, override ); }, { type: 'button' }, true ); }; return retval; } )(), /** * The default cancel button for dialogs. Fires the `cancel` event and * closes the dialog if no UI element value changed. * * @static * @method */ cancelButton: ( function() { var retval = function( editor, override ) { override = override || {}; return CKEDITOR.tools.extend( { id: 'cancel', type: 'button', label: editor.lang.common.cancel, 'class': 'cke_dialog_ui_button_cancel', onClick: function( evt ) { var dialog = evt.data.dialog; if ( dialog.fire( 'cancel', { hide: true } ).hide !== false ) dialog.hide(); } }, override, true ); }; retval.type = 'button'; retval.override = function( override ) { return CKEDITOR.tools.extend( function( editor ) { return retval( editor, override ); }, { type: 'button' }, true ); }; return retval; } )(), /** * Registers a dialog UI element. * * @static * @param {String} typeName The name of the UI element. * @param {Function} builder The function to build the UI element. */ addUIElement: function( typeName, builder ) { this._.uiElementBuilders[ typeName ] = builder; } } ); CKEDITOR.dialog._ = { uiElementBuilders: {}, dialogDefinitions: {}, currentTop: null, currentZIndex: null }; // "Inherit" (copy actually) from CKEDITOR.event. CKEDITOR.event.implementOn( CKEDITOR.dialog ); CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype ); defaultDialogDefinition = { resizable: CKEDITOR.DIALOG_RESIZE_BOTH, minWidth: 600, minHeight: 400, buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ] }; // Tool function used to return an item from an array based on its id // property. var getById = function( array, id, recurse ) { for ( var i = 0, item; ( item = array[ i ] ); i++ ) { if ( item.id == id ) return item; if ( recurse && item[ recurse ] ) { var retval = getById( item[ recurse ], id, recurse ); if ( retval ) return retval; } } return null; }; // Tool function used to add an item into an array. var addById = function( array, newItem, nextSiblingId, recurse, nullIfNotFound ) { if ( nextSiblingId ) { for ( var i = 0, item; ( item = array[ i ] ); i++ ) { if ( item.id == nextSiblingId ) { array.splice( i, 0, newItem ); return newItem; } if ( recurse && item[ recurse ] ) { var retval = addById( item[ recurse ], newItem, nextSiblingId, recurse, true ); if ( retval ) return retval; } } if ( nullIfNotFound ) return null; } array.push( newItem ); return newItem; }; // Tool function used to remove an item from an array based on its id. var removeById = function( array, id, recurse ) { for ( var i = 0, item; ( item = array[ i ] ); i++ ) { if ( item.id == id ) return array.splice( i, 1 ); if ( recurse && item[ recurse ] ) { var retval = removeById( item[ recurse ], id, recurse ); if ( retval ) return retval; } } return null; }; /** * This class is not really part of the API. It is the `definition` property value * passed to `dialogDefinition` event handlers. * * CKEDITOR.on( 'dialogDefinition', function( evt ) { * var definition = evt.data.definition; * var content = definition.getContents( 'page1' ); * // ... * } ); * * @private * @class CKEDITOR.dialog.definitionObject * @extends CKEDITOR.dialog.definition * @constructor Creates a definitionObject class instance. */ function definitionObject( dialog, dialogDefinition ) { // TODO : Check if needed. this.dialog = dialog; // Transform the contents entries in contentObjects. var contents = dialogDefinition.contents; for ( var i = 0, content; ( content = contents[ i ] ); i++ ) contents[ i ] = content && new contentObject( dialog, content ); CKEDITOR.tools.extend( this, dialogDefinition ); } definitionObject.prototype = { /** * Gets a content definition. * * @param {String} id The id of the content definition. * @returns {CKEDITOR.dialog.definition.content} The content definition matching id. */ getContents: function( id ) { return getById( this.contents, id ); }, /** * Gets a button definition. * * @param {String} id The id of the button definition. * @returns {CKEDITOR.dialog.definition.button} The button definition matching id. */ getButton: function( id ) { return getById( this.buttons, id ); }, /** * Adds a content definition object under this dialog definition. * * @param {CKEDITOR.dialog.definition.content} contentDefinition The * content definition. * @param {String} [nextSiblingId] The id of an existing content * definition which the new content definition will be inserted * before. Omit if the new content definition is to be inserted as * the last item. * @returns {CKEDITOR.dialog.definition.content} The inserted content definition. */ addContents: function( contentDefinition, nextSiblingId ) { return addById( this.contents, contentDefinition, nextSiblingId ); }, /** * Adds a button definition object under this dialog definition. * * @param {CKEDITOR.dialog.definition.button} buttonDefinition The * button definition. * @param {String} [nextSiblingId] The id of an existing button * definition which the new button definition will be inserted * before. Omit if the new button definition is to be inserted as * the last item. * @returns {CKEDITOR.dialog.definition.button} The inserted button definition. */ addButton: function( buttonDefinition, nextSiblingId ) { return addById( this.buttons, buttonDefinition, nextSiblingId ); }, /** * Removes a content definition from this dialog definition. * * @param {String} id The id of the content definition to be removed. * @returns {CKEDITOR.dialog.definition.content} The removed content definition. */ removeContents: function( id ) { removeById( this.contents, id ); }, /** * Removes a button definition from the dialog definition. * * @param {String} id The id of the button definition to be removed. * @returns {CKEDITOR.dialog.definition.button} The removed button definition. */ removeButton: function( id ) { removeById( this.buttons, id ); } }; /** * This class is not really part of the API. It is the template of the * objects representing content pages inside the * CKEDITOR.dialog.definitionObject. * * CKEDITOR.on( 'dialogDefinition', function( evt ) { * var definition = evt.data.definition; * var content = definition.getContents( 'page1' ); * content.remove( 'textInput1' ); * // ... * } ); * * @private * @class CKEDITOR.dialog.definition.contentObject * @constructor Creates a contentObject class instance. */ function contentObject( dialog, contentDefinition ) { this._ = { dialog: dialog }; CKEDITOR.tools.extend( this, contentDefinition ); } contentObject.prototype = { /** * Gets a UI element definition under the content definition. * * @param {String} id The id of the UI element definition. * @returns {CKEDITOR.dialog.definition.uiElement} */ get: function( id ) { return getById( this.elements, id, 'children' ); }, /** * Adds a UI element definition to the content definition. * * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition The * UI elemnet definition to be added. * @param {String} nextSiblingId The id of an existing UI element * definition which the new UI element definition will be inserted * before. Omit if the new button definition is to be inserted as * the last item. * @returns {CKEDITOR.dialog.definition.uiElement} The element definition inserted. */ add: function( elementDefinition, nextSiblingId ) { return addById( this.elements, elementDefinition, nextSiblingId, 'children' ); }, /** * Removes a UI element definition from the content definition. * * @param {String} id The id of the UI element definition to be removed. * @returns {CKEDITOR.dialog.definition.uiElement} The element definition removed. */ remove: function( id ) { removeById( this.elements, id, 'children' ); } }; function initDragAndDrop( dialog ) { var lastCoords = null, abstractDialogCoords = null, editor = dialog.getParentEditor(), magnetDistance = editor.config.dialog_magnetDistance, margins = CKEDITOR.skin.margins || [ 0, 0, 0, 0 ]; if ( typeof magnetDistance == 'undefined' ) magnetDistance = 20; function mouseMoveHandler( evt ) { var dialogSize = dialog.getSize(), containerSize = dialog.parts.dialog.getParent().getClientSize(), x = evt.data.$.screenX, y = evt.data.$.screenY, dx = x - lastCoords.x, dy = y - lastCoords.y, realX, realY; lastCoords = { x: x, y: y }; abstractDialogCoords.x += dx; abstractDialogCoords.y += dy; if ( abstractDialogCoords.x + margins[ 3 ] < magnetDistance ) { realX = -margins[ 3 ]; } else if ( abstractDialogCoords.x - margins[ 1 ] > containerSize.width - dialogSize.width - magnetDistance ) { realX = containerSize.width - dialogSize.width + ( editor.lang.dir == 'rtl' ? 0 : margins[ 1 ] ); } else { realX = abstractDialogCoords.x; } if ( abstractDialogCoords.y + margins[ 0 ] < magnetDistance ) { realY = -margins[ 0 ]; } else if ( abstractDialogCoords.y - margins[ 2 ] > containerSize.height - dialogSize.height - magnetDistance ) { realY = containerSize.height - dialogSize.height + margins[ 2 ]; } else { realY = abstractDialogCoords.y; } realX = Math.floor( realX ); realY = Math.floor( realY ); dialog.move( realX, realY, 1 ); evt.data.preventDefault(); } function mouseUpHandler() { CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler ); CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler ); if ( CKEDITOR.env.ie6Compat ) { var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); coverDoc.removeListener( 'mousemove', mouseMoveHandler ); coverDoc.removeListener( 'mouseup', mouseUpHandler ); } } dialog.parts.title.on( 'mousedown', function( evt ) { if ( !dialog._.moved ) { var container = dialog._.element, element = container.getFirst(); element.setStyle( 'position', 'absolute' ); container.removeStyle( 'display' ); dialog._.moved = true; dialog.layout(); } lastCoords = { x: evt.data.$.screenX, y: evt.data.$.screenY }; CKEDITOR.document.on( 'mousemove', mouseMoveHandler ); CKEDITOR.document.on( 'mouseup', mouseUpHandler ); abstractDialogCoords = dialog.getPosition(); if ( CKEDITOR.env.ie6Compat ) { var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); coverDoc.on( 'mousemove', mouseMoveHandler ); coverDoc.on( 'mouseup', mouseUpHandler ); } evt.data.preventDefault(); }, dialog ); } function initResizeHandles( dialog ) { var def = dialog.definition, resizable = def.resizable; if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE ) return; var editor = dialog.getParentEditor(); var wrapperWidth, wrapperHeight, viewSize, origin, startSize, dialogCover; var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) { startSize = dialog.getSize(); var content = dialog.parts.contents, iframeDialog = content.$.getElementsByTagName( 'iframe' ).length, isBorderBox = !( CKEDITOR.env.gecko || CKEDITOR.env.ie && CKEDITOR.env.quirks ); // Shim to help capturing "mousemove" over iframe. if ( iframeDialog ) { dialogCover = CKEDITOR.dom.element.createFromHtml( '
            ' ); content.append( dialogCover ); } // Calculate the offset between content and chrome size. // Use size of current tab panel because we can't rely on size of contents container (#3144). wrapperHeight = startSize.height - dialog.parts.contents.getFirst( isVisible ).getSize( 'height', isBorderBox ); wrapperWidth = startSize.width - dialog.parts.contents.getFirst( isVisible ).getSize( 'width', 1 ); origin = { x: $event.screenX, y: $event.screenY }; viewSize = CKEDITOR.document.getWindow().getViewPaneSize(); CKEDITOR.document.on( 'mousemove', mouseMoveHandler ); CKEDITOR.document.on( 'mouseup', mouseUpHandler ); if ( CKEDITOR.env.ie6Compat ) { var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); coverDoc.on( 'mousemove', mouseMoveHandler ); coverDoc.on( 'mouseup', mouseUpHandler ); } $event.preventDefault && $event.preventDefault(); function isVisible( el ) { return el.isVisible(); } } ); // Prepend the grip to the dialog. dialog.on( 'load', function() { var direction = ''; if ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH ) direction = ' cke_resizer_horizontal'; else if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT ) direction = ' cke_resizer_vertical'; var resizer = CKEDITOR.dom.element.createFromHtml( '' + // BLACK LOWER RIGHT TRIANGLE (ltr) // BLACK LOWER LEFT TRIANGLE (rtl) ( editor.lang.dir == 'ltr' ? '\u25E2' : '\u25E3' ) + '
            ' ); dialog.parts.footer.append( resizer, 1 ); } ); editor.on( 'destroy', function() { CKEDITOR.tools.removeFunction( mouseDownFn ); } ); function mouseMoveHandler( evt ) { var rtl = editor.lang.dir == 'rtl', dx = ( evt.data.$.screenX - origin.x ) * ( rtl ? -1 : 1 ), dy = evt.data.$.screenY - origin.y, width = startSize.width, height = startSize.height, internalWidth = width + dx * ( dialog._.moved ? 1 : 2 ), internalHeight = height + dy * ( dialog._.moved ? 1 : 2 ), element = dialog._.element.getFirst(), right = rtl && parseInt( element.getComputedStyle( 'right' ), 10 ), position = dialog.getPosition(); position.x = position.x || 0; position.y = position.y || 0; if ( position.y + internalHeight > viewSize.height ) { internalHeight = viewSize.height - position.y; } if ( ( rtl ? right : position.x ) + internalWidth > viewSize.width ) { internalWidth = viewSize.width - ( rtl ? right : position.x ); } internalHeight = Math.floor( internalHeight ); internalWidth = Math.floor( internalWidth ); // Make sure the dialog will not be resized to the wrong side when it's in the leftmost position for RTL. if ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) { width = Math.max( def.minWidth || 0, internalWidth - wrapperWidth ); } if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) { height = Math.max( def.minHeight || 0, internalHeight - wrapperHeight ); } dialog.resize( width, height ); if ( dialog._.moved ) { var x = dialog._.position.x, y = dialog._.position.y; updateRatios( dialog, x, y ); } if ( !dialog._.moved ) dialog.layout(); evt.data.preventDefault(); } function mouseUpHandler() { CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler ); CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler ); if ( dialogCover ) { dialogCover.remove(); dialogCover = null; } if ( CKEDITOR.env.ie6Compat ) { var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); coverDoc.removeListener( 'mouseup', mouseUpHandler ); coverDoc.removeListener( 'mousemove', mouseMoveHandler ); } } } function updateRatios( dialog, x, y ) { var containerSize = dialog.parts.dialog.getParent().getClientSize(), dialogSize = dialog.getSize(), ratios = dialog._.viewportRatio, freeSpace = { width: Math.max( containerSize.width - dialogSize.width, 0 ), height: Math.max( containerSize.height - dialogSize.height, 0 ) }; ratios.width = freeSpace.width ? ( x / freeSpace.width ) : ratios.width; ratios.height = freeSpace.height ? ( y / freeSpace.height ) : ratios.height; dialog._.viewportRatio = ratios; } // Caching reusable covers and allowing only one cover on screen. var covers = {}; function cancelEvent( ev ) { ev.data.preventDefault( 1 ); } function showCover( editor ) { var config = editor.config, skinName = ( CKEDITOR.skinName || editor.config.skin ), backgroundColorStyle = config.dialog_backgroundCoverColor || ( skinName == 'moono-lisa' ? 'black' : 'white' ), backgroundCoverOpacity = config.dialog_backgroundCoverOpacity, baseFloatZIndex = config.baseFloatZIndex, coverKey = CKEDITOR.tools.genKey( backgroundColorStyle, backgroundCoverOpacity, baseFloatZIndex ), coverElement = covers[ coverKey ]; CKEDITOR.document.getBody().addClass( 'cke_dialog_open' ); if ( !coverElement ) { var html = [ '
            ' ]; if ( CKEDITOR.env.ie6Compat ) { // Support for custom document.domain in IE. var iframeHtml = ''; html.push( '' + '' ); } html.push( '
            ' ); coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) ); coverElement.setOpacity( backgroundCoverOpacity !== undefined ? backgroundCoverOpacity : 0.5 ); coverElement.on( 'keydown', cancelEvent ); coverElement.on( 'keypress', cancelEvent ); coverElement.on( 'keyup', cancelEvent ); coverElement.appendTo( CKEDITOR.document.getBody() ); covers[ coverKey ] = coverElement; } else { coverElement.show(); } // Makes the dialog cover a focus holder as well. editor.focusManager.add( coverElement ); currentCover = coverElement; // Using Safari/Mac, focus must be kept where it is (https://dev.ckeditor.com/ticket/7027) if ( !( CKEDITOR.env.mac && CKEDITOR.env.webkit ) ) coverElement.focus(); } function hideCover( editor ) { CKEDITOR.document.getBody().removeClass( 'cke_dialog_open' ); if ( !currentCover ) return; editor.focusManager.remove( currentCover ); currentCover.hide(); } function removeCovers() { for ( var coverId in covers ) covers[ coverId ].remove(); covers = {}; } var accessKeyProcessors = {}; function accessKeyDownHandler( evt ) { var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey, alt = evt.data.$.altKey, shift = evt.data.$.shiftKey, key = String.fromCharCode( evt.data.$.keyCode ), keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ]; if ( !keyProcessor || !keyProcessor.length ) return; keyProcessor = keyProcessor[ keyProcessor.length - 1 ]; keyProcessor.keydown && keyProcessor.keydown.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key ); evt.data.preventDefault(); } function accessKeyUpHandler( evt ) { var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey, alt = evt.data.$.altKey, shift = evt.data.$.shiftKey, key = String.fromCharCode( evt.data.$.keyCode ), keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ]; if ( !keyProcessor || !keyProcessor.length ) return; keyProcessor = keyProcessor[ keyProcessor.length - 1 ]; if ( keyProcessor.keyup ) { keyProcessor.keyup.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key ); evt.data.preventDefault(); } } function registerAccessKey( uiElement, dialog, key, downFunc, upFunc ) { var procList = accessKeyProcessors[ key ] || ( accessKeyProcessors[ key ] = [] ); procList.push( { uiElement: uiElement, dialog: dialog, key: key, keyup: upFunc || uiElement.accessKeyUp, keydown: downFunc || uiElement.accessKeyDown } ); } function unregisterAccessKey( obj ) { for ( var i in accessKeyProcessors ) { var list = accessKeyProcessors[ i ]; for ( var j = list.length - 1; j >= 0; j-- ) { if ( list[ j ].dialog == obj || list[ j ].uiElement == obj ) list.splice( j, 1 ); } if ( list.length === 0 ) delete accessKeyProcessors[ i ]; } } function tabAccessKeyUp( dialog, key ) { if ( dialog._.accessKeyMap[ key ] ) dialog.selectPage( dialog._.accessKeyMap[ key ] ); } function tabAccessKeyDown() {} ( function() { CKEDITOR.ui.dialog = { /** * The base class of all dialog UI elements. * * @class CKEDITOR.ui.dialog.uiElement * @constructor Creates a uiElement class instance. * @param {CKEDITOR.dialog} dialog Parent dialog object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element * definition. * * Accepted fields: * * * `id` (Required) The id of the UI element. See {@link CKEDITOR.dialog#getContentElement}. * * `type` (Required) The type of the UI element. The * value to this field specifies which UI element class will be used to * generate the final widget. * * `title` (Optional) The popup tooltip for the UI * element. * * `hidden` (Optional) A flag that tells if the element * should be initially visible. * * `className` (Optional) Additional CSS class names * to add to the UI element. Separated by space. * * `style` (Optional) Additional CSS inline styles * to add to the UI element. A semicolon (;) is required after the last * style declaration. * * `accessKey` (Optional) The alphanumeric access key * for this element. Access keys are automatically prefixed by CTRL. * * `on*` (Optional) Any UI element definition field that * starts with `on` followed immediately by a capital letter and * probably more letters is an event handler. Event handlers may be further * divided into registered event handlers and DOM event handlers. Please * refer to {@link CKEDITOR.ui.dialog.uiElement#registerEvents} and * {@link CKEDITOR.ui.dialog.uiElement#eventProcessors} for more information. * * @param {Array} htmlList * List of HTML code to be added to the dialog's content area. * @param {Function/String} [nodeNameArg='div'] * A function returning a string, or a simple string for the node name for * the root DOM node. * @param {Function/Object} [stylesArg={}] * A function returning an object, or a simple object for CSS styles applied * to the DOM node. * @param {Function/Object} [attributesArg={}] * A fucntion returning an object, or a simple object for attributes applied * to the DOM node. * @param {Function/String} [contentsArg=''] * A function returning a string, or a simple string for the HTML code inside * the root DOM node. Default is empty string. */ uiElement: function( dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg ) { if ( arguments.length < 4 ) return; var nodeName = ( nodeNameArg.call ? nodeNameArg( elementDefinition ) : nodeNameArg ) || 'div', html = [ '<', nodeName, ' ' ], styles = ( stylesArg && stylesArg.call ? stylesArg( elementDefinition ) : stylesArg ) || {}, attributes = ( attributesArg && attributesArg.call ? attributesArg( elementDefinition ) : attributesArg ) || {}, innerHTML = ( contentsArg && contentsArg.call ? contentsArg.call( this, dialog, elementDefinition ) : contentsArg ) || '', domId = this.domId = attributes.id || CKEDITOR.tools.getNextId() + '_uiElement', i; if ( elementDefinition.requiredContent && !dialog.getParentEditor().filter.check( elementDefinition.requiredContent ) ) { styles.display = 'none'; this.notAllowed = true; } // Set the id, a unique id is required for getElement() to work. attributes.id = domId; // Set the type and definition CSS class names. var classes = {}; if ( elementDefinition.type ) classes[ 'cke_dialog_ui_' + elementDefinition.type ] = 1; if ( elementDefinition.className ) classes[ elementDefinition.className ] = 1; if ( elementDefinition.disabled ) classes.cke_disabled = 1; var attributeClasses = ( attributes[ 'class' ] && attributes[ 'class' ].split ) ? attributes[ 'class' ].split( ' ' ) : []; for ( i = 0; i < attributeClasses.length; i++ ) { if ( attributeClasses[ i ] ) classes[ attributeClasses[ i ] ] = 1; } var finalClasses = []; for ( i in classes ) finalClasses.push( i ); attributes[ 'class' ] = finalClasses.join( ' ' ); // Set the popup tooltop. if ( elementDefinition.title ) attributes.title = elementDefinition.title; // Write the inline CSS styles. var styleStr = ( elementDefinition.style || '' ).split( ';' ); // Element alignment support. if ( elementDefinition.align ) { var align = elementDefinition.align; styles[ 'margin-left' ] = align == 'left' ? 0 : 'auto'; styles[ 'margin-right' ] = align == 'right' ? 0 : 'auto'; } for ( i in styles ) styleStr.push( i + ':' + styles[ i ] ); if ( elementDefinition.hidden ) styleStr.push( 'display:none' ); for ( i = styleStr.length - 1; i >= 0; i-- ) { if ( styleStr[ i ] === '' ) styleStr.splice( i, 1 ); } if ( styleStr.length > 0 ) attributes.style = ( attributes.style ? ( attributes.style + '; ' ) : '' ) + styleStr.join( '; ' ); // Write the attributes. for ( i in attributes ) html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[ i ] ) + '" ' ); // Write the content HTML. html.push( '>', innerHTML, '' ); // Add contents to the parent HTML array. htmlList.push( html.join( '' ) ); ( this._ || ( this._ = {} ) ).dialog = dialog; // Override isChanged if it is defined in element definition. if ( typeof elementDefinition.isChanged == 'boolean' ) this.isChanged = function() { return elementDefinition.isChanged; }; if ( typeof elementDefinition.isChanged == 'function' ) this.isChanged = elementDefinition.isChanged; // Overload 'get(set)Value' on definition. if ( typeof elementDefinition.setValue == 'function' ) { this.setValue = CKEDITOR.tools.override( this.setValue, function( org ) { return function( val ) { org.call( this, elementDefinition.setValue.call( this, val ) ); }; } ); } if ( typeof elementDefinition.getValue == 'function' ) { this.getValue = CKEDITOR.tools.override( this.getValue, function( org ) { return function() { return elementDefinition.getValue.call( this, org.call( this ) ); }; } ); } // Add events. CKEDITOR.event.implementOn( this ); this.registerEvents( elementDefinition ); if ( this.accessKeyUp && this.accessKeyDown && elementDefinition.accessKey ) registerAccessKey( this, dialog, 'CTRL+' + elementDefinition.accessKey ); var me = this; dialog.on( 'load', function() { var input = me.getInputElement(); if ( input ) { var focusClass = me.type in { 'checkbox': 1, 'ratio': 1 } && CKEDITOR.env.ie && CKEDITOR.env.version < 8 ? 'cke_dialog_ui_focused' : ''; input.on( 'focus', function() { dialog._.tabBarMode = false; dialog._.hasFocus = true; me.fire( 'focus' ); focusClass && this.addClass( focusClass ); } ); input.on( 'blur', function() { me.fire( 'blur' ); focusClass && this.removeClass( focusClass ); } ); } } ); // Completes this object with everything we have in the // definition. CKEDITOR.tools.extend( this, elementDefinition ); // Register the object as a tab focus if it can be included. if ( this.keyboardFocusable ) { this.tabIndex = elementDefinition.tabIndex || 0; this.focusIndex = dialog._.focusList.push( this ) - 1; this.on( 'focus', function() { dialog._.currentFocusIndex = me.focusIndex; } ); } }, /** * Horizontal layout box for dialog UI elements, auto-expends to available width of container. * * @class CKEDITOR.ui.dialog.hbox * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a hbox class instance. * @param {CKEDITOR.dialog} dialog Parent dialog object. * @param {Array} childObjList * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. * @param {Array} childHtmlList * Array of HTML code that correspond to the HTML output of all the * objects in childObjList. * @param {Array} htmlList * Array of HTML code that this element will output to. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `widths` (Optional) The widths of child cells. * * `height` (Optional) The height of the layout. * * `padding` (Optional) The padding width inside child cells. * * `align` (Optional) The alignment of the whole layout. */ hbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { if ( arguments.length < 4 ) return; this._ || ( this._ = {} ); var children = this._.children = childObjList, widths = elementDefinition && elementDefinition.widths || null, height = elementDefinition && elementDefinition.height || null, styles = {}, i; /** @ignore */ var innerHTML = function() { var html = [ '' ]; for ( i = 0; i < childHtmlList.length; i++ ) { var className = 'cke_dialog_ui_hbox_child', styles = []; if ( i === 0 ) { className = 'cke_dialog_ui_hbox_first'; } if ( i == childHtmlList.length - 1 ) { className = 'cke_dialog_ui_hbox_last'; } html.push( ' 0 ) { html.push( 'style="' + styles.join( '; ' ) + '" ' ); } html.push( '>', childHtmlList[ i ], '' ); } html.push( '' ); return html.join( '' ); }; var attribs = { role: 'presentation' }; elementDefinition && elementDefinition.align && ( attribs.align = elementDefinition.align ); CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'hbox' }, htmlList, 'table', styles, attribs, innerHTML ); }, /** * Vertical layout box for dialog UI elements. * * @class CKEDITOR.ui.dialog.vbox * @extends CKEDITOR.ui.dialog.hbox * @constructor Creates a vbox class instance. * @param {CKEDITOR.dialog} dialog Parent dialog object. * @param {Array} childObjList * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. * @param {Array} childHtmlList * Array of HTML code that correspond to the HTML output of all the * objects in childObjList. * @param {Array} htmlList Array of HTML code that this element will output to. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `width` (Optional) The width of the layout. * * `heights` (Optional) The heights of individual cells. * * `align` (Optional) The alignment of the layout. * * `padding` (Optional) The padding width inside child cells. * * `expand` (Optional) Whether the layout should expand * vertically to fill its container. */ vbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { if ( arguments.length < 3 ) return; this._ || ( this._ = {} ); var children = this._.children = childObjList, width = elementDefinition && elementDefinition.width || null, heights = elementDefinition && elementDefinition.heights || null; /** @ignore */ var innerHTML = function() { var html = [ '' ); for ( var i = 0; i < childHtmlList.length; i++ ) { var styles = []; html.push( '' ); } html.push( '
            0 ) html.push( 'style="', styles.join( '; ' ), '" ' ); html.push( ' class="cke_dialog_ui_vbox_child">', childHtmlList[ i ], '
            ' ); return html.join( '' ); }; CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'vbox' }, htmlList, 'div', null, { role: 'presentation' }, innerHTML ); } }; } )(); /** @class CKEDITOR.ui.dialog.uiElement */ CKEDITOR.ui.dialog.uiElement.prototype = { /** * Gets the root DOM element of this dialog UI object. * * uiElement.getElement().hide(); * * @returns {CKEDITOR.dom.element} Root DOM element of UI object. */ getElement: function() { return CKEDITOR.document.getById( this.domId ); }, /** * Gets the DOM element that the user inputs values. * * This function is used by {@link #setValue}, {@link #getValue} and {@link #focus}. It should * be overrided in child classes where the input element isn't the root * element. * * var rawValue = textInput.getInputElement().$.value; * * @returns {CKEDITOR.dom.element} The element where the user input values. */ getInputElement: function() { return this.getElement(); }, /** * Gets the parent dialog object containing this UI element. * * var dialog = uiElement.getDialog(); * * @returns {CKEDITOR.dialog} Parent dialog object. */ getDialog: function() { return this._.dialog; }, /** * Sets the value of this dialog UI object. * * uiElement.setValue( 'Dingo' ); * * @chainable * @param {Object} value The new value. * @param {Boolean} noChangeEvent Internal commit, to supress `change` event on this element. */ setValue: function( value, noChangeEvent ) { this.getInputElement().setValue( value ); !noChangeEvent && this.fire( 'change', { value: value } ); return this; }, /** * Gets the current value of this dialog UI object. * * var myValue = uiElement.getValue(); * * @returns {Object} The current value. */ getValue: function() { return this.getInputElement().getValue(); }, /** * Tells whether the UI object's value has changed. * * if ( uiElement.isChanged() ) * confirm( 'Value changed! Continue?' ); * * @returns {Boolean} `true` if changed, `false` if not changed. */ isChanged: function() { // Override in input classes. return false; }, /** * Selects the parent tab of this element. Usually called by focus() or overridden focus() methods. * * focus : function() { * this.selectParentTab(); * // do something else. * } * * @chainable */ selectParentTab: function() { var element = this.getInputElement(), cursor = element, tabId; while ( ( cursor = cursor.getParent() ) && cursor.$.className.search( 'cke_dialog_page_contents' ) == -1 ) { } // Some widgets don't have parent tabs (e.g. OK and Cancel buttons). if ( !cursor ) return this; tabId = cursor.getAttribute( 'name' ); // Avoid duplicate select. if ( this._.dialog._.currentTabId != tabId ) this._.dialog.selectPage( tabId ); return this; }, /** * Puts the focus to the UI object. Switches tabs if the UI object isn't in the active tab page. * * uiElement.focus(); * * @chainable */ focus: function() { this.selectParentTab().getInputElement().focus(); return this; }, /** * Registers the `on*` event handlers defined in the element definition. * * The default behavior of this function is: * * 1. If the on* event is defined in the class's eventProcesors list, * then the registration is delegated to the corresponding function * in the eventProcessors list. * 2. If the on* event is not defined in the eventProcessors list, then * register the event handler under the corresponding DOM event of * the UI element's input DOM element (as defined by the return value * of {@link #getInputElement}). * * This function is only called at UI element instantiation, but can * be overridded in child classes if they require more flexibility. * * @chainable * @param {CKEDITOR.dialog.definition.uiElement} definition The UI element * definition. */ registerEvents: function( definition ) { var regex = /^on([A-Z]\w+)/, match; var registerDomEvent = function( uiElement, dialog, eventName, func ) { dialog.on( 'load', function() { uiElement.getInputElement().on( eventName, func, uiElement ); } ); }; for ( var i in definition ) { if ( !( match = i.match( regex ) ) ) continue; if ( this.eventProcessors[ i ] ) this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] ); else registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] ); } return this; }, /** * The event processor list used by * {@link CKEDITOR.ui.dialog.uiElement#getInputElement} at UI element * instantiation. The default list defines three `on*` events: * * 1. `onLoad` - Called when the element's parent dialog opens for the * first time. * 2. `onShow` - Called whenever the element's parent dialog opens. * 3. `onHide` - Called whenever the element's parent dialog closes. * * // This connects the 'click' event in CKEDITOR.ui.dialog.button to onClick * // handlers in the UI element's definitions. * CKEDITOR.ui.dialog.button.eventProcessors = CKEDITOR.tools.extend( {}, * CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, * { onClick : function( dialog, func ) { this.on( 'click', func ); } }, * true * ); * * @property {Object} */ eventProcessors: { onLoad: function( dialog, func ) { dialog.on( 'load', func, this ); }, onShow: function( dialog, func ) { dialog.on( 'show', func, this ); }, onHide: function( dialog, func ) { dialog.on( 'hide', func, this ); } }, /** * The default handler for a UI element's access key down event, which * tries to put focus to the UI element. * * Can be overridded in child classes for more sophisticaed behavior. * * @param {CKEDITOR.dialog} dialog The parent dialog object. * @param {String} key The key combination pressed. Since access keys * are defined to always include the `CTRL` key, its value should always * include a `'CTRL+'` prefix. */ accessKeyDown: function() { this.focus(); }, /** * The default handler for a UI element's access key up event, which * does nothing. * * Can be overridded in child classes for more sophisticated behavior. * * @param {CKEDITOR.dialog} dialog The parent dialog object. * @param {String} key The key combination pressed. Since access keys * are defined to always include the `CTRL` key, its value should always * include a `'CTRL+'` prefix. */ accessKeyUp: function() {}, /** * Disables a UI element. */ disable: function() { var element = this.getElement(), input = this.getInputElement(); input.setAttribute( 'disabled', 'true' ); element.addClass( 'cke_disabled' ); }, /** * Enables a UI element. */ enable: function() { var element = this.getElement(), input = this.getInputElement(); input.removeAttribute( 'disabled' ); element.removeClass( 'cke_disabled' ); }, /** * Determines whether an UI element is enabled or not. * * @returns {Boolean} Whether the UI element is enabled. */ isEnabled: function() { return !this.getElement().hasClass( 'cke_disabled' ); }, /** * Determines whether an UI element is visible or not. * * @returns {Boolean} Whether the UI element is visible. */ isVisible: function() { return this.getInputElement().isVisible(); }, /** * Determines whether an UI element is focus-able or not. * Focus-able is defined as being both visible and enabled. * * @returns {Boolean} Whether the UI element can be focused. */ isFocusable: function() { if ( !this.isEnabled() || !this.isVisible() ) return false; return true; } }; /** @class CKEDITOR.ui.dialog.hbox */ CKEDITOR.ui.dialog.hbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement(), { /** * Gets a child UI element inside this container. * * var checkbox = hbox.getChild( [0,1] ); * checkbox.setValue( true ); * * @param {Array/Number} indices An array or a single number to indicate the child's * position in the container's descendant tree. Omit to get all the children in an array. * @returns {Array/CKEDITOR.ui.dialog.uiElement} Array of all UI elements in the container * if no argument given, or the specified UI element if indices is given. */ getChild: function( indices ) { // If no arguments, return a clone of the children array. if ( arguments.length < 1 ) return this._.children.concat(); // If indices isn't array, make it one. if ( !indices.splice ) indices = [ indices ]; // Retrieve the child element according to tree position. if ( indices.length < 2 ) return this._.children[ indices[ 0 ] ]; else return ( this._.children[ indices[ 0 ] ] && this._.children[ indices[ 0 ] ].getChild ) ? this._.children[ indices[ 0 ] ].getChild( indices.slice( 1, indices.length ) ) : null; } }, true ); CKEDITOR.ui.dialog.vbox.prototype = new CKEDITOR.ui.dialog.hbox(); ( function() { var commonBuilder = { build: function( dialog, elementDefinition, output ) { var children = elementDefinition.children, child, childHtmlList = [], childObjList = []; for ( var i = 0; ( i < children.length && ( child = children[ i ] ) ); i++ ) { var childHtml = []; childHtmlList.push( childHtml ); childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); } return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); } }; CKEDITOR.dialog.addUIElement( 'hbox', commonBuilder ); CKEDITOR.dialog.addUIElement( 'vbox', commonBuilder ); } )(); /** * Generic dialog command. It opens a specific dialog when executed. * * // Register the "link" command which opens the "link" dialog. * editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) ); * * @class * @constructor Creates a dialogCommand class instance. * @extends CKEDITOR.commandDefinition * @param {String} dialogName The name of the dialog to open when executing * this command. * @param {Object} [ext] Additional command definition's properties. * @param {String} [ext.tabId] You can provide additional property (`tabId`) if you wish to open the dialog on a specific tabId. * * // Open the dialog on the 'keystroke' tabId. * editor.addCommand( 'keystroke', new CKEDITOR.dialogCommand( 'a11yHelp', { tabId: 'keystroke' } ) ); */ CKEDITOR.dialogCommand = function( dialogName, ext ) { this.dialogName = dialogName; CKEDITOR.tools.extend( this, ext, true ); }; CKEDITOR.dialogCommand.prototype = { exec: function( editor ) { var tabId = this.tabId; editor.openDialog( this.dialogName, function( dialog ) { // Select different tab if it's provided (#830). if ( tabId ) { dialog.selectPage( tabId ); } } ); }, // Dialog commands just open a dialog ui, thus require no undo logic, // undo support should dedicate to specific dialog implementation. canUndo: false, editorFocus: 1 }; ( function() { var integerRegex = /^\d*$/, numberRegex = /^\d*(?:\.\d+)?$/, htmlLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/, cssLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i, inlineStylePropertyRegex = /^(--|-?([a-zA-Z_]|\\))(\\|[a-zA-Z0-9-_])*\s*?:\s*?[^:;]+$/; /** * {@link CKEDITOR.dialog Dialog} `OR` logical value indicates the * relation between validation functions. * * @readonly * @property {Number} [=1] * @member CKEDITOR */ CKEDITOR.VALIDATE_OR = 1; /** * {@link CKEDITOR.dialog Dialog} `AND` logical value indicates the * relation between validation functions. * * @readonly * @property {Number} [=2] * @member CKEDITOR */ CKEDITOR.VALIDATE_AND = 2; /** * The namespace with dialog helper validation functions. * * @class * @singleton */ CKEDITOR.dialog.validate = { /** * Performs validation functions composition. * * ```javascript * CKEDITOR.dialog.validate.functions( * CKEDITOR.dialog.validate.notEmpty( 'Value is required.' ), * CKEDITOR.dialog.validate.number( 'Value is not a number.' ), * 'error!' * ); * ``` * **Note:** validation functions should return `true` value for successful validation. Since 4.19.1 * this method does not coerce return type to boolean. * * @param {Function...} validators Validation functions which will be composed into a single validator. * @param {String} [msg] Error message returned by the composed validation function. * @param {Number} [relation=CKEDITOR.VALIDATE_OR] Indicates a relation between validation functions. * Use {@link CKEDITOR#VALIDATE_OR} or {@link CKEDITOR#VALIDATE_AND}. * * @returns {Function} Composed validation function. */ functions: function() { var args = arguments; return function( value ) { // It's important for validate functions to be able to accept the value // as argument in addition to this.getValue(), so that it is possible to // combine validate functions together to make more sophisticated // validators. if ( this && this.getValue ) { value = this.getValue(); } var msg, relation = CKEDITOR.VALIDATE_AND, functions = [], i; for ( i = 0; i < args.length; i++ ) { if ( typeof args[ i ] == 'function' ) { functions.push( args[ i ] ); } else { break; } } if ( i < args.length && typeof args[ i ] == 'string' ) { msg = args[ i ]; i++; } if ( i < args.length && typeof args[ i ] == 'number' ) { relation = args[ i ]; } var passed = runValidators( functions, relation, value ); return !passed ? msg : true; }; function runValidators( functions, relation, value ) { var passed = relation == CKEDITOR.VALIDATE_AND; for ( var i = 0; i < functions.length; i++ ) { // Do not confuse `true` with `truthy` not empty error message (#4449). var doesValidationPassed = functions[ i ]( value ) === true; if ( relation == CKEDITOR.VALIDATE_AND ) { passed = passed && doesValidationPassed; } else { passed = passed || doesValidationPassed; } } return passed; } }, /** * Checks if a dialog UI element value meets the regex condition. * * ```javascript * CKEDITOR.dialog.validate.regex( /^\d*$/, 'error!' )( '123' ) // true * CKEDITOR.dialog.validate.regex( /^\d*$/, 'error!' )( '123.321' ) // error! * ``` * * @param {RegExp} regex Regular expression used to validate the value. * @param {String} msg Validator error message. * @returns {Function} Validation function. */ regex: function( regex, msg ) { return this.functions( function( val ) { return regex.test( val ); }, msg ); }, /** * Checks if a dialog UI element value is not an empty string. * * ```javascript * CKEDITOR.dialog.validate.notEmpty( 'error!' )( 'test' ) // true * CKEDITOR.dialog.validate.notEmpty( 'error!' )( ' ' ) // error! * ``` * * @param {String} msg Validator error message. * @returns {Function} Validation function. */ notEmpty: function( msg ) { return this.functions( function( val ) { var trimCharacters = '\\u0020\\u00a0\\u1680\\u202f\\u205f\\u3000\\u2000-\\u200a\\s', trimRegex = new RegExp( '^[' + trimCharacters + ']+|[' + trimCharacters + ']+$', 'g' ); return val.replace( trimRegex, '' ).length > 0; }, msg ); }, /** * Checks if a dialog UI element value is an Integer. * * ```javascript * CKEDITOR.dialog.validate.integer( 'error!' )( '123' ) // true * CKEDITOR.dialog.validate.integer( 'error!' )( '123.321' ) // error! * ``` * * @param {String} msg Validator error message. * @returns {Function} Validation function. */ integer: function( msg ) { return this.regex( integerRegex, msg ); }, /** * Checks if a dialog UI element value is a Number. * * ```javascript * CKEDITOR.dialog.validate.number( 'error!' )( '123' ) // true * CKEDITOR.dialog.validate.number( 'error!' )( 'test' ) // error! * ``` * * @param {String} msg Validator error message. * @returns {Function} Validation function. */ 'number': function( msg ) { return this.regex( numberRegex, msg ); }, /** * Checks if a dialog UI element value is a correct CSS length value. * * It allows `px`, `em`, `ex`, `in`, `cm`, `mm`, `pt`, `pc` units. * * ```javascript * CKEDITOR.dialog.validate.cssLength( 'error!' )( '10pt' ) // true * CKEDITOR.dialog.validate.cssLength( 'error!' )( 'solid' ) // error! * ``` * * @param {String} msg Validator error message. * @returns {Function} Validation function. */ 'cssLength': function( msg ) { return this.functions( function( val ) { return cssLengthRegex.test( CKEDITOR.tools.trim( val ) ); }, msg ); }, /** * Checks if a dialog UI element value is a correct HTML length value. * * It allows `px` units. * * ```javascript * CKEDITOR.dialog.validate.htmlLength( 'error!' )( '10px' ) // true * CKEDITOR.dialog.validate.htmlLength( 'error!' )( 'solid' ) // error! * ``` * * @param {String} msg Validator error message. * @returns {Function} Validation function. */ 'htmlLength': function( msg ) { return this.functions( function( val ) { return htmlLengthRegex.test( CKEDITOR.tools.trim( val ) ); }, msg ); }, /** * Checks if a dialog UI element value is a correct CSS inline style. * * ```javascript * CKEDITOR.dialog.validate.inlineStyle( 'error!' )( '' ) // true * CKEDITOR.dialog.validate.inlineStyle( 'error!' )( 'height: 10px; width: 20px;' ) // true * CKEDITOR.dialog.validate.inlineStyle( 'error!' )( 'test' ) // error! * ``` * * @param {String} msg Validator error message. * @returns {Function} Validation function. */ 'inlineStyle': function( msg ) { return this.functions( function( val ) { var properties = CKEDITOR.tools.trim( val ).split( ';' ); // Empty value is treated as valid value. It can be the only value (when empty 'val' provided) // or the last one in table after splitting (due to ';' on end). // Such value is removed so `every` call below can check for valid non-empty values only. if ( properties[ properties.length - 1 ] === '' ) { properties.pop(); } return CKEDITOR.tools.array.every( properties, function( property ) { return inlineStylePropertyRegex.test( CKEDITOR.tools.trim( property ) ); } ); }, msg ); }, /** * Checks if a dialog UI element value and the given value are equal. * * ```javascript * CKEDITOR.dialog.validate.equals( 'foo', 'error!' )( 'foo' ) // true * CKEDITOR.dialog.validate.equals( 'foo', 'error!' )( 'baz' ) // error! * ``` * * @param {String} value The value to compare. * @param {String} msg Validator error message. * @returns {Function} Validation function. */ equals: function( value, msg ) { return this.functions( function( val ) { return val == value; }, msg ); }, /** * Checks if a dialog UI element value and the given value are not equal. * * ```javascript * CKEDITOR.dialog.validate.notEqual( 'foo', 'error!' )( 'baz' ) // true * CKEDITOR.dialog.validate.notEqual( 'foo', 'error!' )( 'foo' ) // error! * ``` * * @param {String} value The value to compare. * @param {String} msg Validator error message. * @returns {Function} Validation function. */ notEqual: function( value, msg ) { return this.functions( function( val ) { return val != value; }, msg ); } }; CKEDITOR.on( 'instanceDestroyed', function( evt ) { // Remove dialog cover on last instance destroy. if ( CKEDITOR.tools.isEmpty( CKEDITOR.instances ) ) { var currentTopDialog; while ( ( currentTopDialog = CKEDITOR.dialog._.currentTop ) ) currentTopDialog.hide(); removeCovers(); } var dialogs = evt.editor._.storedDialogs; for ( var name in dialogs ) dialogs[ name ].destroy(); } ); } )(); // Extend the CKEDITOR.editor class with dialog specific functions. CKEDITOR.tools.extend( CKEDITOR.editor.prototype, { /** * Loads and opens a registered dialog. * * CKEDITOR.instances.editor1.openDialog( 'smiley' ); * * @member CKEDITOR.editor * @param {String} dialogName The registered name of the dialog. * @param {Function} callback The function to be invoked after a dialog instance is created. * @param {CKEDITOR.dom.element/CKEDITOR.plugins.widget/Object} [forceModel] Forces opening the dialog * using the given model as a subject. The forced model will take precedence before the * {@link CKEDITOR.dialog.definition#getModel} method. Available since 4.13.0. * @returns {CKEDITOR.dialog} The dialog object corresponding to the dialog displayed or * `null` if the dialog name is not registered. * @see CKEDITOR.dialog#add */ openDialog: function( dialogName, callback, forceModel ) { var dialog = null, dialogDefinitions = CKEDITOR.dialog._.dialogDefinitions[ dialogName ]; if ( CKEDITOR.dialog._.currentTop === null ) showCover( this ); // If the dialogDefinition is already loaded, open it immediately. if ( typeof dialogDefinitions == 'function' ) { var storedDialogs = this._.storedDialogs || ( this._.storedDialogs = {} ); dialog = storedDialogs[ dialogName ] || ( storedDialogs[ dialogName ] = new CKEDITOR.dialog( this, dialogName ) ); dialog.setModel( forceModel ); callback && callback.call( dialog, dialog ); dialog.show(); } else if ( dialogDefinitions == 'failed' ) { hideCover( this ); throw new Error( '[CKEDITOR.dialog.openDialog] Dialog "' + dialogName + '" failed when loading definition.' ); } else if ( typeof dialogDefinitions == 'string' ) { CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( dialogDefinitions ), function() { var dialogDefinition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ]; // In case of plugin error, mark it as loading failed. if ( typeof dialogDefinition != 'function' ) CKEDITOR.dialog._.dialogDefinitions[ dialogName ] = 'failed'; this.openDialog( dialogName, callback, forceModel ); }, this, 0, 1 ); } CKEDITOR.skin.loadPart( 'dialog' ); // Dissolve model, so `definition.getModel` can take precedence // in the next dialog opening (#2423). if ( dialog ) { dialog.once( 'hide', function() { dialog.setModel( null ); }, null, null, 999 ); } return dialog; } } ); CKEDITOR.plugins.add( 'dialog', { requires: 'dialogui', init: function( editor ) { if ( !stylesLoaded ) { CKEDITOR.document.appendStyleSheet( this.path + 'styles/dialog.css' ); stylesLoaded = true; } editor.on( 'doubleclick', function( evt ) { if ( evt.data.dialog ) editor.openDialog( evt.data.dialog ); }, null, null, 999 ); } } ); } )(); // Dialog related configurations. /** * The color of the dialog background cover. It should be a valid CSS color string. * * config.dialog_backgroundCoverColor = 'rgb(255, 254, 253)'; * * @cfg {String} [dialog_backgroundCoverColor='white'] * @member CKEDITOR.config */ /** * The opacity of the dialog background cover. It should be a number within the * range `[0.0, 1.0]`. * * config.dialog_backgroundCoverOpacity = 0.7; * * @cfg {Number} [dialog_backgroundCoverOpacity=0.5] * @member CKEDITOR.config */ /** * If the dialog has more than one tab, put focus into the first tab as soon as dialog is opened. * * config.dialog_startupFocusTab = true; * * @cfg {Boolean} [dialog_startupFocusTab=false] * @member CKEDITOR.config */ /** * The distance of magnetic borders used in moving and resizing dialogs, * measured in pixels. * * config.dialog_magnetDistance = 30; * * @cfg {Number} [dialog_magnetDistance=20] * @member CKEDITOR.config */ /** * The guideline to follow when generating the dialog buttons. There are 3 possible options: * * * `'OS'` - the buttons will be displayed in the default order of the user's OS; * * `'ltr'` - for Left-To-Right order; * * `'rtl'` - for Right-To-Left order. * * Example: * * config.dialog_buttonsOrder = 'rtl'; * * @since 3.5.0 * @cfg {String} [dialog_buttonsOrder='OS'] * @member CKEDITOR.config */ /** * The dialog contents to removed. It's a string composed by dialog name and tab name with a colon between them. * * Separate each pair with semicolon (see example). * * **Note:** All names are case-sensitive. * * **Note:** Be cautious when specifying dialog tabs that are mandatory, * like `'info'`, dialog functionality might be broken because of this! * * config.removeDialogTabs = 'table:advanced;image:Link'; * * @since 3.5.0 * @cfg {String} [removeDialogTabs=''] * @member CKEDITOR.config */ /** * Tells if user should not be asked to confirm close, if any dialog field was modified. * By default it is set to `false` meaning that the confirmation dialog will be shown. * * config.dialog_noConfirmCancel = true; * * @since 4.3.0 * @cfg {Boolean} [dialog_noConfirmCancel=false] * @member CKEDITOR.config */ /** * Event fired when a dialog definition is about to be used to create a dialog in * an editor instance. This event makes it possible to customize the definition * before creating it. * * Note that this event is called only the first time a specific dialog is * opened. Successive openings will use the cached dialog, and this event will * not get fired. * * @event dialogDefinition * @member CKEDITOR * @param {Object} data * @param {String} data.name The name of the dialog. * @param {CKEDITOR.dialog.definition} data.definition The dialog definition that * is being loaded. * @param {CKEDITOR.dialog} data.dialog A dialog instance that the definition is loaded * for. Introduced in **CKEditor 4.13.0**. * @param {CKEDITOR.editor} editor The editor instance that will use the dialog. */ /** * Event fired when a tab is going to be selected in a dialog. * * @event selectPage * @member CKEDITOR.dialog * @param data * @param {String} data.page The ID of the page that is going to be selected. * @param {String} data.currentPage The ID of the current page. */ /** * Event fired when the user tries to dismiss a dialog. * * @event cancel * @member CKEDITOR.dialog * @param data * @param {Boolean} data.hide Whether the event should proceed or not. */ /** * Event fired when the user tries to confirm a dialog. * * @event ok * @member CKEDITOR.dialog * @param data * @param {Boolean} data.hide Whether the event should proceed or not. */ /** * Event fired when a dialog is shown. * * @event show * @member CKEDITOR.dialog */ /** * Event fired when a dialog is shown. * * @event dialogShow * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param {CKEDITOR.dialog} data The opened dialog instance. */ /** * Event fired when a dialog is hidden. * * @event hide * @member CKEDITOR.dialog */ /** * Event fired when a dialog is hidden. * * @event dialogHide * @member CKEDITOR.editor * @param {CKEDITOR.editor} editor This editor instance. * @param {CKEDITOR.dialog} data The hidden dialog instance. */ /** * Event fired when a dialog is being resized. The event is fired on * both the {@link CKEDITOR.dialog} object and the dialog instance * since 3.5.3, previously it was only available in the global object. * * @static * @event resize * @member CKEDITOR.dialog * @param data * @param {CKEDITOR.dialog} data.dialog The dialog being resized (if * it is fired on the dialog itself, this parameter is not sent). * @param {String} data.skin The skin name. * @param {Number} data.width The new width. * @param {Number} data.height The new height. */ /** * Event fired when a dialog is being resized. The event is fired on * both the {@link CKEDITOR.dialog} object and the dialog instance * since 3.5.3, previously it was only available in the global object. * * @since 3.5.0 * @event resize * @member CKEDITOR.dialog * @param data * @param {Number} data.width The new width. * @param {Number} data.height The new height. */ /** * Event fired when the dialog state changes, usually by {@link CKEDITOR.dialog#setState}. * * @since 4.5.0 * @event state * @member CKEDITOR.dialog * @param data * @param {Number} data The new state. Either {@link CKEDITOR#DIALOG_STATE_IDLE} or {@link CKEDITOR#DIALOG_STATE_BUSY}. */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/samples/0000755000201500020150000000000014515446705023160 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/samples/assets/0000755000201500020150000000000014515446705024462 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/samples/assets/my_dialog.js0000644000201500020150000000157114515446705026770 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.dialog.add( 'myDialog', function() { return { title: 'My Dialog', minWidth: 400, minHeight: 200, contents: [ { id: 'tab1', label: 'First Tab', title: 'First Tab', elements: [ { id: 'input1', type: 'text', label: 'Text Field' }, { id: 'select1', type: 'select', label: 'Select Field', items: [ [ 'option1', 'value1' ], [ 'option2', 'value2' ] ] } ] }, { id: 'tab2', label: 'Second Tab', title: 'Second Tab', elements: [ { id: 'button1', type: 'button', label: 'Button Field' } ] } ] }; } ); // %LEAVE_UNMINIFIED% %REMOVE_LINE% rt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/samples/dialog.html0000644000201500020150000001635014515446705025312 0ustar puckpuck Using API to Customize Dialog Windows — CKEditor Sample

            CKEditor Samples » Using CKEditor Dialog API

            This sample is not maintained anymore. Check out the brand new samples in CKEditor Examples.

            This sample shows how to use the CKEditor Dialog API to customize CKEditor dialog windows without changing the original editor code. The following customizations are being done in the example below:

            For details on how to create this setup check the source code of this sample page.

            A custom dialog is added to the editors using the pluginsLoaded event, from an external dialog definition file:

            1. Creating a custom dialog window – "My Dialog" dialog window opened with the "My Dialog" toolbar button.
            2. Creating a custom button – Add button to open the dialog with "My Dialog" toolbar button.

            The below editor modify the dialog definition of the above added dialog using the dialogDefinition event:

            1. Adding dialog tab – Add new tab "My Tab" to dialog window.
            2. Removing a dialog window tab – Remove "Second Tab" page from the dialog window.
            3. Adding dialog window fields – Add "My Custom Field" to the dialog window.
            4. Removing dialog window field – Remove "Select Field" selection field from the dialog window.
            5. Setting default values for dialog window fields – Set default value of "Text Field" text field.
            6. Setup initial focus for dialog window – Put initial focus on "My Custom Field" text field.
            rt-5.0.5/devel/third-party/ckeditor-src/plugins/dialog/dialogDefinition.js0000644000201500020150000006301714515446705025331 0ustar puckpuck// jscs:disable disallowMixedSpacesAndTabs /** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview Defines the "virtual" dialog, dialog content and dialog button * definition classes. */ /** * The definition of a dialog window. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create dialogs. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * CKEDITOR.dialog.add( 'testOnly', function( editor ) { * return { * title: 'Test Dialog', * resizable: CKEDITOR.DIALOG_RESIZE_BOTH, * minWidth: 500, * minHeight: 400, * contents: [ * { * id: 'tab1', * label: 'First Tab', * title: 'First Tab Title', * accessKey: 'Q', * elements: [ * { * type: 'text', * label: 'Test Text 1', * id: 'testText1', * 'default': 'hello world!' * } * ] * } * ] * }; * } ); * * @class CKEDITOR.dialog.definition */ /** * The dialog title, displayed in the dialog's header. Required. * * @property {String} title */ /** * How the dialog can be resized, must be one of the four contents defined below. * * * {@link CKEDITOR#DIALOG_RESIZE_NONE} * * {@link CKEDITOR#DIALOG_RESIZE_WIDTH} * * {@link CKEDITOR#DIALOG_RESIZE_HEIGHT} * * {@link CKEDITOR#DIALOG_RESIZE_BOTH} * * @property {Number} [resizable=CKEDITOR.DIALOG_RESIZE_NONE] */ /** * The minimum width of the dialog, in pixels. * * @property {Number} [minWidth=600] */ /** * The minimum height of the dialog, in pixels. * * @property {Number} [minHeight=400] */ /** * The initial width of the dialog, in pixels. * * @since 3.5.3 * @property {Number} [width=CKEDITOR.dialog.definition#minWidth] */ /** * The initial height of the dialog, in pixels. * * @since 3.5.3 * @property {Number} [height=CKEDITOR.dialog.definition.minHeight] */ /** * The buttons in the dialog, defined as an array of * {@link CKEDITOR.dialog.definition.button} objects. * * @property {Array} [buttons=[ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]] */ /** * The contents in the dialog, defined as an array of * {@link CKEDITOR.dialog.definition.content} objects. Required. * * @property {Array} contents */ /** * Returns the subject of the dialog. * * For most plugins, like the `table` or `link` plugin, it should return a * {@link CKEDITOR.dom.element DOM element instance} if there is an element related to the dialog. * For widget plugins (`image2`, `placeholder`) it should return a {@link CKEDITOR.plugins.widget} instance that * is the subject of this dialog. * * @since 4.13.0 * @method getModel * @param {CKEDITOR.editor} editor * @returns {CKEDITOR.dom.element/CKEDITOR.plugins.widget/Object/null} Returns `null` if the dialog does not use the model. */ /** * Returns the current dialog mode based on the state of the feature used with this dialog. * * See {@link CKEDITOR.dialog#EDITING_MODE} and {@link CKEDITOR.dialog#CREATION_MODE}. * * @since 4.13.0 * @method getMode * @param {CKEDITOR.editor} editor * @returns {Number} Dialog mode. */ /** * The function to execute when the "OK" button is pressed. * * @property {Function} onOk */ /** * The function to execute when the "Cancel" button is pressed. * * @property {Function} onCancel */ /** * The function to execute when the dialog is displayed for the first time. * * @property {Function} onLoad */ /** * The function to execute when the dialog is loaded (executed every time the dialog is opened). * * @property {Function} onShow */ /** * The function executed every time the dialog is closed. * * @property {Function} onHide */ /** * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create dialog content pages. * * @class CKEDITOR.dialog.definition.content. */ /** * The ID of the content page. * * @property {String} id */ /** * The tab label of the content page. * * @property {String} label */ /** * The popup message of the tab label. * * @property {String} title */ /** * The Ctrl hotkey for switching to the tab. * * contentDefinition.accessKey = 'Q'; // Switch to this page when Ctrl+Q is pressed. * * @property {String} accessKey */ /** * The UI elements contained in this content page, defined as an array of * {@link CKEDITOR.dialog.definition.uiElement} objects. * * @property {Array} elements */ /** * The definition of a user interface element (textarea, radio etc). * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create dialog UI elements. * * @class CKEDITOR.dialog.definition.uiElement * @see CKEDITOR.ui.dialog.uiElement */ /** * The ID of the UI element. * * @property {String} id */ /** * The type of the UI element. Required. * * @property {String} type */ /** * The popup label of the UI element. * * @property {String} title */ /** * The content that needs to be allowed to enable this UI element. * All formats accepted by {@link CKEDITOR.filter#check} may be used. * * When all UI elements in a tab are disabled, this tab will be disabled automatically. * * @property {String/Object/CKEDITOR.style} requiredContent */ /** * CSS class names to append to the UI element. * * @property {String} className */ /** * Inline CSS classes to append to the UI element. * * @property {String} style */ /** * Horizontal alignment (in the container) of the UI element. * * @property {String} align */ /** * Function to execute the first time the UI element is displayed. * * @property {Function} onLoad */ /** * Function to execute whenever the UI element's parent dialog is displayed. * * @property {Function} onShow */ /** * Function to execute whenever the UI element's parent dialog is closed. * * @property {Function} onHide */ /** * Function to execute whenever the UI element's parent * dialog's {@link CKEDITOR.dialog#setupContent} method is executed. * It usually takes care of the respective UI element as a standalone element. * * @property {Function} setup */ /** * Function to execute whenever the UI element's parent * dialog's {@link CKEDITOR.dialog#commitContent} method is executed. * It usually takes care of the respective UI element as a standalone element. * * @property {Function} commit */ // ----- hbox ----------------------------------------------------------------- /** * Horizontal layout box for dialog UI elements, auto-expends to available width of container. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create horizontal layouts. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.hbox} object and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'hbox', * widths: [ '25%', '25%', '50%' ], * children: [ * { * type: 'text', * id: 'id1', * width: '40px', * }, * { * type: 'text', * id: 'id2', * width: '40px', * }, * { * type: 'text', * id: 'id3' * } * ] * } * * @class CKEDITOR.dialog.definition.hbox * @extends CKEDITOR.dialog.definition.uiElement */ /** * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. * * @property {Array} children */ /** * (Optional) The widths of child cells. * * @property {Array} widths */ /** * (Optional) The height of the layout. * * @property {Number} height */ /** * The CSS styles to apply to this element. * * @property {String} styles */ /** * (Optional) The padding width inside child cells. Example: 0, 1. * * @property {Number} padding */ /** * (Optional) The alignment of the whole layout. Example: center, top. * * @property {String} align */ // ----- vbox ----------------------------------------------------------------- /** * Vertical layout box for dialog UI elements. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create vertical layouts. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.vbox} object and can * be accessed with {@link CKEDITOR.dialog#getContentElement}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'vbox', * align: 'right', * width: '200px', * children: [ * { * type: 'text', * id: 'age', * label: 'Age' * }, * { * type: 'text', * id: 'sex', * label: 'Sex' * }, * { * type: 'text', * id: 'nationality', * label: 'Nationality' * } * ] * } * * @class CKEDITOR.dialog.definition.vbox * @extends CKEDITOR.dialog.definition.uiElement */ /** * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. * * @property {Array} children */ /** * (Optional) The width of the layout. * * @property {Array} width */ /** * (Optional) The heights of individual cells. * * @property {Number} heights */ /** * The CSS styles to apply to this element. * * @property {String} styles */ /** * (Optional) The padding width inside child cells. Example: 0, 1. * * @property {Number} padding */ /** * (Optional) The alignment of the whole layout. Example: center, top. * * @property {String} align */ /** * (Optional) Whether the layout should expand vertically to fill its container. * * @property {Boolean} expand */ // ----- labeled element ------------------------------------------------------ /** * The definition of labeled user interface element (textarea, textInput etc). * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create dialog UI elements. * * @class CKEDITOR.dialog.definition.labeledElement * @extends CKEDITOR.dialog.definition.uiElement * @see CKEDITOR.ui.dialog.labeledElement */ /** * The label of the UI element. * * { * type: 'text', * label: 'My Label' * } * * @property {String} label */ /** * (Optional) Specify the layout of the label. Set to `'horizontal'` for horizontal layout. * The default layout is vertical. * * { * type: 'text', * label: 'My Label', * labelLayout: 'horizontal' * } * * @property {String} labelLayout */ /** * (Optional) Applies only to horizontal layouts: a two elements array of lengths to specify the widths of the * label and the content element. See also {@link CKEDITOR.dialog.definition.labeledElement#labelLayout}. * * { * type: 'text', * label: 'My Label', * labelLayout: 'horizontal', * widths: [100, 200] * } * * @property {Array} widths */ /** * Specify the inline style of the uiElement label. * * { * type: 'text', * label: 'My Label', * labelStyle: 'color: red' * } * * @property {String} labelStyle */ /** * Specify the inline style of the input element. * * { * type: 'text', * label: 'My Label', * inputStyle: 'text-align: center' * } * * @since 3.6.1 * @property {String} inputStyle */ /** * Specify the inline style of the input element container. * * { * type: 'text', * label: 'My Label', * controlStyle: 'width: 3em' * } * * @since 3.6.1 * @property {String} controlStyle */ // ----- button --------------------------------------------------------------- /** * The definition of a button. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create buttons. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.button} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'button', * id: 'buttonId', * label: 'Click me', * title: 'My title', * onClick: function() { * // this = CKEDITOR.ui.dialog.button * alert( 'Clicked: ' + this.id ); * } * } * * @class CKEDITOR.dialog.definition.button * @extends CKEDITOR.dialog.definition.uiElement */ /** * Whether the button is disabled. * * @property {Boolean} disabled */ /** * The label of the UI element. * * @property {String} label */ // ----- checkbox ------ /** * The definition of a checkbox element. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create groups of checkbox buttons. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.checkbox} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'checkbox', * id: 'agree', * label: 'I agree', * 'default': 'checked', * onClick: function() { * // this = CKEDITOR.ui.dialog.checkbox * alert( 'Checked: ' + this.getValue() ); * } * } * * @class CKEDITOR.dialog.definition.checkbox * @extends CKEDITOR.dialog.definition.uiElement */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * The label of the UI element. * * @property {String} label */ /** * The default state. * * @property {String} [default='' (unchecked)] */ // ----- file ----------------------------------------------------------------- /** * The definition of a file upload input. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create file upload elements. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.file} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'file', * id: 'upload', * label: 'Select file from your computer', * size: 38 * }, * { * type: 'fileButton', * id: 'fileId', * label: 'Upload file', * 'for': [ 'tab1', 'upload' ], * filebrowser: { * onSelect: function( fileUrl, data ) { * alert( 'Successfully uploaded: ' + fileUrl ); * } * } * } * * @class CKEDITOR.dialog.definition.file * @extends CKEDITOR.dialog.definition.labeledElement */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * (Optional) The action attribute of the form element associated with this file upload input. * If empty, CKEditor will use path to server connector for currently opened folder. * * @property {String} action */ /** * The size of the UI element. * * @property {Number} size */ // ----- fileButton ----------------------------------------------------------- /** * The definition of a button for submitting the file in a file upload input. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create a button for submitting the file in a file upload input. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.fileButton} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * @class CKEDITOR.dialog.definition.fileButton * @extends CKEDITOR.dialog.definition.uiElement */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * The label of the UI element. * * @property {String} label */ /** * The instruction for CKEditor how to deal with file upload. * By default, the file and fileButton elements will not work "as expected" if this attribute is not set. * * // Update field with id 'txtUrl' in the 'tab1' tab when file is uploaded. * filebrowser: 'tab1:txtUrl' * * // Call custom onSelect function when file is successfully uploaded. * filebrowser: { * onSelect: function( fileUrl, data ) { * alert( 'Successfully uploaded: ' + fileUrl ); * } * } * * @property {String} filebrowser/Object */ /** * An array that contains pageId and elementId of the file upload input element for which this button is created. * * [ pageId, elementId ] * * @property {String} for */ // ----- html ----------------------------------------------------------------- /** * The definition of a raw HTML element. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create elements made from raw HTML code. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.html} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * To access HTML elements use {@link CKEDITOR.dom.document#getById}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example 1: * { * type: 'html', * html: '

            This is some sample HTML content.

            ' * } * * // Example 2: * // Complete sample with document.getById() call when the "Ok" button is clicked. * var dialogDefinition = { * title: 'Sample dialog', * minWidth: 300, * minHeight: 200, * onOk: function() { * // "this" is now a CKEDITOR.dialog object. * var document = this.getElement().getDocument(); * // document = CKEDITOR.dom.document * var element = document.getById( 'myDiv' ); * if ( element ) * alert( element.getHtml() ); * }, * contents: [ * { * id: 'tab1', * label: '', * title: '', * elements: [ * { * type: 'html', * html: '
            Sample text.
            Another div.
            ' * } * ] * } * ], * buttons: [ CKEDITOR.dialog.cancelButton, CKEDITOR.dialog.okButton ] * }; * * @class CKEDITOR.dialog.definition.html * @extends CKEDITOR.dialog.definition.uiElement */ /** * (Required) HTML code of this element. * * @property {String} html */ // ----- radio ---------------------------------------------------------------- /** * The definition of a radio group. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create groups of radio buttons. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.radio} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'radio', * id: 'country', * label: 'Which country is bigger', * items: [ [ 'France', 'FR' ], [ 'Germany', 'DE' ] ], * style: 'color: green', * 'default': 'DE', * onClick: function() { * // this = CKEDITOR.ui.dialog.radio * alert( 'Current value: ' + this.getValue() ); * } * } * * @class CKEDITOR.dialog.definition.radio * @extends CKEDITOR.dialog.definition.labeledElement */ /** * The default value. * * @property {String} default */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`. * If `'Value'` is missing, then the value would be assumed to be the same as the description. * * @property {Array} items */ // ----- selectElement -------------------------------------------------------- /** * The definition of a select element. * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create select elements. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.select} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'select', * id: 'sport', * label: 'Select your favourite sport', * items: [ [ 'Basketball' ], [ 'Baseball' ], [ 'Hockey' ], [ 'Football' ] ], * 'default': 'Football', * onChange: function( api ) { * // this = CKEDITOR.ui.dialog.select * alert( 'Current value: ' + this.getValue() ); * } * } * * @class CKEDITOR.dialog.definition.select * @extends CKEDITOR.dialog.definition.labeledElement */ /** * The default value. * * @property {String} default */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`. * If `'Value'` is missing, then the value would be assumed to be the same as the description. * * @property {Array} items */ /** * (Optional) Set this to true if you'd like to have a multiple-choice select box. * * @property {Boolean} [multiple=false] */ /** * (Optional) The number of items to display in the select box. * * @property {Number} size */ // ----- textInput ------------------------------------------------------------ /** * The definition of a text field (single line). * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create text fields. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textInput} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * { * type: 'text', * id: 'name', * label: 'Your name', * 'default': '', * validate: function() { * if ( !this.getValue() ) { * api.openMsgDialog( '', 'Name cannot be empty.' ); * return false; * } * } * } * * @class CKEDITOR.dialog.definition.textInput * @extends CKEDITOR.dialog.definition.labeledElement */ /** * The default value. * * @property {String} default */ /** * (Optional) The maximum length. * * @property {Number} maxLength */ /** * (Optional) The size of the input field. * * @property {Number} size */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * @property bidi * @inheritdoc CKEDITOR.dialog.definition.textarea#bidi */ // ----- textarea ------------------------------------------------------------- /** * The definition of a text field (multiple lines). * * This class is not really part of the API. It just illustrates the properties * that developers can use to define and create textarea. * * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textarea} object * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. * * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. * * // There is no constructor for this class, the user just has to define an * // object with the appropriate properties. * * // Example: * { * type: 'textarea', * id: 'message', * label: 'Your comment', * 'default': '', * validate: function() { * if ( this.getValue().length < 5 ) { * api.openMsgDialog( 'The comment is too short.' ); * return false; * } * } * } * * @class CKEDITOR.dialog.definition.textarea * @extends CKEDITOR.dialog.definition.labeledElement */ /** * The number of rows. * * @property {Number} rows */ /** * The number of columns. * * @property {Number} cols */ /** * (Optional) The validation function. * * @property {Function} validate */ /** * The default value. * * @property {String} default */ /** * Whether the text direction of this input should be togglable using the following keystrokes: * * * *Shift+Alt+End* – switch to Right-To-Left, * * *Shift+Alt+Home* – switch to Left-To-Right. * * By default the input will be loaded without any text direction set, which means that * the direction will be inherited from the editor's text direction. * * If the direction was set, a marker will be prepended to every non-empty value of this input: * * * [`\u202A`](https://www.unicode.org/charts/PDF/U2000.pdf) – for Right-To-Left, * * [`\u202B`](https://www.unicode.org/charts/PDF/U2000.pdf) – for Left-To-Right. * * This marker allows for restoring the same text direction upon the next dialog opening. * * @since 4.5.0 * @property {Boolean} bidi */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/0000755000201500020150000000000014515446710022201 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/plugin.js0000644000201500020150000020252414515446710024042 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview The [Magic Line](https://ckeditor.com/cke4/addon/magicline) plugin that makes it easier to access some document areas that * are difficult to focus. */ 'use strict'; ( function() { CKEDITOR.plugins.add( 'magicline', { lang: 'af,ar,az,bg,ca,cs,cy,da,de,de-ch,el,en,en-au,en-gb,eo,es,es-mx,et,eu,fa,fi,fr,fr-ca,gl,he,hr,hu,id,it,ja,km,ko,ku,lt,lv,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% init: initPlugin } ); // Activates the box inside of an editor. function initPlugin( editor ) { // Configurables var config = editor.config, triggerOffset = config.magicline_triggerOffset || 30, enterMode = config.enterMode, that = { // Global stuff is being initialized here. editor: editor, enterMode: enterMode, triggerOffset: triggerOffset, holdDistance: 0 | triggerOffset * ( config.magicline_holdDistance || 0.5 ), boxColor: config.magicline_color || '#ff0000', rtl: config.contentsLangDirection == 'rtl', tabuList: [ 'data-cke-hidden-sel' ].concat( config.magicline_tabuList || [] ), triggers: config.magicline_everywhere ? DTD_BLOCK : { table: 1, hr: 1, div: 1, ul: 1, ol: 1, dl: 1, form: 1, blockquote: 1 } }, scrollTimeout, checkMouseTimeoutPending, checkMouseTimer; // %REMOVE_START% // Internal DEBUG uses tools located in the topmost window. // (https://dev.ckeditor.com/ticket/9701) Due to security limitations some browsers may throw // errors when accessing window.top object. Do it safely first then. try { that.debug = window.top.DEBUG; } catch ( e ) {} that.debug = that.debug || { groupEnd: function() {}, groupStart: function() {}, log: function() {}, logElements: function() {}, logElementsEnd: function() {}, logEnd: function() {}, mousePos: function() {}, showHidden: function() {}, showTrigger: function() {}, startTimer: function() {}, stopTimer: function() {} }; // %REMOVE_END% // Simple irrelevant elements filter. that.isRelevant = function( node ) { return isHtml( node ) && // -> Node must be an existing HTML element. !isLine( that, node ) && // -> Node can be neither the box nor its child. !isFlowBreaker( node ); // -> Node can be neither floated nor positioned nor aligned. }; editor.on( 'contentDom', addListeners, this ); function addListeners() { var editable = editor.editable(), doc = editor.document, win = editor.window; // Global stuff is being initialized here. extend( that, { editable: editable, inInlineMode: editable.isInline(), doc: doc, win: win, hotNode: null }, true ); // This is the boundary of the editor. For inline the boundary is editable itself. // For classic (`iframe`-based) editor, the HTML element is a real boundary. that.boundary = that.inInlineMode ? that.editable : that.doc.getDocumentElement(); // Enabling the box inside of inline editable is pointless. // There's no need to access spaces inside paragraphs, links, spans, etc. if ( editable.is( dtd.$inline ) ) return; // Handle in-line editing by setting appropriate position. // If current position is static, make it relative and clear top/left coordinates. if ( that.inInlineMode && !isPositioned( editable ) ) { editable.setStyles( { position: 'relative', top: null, left: null } ); } // Enable the box. Let it produce children elements, initialize // event handlers and own methods. initLine.call( this, that ); // Get view dimensions and scroll positions. // At this stage (before any checkMouse call) it is used mostly // by tests. Nevertheless it a crucial thing. updateWindowSize( that ); // Remove the box before an undo image is created. // This is important. If we didn't do that, the *undo thing* would revert the box into an editor. // Thanks to that, undo doesn't even know about the existence of the box. editable.attachListener( editor, 'beforeUndoImage', function() { that.line.detach(); } ); // Removes the box HTML from editor data string if getData is called. // Thanks to that, an editor never yields data polluted by the box. // Listen with very high priority, so line will be removed before other // listeners will see it. editable.attachListener( editor, 'beforeGetData', function() { // If the box is in editable, remove it. if ( that.line.wrap.getParent() ) { that.line.detach(); // Restore line in the last listener for 'getData'. editor.once( 'getData', function() { that.line.attach(); }, null, null, 1000 ); } }, null, null, 0 ); // Hide the box on mouseout if mouse leaves document. editable.attachListener( that.inInlineMode ? doc : doc.getWindow().getFrame(), 'mouseout', function( event ) { if ( editor.mode != 'wysiwyg' ) return; // Check for inline-mode editor. If so, check mouse position // and remove the box if mouse outside of an editor. if ( that.inInlineMode ) { var mouse = { x: event.data.$.clientX, y: event.data.$.clientY }; updateWindowSize( that ); updateEditableSize( that, true ); var size = that.view.editable, scroll = that.view.scroll; // If outside of an editor... if ( !inBetween( mouse.x, size.left - scroll.x, size.right - scroll.x ) || !inBetween( mouse.y, size.top - scroll.y, size.bottom - scroll.y ) ) { clearTimeout( checkMouseTimer ); checkMouseTimer = null; that.line.detach(); } } else { clearTimeout( checkMouseTimer ); checkMouseTimer = null; that.line.detach(); } } ); // This one deactivates hidden mode of an editor which // prevents the box from being shown. editable.attachListener( editable, 'keyup', function() { that.hiddenMode = 0; that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE% } ); editable.attachListener( editable, 'keydown', function( event ) { if ( editor.mode != 'wysiwyg' ) return; var keyStroke = event.data.getKeystroke(); switch ( keyStroke ) { // Shift pressed case 2228240: // IE case 16: that.hiddenMode = 1; that.line.detach(); } that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE% } ); // This method ensures that checkMouse aren't executed // in parallel and no more frequently than specified in timeout function. // In classic (`iframe`-based) editor, document is used as a trigger, to provide magicline // functionality when mouse is below the body (short content, short body). editable.attachListener( that.inInlineMode ? editable : doc, 'mousemove', function( event ) { checkMouseTimeoutPending = true; if ( editor.mode != 'wysiwyg' || editor.readOnly || checkMouseTimer ) return; // IE<9 requires this event-driven object to be created // outside of the setTimeout statement. // Otherwise it loses the event object with its properties. var mouse = { x: event.data.$.clientX, y: event.data.$.clientY }; checkMouseTimer = setTimeout( function() { checkMouse( mouse ); }, 30 ); // balances performance and accessibility } ); // This one removes box on scroll event. // It is to avoid box displacement. editable.attachListener( win, 'scroll', function() { if ( editor.mode != 'wysiwyg' ) return; that.line.detach(); // To figure this out just look at the mouseup // event handler below. if ( env.webkit ) { that.hiddenMode = 1; clearTimeout( scrollTimeout ); scrollTimeout = setTimeout( function() { // Don't leave hidden mode until mouse remains pressed and // scroll is being used, i.e. when dragging something. if ( !that.mouseDown ) that.hiddenMode = 0; that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE% }, 50 ); that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE% } } ); // Those event handlers remove the box on mousedown // and don't reveal it until the mouse is released. // It is to prevent box insertion e.g. while scrolling // (w/ scrollbar), selecting and so on. editable.attachListener( env_ie8 ? doc : win, 'mousedown', function() { if ( editor.mode != 'wysiwyg' ) return; that.line.detach(); that.hiddenMode = 1; that.mouseDown = 1; that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE% } ); // Google Chrome doesn't trigger this on the scrollbar (since 2009...) // so it is totally useless to check for scroll finish // see: http://code.google.com/p/chromium/issues/detail?id=14204 editable.attachListener( env_ie8 ? doc : win, 'mouseup', function() { that.hiddenMode = 0; that.mouseDown = 0; that.debug.showHidden( that.hiddenMode ); // %REMOVE_LINE% } ); // Editor commands for accessing difficult focus spaces. editor.addCommand( 'accessPreviousSpace', accessFocusSpaceCmd( that ) ); editor.addCommand( 'accessNextSpace', accessFocusSpaceCmd( that, true ) ); editor.setKeystroke( [ [ config.magicline_keystrokePrevious, 'accessPreviousSpace' ], [ config.magicline_keystrokeNext, 'accessNextSpace' ] ] ); // Revert magicline hot node on undo/redo. editor.on( 'loadSnapshot', function() { var elements, element, i; for ( var t in { p: 1, br: 1, div: 1 } ) { // document.find is not available in QM (https://dev.ckeditor.com/ticket/11149). elements = editor.document.getElementsByTag( t ); for ( i = elements.count(); i--; ) { if ( ( element = elements.getItem( i ) ).data( 'cke-magicline-hot' ) ) { // Restore hotNode that.hotNode = element; // Restore last access direction that.lastCmdDirection = element.data( 'cke-magicline-dir' ) === 'true' ? true : false; return; } } } } ); // This method handles mousemove mouse for box toggling. // It uses mouse position to determine underlying element, then // it tries to use different trigger type in order to place the box // in correct place. The following procedure is executed periodically. function checkMouse( mouse ) { that.debug.groupStart( 'CheckMouse' ); // %REMOVE_LINE% that.debug.startTimer(); // %REMOVE_LINE% that.mouse = mouse; that.trigger = null; checkMouseTimer = null; updateWindowSize( that ); if ( checkMouseTimeoutPending && // There must be an event pending. !that.hiddenMode && // Can't be in hidden mode. editor.focusManager.hasFocus && // Editor must have focus. !that.line.mouseNear() && // Mouse pointer can't be close to the box. ( that.element = elementFromMouse( that, true ) ) // There must be valid element. ) { // If trigger exists, and trigger is correct -> show the box. // Don't show the line if trigger is a descendant of some tabu-list element. if ( ( that.trigger = triggerEditable( that ) || triggerEdge( that ) || triggerExpand( that ) ) && !isInTabu( that, that.trigger.upper || that.trigger.lower ) ) { that.line.attach().place(); } // Otherwise remove the box else { that.trigger = null; that.line.detach(); } that.debug.showTrigger( that.trigger ); // %REMOVE_LINE% that.debug.mousePos( mouse.y, that.element ); // %REMOVE_LINE% checkMouseTimeoutPending = false; } that.debug.stopTimer(); // %REMOVE_LINE% that.debug.groupEnd(); // %REMOVE_LINE% } // This one allows testing and debugging. It reveals some // inner methods to the world. editor._.magiclineBackdoor = { accessFocusSpace: accessFocusSpace, boxTrigger: boxTrigger, isLine: isLine, getAscendantTrigger: getAscendantTrigger, getNonEmptyNeighbour: getNonEmptyNeighbour, getSize: getSize, that: that, triggerEdge: triggerEdge, triggerEditable: triggerEditable, triggerExpand: triggerExpand }; } } // Some shorthands for common methods to save bytes var extend = CKEDITOR.tools.extend, newElement = CKEDITOR.dom.element, newElementFromHtml = newElement.createFromHtml, env = CKEDITOR.env, env_ie8 = CKEDITOR.env.ie && CKEDITOR.env.version < 9, dtd = CKEDITOR.dtd, // Global object associating enter modes with elements. enterElements = {}, // Constant values, types and so on. EDGE_TOP = 128, EDGE_BOTTOM = 64, EDGE_MIDDLE = 32, TYPE_EDGE = 16, TYPE_EXPAND = 8, LOOK_TOP = 4, LOOK_BOTTOM = 2, LOOK_NORMAL = 1, WHITE_SPACE = '\u00A0', DTD_LISTITEM = dtd.$listItem, DTD_TABLECONTENT = dtd.$tableContent, DTD_NONACCESSIBLE = extend( {}, dtd.$nonEditable, dtd.$empty ), DTD_BLOCK = dtd.$block, // Minimum time that must elapse between two update*Size calls. // It prevents constant getComuptedStyle calls and improves performance. CACHE_TIME = 100, // Shared CSS stuff for box elements CSS_COMMON = 'width:0px;height:0px;padding:0px;margin:0px;display:block;' + 'z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;', CSS_TRIANGLE = CSS_COMMON + 'border-color:transparent;display:block;border-style:solid;', TRIANGLE_HTML = '' + WHITE_SPACE + ''; enterElements[ CKEDITOR.ENTER_BR ] = 'br'; enterElements[ CKEDITOR.ENTER_P ] = 'p'; enterElements[ CKEDITOR.ENTER_DIV ] = 'div'; function areSiblings( that, upper, lower ) { return isHtml( upper ) && isHtml( lower ) && lower.equals( upper.getNext( function( node ) { return !( isEmptyTextNode( node ) || isComment( node ) || isFlowBreaker( node ) ); } ) ); } // boxTrigger is an abstract type which describes // the relationship between elements that may result // in showing the box. // // The following type is used by numerous methods // to share information about the hypothetical box placement // and look by referring to boxTrigger properties. function boxTrigger( triggerSetup ) { this.upper = triggerSetup[ 0 ]; this.lower = triggerSetup[ 1 ]; this.set.apply( this, triggerSetup.slice( 2 ) ); } boxTrigger.prototype = { set: function( edge, type, look ) { this.properties = edge + type + ( look || LOOK_NORMAL ); return this; }, is: function( property ) { return ( this.properties & property ) == property; } }; var elementFromMouse = ( function() { function elementFromPoint( doc, mouse ) { var pointedElement = doc.$.elementFromPoint( mouse.x, mouse.y ); // IE9QM: from times to times it will return an empty object on scroll bar hover. (https://dev.ckeditor.com/ticket/12185) return pointedElement && pointedElement.nodeType ? new CKEDITOR.dom.element( pointedElement ) : null; } return function( that, ignoreBox, forceMouse ) { if ( !that.mouse ) return null; var doc = that.doc, lineWrap = that.line.wrap, mouse = forceMouse || that.mouse, // Note: element might be null. element = elementFromPoint( doc, mouse ); // If ignoreBox is set and element is the box, it means that we // need to hide the box for a while, repeat elementFromPoint // and show it again. if ( ignoreBox && isLine( that, element ) ) { lineWrap.hide(); element = elementFromPoint( doc, mouse ); lineWrap.show(); } // Return nothing if: // \-> Element is not HTML. if ( !( element && element.type == CKEDITOR.NODE_ELEMENT && element.$ ) ) return null; // Also return nothing if: // \-> We're IE<9 and element is out of the top-level element (editable for inline and HTML for classic (`iframe`-based)). // This is due to the bug which allows IE<9 firing mouse events on element // with contenteditable=true while doing selection out (far, away) of the element. // Thus we must always be sure that we stay in editable or HTML. if ( env.ie && env.version < 9 ) { if ( !( that.boundary.equals( element ) || that.boundary.contains( element ) ) ) return null; } return element; }; } )(); // Gets the closest parent node that belongs to triggers group. function getAscendantTrigger( that ) { var node = that.element, trigger; if ( node && isHtml( node ) ) { trigger = node.getAscendant( that.triggers, true ); // If trigger is an element, neither editable nor editable's ascendant. if ( trigger && that.editable.contains( trigger ) ) { // Check for closest editable limit. // Don't consider trigger as a limit as it may be nested editable (includeSelf=false) (https://dev.ckeditor.com/ticket/12009). var limit = getClosestEditableLimit( trigger ); // Trigger in nested editable area. if ( limit.getAttribute( 'contenteditable' ) == 'true' ) return trigger; // Trigger in non-editable area. else if ( limit.is( that.triggers ) ) return limit; else return null; } else { return null; } } return null; } function getMidpoint( that, upper, lower ) { updateSize( that, upper ); updateSize( that, lower ); var upperSizeBottom = upper.size.bottom, lowerSizeTop = lower.size.top; return upperSizeBottom && lowerSizeTop ? 0 | ( upperSizeBottom + lowerSizeTop ) / 2 : upperSizeBottom || lowerSizeTop; } // Get nearest node (either text or HTML), but: // \-> Omit all empty text nodes (containing white characters only). // \-> Omit BR elements // \-> Omit flow breakers. function getNonEmptyNeighbour( that, node, goBack ) { node = node[ goBack ? 'getPrevious' : 'getNext' ]( function( node ) { return ( isTextNode( node ) && !isEmptyTextNode( node ) ) || ( isHtml( node ) && !isFlowBreaker( node ) && !isLine( that, node ) ); } ); return node; } function inBetween( val, lower, upper ) { return val > lower && val < upper; } // Returns the closest ancestor that has contenteditable attribute. // Such ancestor is the limit of (non-)editable DOM branch that element // belongs to. This method omits editor editable. function getClosestEditableLimit( element, includeSelf ) { if ( element.data( 'cke-editable' ) ) return null; if ( !includeSelf ) element = element.getParent(); while ( element ) { if ( element.data( 'cke-editable' ) ) return null; if ( element.hasAttribute( 'contenteditable' ) ) return element; element = element.getParent(); } return null; } // Access space line consists of a few elements (spans): // \-> Line wrapper. // \-> Line. // \-> Line triangles: left triangle (LT), right triangle (RT). // \-> Button handler (BTN). // // +--------------------------------------------------- line.wrap (span) -----+ // | +---------------------------------------------------- line (span) -----+ | // | | +- LT \ +- BTN -+ / RT -+ | | // | | | \ | | | / | | | // | | | / | <__| | \ | | | // | | +-----/ +-------+ \-----+ | | // | +----------------------------------------------------------------------+ | // +--------------------------------------------------------------------------+ // function initLine( that ) { var doc = that.doc, // This the main box element that holds triangles and the insertion button line = newElementFromHtml( '', doc ), iconPath = CKEDITOR.getUrl( this.path + 'images/' + ( env.hidpi ? 'hidpi/' : '' ) + 'icon' + ( that.rtl ? '-rtl' : '' ) + '.png' ); extend( line, { attach: function() { // Only if not already attached if ( !this.wrap.getParent() ) this.wrap.appendTo( that.editable, true ); return this; }, // Looks are as follows: [ LOOK_TOP, LOOK_BOTTOM, LOOK_NORMAL ]. lineChildren: [ extend( newElementFromHtml( '', doc ), { base: CSS_COMMON + 'height:17px;width:17px;' + ( that.rtl ? 'left' : 'right' ) + ':17px;' + 'background:url(' + iconPath + ') center no-repeat ' + that.boxColor + ';cursor:pointer;' + ( env.hc ? 'font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;' : '' ) + ( env.hidpi ? 'background-size: 9px 10px;' : '' ), looks: [ 'top:-8px; border-radius: 2px;', 'top:-17px; border-radius: 2px 2px 0px 0px;', 'top:-1px; border-radius: 0px 0px 2px 2px;' ] } ), extend( newElementFromHtml( TRIANGLE_HTML, doc ), { base: CSS_TRIANGLE + 'left:0px;border-left-color:' + that.boxColor + ';', looks: [ 'border-width:8px 0 8px 8px;top:-8px', 'border-width:8px 0 0 8px;top:-8px', 'border-width:0 0 8px 8px;top:0px' ] } ), extend( newElementFromHtml( TRIANGLE_HTML, doc ), { base: CSS_TRIANGLE + 'right:0px;border-right-color:' + that.boxColor + ';', looks: [ 'border-width:8px 8px 8px 0;top:-8px', 'border-width:8px 8px 0 0;top:-8px', 'border-width:0 8px 8px 0;top:0px' ] } ) ], detach: function() { // Detach only if already attached. if ( this.wrap.getParent() ) this.wrap.remove(); return this; }, // Checks whether mouseY is around an element by comparing boundaries and considering // an offset distance. mouseNear: function() { that.debug.groupStart( 'mouseNear' ); // %REMOVE_LINE% updateSize( that, this ); var offset = that.holdDistance, size = this.size; // Determine neighborhood by element dimensions and offsets. if ( size && inBetween( that.mouse.y, size.top - offset, size.bottom + offset ) && inBetween( that.mouse.x, size.left - offset, size.right + offset ) ) { that.debug.logEnd( 'Mouse is near.' ); // %REMOVE_LINE% return true; } that.debug.logEnd( 'Mouse isn\'t near.' ); // %REMOVE_LINE% return false; }, // Adjusts position of the box according to the trigger properties. // If also affects look of the box depending on the type of the trigger. place: function() { var view = that.view, editable = that.editable, trigger = that.trigger, upper = trigger.upper, lower = trigger.lower, any = upper || lower, parent = any.getParent(), styleSet = {}; // Save recent trigger for further insertion. // It is necessary due to the fact, that that.trigger may // contain different boxTrigger at the moment of insertion // or may be even null. this.trigger = trigger; upper && updateSize( that, upper, true ); lower && updateSize( that, lower, true ); updateSize( that, parent, true ); // Yeah, that's gonna be useful in inline-mode case. if ( that.inInlineMode ) updateEditableSize( that, true ); // Set X coordinate (left, right, width). if ( parent.equals( editable ) ) { styleSet.left = view.scroll.x; styleSet.right = -view.scroll.x; styleSet.width = ''; } else { styleSet.left = any.size.left - any.size.margin.left + view.scroll.x - ( that.inInlineMode ? view.editable.left + view.editable.border.left : 0 ); styleSet.width = any.size.outerWidth + any.size.margin.left + any.size.margin.right + view.scroll.x; styleSet.right = ''; } // Set Y coordinate (top) for trigger consisting of two elements. if ( upper && lower ) { // No margins at all or they're equal. Place box right between. if ( upper.size.margin.bottom === lower.size.margin.top ) styleSet.top = 0 | ( upper.size.bottom + upper.size.margin.bottom / 2 ); else { // Upper margin < lower margin. Place at lower margin. if ( upper.size.margin.bottom < lower.size.margin.top ) styleSet.top = upper.size.bottom + upper.size.margin.bottom; // Upper margin > lower margin. Place at upper margin - lower margin. else styleSet.top = upper.size.bottom + upper.size.margin.bottom - lower.size.margin.top; } } // Set Y coordinate (top) for single-edge trigger. else if ( !upper ) styleSet.top = lower.size.top - lower.size.margin.top; else if ( !lower ) { styleSet.top = upper.size.bottom + upper.size.margin.bottom; } // Set box button modes if close to the viewport horizontal edge // or look forced by the trigger. if ( trigger.is( LOOK_TOP ) || inBetween( styleSet.top, view.scroll.y - 15, view.scroll.y + 5 ) ) { styleSet.top = that.inInlineMode ? 0 : view.scroll.y; this.look( LOOK_TOP ); } else if ( trigger.is( LOOK_BOTTOM ) || inBetween( styleSet.top, view.pane.bottom - 5, view.pane.bottom + 15 ) ) { styleSet.top = that.inInlineMode ? ( view.editable.height + view.editable.padding.top + view.editable.padding.bottom ) : ( view.pane.bottom - 1 ); this.look( LOOK_BOTTOM ); } else { if ( that.inInlineMode ) styleSet.top -= view.editable.top + view.editable.border.top; this.look( LOOK_NORMAL ); } if ( that.inInlineMode ) { // 1px bug here... styleSet.top--; // Consider the editable to be an element with overflow:scroll // and non-zero scrollTop/scrollLeft value. // For example: divarea editable. (https://dev.ckeditor.com/ticket/9383) styleSet.top += view.editable.scroll.top; styleSet.left += view.editable.scroll.left; } // Append `px` prefixes. for ( var style in styleSet ) styleSet[ style ] = CKEDITOR.tools.cssLength( styleSet[ style ] ); this.setStyles( styleSet ); }, // Changes look of the box according to current needs. // Three different styles are available: [ LOOK_TOP, LOOK_BOTTOM, LOOK_NORMAL ]. look: function( look ) { if ( this.oldLook == look ) return; for ( var i = this.lineChildren.length, child; i--; ) ( child = this.lineChildren[ i ] ).setAttribute( 'style', child.base + child.looks[ 0 | look / 2 ] ); this.oldLook = look; }, wrap: new newElement( 'span', that.doc ) } ); // Insert children into the box. for ( var i = line.lineChildren.length; i--; ) line.lineChildren[ i ].appendTo( line ); // Set default look of the box. line.look( LOOK_NORMAL ); // Using that wrapper prevents IE (8,9) from resizing editable area at the moment // of box insertion. This works thanks to the fact, that positioned box is wrapped by // an inline element. So much tricky. line.appendTo( line.wrap ); // Make the box unselectable. line.unselectable(); // Handle accessSpace node insertion. line.lineChildren[ 0 ].on( 'mouseup', function( event ) { line.detach(); accessFocusSpace( that, function( accessNode ) { // Use old trigger that was saved by 'place' method. Look: line.place var trigger = that.line.trigger; accessNode[ trigger.is( EDGE_TOP ) ? 'insertBefore' : 'insertAfter' ]( trigger.is( EDGE_TOP ) ? trigger.lower : trigger.upper ); }, true ); that.editor.focus(); if ( !env.ie && that.enterMode != CKEDITOR.ENTER_BR ) that.hotNode.scrollIntoView(); event.data.preventDefault( true ); } ); // Prevents IE9 from displaying the resize box and disables drag'n'drop functionality. line.on( 'mousedown', function( event ) { event.data.preventDefault( true ); } ); that.line = line; } // This function allows accessing any focus space according to the insert function: // * For enterMode ENTER_P it creates P element filled with dummy white-space. // * For enterMode ENTER_DIV it creates DIV element filled with dummy white-space. // * For enterMode ENTER_BR it creates BR element or   in IE. // // The node is being inserted according to insertFunction. Finally the method // selects the non-breaking space making the node ready for typing. function accessFocusSpace( that, insertFunction, doSave ) { var range = new CKEDITOR.dom.range( that.doc ), editor = that.editor, accessNode; // IE requires text node of   in ENTER_BR mode. if ( env.ie && that.enterMode == CKEDITOR.ENTER_BR ) accessNode = that.doc.createText( WHITE_SPACE ); // In other cases a regular element is used. else { // Use the enterMode of editable's limit or editor's // enter mode if not in nested editable. var limit = getClosestEditableLimit( that.element, true ), // This is an enter mode for the context. We cannot use // editor.activeEnterMode because the focused nested editable will // have a different enterMode as editor but magicline will be inserted // directly into editor's editable. enterMode = limit && limit.data( 'cke-enter-mode' ) || that.enterMode; accessNode = new newElement( enterElements[ enterMode ], that.doc ); if ( !accessNode.is( 'br' ) ) { var dummy = that.doc.createText( WHITE_SPACE ); dummy.appendTo( accessNode ); } } doSave && editor.fire( 'saveSnapshot' ); insertFunction( accessNode ); //dummy.appendTo( accessNode ); range.moveToPosition( accessNode, CKEDITOR.POSITION_AFTER_START ); editor.getSelection().selectRanges( [ range ] ); that.hotNode = accessNode; doSave && editor.fire( 'saveSnapshot' ); } // Access focus space on demand by taking an element under the caret as a reference. // The space is accessed provided the element under the caret is trigger AND: // // 1. First/last-child of its parent: // +----------------------- Parent element -+ // | +------------------------------ DIV -+ | <-- Access before // | | Foo^ | | // | | | | // | +------------------------------------+ | <-- Access after // +----------------------------------------+ // // OR // // 2. It has a direct sibling element, which is also a trigger: // +-------------------------------- DIV#1 -+ // | Foo^ | // | | // +----------------------------------------+ // <-- Access here // +-------------------------------- DIV#2 -+ // | Bar | // | | // +----------------------------------------+ // // OR // // 3. It has a direct sibling, which is a trigger and has a valid neighbour trigger, // but belongs to dtd.$.empty/nonEditable: // +------------------------------------ P -+ // | Foo^ | // | | // +----------------------------------------+ // +----------------------------------- HR -+ // <-- Access here // +-------------------------------- DIV#2 -+ // | Bar | // | | // +----------------------------------------+ // function accessFocusSpaceCmd( that, insertAfter ) { return { canUndo: true, modes: { wysiwyg: 1 }, exec: ( function() { // Inserts line (accessNode) at the position by taking target node as a reference. function doAccess( target ) { // Remove old hotNode under certain circumstances. var hotNodeChar = ( env.ie && env.version < 9 ? ' ' : WHITE_SPACE ), removeOld = that.hotNode && // Old hotNode must exist. that.hotNode.getText() == hotNodeChar && // Old hotNode hasn't been changed. that.element.equals( that.hotNode ) && // Caret is inside old hotNode. // Command is executed in the same direction. that.lastCmdDirection === !!insertAfter; // jshint ignore:line accessFocusSpace( that, function( accessNode ) { if ( removeOld && that.hotNode ) that.hotNode.remove(); accessNode[ insertAfter ? 'insertAfter' : 'insertBefore' ]( target ); // Make this element distinguishable. Also remember the direction // it's been inserted into document. accessNode.setAttributes( { 'data-cke-magicline-hot': 1, 'data-cke-magicline-dir': !!insertAfter } ); // Save last direction of the command (is insertAfter?). that.lastCmdDirection = !!insertAfter; } ); if ( !env.ie && that.enterMode != CKEDITOR.ENTER_BR ) that.hotNode.scrollIntoView(); // Detach the line if was visible (previously triggered by mouse). that.line.detach(); } return function( editor ) { var selected = editor.getSelection().getStartElement(), limit; // (https://dev.ckeditor.com/ticket/9833) Go down to the closest non-inline element in DOM structure // since inline elements don't participate in in magicline. selected = selected.getAscendant( DTD_BLOCK, 1 ); // Stop if selected is a child of a tabu-list element. if ( isInTabu( that, selected ) ) return; // Sometimes it may happen that there's no parent block below selected element // or, for example, getAscendant reaches editable or editable parent. // We must avoid such pathological cases. if ( !selected || selected.equals( that.editable ) || selected.contains( that.editable ) ) return; // Executing the command directly in nested editable should // access space before/after it. if ( ( limit = getClosestEditableLimit( selected ) ) && limit.getAttribute( 'contenteditable' ) == 'false' ) selected = limit; // That holds element from mouse. Replace it with the // element under the caret. that.element = selected; // (3.) Handle the following cases where selected neighbour // is a trigger inaccessible for the caret AND: // - Is first/last-child // OR // - Has a sibling, which is also a trigger. var neighbor = getNonEmptyNeighbour( that, selected, !insertAfter ), neighborSibling; // Check for a neighbour that belongs to triggers. // Consider only non-accessible elements (they cannot have any children) // since they cannot be given a caret inside, to run the command // the regular way (1. & 2.). if ( isHtml( neighbor ) && neighbor.is( that.triggers ) && neighbor.is( DTD_NONACCESSIBLE ) && ( // Check whether neighbor is first/last-child. !getNonEmptyNeighbour( that, neighbor, !insertAfter ) || // Check for a sibling of a neighbour that also is a trigger. ( ( neighborSibling = getNonEmptyNeighbour( that, neighbor, !insertAfter ) ) && isHtml( neighborSibling ) && neighborSibling.is( that.triggers ) ) ) ) { doAccess( neighbor ); return; } // Look for possible target element DOWN "selected" DOM branch (towards editable) // that belong to that.triggers var target = getAscendantTrigger( that, selected ); // No HTML target -> no access. if ( !isHtml( target ) ) return; // (1.) Target is first/last child -> access. if ( !getNonEmptyNeighbour( that, target, !insertAfter ) ) { doAccess( target ); return; } var sibling = getNonEmptyNeighbour( that, target, !insertAfter ); // (2.) Target has a sibling that belongs to that.triggers -> access. if ( sibling && isHtml( sibling ) && sibling.is( that.triggers ) ) { doAccess( target ); return; } }; } )() }; } function isLine( that, node ) { if ( !( node && node.type == CKEDITOR.NODE_ELEMENT && node.$ ) ) return false; var line = that.line; return line.wrap.equals( node ) || line.wrap.contains( node ); } // Is text node containing white-spaces only? var isEmptyTextNode = CKEDITOR.dom.walker.whitespaces(); // Is fully visible HTML node? function isHtml( node ) { return node && node.type == CKEDITOR.NODE_ELEMENT && node.$; // IE requires that } function isFloated( element ) { if ( !isHtml( element ) ) return false; var options = { left: 1, right: 1, center: 1 }; return !!( options[ element.getComputedStyle( 'float' ) ] || options[ element.getAttribute( 'align' ) ] ); } function isFlowBreaker( element ) { if ( !isHtml( element ) ) return false; return isPositioned( element ) || isFloated( element ); } // Isn't node of NODE_COMMENT type? var isComment = CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_COMMENT ); function isPositioned( element ) { return !!{ absolute: 1, fixed: 1 }[ element.getComputedStyle( 'position' ) ]; } // Is text node? function isTextNode( node ) { return node && node.type == CKEDITOR.NODE_TEXT; } function isTrigger( that, element ) { return isHtml( element ) ? element.is( that.triggers ) : null; } function isInTabu( that, element ) { if ( !element ) return false; var parents = element.getParents( 1 ); for ( var i = parents.length ; i-- ; ) { for ( var j = that.tabuList.length ; j-- ; ) { if ( parents[ i ].hasAttribute( that.tabuList[ j ] ) ) return true; } } return false; } // This function checks vertically is there's a relevant child between element's edge // and the pointer. // \-> Table contents are omitted. function isChildBetweenPointerAndEdge( that, parent, edgeBottom ) { var edgeChild = parent[ edgeBottom ? 'getLast' : 'getFirst' ]( function( node ) { return that.isRelevant( node ) && !node.is( DTD_TABLECONTENT ); } ); if ( !edgeChild ) return false; updateSize( that, edgeChild ); return edgeBottom ? edgeChild.size.top > that.mouse.y : edgeChild.size.bottom < that.mouse.y; } // This method handles edge cases: // \-> Mouse is around upper or lower edge of view pane. // \-> Also scroll position is either minimal or maximal. // \-> It's OK to show LOOK_TOP(BOTTOM) type line. // // This trigger doesn't need additional post-filtering. // // +----------------------------- Editable -+ /-- // | +---------------------- First child -+ | | <-- Top edge (first child) // | | | | | // | | | | | * Mouse activation area * // | | | | | // | | ... | | \-- Top edge + trigger offset // | . . | // | | // | . . | // | | ... | | /-- Bottom edge - trigger offset // | | | | | // | | | | | * Mouse activation area * // | | | | | // | +----------------------- Last child -+ | | <-- Bottom edge (last child) // +----------------------------------------+ \-- // function triggerEditable( that ) { that.debug.groupStart( 'triggerEditable' ); // %REMOVE_LINE% var editable = that.editable, mouse = that.mouse, view = that.view, triggerOffset = that.triggerOffset, triggerLook; // Update editable dimensions. updateEditableSize( that ); // This flag determines whether checking bottom trigger. var bottomTrigger = mouse.y > ( that.inInlineMode ? ( view.editable.top + view.editable.height / 2 ) : ( // This is to handle case when editable.height / 2 <<< pane.height. Math.min( view.editable.height, view.pane.height ) / 2 ) ), // Edge node according to bottomTrigger. edgeNode = editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( function( node ) { return !( isEmptyTextNode( node ) || isComment( node ) ); } ); // There's no edge node. Abort. if ( !edgeNode ) { that.debug.logEnd( 'ABORT. No edge node found.' ); // %REMOVE_LINE% return null; } // If the edgeNode in editable is ML, get the next one. if ( isLine( that, edgeNode ) ) { edgeNode = that.line.wrap[ bottomTrigger ? 'getPrevious' : 'getNext' ]( function( node ) { return !( isEmptyTextNode( node ) || isComment( node ) ); } ); } // Exclude bad nodes (no ML needed then): // \-> Edge node is text. // \-> Edge node is floated, etc. // // Edge node *must be* a valid trigger at this stage as well. if ( !isHtml( edgeNode ) || isFlowBreaker( edgeNode ) || !isTrigger( that, edgeNode ) ) { that.debug.logEnd( 'ABORT. Invalid edge node.' ); // %REMOVE_LINE% return null; } // Update size of edge node. Dimensions will be necessary. updateSize( that, edgeNode ); // Return appropriate trigger according to bottomTrigger. // \-> Top edge trigger case first. if ( !bottomTrigger && // Top trigger case. edgeNode.size.top >= 0 && // Check if the first element is fully visible. inBetween( mouse.y, 0, edgeNode.size.top + triggerOffset ) ) { // Check if mouse in [0, edgeNode.top + triggerOffset]. // Determine trigger look. triggerLook = that.inInlineMode || view.scroll.y === 0 ? LOOK_TOP : LOOK_NORMAL; that.debug.logEnd( 'SUCCESS. Created box trigger. EDGE_TOP.' ); // %REMOVE_LINE% return new boxTrigger( [ null, edgeNode, EDGE_TOP, TYPE_EDGE, triggerLook ] ); } // \-> Bottom case. else if ( bottomTrigger && edgeNode.size.bottom <= view.pane.height && // Check if the last element is fully visible inBetween( mouse.y, // Check if mouse in... edgeNode.size.bottom - triggerOffset, view.pane.height ) ) { // [ edgeNode.bottom - triggerOffset, paneHeight ] // Determine trigger look. triggerLook = that.inInlineMode || inBetween( edgeNode.size.bottom, view.pane.height - triggerOffset, view.pane.height ) ? LOOK_BOTTOM : LOOK_NORMAL; that.debug.logEnd( 'SUCCESS. Created box trigger. EDGE_BOTTOM.' ); // %REMOVE_LINE% return new boxTrigger( [ edgeNode, null, EDGE_BOTTOM, TYPE_EDGE, triggerLook ] ); } that.debug.logEnd( 'ABORT. No trigger created.' ); // %REMOVE_LINE% return null; } // This method covers cases *inside* of an element: // \-> The pointer is in the top (bottom) area of an element and there's // HTML node before (after) this element. // \-> An element being the first or last child of its parent. // // +----------------------- Parent element -+ // | +----------------------- Element #1 -+ | /-- // | | | | | * Mouse activation area (as first child) * // | | | | \-- // | | | | /-- // | | | | | * Mouse activation area (Element #2) * // | +------------------------------------+ | \-- // | | // | +----------------------- Element #2 -+ | /-- // | | | | | * Mouse activation area (Element #1) * // | | | | \-- // | | | | // | +------------------------------------+ | // | | // | Text node is here. | // | | // | +----------------------- Element #3 -+ | // | | | | // | | | | // | | | | /-- // | | | | | * Mouse activation area (as last child) * // | +------------------------------------+ | \-- // +----------------------------------------+ // function triggerEdge( that ) { that.debug.groupStart( 'triggerEdge' ); // %REMOVE_LINE% var mouse = that.mouse, view = that.view, triggerOffset = that.triggerOffset; // Get the ascendant trigger basing on elementFromMouse. var element = getAscendantTrigger( that ); that.debug.logElements( [ element ], [ 'Ascendant trigger' ], 'First stage' ); // %REMOVE_LINE% // Abort if there's no appropriate element. if ( !element ) { that.debug.logEnd( 'ABORT. No element, element is editable or element contains editable.' ); // %REMOVE_LINE% return null; } // Dimensions will be necessary. updateSize( that, element ); // If triggerOffset is larger than a half of element's height, // use an offset of 1/2 of element's height. If the offset wasn't reduced, // top area would cover most (all) cases. var fixedOffset = Math.min( triggerOffset, 0 | ( element.size.outerHeight / 2 ) ), // This variable will hold the trigger to be returned. triggerSetup = [], triggerLook, // This flag determines whether dealing with a bottom trigger. bottomTrigger; // \-> Top trigger. if ( inBetween( mouse.y, element.size.top - 1, element.size.top + fixedOffset ) ) bottomTrigger = false; // \-> Bottom trigger. else if ( inBetween( mouse.y, element.size.bottom - fixedOffset, element.size.bottom + 1 ) ) bottomTrigger = true; // \-> Abort. Not in a valid trigger space. else { that.debug.logEnd( 'ABORT. Not around of any edge.' ); // %REMOVE_LINE% return null; } // Reject wrong elements. // \-> Reject an element which is a flow breaker. // \-> Reject an element which has a child above/below the mouse pointer. // \-> Reject an element which belongs to list items. if ( isFlowBreaker( element ) || isChildBetweenPointerAndEdge( that, element, bottomTrigger ) || element.getParent().is( DTD_LISTITEM ) ) { that.debug.logEnd( 'ABORT. element is wrong', element ); // %REMOVE_LINE% return null; } // Get sibling according to bottomTrigger. var elementSibling = getNonEmptyNeighbour( that, element, !bottomTrigger ); // No sibling element. // This is a first or last child case. if ( !elementSibling ) { // No need to reject the element as it has already been done before. // Prepare a trigger. // Determine trigger look. if ( element.equals( that.editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( that.isRelevant ) ) ) { updateEditableSize( that ); if ( bottomTrigger && inBetween( mouse.y, element.size.bottom - fixedOffset, view.pane.height ) && inBetween( element.size.bottom, view.pane.height - fixedOffset, view.pane.height ) ) { triggerLook = LOOK_BOTTOM; } else if ( inBetween( mouse.y, 0, element.size.top + fixedOffset ) ) { triggerLook = LOOK_TOP; } } else { triggerLook = LOOK_NORMAL; } triggerSetup = [ null, element ][ bottomTrigger ? 'reverse' : 'concat' ]().concat( [ bottomTrigger ? EDGE_BOTTOM : EDGE_TOP, TYPE_EDGE, triggerLook, element.equals( that.editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( that.isRelevant ) ) ? ( bottomTrigger ? LOOK_BOTTOM : LOOK_TOP ) : LOOK_NORMAL ] ); that.debug.log( 'Configured edge trigger of ' + ( bottomTrigger ? 'EDGE_BOTTOM' : 'EDGE_TOP' ) ); // %REMOVE_LINE% } // Abort. Sibling is a text element. else if ( isTextNode( elementSibling ) ) { that.debug.logEnd( 'ABORT. Sibling is non-empty text element' ); // %REMOVE_LINE% return null; } // Check if the sibling is a HTML element. // If so, create an TYPE_EDGE, EDGE_MIDDLE trigger. else if ( isHtml( elementSibling ) ) { // Reject wrong elementSiblings. // \-> Reject an elementSibling which is a flow breaker. // \-> Reject an elementSibling which isn't a trigger. // \-> Reject an elementSibling which belongs to list items. if ( isFlowBreaker( elementSibling ) || !isTrigger( that, elementSibling ) || elementSibling.getParent().is( DTD_LISTITEM ) ) { that.debug.logEnd( 'ABORT. elementSibling is wrong', elementSibling ); // %REMOVE_LINE% return null; } // Prepare a trigger. triggerSetup = [ elementSibling, element ][ bottomTrigger ? 'reverse' : 'concat' ]().concat( [ EDGE_MIDDLE, TYPE_EDGE ] ); that.debug.log( 'Configured edge trigger of EDGE_MIDDLE' ); // %REMOVE_LINE% } if ( 0 in triggerSetup ) { that.debug.logEnd( 'SUCCESS. Returning a trigger.' ); // %REMOVE_LINE% return new boxTrigger( triggerSetup ); } that.debug.logEnd( 'ABORT. No trigger generated.' ); // %REMOVE_LINE% return null; } // Checks iteratively up and down in search for elements using elementFromMouse method. // Useful if between two triggers. // // +----------------------- Parent element -+ // | +----------------------- Element #1 -+ | // | | | | // | | | | // | | | | // | +------------------------------------+ | // | | /-- // | . | | // | . +-- Floated -+ | | // | | | | | | * Mouse activation area * // | | | IGNORE | | | // | X | | | | Method searches vertically for sibling elements. // | | +------------+ | | Start point is X (mouse-y coordinate). // | | | | Floated elements, comments and empty text nodes are omitted. // | . | | // | . | | // | | \-- // | +----------------------- Element #2 -+ | // | | | | // | | | | // | | | | // | | | | // | +------------------------------------+ | // +----------------------------------------+ // var triggerExpand = ( function() { // The heart of the procedure. This method creates triggers that are // filtered by expandFilter method. function expandEngine( that ) { that.debug.groupStart( 'expandEngine' ); // %REMOVE_LINE% var startElement = that.element, upper, lower, trigger; if ( !isHtml( startElement ) || startElement.contains( that.editable ) ) { that.debug.logEnd( 'ABORT. No start element, or start element contains editable.' ); // %REMOVE_LINE% return null; } // Stop searching if element is in non-editable branch of DOM. if ( startElement.isReadOnly() ) return null; trigger = verticalSearch( that, function( current, startElement ) { return !startElement.equals( current ); // stop when start element and the current one differ }, function( that, mouse ) { return elementFromMouse( that, true, mouse ); }, startElement ), upper = trigger.upper, lower = trigger.lower; that.debug.logElements( [ upper, lower ], [ 'Upper', 'Lower' ], 'Pair found' ); // %REMOVE_LINE% // Success: two siblings have been found if ( areSiblings( that, upper, lower ) ) { that.debug.logEnd( 'SUCCESS. Expand trigger created.' ); // %REMOVE_LINE% return trigger.set( EDGE_MIDDLE, TYPE_EXPAND ); } that.debug.logElements( [ startElement, upper, lower ], // %REMOVE_LINE% [ 'Start', 'Upper', 'Lower' ], 'Post-processing' ); // %REMOVE_LINE% // Danger. Dragons ahead. // No siblings have been found during previous phase, post-processing may be necessary. // We can traverse DOM until a valid pair of elements around the pointer is found. // Prepare for post-processing: // 1. Determine if upper and lower are children of startElement. // 1.1. If so, find their ascendants that are closest to startElement (one level deeper than startElement). // 1.2. Otherwise use first/last-child of the startElement as upper/lower. Why?: // a) upper/lower belongs to another branch of the DOM tree. // b) verticalSearch encountered an edge of the viewport and failed. // 1.3. Make sure upper and lower still exist. Why?: // a) Upper and lower may be not belong to the branch of the startElement (may not exist at all) and // startElement has no children. // 2. Perform the post-processing. // 2.1. Gather dimensions of an upper element. // 2.2. Abort if lower edge of upper is already under the mouse pointer. Why?: // a) We expect upper to be above and lower below the mouse pointer. // 3. Perform iterative search while upper != lower. // 3.1. Find the upper-next element. If there's no such element, break current search. Why?: // a) There's no point in further search if there are only text nodes ahead. // 3.2. Calculate the distance between the middle point of ( upper, upperNext ) and mouse-y. // 3.3. If the distance is shorter than the previous best, save it (save upper, upperNext as well). // 3.4. If the optimal pair is found, assign it back to the trigger. // 1.1., 1.2. if ( upper && startElement.contains( upper ) ) { while ( !upper.getParent().equals( startElement ) ) upper = upper.getParent(); } else { upper = startElement.getFirst( function( node ) { return expandSelector( that, node ); } ); } if ( lower && startElement.contains( lower ) ) { while ( !lower.getParent().equals( startElement ) ) lower = lower.getParent(); } else { lower = startElement.getLast( function( node ) { return expandSelector( that, node ); } ); } // 1.3. if ( !upper || !lower ) { that.debug.logEnd( 'ABORT. There is no upper or no lower element.' ); // %REMOVE_LINE% return null; } // 2.1. updateSize( that, upper ); updateSize( that, lower ); if ( !checkMouseBetweenElements( that, upper, lower ) ) { that.debug.logEnd( 'ABORT. Mouse is already above upper or below lower.' ); // %REMOVE_LINE% return null; } var minDistance = Number.MAX_VALUE, currentDistance, upperNext, minElement, minElementNext; while ( lower && !lower.equals( upper ) ) { // 3.1. if ( !( upperNext = upper.getNext( that.isRelevant ) ) ) break; // 3.2. currentDistance = Math.abs( getMidpoint( that, upper, upperNext ) - that.mouse.y ); // 3.3. if ( currentDistance < minDistance ) { minDistance = currentDistance; minElement = upper; minElementNext = upperNext; } upper = upperNext; updateSize( that, upper ); } that.debug.logElements( [ minElement, minElementNext ], // %REMOVE_LINE% [ 'Min', 'MinNext' ], 'Post-processing results' ); // %REMOVE_LINE% // 3.4. if ( !minElement || !minElementNext ) { that.debug.logEnd( 'ABORT. No Min or MinNext' ); // %REMOVE_LINE% return null; } if ( !checkMouseBetweenElements( that, minElement, minElementNext ) ) { that.debug.logEnd( 'ABORT. Mouse is already above minElement or below minElementNext.' ); // %REMOVE_LINE% return null; } // An element of minimal distance has been found. Assign it to the trigger. trigger.upper = minElement; trigger.lower = minElementNext; // Success: post-processing revealed a pair of elements. that.debug.logEnd( 'SUCCESSFUL post-processing. Trigger created.' ); // %REMOVE_LINE% return trigger.set( EDGE_MIDDLE, TYPE_EXPAND ); } // This is default element selector used by the engine. function expandSelector( that, node ) { return !( isTextNode( node ) || isComment( node ) || isFlowBreaker( node ) || isLine( that, node ) || ( node.type == CKEDITOR.NODE_ELEMENT && node.$ && node.is( 'br' ) ) ); } // This method checks whether mouse-y is between the top edge of upper // and bottom edge of lower. // // NOTE: This method assumes that updateSize has already been called // for the elements and is up-to-date. // // +---------------------------- Upper -+ /-- // | | | // +------------------------------------+ | // | // ... | // | // X | * Return true for mouse-y in this range * // | // ... | // | // +---------------------------- Lower -+ | // | | | // +------------------------------------+ \-- // function checkMouseBetweenElements( that, upper, lower ) { return inBetween( that.mouse.y, upper.size.top, lower.size.bottom ); } // A method for trigger filtering. Accepts or rejects trigger pairs // by their location in DOM etc. function expandFilter( that, trigger ) { that.debug.groupStart( 'expandFilter' ); // %REMOVE_LINE% var upper = trigger.upper, lower = trigger.lower; if ( !upper || !lower || // NOT: EDGE_MIDDLE trigger ALWAYS has two elements. isFlowBreaker( lower ) || isFlowBreaker( upper ) || // NOT: one of the elements is floated or positioned lower.equals( upper ) || upper.equals( lower ) || // NOT: two trigger elements, one equals another. lower.contains( upper ) || upper.contains( lower ) ) { // NOT: two trigger elements, one contains another. that.debug.logEnd( 'REJECTED. No upper or no lower or they contain each other.' ); // %REMOVE_LINE% return false; } // YES: two trigger elements, pure siblings. else if ( isTrigger( that, upper ) && isTrigger( that, lower ) && areSiblings( that, upper, lower ) ) { that.debug.logElementsEnd( [ upper, lower ], // %REMOVE_LINE% [ 'upper', 'lower' ], 'APPROVED EDGE_MIDDLE' ); // %REMOVE_LINE% return true; } that.debug.logElementsEnd( [ upper, lower ], // %REMOVE_LINE% [ 'upper', 'lower' ], 'Rejected unknown pair' ); // %REMOVE_LINE% return false; } // Simple wrapper for expandEngine and expandFilter. return function( that ) { that.debug.groupStart( 'triggerExpand' ); // %REMOVE_LINE% var trigger = expandEngine( that ); that.debug.groupEnd(); // %REMOVE_LINE% return trigger && expandFilter( that, trigger ) ? trigger : null; }; } )(); // Collects dimensions of an element. var sizePrefixes = [ 'top', 'left', 'right', 'bottom' ]; function getSize( that, element, ignoreScroll, force ) { var docPosition = element.getDocumentPosition(), border = {}, margin = {}, padding = {}, box = {}; for ( var i = sizePrefixes.length; i--; ) { border[ sizePrefixes[ i ] ] = parseInt( getStyle( 'border-' + sizePrefixes[ i ] + '-width' ), 10 ) || 0; padding[ sizePrefixes[ i ] ] = parseInt( getStyle( 'padding-' + sizePrefixes[ i ] ), 10 ) || 0; margin[ sizePrefixes[ i ] ] = parseInt( getStyle( 'margin-' + sizePrefixes[ i ] ), 10 ) || 0; } // updateWindowSize if forced to do so OR NOT ignoring scroll. if ( !ignoreScroll || force ) updateWindowSize( that, force ); box.top = docPosition.y - ( ignoreScroll ? 0 : that.view.scroll.y ), box.left = docPosition.x - ( ignoreScroll ? 0 : that.view.scroll.x ), // w/ borders and paddings. box.outerWidth = element.$.offsetWidth, box.outerHeight = element.$.offsetHeight, // w/o borders and paddings. box.height = box.outerHeight - ( padding.top + padding.bottom + border.top + border.bottom ), box.width = box.outerWidth - ( padding.left + padding.right + border.left + border.right ), box.bottom = box.top + box.outerHeight, box.right = box.left + box.outerWidth; if ( that.inInlineMode ) { box.scroll = { top: element.$.scrollTop, left: element.$.scrollLeft }; } return extend( { border: border, padding: padding, margin: margin, ignoreScroll: ignoreScroll }, box, true ); function getStyle( propertyName ) { return element.getComputedStyle.call( element, propertyName ); } } function updateSize( that, element, ignoreScroll ) { if ( !isHtml( element ) ) // i.e. an element is hidden return ( element.size = null ); // -> reset size to make it useless for other methods if ( !element.size ) element.size = {}; // Abort if there was a similar query performed recently. // This kind of caching provides great performance improvement. else if ( element.size.ignoreScroll == ignoreScroll && element.size.date > new Date() - CACHE_TIME ) { that.debug.log( 'element.size: get from cache' ); // %REMOVE_LINE% return null; } that.debug.log( 'element.size: capture' ); // %REMOVE_LINE% return extend( element.size, getSize( that, element, ignoreScroll ), { date: +new Date() }, true ); } // Updates that.view.editable object. // This one must be called separately outside of updateWindowSize // to prevent cyclic dependency getSize<->updateWindowSize. // It calls getSize with force flag to avoid getWindowSize cache (look: getSize). function updateEditableSize( that, ignoreScroll ) { that.view.editable = getSize( that, that.editable, ignoreScroll, true ); } function updateWindowSize( that, force ) { if ( !that.view ) that.view = {}; var view = that.view; if ( !force && view && view.date > new Date() - CACHE_TIME ) { that.debug.log( 'win.size: get from cache' ); // %REMOVE_LINE% return; } that.debug.log( 'win.size: capturing' ); // %REMOVE_LINE% var win = that.win, scroll = win.getScrollPosition(), paneSize = win.getViewPaneSize(); extend( that.view, { scroll: { x: scroll.x, y: scroll.y, width: that.doc.$.documentElement.scrollWidth - paneSize.width, height: that.doc.$.documentElement.scrollHeight - paneSize.height }, pane: { width: paneSize.width, height: paneSize.height, bottom: paneSize.height + scroll.y }, date: +new Date() }, true ); } // This method searches document vertically using given // select criterion until stop criterion is fulfilled. function verticalSearch( that, stopCondition, selectCriterion, startElement ) { var upper = startElement, lower = startElement, mouseStep = 0, upperFound = false, lowerFound = false, viewPaneHeight = that.view.pane.height, mouse = that.mouse; while ( mouse.y + mouseStep < viewPaneHeight && mouse.y - mouseStep > 0 ) { if ( !upperFound ) upperFound = stopCondition( upper, startElement ); if ( !lowerFound ) lowerFound = stopCondition( lower, startElement ); // Still not found... if ( !upperFound && mouse.y - mouseStep > 0 ) upper = selectCriterion( that, { x: mouse.x, y: mouse.y - mouseStep } ); if ( !lowerFound && mouse.y + mouseStep < viewPaneHeight ) lower = selectCriterion( that, { x: mouse.x, y: mouse.y + mouseStep } ); if ( upperFound && lowerFound ) break; // Instead of ++ to reduce the number of invocations by half. // It's trades off accuracy in some edge cases for improved performance. mouseStep += 2; } return new boxTrigger( [ upper, lower, null, null ] ); } } )(); /** * Sets the default vertical distance between the edge of the element and the mouse pointer that * causes the magic line to appear. This option accepts a value in pixels, without the unit (for example: * `15` for 15 pixels). * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Changes the offset to 15px. * CKEDITOR.config.magicline_triggerOffset = 15; * * @cfg {Number} [magicline_triggerOffset=30] * @member CKEDITOR.config * @see CKEDITOR.config#magicline_holdDistance */ /** * Defines the distance between the mouse pointer and the box within * which the magic line stays revealed and no other focus space is offered to be accessed. * This value is relative to {@link #magicline_triggerOffset}. * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Increases the distance to 80% of CKEDITOR.config.magicline_triggerOffset. * CKEDITOR.config.magicline_holdDistance = .8; * * @cfg {Number} [magicline_holdDistance=0.5] * @member CKEDITOR.config * @see CKEDITOR.config#magicline_triggerOffset */ /** * Defines the default keystroke that accesses the closest unreachable focus space **before** * the caret (start of the selection). If there is no focus space available, the selection remains unchanged. * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Changes the default keystroke to "Ctrl + ,". * CKEDITOR.config.magicline_keystrokePrevious = CKEDITOR.CTRL + 188; * * @cfg {Number} [magicline_keystrokePrevious=CKEDITOR.CTRL + CKEDITOR.SHIFT + 51 (CTRL + SHIFT + 3)] * @member CKEDITOR.config */ CKEDITOR.config.magicline_keystrokePrevious = CKEDITOR.CTRL + CKEDITOR.SHIFT + 51; // CTRL + SHIFT + 3 /** * Defines the default keystroke that accesses the closest unreachable focus space **after** * the caret (start of the selection). If there is no focus space available, the selection remains unchanged. * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Changes keystroke to "Ctrl + .". * CKEDITOR.config.magicline_keystrokeNext = CKEDITOR.CTRL + 190; * * @cfg {Number} [magicline_keystrokeNext=CKEDITOR.CTRL + CKEDITOR.SHIFT + 52 (CTRL + SHIFT + 4)] * @member CKEDITOR.config */ CKEDITOR.config.magicline_keystrokeNext = CKEDITOR.CTRL + CKEDITOR.SHIFT + 52; // CTRL + SHIFT + 4 /** * Defines a list of attributes that, if assigned to some elements, prevent the magic line from being * used within these elements. * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Adds the "data-tabu" attribute to the magic line tabu list. * CKEDITOR.config.magicline_tabuList = [ 'data-tabu' ]; * * @cfg {Number} [magicline_tabuList=[ 'data-widget-wrapper' ]] * @member CKEDITOR.config */ /** * Defines the color of the magic line. The color may be adjusted to enhance readability. * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Changes magic line color to blue. * CKEDITOR.config.magicline_color = '#0000FF'; * * @cfg {String} [magicline_color='#FF0000'] * @member CKEDITOR.config */ /** * Activates the special all-encompassing mode that considers all focus spaces between * {@link CKEDITOR.dtd#$block} elements as accessible by the magic line. * * Read more in the {@glink features/magicline documentation} * and see the {@glink examples/magicline example}. * * // Enables the greedy "put everywhere" mode. * CKEDITOR.config.magicline_everywhere = true; * * @cfg {Boolean} [magicline_everywhere=false] * @member CKEDITOR.config */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/dev/0000755000201500020150000000000014515446710022757 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/dev/magicline.html0000644000201500020150000055413614515446710025613 0ustar puckpuck Magicline muddy trenches – CKEditor Sample

            CKEditor Sample — magicline muddy trenches

            Various cases

            Odd case: first (last) element at the very beginning, short editable

            Large document, put everywhere

            Deeply nested divs

            Line custom look

            Little Red Riding Hood

            "Little Red Riding Hood" is a famous fairy tale about a young girl's encounter with a wolf. The story has been changed considerably in its history and subject to numerous modern adaptations and readings.

            International Names
            Chinese 小紅帽
            Italian Cappuccetto Rosso
            Spanish Caperucita Roja


            The version most widely known today is based on the Brothers Grimm variant. It is about a girl called Little Red Riding Hood, after the red hooded cape or cloak she wears. The girl walks through the woods to deliver food to her sick grandmother.

            A wolf wants to eat the girl but is afraid to do so in public. He approaches the girl, and she naïvely tells him where she is going. He suggests the girl pick some flowers, which she does. In the meantime, he goes to the grandmother's house and gains entry by pretending to be the girl. He swallows the grandmother whole, and waits for the girl, disguised as the grandmother.

            When the girl arrives, she notices he looks very strange to be her grandma. In most retellings, this eventually culminates with Little Red Riding Hood saying, "My, what big teeth you have!"
            To which the wolf replies, "The better to eat you with," and swallows her whole, too.

            A hunter, however, comes to the rescue and cuts the wolf open. Little Red Riding Hood and her grandmother emerge unharmed. They fill the wolf's body with heavy stones, which drown him when he falls into a well. Other versions of the story have had the grandmother shut in the closet instead of eaten, and some have Little Red Riding Hood saved by the hunter as the wolf advances on her rather than after she is eaten.

            The tale makes the clearest contrast between the safe world of the village and the dangers of the forest, conventional antitheses that are essentially medieval, though no written versions are as old as that.

            Extreme inline editing

            Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim.
            Position static
            foo
            Key
            Value
            Whatever

            Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies



            Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies

            foo

            Enter mode: BR

            Mouse over: Mouse Y-pos.:

            Time:

            Hidden state:

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/0000755000201500020150000000000014515446710023122 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/zh.js0000644000201500020150000000040414515446710024077 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'zh', { title: '在此插入段落' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/nb.js0000644000201500020150000000041314515446710024055 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'nb', { title: 'Sett inn nytt avsnitt her' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/eo.js0000644000201500020150000000041414515446710024062 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'eo', { title: 'Enmeti paragrafon ĉi-tien' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/es.js0000644000201500020150000000041114515446710024063 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'es', { title: 'Insertar párrafo aquí' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ro.js0000644000201500020150000000041214515446710024075 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ro', { title: 'Inserează paragraf aici' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/hr.js0000644000201500020150000000040614515446710024071 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'hr', { title: 'Ubaci paragraf ovdje' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/it.js0000644000201500020150000000041114515446710024070 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'it', { title: 'Inserisci paragrafo qui' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/de-ch.js0000644000201500020150000000041214515446710024435 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'de-ch', { title: 'Absatz hier einfügen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/sk.js0000644000201500020150000000040414515446710024073 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'sk', { title: 'Odsek vložiť sem' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/az.js0000644000201500020150000000041314515446710024070 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'az', { title: 'Abzası burada əlavə et' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/pt.js0000644000201500020150000000041114515446710024077 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'pt', { title: 'Inserir parágrafo aqui' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/si.js0000644000201500020150000000044114515446710024072 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'si', { title: 'චේදය ඇතුලත් කරන්න' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ko.js0000644000201500020150000000041114515446710024065 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ko', { title: '여기에 단락 삽입' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/cy.js0000644000201500020150000000041014515446710024066 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'cy', { title: 'Mewnosod paragraff yma' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/uk.js0000644000201500020150000000041514515446710024077 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'uk', { title: 'Вставити абзац' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/zh-cn.js0000644000201500020150000000040714515446710024500 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'zh-cn', { title: '在这插入段落' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/sv.js0000644000201500020150000000040614515446710024110 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'sv', { title: 'Infoga paragraf här' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/lt.js0000644000201500020150000000041214515446710024074 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'lt', { title: 'Įterpti pastraipą čia' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/fr-ca.js0000644000201500020150000000041714515446710024452 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'fr-ca', { title: 'Insérer le paragraphe ici' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/et.js0000644000201500020150000000041314515446710024066 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'et', { title: 'Sisesta siia lõigu tekst' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/pl.js0000644000201500020150000000040314515446710024070 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'pl', { title: 'Wstaw nowy akapit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/bg.js0000644000201500020150000000043214515446710024047 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'bg', { title: 'Вмъкнете параграф тук' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/fa.js0000644000201500020150000000043214515446710024045 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'fa', { title: 'قرار دادن بند در اینجا' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ku.js0000644000201500020150000000041614515446710024100 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ku', { title: 'بڕگە لێرە دابنێ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/el.js0000644000201500020150000000043414515446710024061 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'el', { title: 'Εισάγετε παράγραφο εδώ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/fi.js0000644000201500020150000000041214515446710024053 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'fi', { title: 'Lisää kappale tähän.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ru.js0000644000201500020150000000043614515446710024111 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ru', { title: 'Вставить здесь параграф' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/gl.js0000644000201500020150000000041414515446710024061 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'gl', { title: 'Inserir aquí o parágrafo' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/sr-latn.js0000644000201500020150000000041314515446710025036 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'sr-latn', { title: 'Umetnite pasus ovde.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/oc.js0000644000201500020150000000041314515446710024057 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'oc', { title: 'Inserir un paragraf aicí' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/sq.js0000644000201500020150000000040714515446710024104 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'sq', { title: 'Shto paragrafin këtu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/pt-br.js0000644000201500020150000000041714515446710024506 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'pt-br', { title: 'Inserir um parágrafo aqui' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/af.js0000644000201500020150000000041014515446710024041 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'af', { title: 'Voeg paragraaf hier in' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/km.js0000644000201500020150000000046714515446710024076 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'km', { title: 'បញ្ចូល​កថាខណ្ឌ​នៅ​ទីនេះ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/nl.js0000644000201500020150000000041114515446710024065 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'nl', { title: 'Hier paragraaf invoeren' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/es-mx.js0000644000201500020150000000041714515446710024513 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'es-mx', { title: 'Insertar un párrafo aquí' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/da.js0000644000201500020150000000040014515446710024036 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'da', { title: 'Indsæt afsnit' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/he.js0000644000201500020150000000041214515446710024051 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'he', { title: 'הכנס פסקה כאן' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ca.js0000644000201500020150000000041514515446710024043 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ca', { title: 'Insereix el paràgraf aquí' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/de.js0000644000201500020150000000040714515446710024051 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'de', { title: 'Absatz hier einfügen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/tt.js0000644000201500020150000000043214515446710024106 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'tt', { title: 'Бирегә параграф өстәү' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/vi.js0000644000201500020150000000041214515446710024073 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'vi', { title: 'Chèn đoạn vào đây' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/cs.js0000644000201500020150000000040614515446710024065 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'cs', { title: 'zde vložit odstavec' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/tr.js0000644000201500020150000000041114515446710024101 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'tr', { title: 'Parağrafı buraya ekle' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ja.js0000644000201500020150000000041214515446710024047 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ja', { title: 'ここに段落を挿入' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/sl.js0000644000201500020150000000041114515446710024072 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'sl', { title: 'Vstavite odstavek tukaj' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/lv.js0000644000201500020150000000041114515446710024075 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'lv', { title: 'Ievietot šeit rindkopu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/en-au.js0000644000201500020150000000041214515446710024462 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'en-au', { title: 'Insert paragraph here' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/en.js0000644000201500020150000000040714515446710024063 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'en', { title: 'Insert paragraph here' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/no.js0000644000201500020150000000041314515446710024072 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'no', { title: 'Sett inn nytt avsnitt her' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/fr.js0000644000201500020150000000041414515446710024066 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'fr', { title: 'Insérer un paragraphe ici' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/id.js0000644000201500020150000000041214515446710024051 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'id', { title: 'Masukkan paragraf disini' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ug.js0000644000201500020150000000043314515446710024073 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ug', { title: 'بۇ جايغا ئابزاس قىستۇر' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/ar.js0000644000201500020150000000041414515446710024061 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'ar', { title: 'إدراج فقرة هنا' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/sr.js0000644000201500020150000000042714515446710024107 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'sr', { title: 'Уметните пасус овде.' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/eu.js0000644000201500020150000000041314515446710024067 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'eu', { title: 'Txertatu paragrafoa hemen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/en-gb.js0000644000201500020150000000041214515446710024445 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'en-gb', { title: 'Insert paragraph here' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/lang/hu.js0000644000201500020150000000041514515446710024074 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'magicline', 'hu', { title: 'Szúrja be a bekezdést ide' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/images/0000755000201500020150000000000014101750135023434 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/images/hidpi/0000755000201500020150000000000014101750135024531 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/images/hidpi/icon-rtl.png0000644000201500020150000000026014101750135026764 0ustar puckpuckPNG  IHDRrpyPLTEHmtRNSoDIDATcPQa4+4 ÔBכMff0}iPD@&L & 3j'_S~R.IENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/images/hidpi/icon.png0000644000201500020150000000030714101750135026167 0ustar puckpuckPNG  IHDRrpyPLTE#~_tRNSWIDAT}0 ߕZ1>~ [)CC !!٭ mTXO!fg|-1%I?b }%NIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/images/icon-rtl.png0000644000201500020150000000021214101750135025664 0ustar puckpuckPNG  IHDR ftQIDATA 5a!& k4NAee% ALHgNzmPs]lu=b& #3IENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/images/icon.png0000644000201500020150000000020514101750135025067 0ustar puckpuckPNG  IHDR ftLIDATӅ10UڬBzb8 Qv X 0bܴI Punm줁vcB7/'ܸIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/samples/0000755000201500020150000000000014515446710023645 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/magicline/samples/magicline.html0000644000201500020150000002027014515446710026464 0ustar puckpuck Using Magicline plugin — CKEditor Sample

            CKEditor Samples » Using Magicline plugin

            This sample is not maintained anymore. Check out its brand new version in CKEditor Examples.

            This sample shows the advantages of Magicline plugin which is to enhance the editing process. Thanks to this plugin, a number of difficult focus spaces which are inaccessible due to browser issues can now be focused.

            Magicline plugin shows a red line with a handler which, when clicked, inserts a paragraph and allows typing. To see this, focus an editor and move your mouse above the focus space you want to access. The plugin is enabled by default so no additional configuration is necessary.

            This editor uses a default Magicline setup.


            This editor is using a blue line.

            CKEDITOR.replace( 'editor2', {
            	magicline_color: 'blue'
            });
            rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/0000755000201500020150000000000014515446705022602 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/plugin.js0000644000201500020150000001760214515446705024444 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.add( 'basicstyles', { // jscs:disable maximumLineLength lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'bold,italic,underline,strike,subscript,superscript', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { var order = 0; // All buttons use the same code to register. So, to avoid // duplications, let's use this tool function. var addButtonCommand = function( buttonName, buttonLabel, commandName, styleDefiniton ) { // Disable the command if no definition is configured. if ( !styleDefiniton ) return; var style = new CKEDITOR.style( styleDefiniton ), forms = contentForms[ commandName ]; // Put the style as the most important form. forms.unshift( style ); // Listen to contextual style activation. editor.attachStyleStateChange( style, function( state ) { !editor.readOnly && editor.getCommand( commandName ).setState( state ); } ); // Create the command that can be used to apply the style. editor.addCommand( commandName, new CKEDITOR.styleCommand( style, { contentForms: forms } ) ); // Register the button, if the button plugin is loaded. if ( editor.ui.addButton ) { editor.ui.addButton( buttonName, { isToggle: true, label: buttonLabel, command: commandName, toolbar: 'basicstyles,' + ( order += 10 ) } ); } }; var contentForms = { bold: [ 'strong', 'b', [ 'span', function( el ) { var fw = el.styles[ 'font-weight' ]; return fw == 'bold' || +fw >= 700; } ] ], italic: [ 'em', 'i', [ 'span', function( el ) { return el.styles[ 'font-style' ] == 'italic'; } ] ], underline: [ 'u', [ 'span', function( el ) { return el.styles[ 'text-decoration' ] == 'underline'; } ] ], strike: [ 's', 'strike', [ 'span', function( el ) { return el.styles[ 'text-decoration' ] == 'line-through'; } ] ], subscript: [ 'sub' ], superscript: [ 'sup' ] }, config = editor.config, lang = editor.lang.basicstyles; addButtonCommand( 'Bold', lang.bold, 'bold', config.coreStyles_bold ); addButtonCommand( 'Italic', lang.italic, 'italic', config.coreStyles_italic ); addButtonCommand( 'Underline', lang.underline, 'underline', config.coreStyles_underline ); addButtonCommand( 'Strike', lang.strike, 'strike', config.coreStyles_strike ); addButtonCommand( 'Subscript', lang.subscript, 'subscript', config.coreStyles_subscript ); addButtonCommand( 'Superscript', lang.superscript, 'superscript', config.coreStyles_superscript ); editor.setKeystroke( [ [ CKEDITOR.CTRL + 66 /*B*/, 'bold' ], [ CKEDITOR.CTRL + 73 /*I*/, 'italic' ], [ CKEDITOR.CTRL + 85 /*U*/, 'underline' ] ] ); }, afterInit: function( editor ) { // If disabled, sub and sub scripts can be applied to element simoultaneously. // The rest of that code takes care of toggling both elements (#5215). if ( !editor.config.coreStyles_toggleSubSup ) { return; } var subscriptCommand = editor.getCommand( 'subscript' ), superscriptCommand = editor.getCommand( 'superscript' ); // Both commands are required for toggle operation. if ( !subscriptCommand || !superscriptCommand ) { return; } editor.on( 'afterCommandExec', function( evt ) { var commandName = evt.data.name; if ( commandName !== 'subscript' && commandName !== 'superscript' ) { return; } var executedCommand = commandName === 'subscript' ? subscriptCommand : superscriptCommand, otherCommand = commandName === 'subscript' ? superscriptCommand : subscriptCommand; // Disable the other command if both are enabled. if ( executedCommand.state === CKEDITOR.TRISTATE_ON && otherCommand.state === CKEDITOR.TRISTATE_ON ) { otherCommand.exec( editor ); // Merge undo images, so toggle operation is treated as a single undo step. editor.fire( 'updateSnapshot' ); } } ); } } ); // Basic Inline Styles. /** * The style definition that applies the **bold** style to the text. * * Read more in the {@glink features/basicstyles documentation} * and see the {@glink examples/basicstyles example}. * * config.coreStyles_bold = { element: 'b', overrides: 'strong' }; * * config.coreStyles_bold = { * element: 'span', * attributes: { 'class': 'Bold' } * }; * * @cfg {Object} [coreStyles_bold={ element: 'strong', overrides: 'b' }] * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_bold = { element: 'strong', overrides: 'b' }; /** * The style definition that applies the *italics* style to the text. * * Read more in the {@glink features/basicstyles documentation} * and see the {@glink examples/basicstyles example}. * * config.coreStyles_italic = { element: 'i', overrides: 'em' }; * * CKEDITOR.config.coreStyles_italic = { * element: 'span', * attributes: { 'class': 'Italic' } * }; * * @cfg {Object} [coreStyles_italic={ element: 'em', overrides: 'i' }] * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_italic = { element: 'em', overrides: 'i' }; /** * The style definition that applies the underline style to the text. * * Read more in the {@glink features/basicstyles documentation} * and see the {@glink examples/basicstyles example}. * * CKEDITOR.config.coreStyles_underline = { * element: 'span', * attributes: { 'class': 'Underline' } * }; * * @cfg {Object} [coreStyles_underline={ element: 'u' }] * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_underline = { element: 'u' }; /** * The style definition that applies the strikethrough style to the text. * * Read more in the {@glink features/basicstyles documentation} * and see the {@glink examples/basicstyles example}. * * CKEDITOR.config.coreStyles_strike = { * element: 'span', * attributes: { 'class': 'Strikethrough' }, * overrides: 'strike' * }; * * @cfg {Object} [coreStyles_strike={ element: 's', overrides: 'strike' }] * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_strike = { element: 's', overrides: 'strike' }; /** * The style definition that applies the subscript style to the text. * * Read more in the {@glink features/basicstyles documentation} * and see the {@glink examples/basicstyles example}. * * CKEDITOR.config.coreStyles_subscript = { * element: 'span', * attributes: { 'class': 'Subscript' }, * overrides: 'sub' * }; * * @cfg {Object} [coreStyles_subscript={ element: 'sub' }] * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_subscript = { element: 'sub' }; /** * The style definition that applies the superscript style to the text. * * Read more in the {@glink features/basicstyles documentation} * and see the {@glink examples/basicstyles example}. * * CKEDITOR.config.coreStyles_superscript = { * element: 'span', * attributes: { 'class': 'Superscript' }, * overrides: 'sup' * }; * * @cfg {Object} [coreStyles_superscript={ element: 'sup' }] * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_superscript = { element: 'sup' }; /** * Disallow setting subscript and superscript simultaneously on the same element using UI buttons. * * By default, you can apply subscript and superscript styles to the same element. Enabling that option * will remove the superscript style when the subscript button is pressed and vice versa. * * @cfg {Boolean} [coreStyles_toggleSubSup=false] * @since 4.20.0 * @member CKEDITOR.config */ CKEDITOR.config.coreStyles_toggleSubSup = false; rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/0000755000201500020150000000000014515446705023523 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/zh.js0000644000201500020150000000052414515446705024503 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'zh', { bold: '粗體', italic: '斜體', strike: '刪除線', subscript: '下標', superscript: '上標', underline: '底線' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/nb.js0000644000201500020150000000055314515446705024463 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'nb', { bold: 'Fet', italic: 'Kursiv', strike: 'Gjennomstreking', subscript: 'Senket skrift', superscript: 'Hevet skrift', underline: 'Understreking' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/eo.js0000644000201500020150000000054214515446705024465 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'eo', { bold: 'Grasa', italic: 'Kursiva', strike: 'Trastreko', subscript: 'Suba indico', superscript: 'Supra indico', underline: 'Substreko' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/es.js0000644000201500020150000000054114515446705024470 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'es', { bold: 'Negrita', italic: 'Cursiva', strike: 'Tachado', subscript: 'Subíndice', superscript: 'Superíndice', underline: 'Subrayado' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ro.js0000644000201500020150000000064214515446705024503 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ro', { bold: 'Îngroşat (bold)', italic: 'Înclinat (italic)', strike: 'Tăiat (strike through)', subscript: 'Indice (subscript)', superscript: 'Putere (superscript)', underline: 'Subliniat (underline)' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/hr.js0000644000201500020150000000054514515446705024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'hr', { bold: 'Podebljano', italic: 'Ukošeno', strike: 'Precrtano', subscript: 'Subscript', superscript: 'Superscript', underline: 'Potcrtano' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/it.js0000644000201500020150000000053314515446705024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'it', { bold: 'Grassetto', italic: 'Corsivo', strike: 'Barrato', subscript: 'Pedice', superscript: 'Apice', underline: 'Sottolineato' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/de-ch.js0000644000201500020150000000055614515446705025047 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'de-ch', { bold: 'Fett', italic: 'Kursiv', strike: 'Durchgestrichen', subscript: 'Tiefgestellt', superscript: 'Hochgestellt', underline: 'Unterstrichen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/sk.js0000644000201500020150000000056014515446705024477 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'sk', { bold: 'Tučné', italic: 'Kurzíva', strike: 'Prečiarknuté', subscript: 'Dolný index', superscript: 'Horný index', underline: 'Podčiarknuté' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/az.js0000644000201500020150000000055614515446705024501 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'az', { bold: 'Qalın', italic: 'Kursiv', strike: 'Üstüxətli', subscript: 'Aşağı indeks', superscript: 'Yuxarı indeks', underline: 'Altdan xətt' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/pt.js0000644000201500020150000000056014515446705024505 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'pt', { bold: 'Negrito', italic: 'Itálico', strike: 'Rasurado', subscript: 'Superior à linha', superscript: 'Superior à linha', underline: 'Sublinhado' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/si.js0000644000201500020150000000100014515446705024463 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'si', { bold: 'තද අකුරින් ලියනලද', italic: 'බැධීඅකුරින් ලියන ලද', strike: 'Strikethrough', // MISSING subscript: 'Subscript', // MISSING superscript: 'Superscript', // MISSING underline: 'යටින් ඉරි අදින ලද' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ko.js0000644000201500020150000000054514515446705024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ko', { bold: '굵게', italic: '기울임꼴', strike: '취소선', subscript: '아래 첨자', superscript: '위 첨자', underline: '밑줄' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/mk.js0000644000201500020150000000064514515446705024475 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'mk', { bold: 'Здебелено', italic: 'Накривено', strike: 'Прецртано', subscript: 'Долен индекс', superscript: 'Горен индекс', underline: 'Подвлечено' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/cy.js0000644000201500020150000000054314515446705024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'cy', { bold: 'Bras', italic: 'Italig', strike: 'Llinell Trwyddo', subscript: 'Is-sgript', superscript: 'Uwchsgript', underline: 'Tanlinellu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/uk.js0000644000201500020150000000064714515446705024507 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'uk', { bold: 'Жирний', italic: 'Курсив', strike: 'Закреслений', subscript: 'Нижній індекс', superscript: 'Верхній індекс', underline: 'Підкреслений' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/zh-cn.js0000644000201500020150000000053214515446705025100 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'zh-cn', { bold: '加粗', italic: '倾斜', strike: '删除线', subscript: '下标', superscript: '上标', underline: '下划线' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/sv.js0000644000201500020150000000055714515446705024520 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'sv', { bold: 'Fet', italic: 'Kursiv', strike: 'Genomstruken', subscript: 'Nedsänkta tecken', superscript: 'Upphöjda tecken', underline: 'Understruken' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/lt.js0000644000201500020150000000057014515446705024502 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'lt', { bold: 'Pusjuodis', italic: 'Kursyvas', strike: 'Perbrauktas', subscript: 'Apatinis indeksas', superscript: 'Viršutinis indeksas', underline: 'Pabrauktas' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/is.js0000644000201500020150000000056514515446705024502 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'is', { bold: 'Feitletrað', italic: 'Skáletrað', strike: 'Yfirstrikað', subscript: 'Niðurskrifað', superscript: 'Uppskrifað', underline: 'Undirstrikað' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/fr-ca.js0000644000201500020150000000053114515446705025050 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'fr-ca', { bold: 'Gras', italic: 'Italique', strike: 'Barré', subscript: 'Indice', superscript: 'Exposant', underline: 'Souligné' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/et.js0000644000201500020150000000054414515446705024474 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'et', { bold: 'Paks', italic: 'Kursiiv', strike: 'Läbijoonitud', subscript: 'Allindeks', superscript: 'Ülaindeks', underline: 'Allajoonitud' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/bs.js0000644000201500020150000000053514515446705024470 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'bs', { bold: 'Boldiraj', italic: 'Ukosi', strike: 'Precrtaj', subscript: 'Subscript', superscript: 'Superscript', underline: 'Podvuci' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/pl.js0000644000201500020150000000056314515446705024500 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'pl', { bold: 'Pogrubienie', italic: 'Kursywa', strike: 'Przekreślenie', subscript: 'Indeks dolny', superscript: 'Indeks górny', underline: 'Podkreślenie' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/bg.js0000644000201500020150000000065014515446705024452 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'bg', { bold: 'Удебелен', italic: 'Наклонен', strike: 'Зачертан текст', subscript: 'Долен индекс', superscript: 'Горен индекс', underline: 'Подчертан' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/fa.js0000644000201500020150000000060114515446705024444 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'fa', { bold: 'درشت', italic: 'خمیده', strike: 'خط‌خورده', subscript: 'زیرنویس', superscript: 'بالانویس', underline: 'زیرخط‌دار' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ku.js0000644000201500020150000000055714515446705024507 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ku', { bold: 'قەڵەو', italic: 'لار', strike: 'لێدان', subscript: 'ژێرنووس', superscript: 'سەرنووس', underline: 'ژێرهێڵ' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/bn.js0000644000201500020150000000066214515446705024464 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'bn', { bold: 'বোল্ড', italic: 'বাঁকা', strike: 'স্ট্রাইক থ্রু', subscript: 'অধোলেখ', superscript: 'অভিলেখ', underline: 'আন্ডারলাইন' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/el.js0000644000201500020150000000063014515446705024460 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'el', { bold: 'Έντονη', italic: 'Πλάγια', strike: 'Διακριτή Διαγραφή', subscript: 'Δείκτης', superscript: 'Εκθέτης', underline: 'Υπογράμμιση' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/fi.js0000644000201500020150000000055414515446705024463 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'fi', { bold: 'Lihavoitu', italic: 'Kursivoitu', strike: 'Yliviivattu', subscript: 'Alaindeksi', superscript: 'Yläindeksi', underline: 'Alleviivattu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ru.js0000644000201500020150000000070114515446705024505 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ru', { bold: 'Полужирный', italic: 'Курсив', strike: 'Зачеркнутый', subscript: 'Подстрочный индекс', superscript: 'Надстрочный индекс', underline: 'Подчеркнутый' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/gl.js0000644000201500020150000000054014515446705024462 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'gl', { bold: 'Negra', italic: 'Cursiva', strike: 'Riscado', subscript: 'Subíndice', superscript: 'Superíndice', underline: 'Subliñado' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/sr-latn.js0000644000201500020150000000054114515446705025441 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'sr-latn', { bold: 'Podebljano', italic: 'Kurziv', strike: 'Precrtano', subscript: 'Indeks', superscript: 'Stepen', underline: 'Podvučeno' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/oc.js0000644000201500020150000000052314515446705024462 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'oc', { bold: 'Gras', italic: 'Italica', strike: 'Raiat', subscript: 'Indici', superscript: 'Exponent', underline: 'Solinhat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/sq.js0000644000201500020150000000055414515446705024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'sq', { bold: 'Trash', italic: 'Pjerrët', strike: 'Nëpërmes', subscript: 'Nën-skriptë', superscript: 'Super-skriptë', underline: 'Nënvijëzuar' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/pt-br.js0000644000201500020150000000054414515446705025110 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'pt-br', { bold: 'Negrito', italic: 'Itálico', strike: 'Tachado', subscript: 'Subscrito', superscript: 'Sobrescrito', underline: 'Sublinhado' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/fo.js0000644000201500020150000000057214515446705024471 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'fo', { bold: 'Feit skrift', italic: 'Skráskrift', strike: 'Yvirstrikað', subscript: 'Lækkað skrift', superscript: 'Hækkað skrift', underline: 'Undirstrikað' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/af.js0000644000201500020150000000053714515446705024454 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'af', { bold: 'Vet', italic: 'Skuins', strike: 'Deurgestreep', subscript: 'Onderskrif', superscript: 'Bo-skrif', underline: 'Onderstreep' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/hi.js0000644000201500020150000000065414515446705024466 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'hi', { bold: 'बोल्ड', italic: 'इटैलिक', strike: 'स्ट्राइक थ्रू', subscript: 'अधोलेख', superscript: 'अभिलेख', underline: 'रेखांकण' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/km.js0000644000201500020150000000077414515446705024500 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'km', { bold: 'ដិត', italic: 'ទ្រេត', strike: 'គូស​បន្ទាត់​ចំ​កណ្ដាល', subscript: 'អក្សរតូចក្រោម', superscript: 'អក្សរតូចលើ', underline: 'គូស​បន្ទាត់​ក្រោម' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/nl.js0000644000201500020150000000054014515446705024471 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'nl', { bold: 'Vet', italic: 'Cursief', strike: 'Doorhalen', subscript: 'Subscript', superscript: 'Superscript', underline: 'Onderstrepen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ka.js0000644000201500020150000000066714515446705024465 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ka', { bold: 'მსხვილი', italic: 'დახრილი', strike: 'გადახაზული', subscript: 'ინდექსი', superscript: 'ხარისხი', underline: 'გახაზული' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/es-mx.js0000644000201500020150000000054314515446705025114 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'es-mx', { bold: 'Negrita', italic: 'Cursiva', strike: 'Tachado', subscript: 'subíndice', superscript: 'Sobrescrito', underline: 'Subrayada' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/mn.js0000644000201500020150000000073614515446705024501 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'mn', { bold: 'Тод бүдүүн', italic: 'Налуу', strike: 'Дундуур нь зураастай болгох', subscript: 'Суурь болгох', superscript: 'Зэрэг болгох', underline: 'Доогуур нь зураастай болгох' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/da.js0000644000201500020150000000055214515446705024447 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'da', { bold: 'Fed', italic: 'Kursiv', strike: 'Gennemstreget', subscript: 'Sænket skrift', superscript: 'Hævet skrift', underline: 'Understreget' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/he.js0000644000201500020150000000060514515446705024456 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'he', { bold: 'מודגש', italic: 'נטוי', strike: 'כתיב מחוק', subscript: 'כתיב תחתון', superscript: 'כתיב עליון', underline: 'קו תחתון' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ca.js0000644000201500020150000000054014515446705024443 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ca', { bold: 'Negreta', italic: 'Cursiva', strike: 'Ratllat', subscript: 'Subíndex', superscript: 'Superíndex', underline: 'Subratllat' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/gu.js0000644000201500020150000000120014515446705024465 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'gu', { bold: 'બોલ્ડ/સ્પષ્ટ', italic: 'ઇટેલિક, ત્રાંસા', strike: 'છેકી નાખવું', subscript: 'એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન', superscript: 'એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.', underline: 'અન્ડર્લાઇન, નીચે લીટી' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ms.js0000644000201500020150000000054214515446705024501 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ms', { bold: 'Bold', italic: 'Italic', strike: 'Strike Through', subscript: 'Subscript', superscript: 'Superscript', underline: 'Underline' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/th.js0000644000201500020150000000071114515446705024473 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'th', { bold: 'ตัวหนา', italic: 'ตัวเอียง', strike: 'ตัวขีดเส้นทับ', subscript: 'ตัวห้อย', superscript: 'ตัวยก', underline: 'ตัวขีดเส้นใต้' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/de.js0000644000201500020150000000055314515446705024454 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'de', { bold: 'Fett', italic: 'Kursiv', strike: 'Durchgestrichen', subscript: 'Tiefgestellt', superscript: 'Hochgestellt', underline: 'Unterstrichen' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/en-ca.js0000644000201500020150000000054514515446705025050 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'en-ca', { bold: 'Bold', italic: 'Italic', strike: 'Strike Through', subscript: 'Subscript', superscript: 'Superscript', underline: 'Underline' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/tt.js0000644000201500020150000000063214515446705024511 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'tt', { bold: 'Калын', italic: 'Курсив', strike: 'Сызылган', subscript: 'Аскы индекс', superscript: 'Өске индекс', underline: 'Астына сызылган' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/vi.js0000644000201500020150000000057414515446705024505 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'vi', { bold: 'Đậm', italic: 'Nghiêng', strike: 'Gạch xuyên ngang', subscript: 'Chỉ số dưới', superscript: 'Chỉ số trên', underline: 'Gạch chân' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/cs.js0000644000201500020150000000055514515446705024473 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'cs', { bold: 'Tučné', italic: 'Kurzíva', strike: 'Přeškrtnuté', subscript: 'Dolní index', superscript: 'Horní index', underline: 'Podtržené' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/tr.js0000644000201500020150000000055214515446705024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'tr', { bold: 'Kalın', italic: 'İtalik', strike: 'Üstü Çizgili', subscript: 'Alt Simge', superscript: 'Üst Simge', underline: 'Altı Çizgili' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ja.js0000644000201500020150000000054014515446705024452 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ja', { bold: '太字', italic: '斜体', strike: '打ち消し線', subscript: '下付き', superscript: '上付き', underline: '下線' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/sl.js0000644000201500020150000000054114515446705024477 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'sl', { bold: 'Krepko', italic: 'Ležeče', strike: 'Prečrtano', subscript: 'Podpisano', superscript: 'Nadpisano', underline: 'Podčrtano' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/lv.js0000644000201500020150000000056614515446705024511 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'lv', { bold: 'Treknraksts', italic: 'Slīpraksts', strike: 'Pārsvītrojums', subscript: 'Apakšraksts', superscript: 'Augšraksts', underline: 'Pasvītrojums' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/en-au.js0000644000201500020150000000054514515446705025072 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'en-au', { bold: 'Bold', italic: 'Italic', strike: 'Strike Through', subscript: 'Subscript', superscript: 'Superscript', underline: 'Underline' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/en.js0000644000201500020150000000054114515446705024463 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'en', { bold: 'Bold', italic: 'Italic', strike: 'Strikethrough', subscript: 'Subscript', superscript: 'Superscript', underline: 'Underline' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/no.js0000644000201500020150000000055314515446705024500 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'no', { bold: 'Fet', italic: 'Kursiv', strike: 'Gjennomstreking', subscript: 'Senket skrift', superscript: 'Hevet skrift', underline: 'Understreking' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/fr.js0000644000201500020150000000052614515446705024473 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'fr', { bold: 'Gras', italic: 'Italique', strike: 'Barré', subscript: 'Indice', superscript: 'Exposant', underline: 'Souligné' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/id.js0000644000201500020150000000062114515446705024454 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'id', { bold: 'Huruf Tebal', italic: 'Huruf Miring', strike: 'Strikethrough', // MISSING subscript: 'Subscript', // MISSING superscript: 'Superscript', // MISSING underline: 'Garis Bawah' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ug.js0000644000201500020150000000064114515446705024475 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ug', { bold: 'توم', italic: 'يانتۇ', strike: 'ئۆچۈرۈش سىزىقى', subscript: 'تۆۋەن ئىندېكس', superscript: 'يۇقىرى ئىندېكس', underline: 'ئاستى سىزىق' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/ar.js0000644000201500020150000000055414515446705024467 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'ar', { bold: 'عريض', italic: 'مائل', strike: 'يتوسطه خط', subscript: 'منخفض', superscript: 'مرتفع', underline: 'تسطير' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/sr.js0000644000201500020150000000060714515446705024510 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'sr', { bold: 'Подебљано', italic: 'Курзив', strike: 'Прецртано', subscript: 'Индекс', superscript: 'Степен', underline: 'Подвучено' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/eu.js0000644000201500020150000000054214515446705024473 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'eu', { bold: 'Lodia', italic: 'Etzana', strike: 'Marratua', subscript: 'Azpi-indizea', superscript: 'Goi-indizea', underline: 'Azpimarratu' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/en-gb.js0000644000201500020150000000054514515446705025055 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'en-gb', { bold: 'Bold', italic: 'Italic', strike: 'Strike Through', subscript: 'Subscript', superscript: 'Superscript', underline: 'Underline' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/lang/hu.js0000644000201500020150000000055114515446705024476 0ustar puckpuck/* Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'basicstyles', 'hu', { bold: 'Félkövér', italic: 'Dőlt', strike: 'Áthúzott', subscript: 'Alsó index', superscript: 'Felső index', underline: 'Aláhúzott' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/0000755000201500020150000000000014503523375023711 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/underline.png0000644000201500020150000000103514503523375026403 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *-> IDAT8˥J@u!u#uz-E?B5/t@d|\iKs jRܑ{(`EYl8cLOH"~1̲EQz9o%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/hidpi/0000755000201500020150000000000014503523375025006 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/hidpi/underline.png0000644000201500020150000000207414503523375027504 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !@IDATXíW=o1}&mRR!%PT4~F$~hhRHQDk({1i̛!]䌈@D(u]*AD "`fXkR EQ,KER888qk-ڶ1':3".1& XkZ(" LZ@h)+L&F> 34͵c,Ek-u]^i3mhEk-UUp8i^9BIf"+WJc8wMDc$ {ZcdWa/{%HHi&?In_/1M~,%*qq=vrY& /}1prՆ dQNӜ:w We'> 6Gok-Em`!9::J&ۃK"R D&N(dh\$a%s~t&ɷ0+( ?'}ەR/Zx VVVX4>ֵ_\\|-78>C\.{0 }@xG8Ɛ_݌\f~Q:;Nsey$\:>z7$s=H7ݔ4"u{.JOMAe7idsTDCѳ(fȒ{*8ɿ.@̌db@T΁xoi &iBwnuʿֱJ%\UhEQ/( @|1qv9@_eos&D~]/H|S4?^;7Λ&—S뉗ckPg4y_T?#pJAt˔%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/hidpi/subscript.png0000644000201500020150000000224514503523375027535 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !IDATXW$E^UMWwpg(&l`/n ,  xs?ɼ{gDL|tuuW}W5Bp~~f޸%RL&pa69...v8;;K]91 "cL#B`fquuu#Wi3#"031fc0.1Ţ(Ƹh}E X.hvA>}9m4[)%2Ƙ2K/KJ3cZ(0s2{uf>Knӻjts/*(̏%`{G]טNu䌬Ǐ^Dr4kY933[qԁWm~$)ٯ'1 J$ʲD]ڧ1{y>_zeC(c kshu"Ҽ/ڶ}R ZkL&Xk (\m۾ b>?tΥ`I}a>vbH2.C ]׽3#=m[, 03NOO1>aNsZCekS#-:|Syww h!)%ʉ(bQ)>>Xk &FOWJrJD?ޟ~e/[k?ϖGiz!tmf9.2Cr.?LD!.B V+t]7~=0f9PJMEIq ۶ ٤1FK9$U@nZkY "r|4ͣ\wiKE>|Hr^'H$6vr Һ9ཿ;\+r}^Cw;˸+2αqK@ukIX,wM|0yΟ2fC]B!Bx%$m2 zCYhM?T .voڶ9>@Q( ,$Y^Rne9.FQfV[k 9NN{ߊҲhVޝvCT1q]/e9(LTC)cP{ *c77M32ff@k=A꽇:4/R_eyZGlVÎ[D&u"Oڶϙsfo "C+>{R m$ 3+97Bu-cx3*MӼA2ࣣ1N][kţu_D!WUʀ+{\&"7ND|: z^93K]ZmߘMoAUU0\v_f̭M5%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/hidpi/strike.png0000644000201500020150000000251514503523375027020 0ustar puckpuckPNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGDtIME  !QIDATXåWMh$U^4ITţ!Bċ,C x7aŃ'ŃG/vxHvUAA0g{U24^W_ E10ƀNҴQDv1 ཇ @buuǓ !0sGBDHYUغNNN`3űf4ۡ Bp"zD$rR.|/>2\s]bn"J(4M%𩈬0s'KѦJ FdYDki."T`f$IR ^cN&€ITXk!@D%%[Dϼk$IVqL#ǣc4MB2s ^ȲYJ =ttTyVzo[kǶ樎~`<V+#z\fYR:ёJSe( Efbƨ+mRun7Z,6q&P}GiaABB薵Y\#qBM}],tn:~֊<0\vl]$ n( es|_԰3 Q\r^1ZfIa}t@!"ޛ<ϟ~gWB4]6oLXM)Cf~zfnnUfLj{zlN:>9w^!c{qde @Gska sAGץV_2V$+ѹ*8tntfb`7I![VkbeȕF&IbF׻1GO1s1tZ$qC2>!\p=NHRI{*)꧙.(Ng6>^@~5Hf^pJax( BxڻRkWD|QLbRuՂpOG߉X)Ӕ{h9Of@k&EAEQPe9eYFшּ._]__FpT< @ "?noo;ΥTWJ5;Lr=C`NjHۯa2F!h9 ED{HcpFv ZkxtUϞ /cLik;A8 -̉ba11IRfY6hb S" !lYkw|o )xQ_p$Q-Pk[Y z)s0 JWC!M[xGGؙ\i΍1HEQ?ƘVGHB gYagg-v:߆1^S٬寓db\9ݢ*TU5ݧ5"IvtN2a%tEXtdate:create2016-11-02T13:33:00+01:00%tEXtdate:modify2016-11-02T13:33:00+01:00\QIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/italic.png0000644000201500020150000000114314503523375025663 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->RIDAT8ˍSN@]ǖɱDAI?,!wU %eE>ٹqA̜M"2 "V:t/N4 6},dfaf!4ϱ"2̕TU8߬(zq{xR@Ƙ_ȮbrBgI7IDAT8˕RAn01XT5$!/ 8?4@T 2 v4H+y׻ksB)(IXk!"`1gq$$k!0^E T0 Ù0v *8Zk!^.k[%<t"`QfTR.I,˅16" :pŧӉƘ3pUU6o_;( _eY&Idw R9mq % 4MI`Za^?O|L3@L}w8~ia"'$X2U0?2ʎi%%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/superscript.png0000644000201500020150000000112214503523375026776 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->AIDAT8˝Rn1=Hp+?4:t:%ySpwZN%;3/7 p8{D$~c $1$Ѷ-DI@DCD@r`ѹL5zr ι_}M5Vb˲LUmZZ@1]vj\D҅! ($DJ꺾?rL yn7M>zl6bIDAT8˝1KA4b)!`c_`+X]v6AA)Zb۹gsEąۛٷ) "$H.iT9 , i|޷ȺνO:, "yodY6V30!@xhfo$QuIZDd8fmՈxȲx2d;I $ABsBN9GW45rzM7K6cͷx{_y}>D]DNl<6Tb+Ar䭪,V]UmT wi[xuK]"Y;״Ŀ-%tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/basicstyles/icons/bold.png0000644000201500020150000000110414503523375025333 0ustar puckpuckPNG  IHDRagAMA a cHRMz%u0`:o_FbKGD pHYs  tIME *->3IDAT8˕SJ@yd-+{E&iAӀeC NRɡ[yٱ6rfy0kf=.?1l`M$꺆^YhE>7ul,2M$Z,l$peY$803`5/+%&A$w<>3:IpiXts(su@$HnZ}+R4f; tn܆uQ2ޣisHz} ›B܋:$4]fv[O!+pxbf9hdz?~([ $ %tEXtdate:create2016-07-19T13:30:42+02:00wx%tEXtdate:modify2016-07-19T13:30:42+02:00iIENDB`rt-5.0.5/devel/third-party/ckeditor-src/plugins/resize/0000755000201500020150000000000014515446712021554 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/resize/plugin.js0000644000201500020150000001501014515446712023405 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.add( 'resize', { init: function( editor ) { function dragHandler( evt ) { var dx = evt.data.$.screenX - origin.x, dy = evt.data.$.screenY - origin.y, width = startSize.width, height = startSize.height, internalWidth = width + dx * ( resizeDir == 'rtl' ? -1 : 1 ), internalHeight = height + dy; if ( resizeHorizontal ) width = Math.max( config.resize_minWidth, Math.min( internalWidth, config.resize_maxWidth ) ); if ( resizeVertical ) height = Math.max( config.resize_minHeight, Math.min( internalHeight, config.resize_maxHeight ) ); // DO NOT impose fixed size with single direction resize. (https://dev.ckeditor.com/ticket/6308) editor.resize( resizeHorizontal ? width : null, height ); } function dragEndHandler() { CKEDITOR.document.removeListener( 'mousemove', dragHandler ); CKEDITOR.document.removeListener( 'mouseup', dragEndHandler ); if ( editor.document ) { editor.document.removeListener( 'mousemove', dragHandler ); editor.document.removeListener( 'mouseup', dragEndHandler ); } } var config = editor.config; var spaceId = editor.ui.spaceId( 'resizer' ); // Resize in the same direction of chrome, // which is identical to dir of editor element. (https://dev.ckeditor.com/ticket/6614) var resizeDir = editor.element ? editor.element.getDirection( 1 ) : 'ltr'; !config.resize_dir && ( config.resize_dir = 'vertical' ); ( config.resize_maxWidth === undefined ) && ( config.resize_maxWidth = 3000 ); ( config.resize_maxHeight === undefined ) && ( config.resize_maxHeight = 3000 ); ( config.resize_minWidth === undefined ) && ( config.resize_minWidth = 750 ); ( config.resize_minHeight === undefined ) && ( config.resize_minHeight = 250 ); if ( config.resize_enabled !== false ) { var container = null, origin, startSize, resizeHorizontal = ( config.resize_dir == 'both' || config.resize_dir == 'horizontal' ) && ( config.resize_minWidth != config.resize_maxWidth ), resizeVertical = ( config.resize_dir == 'both' || config.resize_dir == 'vertical' ) && ( config.resize_minHeight != config.resize_maxHeight ); var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) { if ( !container ) container = editor.getResizable(); startSize = { width: container.$.offsetWidth || 0, height: container.$.offsetHeight || 0 }; origin = { x: $event.screenX, y: $event.screenY }; config.resize_minWidth > startSize.width && ( config.resize_minWidth = startSize.width ); config.resize_minHeight > startSize.height && ( config.resize_minHeight = startSize.height ); CKEDITOR.document.on( 'mousemove', dragHandler ); CKEDITOR.document.on( 'mouseup', dragEndHandler ); if ( editor.document ) { editor.document.on( 'mousemove', dragHandler ); editor.document.on( 'mouseup', dragEndHandler ); } $event.preventDefault && $event.preventDefault(); } ); editor.on( 'destroy', function() { CKEDITOR.tools.removeFunction( mouseDownFn ); } ); editor.on( 'uiSpace', function( event ) { if ( event.data.space == 'bottom' ) { var direction = ''; if ( resizeHorizontal && !resizeVertical ) direction = ' cke_resizer_horizontal'; if ( !resizeHorizontal && resizeVertical ) direction = ' cke_resizer_vertical'; var resizerHtml = '' + // BLACK LOWER RIGHT TRIANGLE (ltr) // BLACK LOWER LEFT TRIANGLE (rtl) ( resizeDir == 'ltr' ? '\u25E2' : '\u25E3' ) + ''; // Always sticks the corner of botttom space. resizeDir == 'ltr' && direction == 'ltr' ? event.data.html += resizerHtml : event.data.html = resizerHtml + event.data.html; } }, editor, null, 100 ); // Toggle the visibility of the resizer when an editor is being maximized or minimized. editor.on( 'maximize', function( event ) { editor.ui.space( 'resizer' )[ event.data == CKEDITOR.TRISTATE_ON ? 'hide' : 'show' ](); } ); } } } ); /** * The minimum editor width, in pixels, when resizing the editor interface by using the resize handle. * Note: It falls back to editor's actual width if it is smaller than the default value. * * Read more in the {@glink features/resize documentation} * and see the {@glink examples/resize example}. * * config.resize_minWidth = 500; * * @cfg {Number} [resize_minWidth=750] * @member CKEDITOR.config */ /** * The minimum editor height, in pixels, when resizing the editor interface by using the resize handle. * Note: It falls back to editor's actual height if it is smaller than the default value. * * Read more in the {@glink features/resize documentation} * and see the {@glink examples/resize example}. * * config.resize_minHeight = 600; * * @cfg {Number} [resize_minHeight=250] * @member CKEDITOR.config */ /** * The maximum editor width, in pixels, when resizing the editor interface by using the resize handle. * * Read more in the {@glink features/resize documentation} * and see the {@glink examples/resize example}. * * config.resize_maxWidth = 750; * * @cfg {Number} [resize_maxWidth=3000] * @member CKEDITOR.config */ /** * The maximum editor height, in pixels, when resizing the editor interface by using the resize handle. * * Read more in the {@glink features/resize documentation} * and see the {@glink examples/resize example}. * * config.resize_maxHeight = 600; * * @cfg {Number} [resize_maxHeight=3000] * @member CKEDITOR.config */ /** * Whether to enable the resizing feature. If this feature is disabled, the resize handle will not be visible. * * Read more in the {@glink features/resize documentation} * and see the {@glink examples/resize example}. * * config.resize_enabled = false; * * @cfg {Boolean} [resize_enabled=true] * @member CKEDITOR.config */ /** * The dimensions for which the editor resizing is enabled. Possible values * are `both`, `vertical`, and `horizontal`. * * Read more in the {@glink features/resize documentation} * and see the {@glink examples/resize example}. * * config.resize_dir = 'both'; * * @since 3.3.0 * @cfg {String} [resize_dir='vertical'] * @member CKEDITOR.config */ rt-5.0.5/devel/third-party/ckeditor-src/plugins/xml/0000755000201500020150000000000014515446713021054 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/xml/plugin.js0000644000201500020150000001231414515446713022711 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ /** * @fileOverview Defines the {@link CKEDITOR.xml} class, which represents a * loaded XML document. */ ( function() { /* global ActiveXObject */ CKEDITOR.plugins.add( 'xml', {} ); /** * Represents a loaded XML document. * * var xml = new CKEDITOR.xml( '' ); * * @class * @constructor Creates xml class instance. * @param {Object/String} xmlObjectOrData A native XML (DOM document) object or * a string containing the XML definition to be loaded. */ CKEDITOR.xml = function( xmlObjectOrData ) { var baseXml = null; if ( typeof xmlObjectOrData == 'object' ) baseXml = xmlObjectOrData; else { var data = ( xmlObjectOrData || '' ).replace( / /g, '\xA0' ); // Check ActiveXObject before DOMParser, because IE10+ support both, but // there's no XPath support in DOMParser instance. // Also, the only check for ActiveXObject which still works in IE11+ is with `in` operator. if ( 'ActiveXObject' in window ) { try { baseXml = new ActiveXObject( 'MSXML2.DOMDocument' ); } catch ( e ) { try { baseXml = new ActiveXObject( 'Microsoft.XmlDom' ); } catch ( err ) {} } if ( baseXml ) { baseXml.async = false; baseXml.resolveExternals = false; baseXml.validateOnParse = false; baseXml.loadXML( data ); } } else if ( window.DOMParser ) { baseXml = ( new DOMParser() ).parseFromString( data, 'text/xml' ); } } /** * The native XML (DOM document) used by the class instance. * * @property {Object} */ this.baseXml = baseXml; }; CKEDITOR.xml.prototype = { /** * Get a single node from the XML document, based on a XPath query. * * // Create the XML instance. * var xml = new CKEDITOR.xml( '' ); * // Get the first node. * var itemNode = xml.selectSingleNode( 'list/item' ); * // Alert "item". * alert( itemNode.nodeName ); * * @param {String} xpath The XPath query to execute. * @param {Object} [contextNode] The XML DOM node to be used as the context * for the XPath query. The document root is used by default. * @returns {Object} A XML node element or null if the query has no results. */ selectSingleNode: function( xpath, contextNode ) { var baseXml = this.baseXml; if ( contextNode || ( contextNode = baseXml ) ) { if ( 'selectSingleNode' in contextNode ) // IEs return contextNode.selectSingleNode( xpath ); else if ( baseXml.evaluate ) { // Others var result = baseXml.evaluate( xpath, contextNode, null, 9, null ); return ( result && result.singleNodeValue ) || null; } } return null; }, /** * Gets a list node from the XML document, based on a XPath query. * * // Create the XML instance. * var xml = new CKEDITOR.xml( '' ); * // Get all nodes. * var itemNodes = xml.selectNodes( 'list/item' ); * // Alert "item" twice, one for each . * for ( var i = 0; i < itemNodes.length; i++ ) * alert( itemNodes[i].nodeName ); * * @param {String} xpath The XPath query to execute. * @param {Object} [contextNode] The XML DOM node to be used as the context * for the XPath query. The document root is used by default. * @returns {Array} An array containing all matched nodes. The array will * be empty if the query has no results. */ selectNodes: function( xpath, contextNode ) { var baseXml = this.baseXml, nodes = []; if ( contextNode || ( contextNode = baseXml ) ) { if ( 'selectNodes' in contextNode ) // IEs return contextNode.selectNodes( xpath ); else if ( baseXml.evaluate ) { // Others var result = baseXml.evaluate( xpath, contextNode, null, 5, null ); if ( result ) { var node; while ( ( node = result.iterateNext() ) ) nodes.push( node ); } } } return nodes; }, /** * Gets the string representation of hte inner contents of a XML node, * based on a XPath query. * * // Create the XML instance. * var xml = new CKEDITOR.xml( '' ); * // Alert "". * alert( xml.getInnerXml( 'list' ) ); * * @param {String} xpath The XPath query to execute. * @param {Object} [contextNode] The XML DOM node to be used as the context * for the XPath query. The document root is used by default. * @returns {String} The textual representation of the inner contents of * the node or null if the query has no results. */ getInnerXml: function( xpath, contextNode ) { var node = this.selectSingleNode( xpath, contextNode ), xml = []; if ( node ) { node = node.firstChild; while ( node ) { if ( node.xml ) // IEs xml.push( node.xml ); else if ( window.XMLSerializer ) // Others xml.push( ( new XMLSerializer() ).serializeToString( node ) ); node = node.nextSibling; } } return xml.length ? xml.join( '' ) : null; } }; } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/0000755000201500020150000000000014515446713022744 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/plugin.js0000644000201500020150000005464314515446713024614 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ 'use strict'; ( function() { CKEDITOR.plugins.add( 'uploadwidget', { lang: 'az,bg,ca,cs,da,de,de-ch,el,en,en-au,eo,es,es-mx,et,eu,fa,fr,gl,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,oc,pl,pt,pt-br,ro,ru,sk,sq,sr,sr-latn,sv,tr,ug,uk,zh,zh-cn', // %REMOVE_LINE_CORE% requires: 'widget,clipboard,filetools,notificationaggregator', init: function( editor ) { // Images which should be changed into upload widget needs to be marked with `data-widget` on paste, // because otherwise wrong widget may handle upload placeholder element (e.g. image2 plugin would handle image). // `data-widget` attribute is allowed only in the elements which has also `data-cke-upload-id` attribute. editor.filter.allow( '*[!data-widget,!data-cke-upload-id]' ); }, isSupportedEnvironment: function() { return CKEDITOR.plugins.clipboard.isFileApiSupported; } } ); /** * This function creates an upload widget — a placeholder to show the progress of an upload. The upload widget * is based on its {@link CKEDITOR.fileTools.uploadWidgetDefinition definition}. The `addUploadWidget` method also * creates a `paste` event, if the {@link CKEDITOR.fileTools.uploadWidgetDefinition#fileToElement fileToElement} method * is defined. This event helps in handling pasted files, as it will automatically check if the files were pasted and * mark them to be uploaded. * * The upload widget helps to handle content that is uploaded asynchronously inside the editor. It solves issues such as: * editing during upload, undo manager integration, getting data, removing or copying uploaded element. * * To create an upload widget you need to define two transformation methods: * * * The {@link CKEDITOR.fileTools.uploadWidgetDefinition#fileToElement fileToElement} method which will be called on * `paste` and transform a file into a placeholder. * * The {@link CKEDITOR.fileTools.uploadWidgetDefinition#onUploaded onUploaded} method with * the {@link CKEDITOR.fileTools.uploadWidgetDefinition#replaceWith replaceWith} method which will be called to replace * the upload placeholder with the final HTML when the upload is done. * If you want to show more information about the progress you can also define * the {@link CKEDITOR.fileTools.uploadWidgetDefinition#onLoading onLoading} and * {@link CKEDITOR.fileTools.uploadWidgetDefinition#onUploading onUploading} methods. * * The simplest uploading widget which uploads a file and creates a link to it may look like this: * * CKEDITOR.fileTools.addUploadWidget( editor, 'uploadfile', { * uploadUrl: CKEDITOR.fileTools.getUploadUrl( editor.config ), * * fileToElement: function( file ) { * var a = new CKEDITOR.dom.element( 'a' ); * a.setText( file.name ); * a.setAttribute( 'href', '#' ); * return a; * }, * * onUploaded: function( upload ) { * this.replaceWith( '' + upload.fileName + '' ); * } * } ); * * The upload widget uses {@link CKEDITOR.fileTools.fileLoader} as a helper to upload the file. A * {@link CKEDITOR.fileTools.fileLoader} instance is created when the file is pasted and a proper method is * called — by default it is the {@link CKEDITOR.fileTools.fileLoader#loadAndUpload} method. If you want * to only use the `load` or `upload`, you can use the {@link CKEDITOR.fileTools.uploadWidgetDefinition#loadMethod loadMethod} * property. * * Note that if you want to handle a big file, e.g. a video, you may need to use `upload` instead of * `loadAndUpload` because the file may be too big to load it to memory at once. * * If you do not upload the file, you need to define {@link CKEDITOR.fileTools.uploadWidgetDefinition#onLoaded onLoaded} * instead of {@link CKEDITOR.fileTools.uploadWidgetDefinition#onUploaded onUploaded}. * For example, if you want to read the content of the file: * * CKEDITOR.fileTools.addUploadWidget( editor, 'fileReader', { * loadMethod: 'load', * supportedTypes: /text\/(plain|html)/, * * fileToElement: function( file ) { * var el = new CKEDITOR.dom.element( 'span' ); * el.setText( '...' ); * return el; * }, * * onLoaded: function( loader ) { * this.replaceWith( atob( loader.data.split( ',' )[ 1 ] ) ); * } * } ); * * If you need to pass additional data to the request, you can do this using the * {@link CKEDITOR.fileTools.uploadWidgetDefinition#additionalRequestParameters additionalRequestParameters} property. * That data is then passed to the upload method defined by {@link CKEDITOR.fileTools.uploadWidgetDefinition#loadMethod}, * and to the {@link CKEDITOR.editor#fileUploadRequest} event (as part of the `requestData` property). * The syntax of that parameter is compatible with the {@link CKEDITOR.editor#fileUploadRequest} `requestData` property. * * CKEDITOR.fileTools.addUploadWidget( editor, 'uploadFile', { * additionalRequestParameters: { * foo: 'bar' * }, * * fileToElement: function( file ) { * var el = new CKEDITOR.dom.element( 'span' ); * el.setText( '...' ); * return el; * }, * * onUploaded: function( upload ) { * this.replaceWith( '' + upload.fileName + '' ); * } * } ); * * If you need custom `paste` handling, you need to mark the pasted element to be changed into an upload widget * using {@link CKEDITOR.fileTools#markElement markElement}. For example, instead of the `fileToElement` helper from the * example above, a `paste` listener can be created manually: * * editor.on( 'paste', function( evt ) { * var file, i, el, loader; * * for ( i = 0; i < evt.data.dataTransfer.getFilesCount(); i++ ) { * file = evt.data.dataTransfer.getFile( i ); * * if ( CKEDITOR.fileTools.isTypeSupported( file, /text\/(plain|html)/ ) ) { * el = new CKEDITOR.dom.element( 'span' ), * loader = editor.uploadRepository.create( file ); * * el.setText( '...' ); * * loader.load(); * * CKEDITOR.fileTools.markElement( el, 'filereader', loader.id ); * * evt.data.dataValue += el.getOuterHtml(); * } * } * } ); * * Note that you can bind notifications to the upload widget on paste using * the {@link CKEDITOR.fileTools#bindNotifications} method, so notifications will automatically * show the progress of the upload. Because this method shows notifications about upload, do not use it if you only * {@link CKEDITOR.fileTools.fileLoader#load load} (and not upload) a file. * * editor.on( 'paste', function( evt ) { * var file, i, el, loader; * * for ( i = 0; i < evt.data.dataTransfer.getFilesCount(); i++ ) { * file = evt.data.dataTransfer.getFile( i ); * * if ( CKEDITOR.fileTools.isTypeSupported( file, /text\/pdf/ ) ) { * el = new CKEDITOR.dom.element( 'span' ), * loader = editor.uploadRepository.create( file ); * * el.setText( '...' ); * * loader.upload(); * * CKEDITOR.fileTools.markElement( el, 'pdfuploader', loader.id ); * * CKEDITOR.fileTools.bindNotifications( editor, loader ); * * evt.data.dataValue += el.getOuterHtml(); * } * } * } ); * * @member CKEDITOR.fileTools * @param {CKEDITOR.editor} editor The editor instance. * @param {String} name The name of the upload widget. * @param {CKEDITOR.fileTools.uploadWidgetDefinition} def Upload widget definition. */ function addUploadWidget( editor, name, def ) { var fileTools = CKEDITOR.fileTools, uploads = editor.uploadRepository, // Plugins which support all file type has lower priority than plugins which support specific types. priority = def.supportedTypes ? 10 : 20; // Add a callback as a matcher in the clipboard plugin to check if notification should be displayed (#5095). CKEDITOR.plugins.clipboard.addFileMatcher( editor, function( file ) { // Allow any file type in case no type is defined. if ( !def.supportedTypes ) { return true; } return fileTools.isTypeSupported( file, def.supportedTypes ); } ); if ( def.fileToElement ) { editor.on( 'paste', function( evt ) { var data = evt.data, // Fetch runtime widget definition as it might get changed in editor#widgetDefinition event. def = editor.widgets.registered[ name ], dataTransfer = data.dataTransfer, filesCount = dataTransfer.getFilesCount(), loadMethod = def.loadMethod || 'loadAndUpload', file, i; if ( data.dataValue || !filesCount ) { return; } for ( i = 0; i < filesCount; i++ ) { file = dataTransfer.getFile( i ); // No def.supportedTypes means all types are supported. if ( !def.supportedTypes || fileTools.isTypeSupported( file, def.supportedTypes ) ) { var el = def.fileToElement( file ), loader = uploads.create( file, undefined, def.loaderType ); if ( el ) { loader[ loadMethod ]( def.uploadUrl, def.additionalRequestParameters ); CKEDITOR.fileTools.markElement( el, name, loader.id ); if ( ( loadMethod == 'loadAndUpload' || loadMethod == 'upload' ) && !def.skipNotifications ) { CKEDITOR.fileTools.bindNotifications( editor, loader ); } data.dataValue += el.getOuterHtml(); } } } }, null, null, priority ); } /** * This is an abstract class that describes a definition of an upload widget. * It is a type of {@link CKEDITOR.fileTools#addUploadWidget} method's second argument. * * Note that because the upload widget is a type of a widget, this definition extends * {@link CKEDITOR.plugins.widget.definition}. * It adds several new properties and callbacks and implements the {@link CKEDITOR.plugins.widget.definition#downcast} * and {@link CKEDITOR.plugins.widget.definition#init} callbacks. These two properties * should not be overwritten. * * Also, the upload widget definition defines a few properties ({@link #fileToElement}, {@link #supportedTypes}, * {@link #loadMethod loadMethod}, {@link #uploadUrl} and {@link #additionalRequestParameters}) used in the * {@link CKEDITOR.editor#paste} listener which is registered by {@link CKEDITOR.fileTools#addUploadWidget} * if the upload widget definition contains the {@link #fileToElement} callback. * * @abstract * @class CKEDITOR.fileTools.uploadWidgetDefinition * @mixins CKEDITOR.plugins.widget.definition */ CKEDITOR.tools.extend( def, { /** * Upload widget definition overwrites the {@link CKEDITOR.plugins.widget.definition#downcast} property. * This should not be changed. * * @property {String/Function} */ downcast: function() { return new CKEDITOR.htmlParser.text( '' ); }, /** * Upload widget definition overwrites the {@link CKEDITOR.plugins.widget.definition#init} property. * If you want to add some code in the `init` callback remember to call the base function. * * @property {Function} */ init: function() { var widget = this, id = this.wrapper.findOne( '[data-cke-upload-id]' ).data( 'cke-upload-id' ), loader = uploads.loaders[ id ], capitalize = CKEDITOR.tools.capitalize, oldStyle, newStyle; loader.on( 'update', function( evt ) { // (#1454) if ( loader.status === 'abort' ) { if ( typeof widget.onAbort === 'function' ) { widget.onAbort( loader ); } } // Abort if widget was removed. if ( !widget.wrapper || !widget.wrapper.getParent() ) { // Uploading should be aborted if the editor is already destroyed (#966) or the upload widget was removed. if ( !CKEDITOR.instances[ editor.name ] || !editor.editable().find( '[data-cke-upload-id="' + id + '"]' ).count() ) { loader.abort(); } evt.removeListener(); return; } editor.fire( 'lockSnapshot' ); // Call users method, eg. if the status is `uploaded` then // `onUploaded` method will be called, if exists. var methodName = 'on' + capitalize( loader.status ); if ( loader.status !== 'abort' && typeof widget[ methodName ] === 'function' ) { if ( widget[ methodName ]( loader ) === false ) { editor.fire( 'unlockSnapshot' ); return; } } // Set style to the wrapper if it still exists. newStyle = 'cke_upload_' + loader.status; if ( widget.wrapper && newStyle != oldStyle ) { oldStyle && widget.wrapper.removeClass( oldStyle ); widget.wrapper.addClass( newStyle ); oldStyle = newStyle; } // Remove widget on error or abort. if ( loader.status == 'error' || loader.status == 'abort' ) { editor.widgets.del( widget ); } editor.fire( 'unlockSnapshot' ); } ); loader.update(); }, /** * Replaces the upload widget with the final HTML. This method should be called when the upload is done, * usually in the {@link #onUploaded} callback. * * @property {Function} * @param {String} data HTML to replace the upload widget. * @param {String} [mode='html'] See {@link CKEDITOR.editor#method-insertHtml}'s modes. */ replaceWith: function( data, mode ) { if ( data.trim() === '' ) { editor.widgets.del( this ); return; } var wasSelected = ( this == editor.widgets.focused ), editable = editor.editable(), range = editor.createRange(), bookmark, bookmarks; if ( !wasSelected ) { bookmarks = editor.getSelection().createBookmarks(); } range.setStartBefore( this.wrapper ); range.setEndAfter( this.wrapper ); if ( wasSelected ) { bookmark = range.createBookmark(); } editable.insertHtmlIntoRange( data, range, mode ); editor.widgets.checkWidgets( { initOnlyNew: true } ); // Ensure that old widgets instance will be removed. // If replaceWith is called in init, because of paste then checkWidgets will not remove it. editor.widgets.destroy( this, true ); if ( wasSelected ) { range.moveToBookmark( bookmark ); range.select(); } else { editor.getSelection().selectBookmarks( bookmarks ); } }, /** * @private * @returns {CKEDITOR.fileTools.fileLoader/null} The loader associated with this widget instance or `null` if not found. */ _getLoader: function() { var marker = this.wrapper.findOne( '[data-cke-upload-id]' ); return marker ? this.editor.uploadRepository.loaders[ marker.data( 'cke-upload-id' ) ] : null; } /** * If this property is defined, paste listener is created to transform the pasted file into an HTML element. * It creates an HTML element which will be then transformed into an upload widget. * It is only called for {@link #supportedTypes supported files}. * If multiple files were pasted, this function will be called for each file of a supported type. * * @property {Function} fileToElement * @param {Blob} file A pasted file to load or upload. * @returns {CKEDITOR.dom.element} An element which will be transformed into the upload widget. */ /** * Regular expression to check if the file type is supported by this widget. * If not defined, all files will be handled. * * @property {RegExp} [supportedTypes] */ /** * The URL to which the file will be uploaded. It should be taken from the configuration using * {@link CKEDITOR.fileTools#getUploadUrl}. * * @property {String} [uploadUrl] */ /** * Loader type that should be used for creating file tools requests. * * @property {Function} [loaderType] */ /** * An object containing additional data that should be passed to the function defined by {@link #loadMethod}. * * @property {Object} [additionalRequestParameters] */ /** * The type of loading operation that should be executed as a result of pasting a file. Possible options are: * * * `'loadAndUpload'` – Default behavior. The {@link CKEDITOR.fileTools.fileLoader#loadAndUpload} method will be * executed, the file will be loaded first and uploaded immediately after loading is done. * * `'load'` – The {@link CKEDITOR.fileTools.fileLoader#load} method will be executed. This loading type should * be used if you only want to load file data without uploading it. * * `'upload'` – The {@link CKEDITOR.fileTools.fileLoader#upload} method will be executed, the file will be uploaded * without loading it to memory. This loading type should be used if you want to upload a big file, * otherwise you can get an "out of memory" error. * * @property {String} [loadMethod=loadAndUpload] */ /** * Indicates whether default notification handling should be skipped. * * By default upload widget will use [Notification](https://ckeditor.com/cke4/addon/notification) plugin to provide * feedback for upload progress and eventual success / error message. * * @since 4.8.0 * @property {Boolean} [skipNotifications=false] */ /** * A function called when the {@link CKEDITOR.fileTools.fileLoader#status status} of the upload changes to `loading`. * * @property {Function} [onLoading] * @param {CKEDITOR.fileTools.fileLoader} loader Loader instance. * @returns {Boolean} */ /** * A function called when the {@link CKEDITOR.fileTools.fileLoader#status status} of the upload changes to `loaded`. * * @property {Function} [onLoaded] * @param {CKEDITOR.fileTools.fileLoader} loader Loader instance. * @returns {Boolean} */ /** * A function called when the {@link CKEDITOR.fileTools.fileLoader#status status} of the upload changes to `uploading`. * * @property {Function} [onUploading] * @param {CKEDITOR.fileTools.fileLoader} loader Loader instance. * @returns {Boolean} */ /** * A function called when the {@link CKEDITOR.fileTools.fileLoader#status status} of the upload changes to `uploaded`. * At that point the upload is done and the upload widget should be replaced with the final HTML using * the {@link #replaceWith} method. * * @property {Function} [onUploaded] * @param {CKEDITOR.fileTools.fileLoader} loader Loader instance. * @returns {Boolean} */ /** * A function called when the {@link CKEDITOR.fileTools.fileLoader#status status} of the upload changes to `error`. * The default behavior is to remove the widget and it can be canceled if this function returns `false`. * * @property {Function} [onError] * @param {CKEDITOR.fileTools.fileLoader} loader Loader instance. * @returns {Boolean} If `false`, the default behavior (remove widget) will be canceled. */ /** * A function called when the {@link CKEDITOR.fileTools.fileLoader#status status} of the upload changes to `abort`. * The default behavior is to remove the widget and it can be canceled if this function returns `false`. * * @property {Function} [onAbort] * @param {CKEDITOR.fileTools.fileLoader} loader Loader instance. * @returns {Boolean} If `false`, the default behavior (remove widget) will be canceled. */ } ); editor.widgets.add( name, def ); } /** * Marks an element which should be transformed into an upload widget. * * @see CKEDITOR.fileTools.addUploadWidget * * @member CKEDITOR.fileTools * @param {CKEDITOR.dom.element} element Element to be marked. * @param {String} widgetName The name of the upload widget. * @param {Number} loaderId The ID of a related {@link CKEDITOR.fileTools.fileLoader}. */ function markElement( element, widgetName, loaderId ) { element.setAttributes( { 'data-cke-upload-id': loaderId, 'data-widget': widgetName } ); } /** * Binds a notification to the {@link CKEDITOR.fileTools.fileLoader file loader} so the upload widget will use * the notification to show the status and progress. * This function uses {@link CKEDITOR.plugins.notificationAggregator}, so even if multiple files are uploading * only one notification is shown. Warnings are an exception, because they are shown in separate notifications. * This notification shows only the progress of the upload, so this method should not be used if * the {@link CKEDITOR.fileTools.fileLoader#load loader.load} method was called. It works with * {@link CKEDITOR.fileTools.fileLoader#upload upload} and {@link CKEDITOR.fileTools.fileLoader#loadAndUpload loadAndUpload}. * * @member CKEDITOR.fileTools * @param {CKEDITOR.editor} editor The editor instance. * @param {CKEDITOR.fileTools.fileLoader} loader The file loader instance. */ function bindNotifications( editor, loader ) { var aggregator, task = null; loader.on( 'update', function() { // Value of uploadTotal is known after upload start. Task will be created when uploadTotal is present. if ( !task && loader.uploadTotal ) { createAggregator(); task = aggregator.createTask( { weight: loader.uploadTotal } ); } if ( task && loader.status == 'uploading' ) { task.update( loader.uploaded ); } } ); loader.on( 'uploaded', function() { task && task.done(); } ); loader.on( 'error', function() { task && task.cancel(); editor.showNotification( loader.message, 'warning' ); } ); loader.on( 'abort', function() { task && task.cancel(); // Editor could be already destroyed (#966). if ( CKEDITOR.instances[ editor.name ] ) { editor.showNotification( editor.lang.uploadwidget.abort, 'info' ); } } ); function createAggregator() { aggregator = editor._.uploadWidgetNotificaionAggregator; // Create one notification aggregator for all types of upload widgets for the editor. if ( !aggregator || aggregator.isFinished() ) { aggregator = editor._.uploadWidgetNotificaionAggregator = new CKEDITOR.plugins.notificationAggregator( editor, editor.lang.uploadwidget.uploadMany, editor.lang.uploadwidget.uploadOne ); aggregator.once( 'finished', function() { var tasks = aggregator.getTaskCount(); if ( tasks === 0 ) { aggregator.notification.hide(); } else { aggregator.notification.update( { message: tasks == 1 ? editor.lang.uploadwidget.doneOne : editor.lang.uploadwidget.doneMany.replace( '%1', tasks ), type: 'success', important: 1 } ); } } ); } } } // Two plugins extend this object. if ( !CKEDITOR.fileTools ) { CKEDITOR.fileTools = {}; } CKEDITOR.tools.extend( CKEDITOR.fileTools, { addUploadWidget: addUploadWidget, markElement: markElement, bindNotifications: bindNotifications } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/dev/0000755000201500020150000000000014515446713023522 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/dev/filereaderplugin.js0000644000201500020150000000261514515446713027405 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ 'use strict'; ( function() { CKEDITOR.plugins.add( 'filereader', { requires: 'uploadwidget', init: function( editor ) { var fileTools = CKEDITOR.fileTools; fileTools.addUploadWidget( editor, 'filereader', { onLoaded: function( upload ) { var data = upload.data; if ( data && data.indexOf( ',' ) >= 0 && data.indexOf( ',' ) < data.length - 1 ) { this.replaceWith( atob( upload.data.split( ',' )[ 1 ] ) ); } else { editor.widgets.del( this ); } } } ); editor.on( 'paste', function( evt ) { var data = evt.data, dataTransfer = data.dataTransfer, filesCount = dataTransfer.getFilesCount(), file, i; if ( data.dataValue || !filesCount ) { return; } for ( i = 0; i < filesCount; i++ ) { file = dataTransfer.getFile( i ); if ( fileTools.isTypeSupported( file, /text\/(plain|html)/ ) ) { var el = new CKEDITOR.dom.element( 'span' ), loader = editor.uploadRepository.create( file ); el.setText( '...' ); loader.load(); fileTools.markElement( el, 'filereader', loader.id ); fileTools.bindNotifications( editor, loader ); data.dataValue += el.getOuterHtml(); } } } ); } } ); } )(); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/dev/cors.html0000644000201500020150000001366714515446713025373 0ustar puckpuck CORS sample

            CORS sample

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/dev/upload.html0000644000201500020150000002431514515446713025701 0ustar puckpuck Upload image dev sample

            Upload image dev sample

            Saturn V carrying Apollo 11 Apollo 11

            Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

            Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

            Broadcasting and quotes

            Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

            One small step for [a] man, one giant leap for mankind.

            Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

            [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

            Technical details

            Mission crew
            Position Astronaut
            Commander Neil A. Armstrong
            Command Module Pilot Michael Collins
            Lunar Module Pilot Edwin "Buzz" E. Aldrin, Jr.

            Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

            1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
            2. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
            3. Lunar Module for landing on the Moon.

            After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.


            Source: Wikipedia.org

            rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/0000755000201500020150000000000014515446713023665 5ustar puckpuckrt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/zh.js0000644000201500020150000000075714515446713024655 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'zh', { abort: '上傳由使用者放棄。', doneOne: '檔案成功上傳。', doneMany: '成功上傳 %1 檔案。', uploadOne: '正在上傳檔案({percentage}%)...', uploadMany: '正在上傳檔案,{max} 中的 {current} 已完成({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/nb.js0000644000201500020150000000076414515446713024631 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'nb', { abort: 'Opplasting ble avbrutt av brukeren.', doneOne: 'Filen har blitt lastet opp.', doneMany: 'Fullført opplasting av %1 filer.', uploadOne: 'Laster opp fil ({percentage}%)...', uploadMany: 'Laster opp filer, {current} av {max} fullført ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/eo.js0000644000201500020150000000076014515446713024631 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'eo', { abort: 'Alŝuto ĉesigita de la uzanto', doneOne: 'Dosiero sukcese alŝutita.', doneMany: 'Sukcese alŝutitaj %1 dosieroj.', uploadOne: 'alŝutata dosiero ({percentage}%)...', uploadMany: 'Alŝutataj dosieroj, {current} el {max} faritaj ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/es.js0000644000201500020150000000076314515446713024640 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'es', { abort: 'Carga abortada por el usuario.', doneOne: 'Archivo cargado exitósamente.', doneMany: '%1 archivos exitósamente cargados.', uploadOne: 'Cargando archivo ({percentage}%)...', uploadMany: 'Cargando archivos, {current} de {max} hecho ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ro.js0000644000201500020150000000100414515446713024636 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ro', { abort: 'Încărcare întreruptă de utilizator.', doneOne: 'Fișier încărcat cu succes.', doneMany: '%1 fișiere încărcate cu succes.', uploadOne: 'Încărcare fișier ({percentage}%)...', uploadMany: 'Încărcare fișiere, {current} din {max} realizat ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/hr.js0000644000201500020150000000075714515446713024645 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'hr', { abort: 'Slanje prekinuto od strane korisnika', doneOne: 'Datoteka uspješno poslana.', doneMany: 'Uspješno poslano %1 datoteka.', uploadOne: 'Slanje datoteke ({percentage}%)...', uploadMany: 'Slanje datoteka, {current} od {max} gotovo ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/it.js0000644000201500020150000000102614515446713024636 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'it', { abort: 'Caricamento interrotto dall\'utente.', doneOne: 'Il file è stato caricato correttamente.', doneMany: '%1 file sono stati caricati correttamente.', uploadOne: 'Caricamento del file ({percentage}%)...', uploadMany: 'Caricamento dei file, {current} di {max} completati ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/de-ch.js0000644000201500020150000000102214515446713025176 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'de-ch', { abort: 'Hochladen durch den Benutzer abgebrochen.', doneOne: 'Datei erfolgreich hochgeladen.', doneMany: '%1 Dateien erfolgreich hochgeladen.', uploadOne: 'Datei wird hochgeladen ({percentage}%)...', uploadMany: 'Dateien werden hochgeladen, {current} von {max} fertig ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/sk.js0000644000201500020150000000077314515446713024647 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'sk', { abort: 'Nahrávanie zrušené používateľom.', doneOne: 'Súbor úspešne nahraný.', doneMany: 'Úspešne nahraných %1 súborov.', uploadOne: 'Nahrávanie súboru ({percentage}%)...', uploadMany: 'Nahrávanie súborov, {current} z {max} hotovo ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/az.js0000644000201500020150000000105414515446713024635 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'az', { abort: 'Serverə yükləmə istifadəçi tərəfindən dayandırılıb', doneOne: 'Fayl müvəffəqiyyətlə yüklənib', doneMany: '%1 fayllar müvəffəqiyyətlə yüklənib', uploadOne: 'Faylın yüklənməsi ({percentage}%)', uploadMany: 'Faylların yüklənməsi, {max}-dan {current} hazır ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/pt.js0000644000201500020150000000102514515446713024644 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'pt', { abort: 'Carregamento cancelado pelo utilizador.', doneOne: 'Ficheiro carregado com sucesso.', doneMany: 'Successfully uploaded %1 files.', // MISSING uploadOne: 'Uploading file ({percentage}%)...', // MISSING uploadMany: 'Uploading files, {current} of {max} done ({percentage}%)...' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ko.js0000644000201500020150000000107714515446713024641 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ko', { abort: '사용자가 업로드를 중단했습니다.', doneOne: '파일이 성공적으로 업로드되었습니다.', doneMany: '파일 %1개를 성공적으로 업로드하였습니다.', uploadOne: '파일 업로드중 ({percentage}%)...', uploadMany: '파일 {max} 개 중 {current} 번째 파일 업로드 중 ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/uk.js0000644000201500020150000000116214515446713024642 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'uk', { abort: 'Завантаження перервано користувачем.', doneOne: 'Файл цілком завантажено.', doneMany: 'Цілком завантажено %1 файлів.', uploadOne: 'Завантаження файлу ({percentage}%)...', uploadMany: 'Завантажено {current} із {max} файлів завершено на ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/zh-cn.js0000644000201500020150000000074514515446713025250 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'zh-cn', { abort: '上传已被用户中止', doneOne: '文件上传成功', doneMany: '成功上传了 %1 个文件', uploadOne: '正在上传文件({percentage}%)...', uploadMany: '正在上传文件,{max} 中的 {current}({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/sv.js0000644000201500020150000000076114515446713024657 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'sv', { abort: 'Uppladdning avbruten av användaren.', doneOne: 'Filuppladdning lyckades.', doneMany: 'Uppladdning av %1 filer lyckades.', uploadOne: 'Laddar upp fil ({percentage}%)...', uploadMany: 'Laddar upp filer, {current} av {max} färdiga ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/et.js0000644000201500020150000000100314515446713024625 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'et', { abort: 'Kasutaja katkestas üleslaadimise.', doneOne: 'Fail on üles laaditud.', doneMany: '%1 faili laaditi edukalt üles.', uploadOne: 'Faili üleslaadimine ({percentage}%)...', uploadMany: 'Failide üleslaadimine, {current} fail {max}-st üles laaditud ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/pl.js0000644000201500020150000000077414515446713024646 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'pl', { abort: 'Wysyłanie przerwane przez użytkownika.', doneOne: 'Plik został pomyślnie wysłany.', doneMany: 'Pomyślnie wysłane pliki: %1.', uploadOne: 'Wysyłanie pliku ({percentage}%)...', uploadMany: 'Wysyłanie plików, gotowe {current} z {max} ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/bg.js0000644000201500020150000000113214515446713024610 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'bg', { abort: 'Качването е прекратено от потребителя.', doneOne: 'Файлът е качен успешно.', doneMany: 'Успешно са качени %1 файла.', uploadOne: 'Качване на файл ({percentage}%)...', uploadMany: 'Качване на файлове, {current} от {max} качени ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/fa.js0000644000201500020150000000113414515446713024610 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'fa', { abort: 'بارگذاری توسط کاربر لغو شد.', doneOne: 'فایل با موفقیت بارگذاری شد.', doneMany: '%1 از فایل​ها با موفقیت بارگذاری شد.', uploadOne: 'بارگذاری فایل ({percentage}%)...', uploadMany: 'بارگذاری فایل​ها, {current} از {max} انجام شده ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ku.js0000644000201500020150000000116514515446713024645 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ku', { abort: 'بارکردنەکە بڕدرا لەلایەن بەکارهێنەر.', doneOne: 'پەڕگەکە بەسەرکەوتووانە بارکرا.', doneMany: 'بەسەرکەوتووانە بارکرا %1 پەڕگە.', uploadOne: 'پەڕگە باردەکرێت ({percentage}%)...', uploadMany: 'پەڕگە باردەکرێت, {current} لە {max} ئەنجامدراوە ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/el.js0000644000201500020150000000113714515446713024625 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'el', { abort: 'Αποστολή ακυρώθηκε απο χρήστη.', doneOne: 'Αρχείο εστάλη επιτυχώς.', doneMany: 'Επιτυχής αποστολή %1 αρχείων.', uploadOne: 'Αποστολή αρχείου ({percentage}%)…', uploadMany: 'Αποστολή αρχείων, {current} από {max} ολοκληρωμένα ({percentage}%)…' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ru.js0000644000201500020150000000111514515446713024647 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ru', { abort: 'Загрузка отменена пользователем', doneOne: 'Файл успешно загружен', doneMany: 'Успешно загружено файлов: %1', uploadOne: 'Загрузка файла ({percentage}%)', uploadMany: 'Загрузка файлов, {current} из {max} загружено ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/gl.js0000644000201500020150000000101014515446713024615 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'gl', { abort: 'Envío interrompido polo usuario.', doneOne: 'Ficheiro enviado satisfactoriamente.', doneMany: '%1 ficheiros enviados satisfactoriamente.', uploadOne: 'Enviando o ficheiro ({percentage}%)...', uploadMany: 'Enviando ficheiros, {current} de {max} feito o ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/sr-latn.js0000644000201500020150000000102214515446713025576 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'sr-latn', { abort: 'Postavljanje je prekinuto sa strane korisnika', doneOne: 'Datoteka je uspešno postavljena', doneMany: '%1 datoteka je uspešno postavljena', uploadOne: 'Postavljanje datoteke ({percentage}%)...', uploadMany: 'Postavljanje datoteka, {current} of {max} done ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/oc.js0000644000201500020150000000104014515446713024617 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'oc', { abort: 'Mandadís interromput per l\'utilizaire', doneOne: 'Fichièr mandat amb succès.', doneMany: '%1 fichièrs mandats amb succès.', uploadOne: 'Mandadís del fichièr en cors ({percentage} %)…', uploadMany: 'Mandadís dels fichièrs en cors, {current} sus {max} efectuats ({percentage} %)…' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/sq.js0000644000201500020150000000077614515446713024660 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'sq', { abort: 'Ngarkimi u ndërpre nga përdoruesi.', doneOne: 'Skeda u ngarkua me sukses.', doneMany: 'Me sukses u ngarkuan %1 skeda.', uploadOne: 'Duke ngarkuar skedën ({percentage}%)...', uploadMany: 'Duke ngarkuar skedat, {current} nga {max} , ngarkuar ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/pt-br.js0000644000201500020150000000076514515446713025257 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'pt-br', { abort: 'Envio cancelado pelo usuário.', doneOne: 'Arquivo enviado com sucesso.', doneMany: 'Enviados %1 arquivos com sucesso.', uploadOne: 'Enviando arquivo({percentage}%)...', uploadMany: 'Enviando arquivos, {current} de {max} completos ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/km.js0000644000201500020150000000152014515446713024630 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'km', { abort: 'បាន​ផ្ដាច់​ការផ្ទុកឡើង​ដោយ​អ្នក​ប្រើប្រាស់។', doneOne: 'បាន​ផ្ទុកឡើង​នូវ​ឯកសារ​ដោយ​ជោគជ័យ។', doneMany: 'បាន​ផ្ទុក​ឡើង​នូវ​ឯកសារ %1 ដោយ​ជោគជ័យ។', uploadOne: 'កំពុង​ផ្ទុកឡើង​ឯកសារ ({percentage}%)...', uploadMany: 'កំពុង​ផ្ទុកឡើង​ឯកសារ, រួចរាល់ {current} នៃ {max} ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/nl.js0000644000201500020150000000077414515446713024644 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'nl', { abort: 'Upload gestopt door de gebruiker.', doneOne: 'Bestand succesvol geüpload.', doneMany: 'Succesvol %1 bestanden geüpload.', uploadOne: 'Uploaden bestand ({percentage}%)…', uploadMany: 'Bestanden aan het uploaden, {current} van {max} klaar ({percentage}%)…' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/es-mx.js0000644000201500020150000000101414515446713025250 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'es-mx', { abort: 'La carga ha sido abortada por el usuario.', doneOne: 'El archivo ha sido cargado completamente.', doneMany: '%1 archivos cargados completamente.', uploadOne: 'Cargando archivo ({percentage}%)...', uploadMany: 'Cargando archivos, {current} de {max} listo ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/da.js0000644000201500020150000000073214515446713024611 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'da', { abort: 'Upload er afbrudt af bruger.', doneOne: 'Filen er uploadet.', doneMany: 'Du har uploadet %1 filer.', uploadOne: 'Uploader fil ({percentage}%)...', uploadMany: 'Uploader filer, {current} af {max} er uploadet ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ca.js0000644000201500020150000000075714515446713024617 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ca', { abort: 'Pujada cancel·lada per l\'usuari.', doneOne: 'Fitxer pujat correctament.', doneMany: '%1 fitxers pujats correctament.', uploadOne: 'Pujant fitxer ({percentage}%)...', uploadMany: 'Pujant fitxers, {current} de {max} finalitzats ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/de.js0000644000201500020150000000101714515446713024612 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'de', { abort: 'Hochladen durch den Benutzer abgebrochen.', doneOne: 'Datei erfolgreich hochgeladen.', doneMany: '%1 Dateien erfolgreich hochgeladen.', uploadOne: 'Datei wird hochgeladen ({percentage}%)...', uploadMany: 'Dateien werden hochgeladen, {current} von {max} fertig ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/cs.js0000644000201500020150000000077214515446713024636 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'cs', { abort: 'Nahrávání zrušeno uživatelem.', doneOne: 'Soubor úspěšně nahrán.', doneMany: 'Úspěšně nahráno %1 souborů.', uploadOne: 'Nahrávání souboru ({percentage}%)...', uploadMany: 'Nahrávání souborů, {current} z {max} hotovo ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/tr.js0000644000201500020150000000105614515446713024652 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'tr', { abort: 'Gönderme işlemi kullanıcı tarafından durduruldu.', doneOne: 'Gönderim işlemi başarılı şekilde tamamlandı.', doneMany: '%1 dosya başarılı şekilde gönderildi.', uploadOne: 'Dosyanın ({percentage}%) gönderildi...', uploadMany: 'Toplam {current} / {max} dosyanın ({percentage}%) gönderildi...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ja.js0000644000201500020150000000115614515446713024620 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ja', { abort: 'アップロードを中止しました。', doneOne: 'ファイルのアップロードに成功しました。', doneMany: '%1個のファイルのアップロードに成功しました。', uploadOne: 'ファイルのアップロード中 ({percentage}%)...', uploadMany: '{max} 個中 {current} 個のファイルをアップロードしました。 ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/lv.js0000644000201500020150000000076514515446713024654 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'lv', { abort: 'Augšupielādi atcēla lietotājs.', doneOne: 'Fails veiksmīgi ielādēts.', doneMany: 'Veiksmīgi ielādēts %1 fails.', uploadOne: 'Ielādāju failu ({percentage}%)...', uploadMany: 'Ielādēju failus, {curent} no {max} izpildīts ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/en-au.js0000644000201500020150000000074714515446713025240 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'en-au', { abort: 'Upload aborted by the user.', doneOne: 'File successfully uploaded.', doneMany: 'Successfully uploaded %1 files.', uploadOne: 'Uploading file ({percentage}%)...', uploadMany: 'Uploading files, {current} of {max} done ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/en.js0000644000201500020150000000074414515446713024632 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'en', { abort: 'Upload aborted by the user.', doneOne: 'File successfully uploaded.', doneMany: 'Successfully uploaded %1 files.', uploadOne: 'Uploading file ({percentage}%)...', uploadMany: 'Uploading files, {current} of {max} done ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/no.js0000644000201500020150000000076414515446713024646 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'no', { abort: 'Opplasting ble avbrutt av brukeren.', doneOne: 'Filen har blitt lastet opp.', doneMany: 'Fullført opplasting av %1 filer.', uploadOne: 'Laster opp fil ({percentage}%)...', uploadMany: 'Laster opp filer, {current} av {max} fullført ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/fr.js0000644000201500020150000000107614515446713024636 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'fr', { abort: 'Téléversement interrompu par l\'utilisateur.', doneOne: 'Fichier téléversé avec succès.', doneMany: '%1 fichiers téléversés avec succès.', uploadOne: 'Téléversement du fichier en cours ({percentage} %)…', uploadMany: 'Téléversement des fichiers en cours, {current} sur {max} effectués ({percentage} %)…' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/id.js0000644000201500020150000000077514515446713024630 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'id', { abort: 'Pengunggahan dibatalkan oleh pengguna', doneOne: 'Berkas telah berhasil diunggah', doneMany: 'Pengunggahan berkas %1 berhasil', uploadOne: 'Mengunggah berkas ({percentage}%)...', uploadMany: 'Pengunggahan berkas {current} dari {max} berhasil ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/ug.js0000644000201500020150000000114614515446713024640 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'ug', { abort: 'يۈكلەشنى ئىشلەتكۈچى ئۈزۈۋەتتى.', doneOne: 'ھۆججەت مۇۋەپپەقىيەتلىك يۈكلەندى.', doneMany: 'مۇۋەپپەقىيەتلىك ھالدا %1 ھۆججەت يۈكلەندى.', uploadOne: 'Uploading file ({percentage}%)...', // MISSING uploadMany: 'Uploading files, {current} of {max} done ({percentage}%)...' // MISSING } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/sr.js0000644000201500020150000000120514515446713024645 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'sr', { abort: 'Постављање је прекинуто са стране корисника', doneOne: 'Датотека је успешно постављена', doneMany: '%1 датотека је успешно постављена', uploadOne: 'Постављање датотеке ({percentage}%)...', uploadMany: 'Постављање датотека, {current} of {max} done ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/eu.js0000644000201500020150000000102014515446713024625 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'eu', { abort: 'Karga erabiltzaileak bertan behera utzita.', doneOne: 'Fitxategia behar bezala kargatu da.', doneMany: 'Behar bezala kargatu dira %1 fitxategi.', uploadOne: 'Fitxategia kargatzen ({percentage}%)...', uploadMany: 'Fitxategiak kargatzen, {current} / {max} eginda ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/plugins/uploadwidget/lang/hu.js0000644000201500020150000000077714515446713024652 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.plugins.setLang( 'uploadwidget', 'hu', { abort: 'A feltöltést a felhasználó megszakította.', doneOne: 'A fájl sikeresen feltöltve.', doneMany: '%1 fájl sikeresen feltöltve.', uploadOne: 'Fájl feltöltése ({percentage}%)...', uploadMany: 'Fájlok feltöltése, {current}/{max} kész ({percentage}%)...' } ); rt-5.0.5/devel/third-party/ckeditor-src/.editorconfig0000644000201500020150000000041114503523375021241 0ustar puckpuck# Configurations to normalize the IDE behavior. # http://editorconfig.org/ root = true [*] indent_style = tab tab_width = 4 charset = utf-8 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true [*.yml] indent_style = space indent_size = 2 rt-5.0.5/devel/third-party/ckeditor-src/.gitignore0000644000201500020150000000140514515446700020557 0ustar puckpuck# These files will be ignored by Git and by our linting tools: # grunt jshint # grunt jscs # # Be sure to append /** to folders to have everything inside them ignored. # All "dot directories". .*/** node_modules/** build/** coverage/** dev/builder/release/** dev/builder/ckbuilder/** dev/langtool/po/** dev/langtool/cklangtool/** samples/toolbarconfigurator/.bender/** samples/toolbarconfigurator/node_modules/** samples/toolbarconfigurator/docs/** tests/security tests/plugins/mathjax/_assets/mathjax/** *.css.map bender-*.log !.github/** !.npm/* .DS_Store # Ignore package-lock.json # - we don't intent to force specific 3rd party dependency version via `package-lock.json` file # Such information should be specified in the package.json file. package-lock.json rt-5.0.5/devel/third-party/ckeditor-src/styles.js0000644000201500020150000001255214515446714020462 0ustar puckpuck/** * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ // This file contains style definitions that can be used by CKEditor plugins. // // The most common use for it is the "stylescombo" plugin which shows the Styles drop-down // list containing all styles in the editor toolbar. Other plugins, like // the "div" plugin, use a subset of the styles for their features. // // If you do not have plugins that depend on this file in your editor build, you can simply // ignore it. Otherwise it is strongly recommended to customize this file to match your // website requirements and design properly. // // For more information refer to: https://ckeditor.com/docs/ckeditor4/latest/guide/dev_styles.html#style-rules CKEDITOR.stylesSet.add( 'default', [ /* Block styles */ // These styles are already available in the "Format" drop-down list ("format" plugin), // so they are not needed here by default. You may enable them to avoid // placing the "Format" combo in the toolbar, maintaining the same features. /* { name: 'Paragraph', element: 'p' }, { name: 'Heading 1', element: 'h1' }, { name: 'Heading 2', element: 'h2' }, { name: 'Heading 3', element: 'h3' }, { name: 'Heading 4', element: 'h4' }, { name: 'Heading 5', element: 'h5' }, { name: 'Heading 6', element: 'h6' }, { name: 'Preformatted Text',element: 'pre' }, { name: 'Address', element: 'address' }, */ { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, { name: 'Special Container', element: 'div', styles: { padding: '5px 10px', background: '#eee', border: '1px solid #ccc' } }, /* Inline styles */ // These are core styles available as toolbar buttons. You may opt enabling // some of them in the Styles drop-down list, removing them from the toolbar. // (This requires the "stylescombo" plugin.) /* { name: 'Strong', element: 'strong', overrides: 'b' }, { name: 'Emphasis', element: 'em' , overrides: 'i' }, { name: 'Underline', element: 'u' }, { name: 'Strikethrough', element: 'strike' }, { name: 'Subscript', element: 'sub' }, { name: 'Superscript', element: 'sup' }, */ { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, { name: 'Big', element: 'big' }, { name: 'Small', element: 'small' }, { name: 'Typewriter', element: 'tt' }, { name: 'Computer Code', element: 'code' }, { name: 'Keyboard Phrase', element: 'kbd' }, { name: 'Sample Text', element: 'samp' }, { name: 'Variable', element: 'var' }, { name: 'Deleted Text', element: 'del' }, { name: 'Inserted Text', element: 'ins' }, { name: 'Cited Work', element: 'cite' }, { name: 'Inline Quotation', element: 'q' }, { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, /* Object styles */ { name: 'Styled Image (left)', element: 'img', attributes: { 'class': 'left' } }, { name: 'Styled Image (right)', element: 'img', attributes: { 'class': 'right' } }, { name: 'Compact Table', element: 'table', attributes: { cellpadding: '5', cellspacing: '0', border: '1', bordercolor: '#ccc' }, styles: { 'border-collapse': 'collapse' } }, { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } }, /* Widget styles */ { name: 'Clean Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-clean' } }, { name: 'Grayscale Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-grayscale' } }, { name: 'Featured Snippet', type: 'widget', widget: 'codeSnippet', attributes: { 'class': 'code-featured' } }, { name: 'Featured Formula', type: 'widget', widget: 'mathjax', attributes: { 'class': 'math-featured' } }, { name: '240p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-240p' }, group: 'size' }, { name: '360p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-360p' }, group: 'size' }, { name: '480p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-480p' }, group: 'size' }, { name: '720p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-720p' }, group: 'size' }, { name: '1080p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-1080p' }, group: 'size' }, // Adding space after the style name is an intended workaround. For now, there // is no option to create two styles with the same name for different widget types. See https://dev.ckeditor.com/ticket/16664. { name: '240p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-240p' }, group: 'size' }, { name: '360p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-360p' }, group: 'size' }, { name: '480p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-480p' }, group: 'size' }, { name: '720p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-720p' }, group: 'size' }, { name: '1080p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-1080p' }, group: 'size' } ] ); // %LEAVE_UNMINIFIED% %REMOVE_LINE% rt-5.0.5/devel/third-party/ckeditor-src/bender-runner.config.json0000644000201500020150000000036614503523375023502 0ustar puckpuck{ "bender": { "port": 9001 }, "server": { "port": 9002 }, "paths": { "ckeditor4": "../ckeditor4/", "runner": "./src/runner.html" }, "browsers": { "linux": [ "chrome", "firefox" ], "macos": [ "safari" ] } } rt-5.0.5/devel/third-party/eyedropper.svg0000644000201500020150000000243514514270122017071 0ustar puckpuck rt-5.0.5/devel/third-party/selectize-0.12.6/0000755000201500020150000000000014514270122016677 5ustar puckpuckrt-5.0.5/devel/third-party/selectize-0.12.6/selectize.js0000644000201500020150000031767414514270122021246 0ustar puckpuck/** * sifter.js * Copyright (c) 2013 Brian Reavis & contributors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this * file except in compliance with the License. You may obtain a copy of the License at: * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF * ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. * * @author Brian Reavis */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define('sifter', factory); } else if (typeof exports === 'object') { module.exports = factory(); } else { root.Sifter = factory(); } }(this, function() { /** * Textually searches arrays and hashes of objects * by property (or multiple properties). Designed * specifically for autocomplete. * * @constructor * @param {array|object} items * @param {object} items */ var Sifter = function(items, settings) { this.items = items; this.settings = settings || {diacritics: true}; }; /** * Splits a search string into an array of individual * regexps to be used to match results. * * @param {string} query * @returns {array} */ Sifter.prototype.tokenize = function(query) { query = trim(String(query || '').toLowerCase()); if (!query || !query.length) return []; var i, n, regex, letter; var tokens = []; var words = query.split(/ +/); for (i = 0, n = words.length; i < n; i++) { regex = escape_regex(words[i]); if (this.settings.diacritics) { for (letter in DIACRITICS) { if (DIACRITICS.hasOwnProperty(letter)) { regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]); } } } tokens.push({ string : words[i], regex : new RegExp(regex, 'i') }); } return tokens; }; /** * Iterates over arrays and hashes. * * ``` * this.iterator(this.items, function(item, id) { * // invoked for each item * }); * ``` * * @param {array|object} object */ Sifter.prototype.iterator = function(object, callback) { var iterator; if (is_array(object)) { iterator = Array.prototype.forEach || function(callback) { for (var i = 0, n = this.length; i < n; i++) { callback(this[i], i, this); } }; } else { iterator = function(callback) { for (var key in this) { if (this.hasOwnProperty(key)) { callback(this[key], key, this); } } }; } iterator.apply(object, [callback]); }; /** * Returns a function to be used to score individual results. * * Good matches will have a higher score than poor matches. * If an item is not a match, 0 will be returned by the function. * * @param {object|string} search * @param {object} options (optional) * @returns {function} */ Sifter.prototype.getScoreFunction = function(search, options) { var self, fields, tokens, token_count, nesting; self = this; search = self.prepareSearch(search, options); tokens = search.tokens; fields = search.options.fields; token_count = tokens.length; nesting = search.options.nesting; /** * Calculates how close of a match the * given value is against a search token. * * @param {mixed} value * @param {object} token * @return {number} */ var scoreValue = function(value, token) { var score, pos; if (!value) return 0; value = String(value || ''); pos = value.search(token.regex); if (pos === -1) return 0; score = token.string.length / value.length; if (pos === 0) score += 0.5; return score; }; /** * Calculates the score of an object * against the search query. * * @param {object} token * @param {object} data * @return {number} */ var scoreObject = (function() { var field_count = fields.length; if (!field_count) { return function() { return 0; }; } if (field_count === 1) { return function(token, data) { return scoreValue(getattr(data, fields[0], nesting), token); }; } return function(token, data) { for (var i = 0, sum = 0; i < field_count; i++) { sum += scoreValue(getattr(data, fields[i], nesting), token); } return sum / field_count; }; })(); if (!token_count) { return function() { return 0; }; } if (token_count === 1) { return function(data) { return scoreObject(tokens[0], data); }; } if (search.options.conjunction === 'and') { return function(data) { var score; for (var i = 0, sum = 0; i < token_count; i++) { score = scoreObject(tokens[i], data); if (score <= 0) return 0; sum += score; } return sum / token_count; }; } else { return function(data) { for (var i = 0, sum = 0; i < token_count; i++) { sum += scoreObject(tokens[i], data); } return sum / token_count; }; } }; /** * Returns a function that can be used to compare two * results, for sorting purposes. If no sorting should * be performed, `null` will be returned. * * @param {string|object} search * @param {object} options * @return function(a,b) */ Sifter.prototype.getSortFunction = function(search, options) { var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort; self = this; search = self.prepareSearch(search, options); sort = (!search.query && options.sort_empty) || options.sort; /** * Fetches the specified sort field value * from a search result item. * * @param {string} name * @param {object} result * @return {mixed} */ get_field = function(name, result) { if (name === '$score') return result.score; return getattr(self.items[result.id], name, options.nesting); }; // parse options fields = []; if (sort) { for (i = 0, n = sort.length; i < n; i++) { if (search.query || sort[i].field !== '$score') { fields.push(sort[i]); } } } // the "$score" field is implied to be the primary // sort field, unless it's manually specified if (search.query) { implicit_score = true; for (i = 0, n = fields.length; i < n; i++) { if (fields[i].field === '$score') { implicit_score = false; break; } } if (implicit_score) { fields.unshift({field: '$score', direction: 'desc'}); } } else { for (i = 0, n = fields.length; i < n; i++) { if (fields[i].field === '$score') { fields.splice(i, 1); break; } } } multipliers = []; for (i = 0, n = fields.length; i < n; i++) { multipliers.push(fields[i].direction === 'desc' ? -1 : 1); } // build function fields_count = fields.length; if (!fields_count) { return null; } else if (fields_count === 1) { field = fields[0].field; multiplier = multipliers[0]; return function(a, b) { return multiplier * cmp( get_field(field, a), get_field(field, b) ); }; } else { return function(a, b) { var i, result, a_value, b_value, field; for (i = 0; i < fields_count; i++) { field = fields[i].field; result = multipliers[i] * cmp( get_field(field, a), get_field(field, b) ); if (result) return result; } return 0; }; } }; /** * Parses a search query and returns an object * with tokens and fields ready to be populated * with results. * * @param {string} query * @param {object} options * @returns {object} */ Sifter.prototype.prepareSearch = function(query, options) { if (typeof query === 'object') return query; options = extend({}, options); var option_fields = options.fields; var option_sort = options.sort; var option_sort_empty = options.sort_empty; if (option_fields && !is_array(option_fields)) options.fields = [option_fields]; if (option_sort && !is_array(option_sort)) options.sort = [option_sort]; if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty]; return { options : options, query : String(query || '').toLowerCase(), tokens : this.tokenize(query), total : 0, items : [] }; }; /** * Searches through all items and returns a sorted array of matches. * * The `options` parameter can contain: * * - fields {string|array} * - sort {array} * - score {function} * - filter {bool} * - limit {integer} * * Returns an object containing: * * - options {object} * - query {string} * - tokens {array} * - total {int} * - items {array} * * @param {string} query * @param {object} options * @returns {object} */ Sifter.prototype.search = function(query, options) { var self = this, value, score, search, calculateScore; var fn_sort; var fn_score; search = this.prepareSearch(query, options); options = search.options; query = search.query; // generate result scoring function fn_score = options.score || self.getScoreFunction(search); // perform search and sort if (query.length) { self.iterator(self.items, function(item, id) { score = fn_score(item); if (options.filter === false || score > 0) { search.items.push({'score': score, 'id': id}); } }); } else { self.iterator(self.items, function(item, id) { search.items.push({'score': 1, 'id': id}); }); } fn_sort = self.getSortFunction(search, options); if (fn_sort) search.items.sort(fn_sort); // apply limits search.total = search.items.length; if (typeof options.limit === 'number') { search.items = search.items.slice(0, options.limit); } return search; }; // utilities // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var cmp = function(a, b) { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : (a < b ? -1 : 0); } a = asciifold(String(a || '')); b = asciifold(String(b || '')); if (a > b) return 1; if (b > a) return -1; return 0; }; var extend = function(a, b) { var i, n, k, object; for (i = 1, n = arguments.length; i < n; i++) { object = arguments[i]; if (!object) continue; for (k in object) { if (object.hasOwnProperty(k)) { a[k] = object[k]; } } } return a; }; /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on * @param {String} name The optionally dotted property name to fetch * @param {Boolean} nesting Handle nesting or not * @return {Object} The resolved property value */ var getattr = function(obj, name, nesting) { if (!obj || !name) return; if (!nesting) return obj[name]; var names = name.split("."); while(names.length && (obj = obj[names.shift()])); return obj; }; var trim = function(str) { return (str + '').replace(/^\s+|\s+$|/g, ''); }; var escape_regex = function(str) { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); }; var is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) { return Object.prototype.toString.call(object) === '[object Array]'; }; var DIACRITICS = { 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', 'b': '[b␢βΒB฿𐌁ᛒ]', 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', 'f': '[fƑƒḞḟ]', 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', 'j': '[jȷĴĵɈɉʝɟʲ]', 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', 'x': '[xẌẍẊẋχ]', 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' }; var asciifold = (function() { var i, n, k, chunk; var foreignletters = ''; var lookup = {}; for (k in DIACRITICS) { if (DIACRITICS.hasOwnProperty(k)) { chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); foreignletters += chunk; for (i = 0, n = chunk.length; i < n; i++) { lookup[chunk.charAt(i)] = k; } } } var regexp = new RegExp('[' + foreignletters + ']', 'g'); return function(str) { return str.replace(regexp, function(foreignletter) { return lookup[foreignletter]; }).toLowerCase(); }; })(); // export // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return Sifter; })); /** * microplugin.js * Copyright (c) 2013 Brian Reavis & contributors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this * file except in compliance with the License. You may obtain a copy of the License at: * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF * ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. * * @author Brian Reavis */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define('microplugin', factory); } else if (typeof exports === 'object') { module.exports = factory(); } else { root.MicroPlugin = factory(); } }(this, function() { var MicroPlugin = {}; MicroPlugin.mixin = function(Interface) { Interface.plugins = {}; /** * Initializes the listed plugins (with options). * Acceptable formats: * * List (without options): * ['a', 'b', 'c'] * * List (with options): * [{'name': 'a', options: {}}, {'name': 'b', options: {}}] * * Hash (with options): * {'a': { ... }, 'b': { ... }, 'c': { ... }} * * @param {mixed} plugins */ Interface.prototype.initializePlugins = function(plugins) { var i, n, key; var self = this; var queue = []; self.plugins = { names : [], settings : {}, requested : {}, loaded : {} }; if (utils.isArray(plugins)) { for (i = 0, n = plugins.length; i < n; i++) { if (typeof plugins[i] === 'string') { queue.push(plugins[i]); } else { self.plugins.settings[plugins[i].name] = plugins[i].options; queue.push(plugins[i].name); } } } else if (plugins) { for (key in plugins) { if (plugins.hasOwnProperty(key)) { self.plugins.settings[key] = plugins[key]; queue.push(key); } } } while (queue.length) { self.require(queue.shift()); } }; Interface.prototype.loadPlugin = function(name) { var self = this; var plugins = self.plugins; var plugin = Interface.plugins[name]; if (!Interface.plugins.hasOwnProperty(name)) { throw new Error('Unable to find "' + name + '" plugin'); } plugins.requested[name] = true; plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]); plugins.names.push(name); }; /** * Initializes a plugin. * * @param {string} name */ Interface.prototype.require = function(name) { var self = this; var plugins = self.plugins; if (!self.plugins.loaded.hasOwnProperty(name)) { if (plugins.requested[name]) { throw new Error('Plugin has circular dependency ("' + name + '")'); } self.loadPlugin(name); } return plugins.loaded[name]; }; /** * Registers a plugin. * * @param {string} name * @param {function} fn */ Interface.define = function(name, fn) { Interface.plugins[name] = { 'name' : name, 'fn' : fn }; }; }; var utils = { isArray: Array.isArray || function(vArg) { return Object.prototype.toString.call(vArg) === '[object Array]'; } }; return MicroPlugin; })); /** * selectize.js (v0.12.6) * Copyright (c) 2013–2015 Brian Reavis & contributors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this * file except in compliance with the License. You may obtain a copy of the License at: * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF * ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. * * @author Brian Reavis */ /*jshint curly:false */ /*jshint browser:true */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define('selectize', ['jquery','sifter','microplugin'], factory); } else if (typeof exports === 'object') { module.exports = factory(require('jquery'), require('sifter'), require('microplugin')); } else { root.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin); } }(this, function($, Sifter, MicroPlugin) { 'use strict'; var highlight = function($element, pattern) { if (typeof pattern === 'string' && !pattern.length) return; var regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern; var highlight = function(node) { var skip = 0; // Wrap matching part of text node with highlighting , e.g. // Soccer -> Soccer for regex = /soc/i if (node.nodeType === 3) { var pos = node.data.search(regex); if (pos >= 0 && node.data.length > 0) { var match = node.data.match(regex); var spannode = document.createElement('span'); spannode.className = 'highlight'; var middlebit = node.splitText(pos); var endbit = middlebit.splitText(match[0].length); var middleclone = middlebit.cloneNode(true); spannode.appendChild(middleclone); middlebit.parentNode.replaceChild(spannode, middlebit); skip = 1; } } // Recurse element node, looking for child text nodes to highlight, unless element // is childless,