更新到 5.2 后第一次 SVN 提交。
[email protected] git-svn-id: https://svn.code.sf.net/p/hawebs/svn@561 a2543c7e-f6e9-4f8a-8bff-1ffc34733512
This commit is contained in:
@@ -0,0 +1,297 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview jQuery adapter provides easy use of basic CKEditor functions
|
||||
* and access to internal API. It also integrates some aspects of CKEditor with
|
||||
* jQuery framework.
|
||||
*
|
||||
* Every TEXTAREA, DIV and P elements can be converted to working editor.
|
||||
*
|
||||
* Plugin exposes some of editor's event to jQuery event system. All of those are namespaces inside
|
||||
* ".ckeditor" namespace and can be binded/listened on supported textarea, div and p nodes.
|
||||
*
|
||||
* Available jQuery events:
|
||||
* - instanceReady.ckeditor( editor, rootNode )
|
||||
* Triggered when new instance is ready.
|
||||
* - destroy.ckeditor( editor )
|
||||
* Triggered when instance is destroyed.
|
||||
* - getData.ckeditor( editor, eventData )
|
||||
* Triggered when getData event is fired inside editor. It can change returned data using eventData reference.
|
||||
* - setData.ckeditor( editor )
|
||||
* Triggered when getData event is fired inside editor.
|
||||
*
|
||||
* @example
|
||||
* <script src="jquery.js"></script>
|
||||
* <script src="ckeditor.js"></script>
|
||||
* <script src="adapters/jquery/adapter.js"></script>
|
||||
*/
|
||||
|
||||
(function()
|
||||
{
|
||||
/**
|
||||
* Allow CKEditor to override jQuery.fn.val(). This results in ability to use val()
|
||||
* function on textareas as usual and having those calls synchronized with CKEditor
|
||||
* Rich Text Editor component.
|
||||
*
|
||||
* This config option is global and executed during plugin load.
|
||||
* Can't be customized across editor instances.
|
||||
*
|
||||
* @type Boolean
|
||||
* @example
|
||||
* $( 'textarea' ).ckeditor();
|
||||
* // ...
|
||||
* $( 'textarea' ).val( 'New content' );
|
||||
*/
|
||||
CKEDITOR.config.jqueryOverrideVal = typeof CKEDITOR.config.jqueryOverrideVal == 'undefined'
|
||||
? true : CKEDITOR.config.jqueryOverrideVal;
|
||||
|
||||
var jQuery = window.jQuery;
|
||||
|
||||
if ( typeof jQuery == 'undefined' )
|
||||
return;
|
||||
|
||||
// jQuery object methods.
|
||||
jQuery.extend( jQuery.fn,
|
||||
/** @lends jQuery.fn */
|
||||
{
|
||||
/**
|
||||
* Return existing CKEditor instance for first matched element.
|
||||
* Allows to easily use internal API. Doesn't return jQuery object.
|
||||
*
|
||||
* Raised exception if editor doesn't exist or isn't ready yet.
|
||||
*
|
||||
* @name jQuery.ckeditorGet
|
||||
* @return CKEDITOR.editor
|
||||
* @see CKEDITOR.editor
|
||||
*/
|
||||
ckeditorGet: function()
|
||||
{
|
||||
var instance = this.eq( 0 ).data( 'ckeditorInstance' );
|
||||
if ( !instance )
|
||||
throw "CKEditor not yet initialized, use ckeditor() with callback.";
|
||||
return instance;
|
||||
},
|
||||
/**
|
||||
* Triggers creation of CKEditor in all matched elements (reduced to DIV, P and TEXTAREAs).
|
||||
* Binds callback to instanceReady event of all instances. If editor is already created, than
|
||||
* callback is fired right away.
|
||||
*
|
||||
* Mixed parameter order allowed.
|
||||
*
|
||||
* @param callback Function to be run on editor instance. Passed parameters: [ textarea ].
|
||||
* Callback is fiered in "this" scope being ckeditor instance and having source textarea as first param.
|
||||
*
|
||||
* @param config Configuration options for new instance(s) if not already created.
|
||||
* See URL
|
||||
*
|
||||
* @example
|
||||
* $( 'textarea' ).ckeditor( function( textarea ) {
|
||||
* $( textarea ).val( this.getData() )
|
||||
* } );
|
||||
*
|
||||
* @name jQuery.fn.ckeditor
|
||||
* @return jQuery.fn
|
||||
*/
|
||||
ckeditor: function( callback, config )
|
||||
{
|
||||
if ( !jQuery.isFunction( callback ))
|
||||
{
|
||||
var tmp = config;
|
||||
config = callback;
|
||||
callback = tmp;
|
||||
}
|
||||
config = config || {};
|
||||
|
||||
this.filter( 'textarea, div, p' ).each( function()
|
||||
{
|
||||
var $element = jQuery( this ),
|
||||
editor = $element.data( 'ckeditorInstance' ),
|
||||
instanceLock = $element.data( '_ckeditorInstanceLock' ),
|
||||
element = this;
|
||||
|
||||
if ( editor && !instanceLock )
|
||||
{
|
||||
if ( callback )
|
||||
callback.apply( editor, [ this ] );
|
||||
}
|
||||
else if ( !instanceLock )
|
||||
{
|
||||
// CREATE NEW INSTANCE
|
||||
|
||||
// Handle config.autoUpdateElement inside this plugin if desired.
|
||||
if ( config.autoUpdateElement
|
||||
|| ( typeof config.autoUpdateElement == 'undefined' && CKEDITOR.config.autoUpdateElement ) )
|
||||
{
|
||||
config.autoUpdateElementJquery = true;
|
||||
}
|
||||
|
||||
// Always disable config.autoUpdateElement.
|
||||
config.autoUpdateElement = false;
|
||||
$element.data( '_ckeditorInstanceLock', true );
|
||||
|
||||
// Set instance reference in element's data.
|
||||
editor = CKEDITOR.replace( element, config );
|
||||
$element.data( 'ckeditorInstance', editor );
|
||||
|
||||
// Register callback.
|
||||
editor.on( 'instanceReady', function( event )
|
||||
{
|
||||
var editor = event.editor;
|
||||
setTimeout( function()
|
||||
{
|
||||
// Delay bit more if editor is still not ready.
|
||||
if ( !editor.element )
|
||||
{
|
||||
setTimeout( arguments.callee, 100 );
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove this listener.
|
||||
event.removeListener( 'instanceReady', this.callee );
|
||||
|
||||
// Forward setData on dataReady.
|
||||
editor.on( 'dataReady', function()
|
||||
{
|
||||
$element.trigger( 'setData' + '.ckeditor', [ editor ] );
|
||||
});
|
||||
|
||||
// Forward getData.
|
||||
editor.on( 'getData', function( event ) {
|
||||
$element.trigger( 'getData' + '.ckeditor', [ editor, event.data ] );
|
||||
}, 999 );
|
||||
|
||||
// Forward destroy event.
|
||||
editor.on( 'destroy', function()
|
||||
{
|
||||
$element.trigger( 'destroy.ckeditor', [ editor ] );
|
||||
});
|
||||
|
||||
// Integrate with form submit.
|
||||
if ( editor.config.autoUpdateElementJquery && $element.is( 'textarea' ) && $element.parents( 'form' ).length )
|
||||
{
|
||||
var onSubmit = function()
|
||||
{
|
||||
$element.ckeditor( function()
|
||||
{
|
||||
editor.updateElement();
|
||||
});
|
||||
};
|
||||
|
||||
// Bind to submit event.
|
||||
$element.parents( 'form' ).submit( onSubmit );
|
||||
|
||||
// Bind to form-pre-serialize from jQuery Forms plugin.
|
||||
$element.parents( 'form' ).bind( 'form-pre-serialize', onSubmit );
|
||||
|
||||
// Unbind when editor destroyed.
|
||||
$element.bind( 'destroy.ckeditor', function()
|
||||
{
|
||||
$element.parents( 'form' ).unbind( 'submit', onSubmit );
|
||||
$element.parents( 'form' ).unbind( 'form-pre-serialize', onSubmit );
|
||||
});
|
||||
}
|
||||
|
||||
// Garbage collect on destroy.
|
||||
editor.on( 'destroy', function()
|
||||
{
|
||||
$element.data( 'ckeditorInstance', null );
|
||||
});
|
||||
|
||||
// Remove lock.
|
||||
$element.data( '_ckeditorInstanceLock', null );
|
||||
|
||||
// Fire instanceReady event.
|
||||
$element.trigger( 'instanceReady.ckeditor', [ editor ] );
|
||||
|
||||
// Run given (first) code.
|
||||
if ( callback )
|
||||
callback.apply( editor, [ element ] );
|
||||
}, 0 );
|
||||
}, null, null, 9999);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Editor is already during creation process, bind our code to the event.
|
||||
CKEDITOR.on( 'instanceReady', function( event )
|
||||
{
|
||||
var editor = event.editor;
|
||||
setTimeout( function()
|
||||
{
|
||||
// Delay bit more if editor is still not ready.
|
||||
if ( !editor.element )
|
||||
{
|
||||
setTimeout( arguments.callee, 100 );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( editor.element.$ == element )
|
||||
{
|
||||
// Run given code.
|
||||
if ( callback )
|
||||
callback.apply( editor, [ element ] );
|
||||
}
|
||||
}, 0 );
|
||||
}, null, null, 9999);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
// New val() method for objects.
|
||||
if ( CKEDITOR.config.jqueryOverrideVal )
|
||||
{
|
||||
jQuery.fn.val = CKEDITOR.tools.override( jQuery.fn.val, function( oldValMethod )
|
||||
{
|
||||
/**
|
||||
* CKEditor-aware val() method.
|
||||
*
|
||||
* Acts same as original jQuery val(), but for textareas which have CKEditor instances binded to them, method
|
||||
* returns editor's content. It also works for settings values.
|
||||
*
|
||||
* @param oldValMethod
|
||||
* @name jQuery.fn.val
|
||||
*/
|
||||
return function( newValue, forceNative )
|
||||
{
|
||||
var isSetter = typeof newValue != 'undefined',
|
||||
result;
|
||||
|
||||
this.each( function()
|
||||
{
|
||||
var $this = jQuery( this ),
|
||||
editor = $this.data( 'ckeditorInstance' );
|
||||
|
||||
if ( !forceNative && $this.is( 'textarea' ) && editor )
|
||||
{
|
||||
if ( isSetter )
|
||||
editor.setData( newValue );
|
||||
else
|
||||
{
|
||||
result = editor.getData();
|
||||
// break;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isSetter )
|
||||
oldValMethod.call( $this, newValue );
|
||||
else
|
||||
{
|
||||
result = oldValMethod.call( $this );
|
||||
// break;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
return isSetter ? this : result;
|
||||
};
|
||||
});
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview API initialization code.
|
||||
*/
|
||||
|
||||
(function()
|
||||
{
|
||||
// Disable HC detaction in WebKit. (#5429)
|
||||
if ( CKEDITOR.env.webkit )
|
||||
{
|
||||
CKEDITOR.env.hc = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check is High Contrast is active by creating a temporary element with a
|
||||
// background image.
|
||||
|
||||
var useSpacer = CKEDITOR.env.ie && CKEDITOR.env.version < 7,
|
||||
useBlank = CKEDITOR.env.ie && CKEDITOR.env.version == 7;
|
||||
|
||||
var backgroundImageUrl = useSpacer ? ( CKEDITOR.basePath + 'images/spacer.gif' ) :
|
||||
useBlank ? 'about:blank' : 'data:image/png;base64,';
|
||||
|
||||
var hcDetect = CKEDITOR.dom.element.createFromHtml(
|
||||
'<div style="width:0px;height:0px;' +
|
||||
'position:absolute;left:-10000px;' +
|
||||
'background-image:url(' + backgroundImageUrl + ')"></div>', CKEDITOR.document );
|
||||
|
||||
hcDetect.appendTo( CKEDITOR.document.getHead() );
|
||||
|
||||
// Update CKEDITOR.env.
|
||||
// Catch exception needed sometimes for FF. (#4230)
|
||||
try
|
||||
{
|
||||
CKEDITOR.env.hc = ( hcDetect.getComputedStyle( 'background-image' ) == 'none' );
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
CKEDITOR.env.hc = false;
|
||||
}
|
||||
|
||||
if ( CKEDITOR.env.hc )
|
||||
CKEDITOR.env.cssClass += ' cke_hc';
|
||||
|
||||
hcDetect.remove();
|
||||
})();
|
||||
|
||||
// Load core plugins.
|
||||
CKEDITOR.plugins.load( CKEDITOR.config.corePlugins.split( ',' ), function()
|
||||
{
|
||||
CKEDITOR.status = 'loaded';
|
||||
CKEDITOR.fire( 'loaded' );
|
||||
|
||||
// Process all instances created by the "basic" implementation.
|
||||
var pending = CKEDITOR._.pending;
|
||||
if ( pending )
|
||||
{
|
||||
delete CKEDITOR._.pending;
|
||||
|
||||
for ( var i = 0 ; i < pending.length ; i++ )
|
||||
CKEDITOR.add( pending[ i ] );
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
TODO: Enable the following and check if effective.
|
||||
|
||||
if ( CKEDITOR.env.ie )
|
||||
{
|
||||
// Remove IE mouse flickering on IE6 because of background images.
|
||||
try
|
||||
{
|
||||
document.execCommand( 'BackgroundImageCache', false, true );
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
// We have been reported about loading problems caused by the above
|
||||
// line. For safety, let's just ignore errors.
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Fired when a CKEDITOR core object is fully loaded and ready for interaction.
|
||||
* @name CKEDITOR#loaded
|
||||
* @event
|
||||
*/
|
||||
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.ajax} object, which holds ajax methods for
|
||||
* data loading.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Ajax methods for data loading.
|
||||
* @namespace
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.ajax = (function()
|
||||
{
|
||||
var createXMLHttpRequest = function()
|
||||
{
|
||||
// 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;
|
||||
};
|
||||
|
||||
var checkStatus = function( 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 ) );
|
||||
};
|
||||
|
||||
var getResponseText = function( xhr )
|
||||
{
|
||||
if ( checkStatus( xhr ) )
|
||||
return xhr.responseText;
|
||||
return null;
|
||||
};
|
||||
|
||||
var getResponseXml = function( xhr )
|
||||
{
|
||||
if ( checkStatus( xhr ) )
|
||||
{
|
||||
var xml = xhr.responseXML;
|
||||
return new CKEDITOR.xml( xml && xml.firstChild ? xml : xhr.responseText );
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
var load = function( url, callback, getResponseFn )
|
||||
{
|
||||
var async = !!callback;
|
||||
|
||||
var xhr = createXMLHttpRequest();
|
||||
|
||||
if ( !xhr )
|
||||
return null;
|
||||
|
||||
xhr.open( 'GET', url, async );
|
||||
|
||||
if ( async )
|
||||
{
|
||||
// TODO: perform leak checks on this closure.
|
||||
/** @ignore */
|
||||
xhr.onreadystatechange = function()
|
||||
{
|
||||
if ( xhr.readyState == 4 )
|
||||
{
|
||||
callback( getResponseFn( xhr ) );
|
||||
xhr = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
xhr.send(null);
|
||||
|
||||
return async ? '' : getResponseFn( xhr );
|
||||
};
|
||||
|
||||
return /** @lends CKEDITOR.ajax */ {
|
||||
|
||||
/**
|
||||
* Loads data from an URL as plain text.
|
||||
* @param {String} url The URL from which load data.
|
||||
* @param {Function} [callback] A callback function to be called on
|
||||
* data load. If not provided, the data will be loaded
|
||||
* asynchronously, passing the data value the function on load.
|
||||
* @returns {String} The loaded data. For asynchronous requests, an
|
||||
* empty string. For invalid requests, null.
|
||||
* @example
|
||||
* // Load data synchronously.
|
||||
* var data = CKEDITOR.ajax.load( 'somedata.txt' );
|
||||
* alert( data );
|
||||
* @example
|
||||
* // Load data asynchronously.
|
||||
* var data = CKEDITOR.ajax.load( 'somedata.txt', function( data )
|
||||
* {
|
||||
* alert( data );
|
||||
* } );
|
||||
*/
|
||||
load : function( url, callback )
|
||||
{
|
||||
return load( url, callback, getResponseText );
|
||||
},
|
||||
|
||||
/**
|
||||
* Loads data from an URL as XML.
|
||||
* @param {String} url The URL from which load data.
|
||||
* @param {Function} [callback] A callback function to be called on
|
||||
* data load. If not provided, the data will be loaded
|
||||
* asynchronously, passing the data value the function on load.
|
||||
* @returns {CKEDITOR.xml} An XML object holding the loaded data. For asynchronous requests, an
|
||||
* empty string. For invalid requests, null.
|
||||
* @example
|
||||
* // Load XML synchronously.
|
||||
* var xml = CKEDITOR.ajax.loadXml( 'somedata.xml' );
|
||||
* alert( xml.getInnerXml( '//' ) );
|
||||
* @example
|
||||
* // Load XML asynchronously.
|
||||
* var data = CKEDITOR.ajax.loadXml( 'somedata.xml', function( xml )
|
||||
* {
|
||||
* alert( xml.getInnerXml( '//' ) );
|
||||
* } );
|
||||
*/
|
||||
loadXml : function( url, callback )
|
||||
{
|
||||
return load( url, callback, getResponseXml );
|
||||
}
|
||||
};
|
||||
})();
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Contains the third and last part of the {@link CKEDITOR} object
|
||||
* definition.
|
||||
*/
|
||||
|
||||
// Remove the CKEDITOR.loadFullCore reference defined on ckeditor_basic.
|
||||
delete CKEDITOR.loadFullCore;
|
||||
|
||||
/**
|
||||
* Holds references to all editor instances created. The name of the properties
|
||||
* in this object correspond to instance names, and their values contains the
|
||||
* {@link CKEDITOR.editor} object representing them.
|
||||
* @type {Object}
|
||||
* @example
|
||||
* alert( <b>CKEDITOR.instances</b>.editor1.name ); // "editor1"
|
||||
*/
|
||||
CKEDITOR.instances = {};
|
||||
|
||||
/**
|
||||
* The document of the window holding the CKEDITOR object.
|
||||
* @type {CKEDITOR.dom.document}
|
||||
* @example
|
||||
* alert( <b>CKEDITOR.document</b>.getBody().getName() ); // "body"
|
||||
*/
|
||||
CKEDITOR.document = new CKEDITOR.dom.document( document );
|
||||
|
||||
/**
|
||||
* Adds an editor instance to the global {@link CKEDITOR} object. This function
|
||||
* is available for internal use mainly.
|
||||
* @param {CKEDITOR.editor} editor The editor instance to be added.
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.add = function( editor )
|
||||
{
|
||||
CKEDITOR.instances[ editor.name ] = editor;
|
||||
|
||||
editor.on( 'focus', function()
|
||||
{
|
||||
if ( CKEDITOR.currentInstance != editor )
|
||||
{
|
||||
CKEDITOR.currentInstance = editor;
|
||||
CKEDITOR.fire( 'currentInstance' );
|
||||
}
|
||||
});
|
||||
|
||||
editor.on( 'blur', function()
|
||||
{
|
||||
if ( CKEDITOR.currentInstance == editor )
|
||||
{
|
||||
CKEDITOR.currentInstance = null;
|
||||
CKEDITOR.fire( 'currentInstance' );
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes and editor instance from the global {@link CKEDITOR} object. his function
|
||||
* is available for internal use mainly.
|
||||
* @param {CKEDITOR.editor} editor The editor instance to be added.
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.remove = function( editor )
|
||||
{
|
||||
delete CKEDITOR.instances[ editor.name ];
|
||||
};
|
||||
|
||||
// Load the bootstrap script.
|
||||
CKEDITOR.loader.load( 'core/_bootstrap' ); // @Packager.RemoveLine
|
||||
|
||||
// Tri-state constants.
|
||||
|
||||
/**
|
||||
* Used to indicate the ON or ACTIVE state.
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.TRISTATE_ON = 1;
|
||||
|
||||
/**
|
||||
* Used to indicate the OFF or NON ACTIVE state.
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.TRISTATE_OFF = 2;
|
||||
|
||||
/**
|
||||
* Used to indicate DISABLED state.
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.TRISTATE_DISABLED = 0;
|
||||
|
||||
/**
|
||||
* Fired when the CKEDITOR.currentInstance object reference changes. This may
|
||||
* happen when setting the focus on different editor instances in the page.
|
||||
* @name CKEDITOR#currentInstance
|
||||
* @event
|
||||
*/
|
||||
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Contains the first and essential part of the {@link CKEDITOR}
|
||||
* object definition.
|
||||
*/
|
||||
|
||||
// #### Compressed Code
|
||||
// Must be updated on changes in the script, as well as updated in the
|
||||
// ckeditor_source.js and ckeditor_basic_source.js files.
|
||||
|
||||
// if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'3.2.1',rev:'5372',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf('://')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf('://')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
|
||||
|
||||
// #### Raw code
|
||||
// ATTENTION: read the above "Compressed Code" notes when changing this code.
|
||||
|
||||
if ( !window.CKEDITOR )
|
||||
{
|
||||
/**
|
||||
* This is the API entry point. The entire CKEditor code runs under this object.
|
||||
* @name CKEDITOR
|
||||
* @namespace
|
||||
* @example
|
||||
*/
|
||||
window.CKEDITOR = (function()
|
||||
{
|
||||
var CKEDITOR =
|
||||
/** @lends CKEDITOR */
|
||||
{
|
||||
|
||||
/**
|
||||
* A constant string unique for each release of CKEditor. Its value
|
||||
* is used, by default, to build the URL for all resources loaded
|
||||
* by the editor code, guaranteing clean cache results when
|
||||
* upgrading.
|
||||
* @type String
|
||||
* @example
|
||||
* alert( CKEDITOR.timestamp ); // e.g. '87dm'
|
||||
*/
|
||||
// The production implementation contains a fixed timestamp, unique
|
||||
// for each release, generated by the releaser.
|
||||
// (Base 36 value of each component of YYMMDDHH - 4 chars total - e.g. 87bm == 08071122)
|
||||
timestamp : 'A39E',
|
||||
|
||||
/**
|
||||
* Contains the CKEditor version number.
|
||||
* @type String
|
||||
* @example
|
||||
* alert( CKEDITOR.version ); // e.g. 'CKEditor 3.0 Beta'
|
||||
*/
|
||||
version : '3.2.1',
|
||||
|
||||
/**
|
||||
* Contains the CKEditor revision number.
|
||||
* Revision number is incremented automatically after each modification of CKEditor source code.
|
||||
* @type String
|
||||
* @example
|
||||
* alert( CKEDITOR.revision ); // e.g. '3975'
|
||||
*/
|
||||
revision : '5372',
|
||||
|
||||
/**
|
||||
* Private object used to hold core stuff. It should not be used out of
|
||||
* the API code as properties defined here may change at any time
|
||||
* without notice.
|
||||
* @private
|
||||
*/
|
||||
_ : {},
|
||||
|
||||
/**
|
||||
* Indicates the API loading status. The following status are available:
|
||||
* <ul>
|
||||
* <li><b>unloaded</b>: the API is not yet loaded.</li>
|
||||
* <li><b>basic_loaded</b>: the basic API features are available.</li>
|
||||
* <li><b>basic_ready</b>: the basic API is ready to load the full core code.</li>
|
||||
* <li><b>loading</b>: the full API is being loaded.</li>
|
||||
* <li><b>ready</b>: the API can be fully used.</li>
|
||||
* </ul>
|
||||
* @type String
|
||||
* @example
|
||||
* if ( <b>CKEDITOR.status</b> == 'ready' )
|
||||
* {
|
||||
* // The API can now be fully used.
|
||||
* }
|
||||
*/
|
||||
status : 'unloaded',
|
||||
|
||||
/**
|
||||
* Contains the full URL for the CKEditor installation directory.
|
||||
* It's possible to manually provide the base path by setting a
|
||||
* global variable named CKEDITOR_BASEPATH. This global variable
|
||||
* must be set "before" the editor script loading.
|
||||
* @type String
|
||||
* @example
|
||||
* alert( <b>CKEDITOR.basePath</b> ); // "http://www.example.com/ckeditor/" (e.g.)
|
||||
*/
|
||||
basePath : (function()
|
||||
{
|
||||
// ATTENTION: fixes on this code must be ported to
|
||||
// var basePath in "core/loader.js".
|
||||
|
||||
// Find out the editor directory path, based on its <script> tag.
|
||||
var path = window.CKEDITOR_BASEPATH || '';
|
||||
|
||||
if ( !path )
|
||||
{
|
||||
var scripts = document.getElementsByTagName( 'script' );
|
||||
|
||||
for ( var i = 0 ; i < scripts.length ; i++ )
|
||||
{
|
||||
var match = scripts[i].src.match( /(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i );
|
||||
|
||||
if ( match )
|
||||
{
|
||||
path = match[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// In IE (only) the script.src string is the raw valued entered in the
|
||||
// HTML. Other browsers return the full resolved URL instead.
|
||||
if ( path.indexOf('://') == -1 )
|
||||
{
|
||||
// Absolute path.
|
||||
if ( path.indexOf( '/' ) === 0 )
|
||||
path = location.href.match( /^.*?:\/\/[^\/]*/ )[0] + path;
|
||||
// Relative path.
|
||||
else
|
||||
path = location.href.match( /^[^\?]*\/(?:)/ )[0] + path;
|
||||
}
|
||||
|
||||
if ( !path )
|
||||
throw 'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';
|
||||
|
||||
return path;
|
||||
})(),
|
||||
|
||||
/**
|
||||
* Gets the full URL for CKEditor resources. By default, URLs
|
||||
* returned by this function contains a querystring parameter ("t")
|
||||
* set to the {@link CKEDITOR.timestamp} value.
|
||||
* It's possible to provide a custom implementation to this
|
||||
* function by setting a global variable named CKEDITOR_GETURL.
|
||||
* This global variable must be set "before" the editor script
|
||||
* loading. If the custom implementation returns nothing, the
|
||||
* default implementation is used.
|
||||
* @returns {String} The full URL.
|
||||
* @example
|
||||
* // e.g. http://www.example.com/ckeditor/skins/default/editor.css?t=87dm
|
||||
* alert( CKEDITOR.getUrl( 'skins/default/editor.css' ) );
|
||||
* @example
|
||||
* // e.g. http://www.example.com/skins/default/editor.css?t=87dm
|
||||
* alert( CKEDITOR.getUrl( '/skins/default/editor.css' ) );
|
||||
* @example
|
||||
* // e.g. http://www.somesite.com/skins/default/editor.css?t=87dm
|
||||
* alert( CKEDITOR.getUrl( 'http://www.somesite.com/skins/default/editor.css' ) );
|
||||
*/
|
||||
getUrl : function( resource )
|
||||
{
|
||||
// If this is not a full or absolute path.
|
||||
if ( resource.indexOf('://') == -1 && resource.indexOf( '/' ) !== 0 )
|
||||
resource = this.basePath + resource;
|
||||
|
||||
// Add the timestamp, except for directories.
|
||||
if ( this.timestamp && resource.charAt( resource.length - 1 ) != '/' )
|
||||
resource += ( resource.indexOf( '?' ) >= 0 ? '&' : '?' ) + 't=' + this.timestamp;
|
||||
|
||||
return resource;
|
||||
}
|
||||
};
|
||||
|
||||
// Make it possible to override the getUrl function with a custom
|
||||
// implementation pointing to a global named CKEDITOR_GETURL.
|
||||
var newGetUrl = window.CKEDITOR_GETURL;
|
||||
if ( newGetUrl )
|
||||
{
|
||||
var originalGetUrl = CKEDITOR.getUrl;
|
||||
CKEDITOR.getUrl = function ( resource )
|
||||
{
|
||||
return newGetUrl.call( CKEDITOR, resource ) ||
|
||||
originalGetUrl.call( CKEDITOR, resource );
|
||||
};
|
||||
}
|
||||
|
||||
return CKEDITOR;
|
||||
})();
|
||||
}
|
||||
|
||||
// PACKAGER_RENAME( CKEDITOR )
|
||||
@@ -0,0 +1,242 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Contains the second part of the {@link CKEDITOR} object
|
||||
* definition, which defines the basic editor features to be available in
|
||||
* the root ckeditor_basic.js file.
|
||||
*/
|
||||
|
||||
if ( CKEDITOR.status == 'unloaded' )
|
||||
{
|
||||
(function()
|
||||
{
|
||||
CKEDITOR.event.implementOn( CKEDITOR );
|
||||
|
||||
/**
|
||||
* Forces the full CKEditor core code, in the case only the basic code has been
|
||||
* loaded (ckeditor_basic.js). This method self-destroys (becomes undefined) in
|
||||
* the first call or as soon as the full code is available.
|
||||
* @example
|
||||
* // Check if the full core code has been loaded and load it.
|
||||
* if ( CKEDITOR.loadFullCore )
|
||||
* <b>CKEDITOR.loadFullCore()</b>;
|
||||
*/
|
||||
CKEDITOR.loadFullCore = function()
|
||||
{
|
||||
// If not the basic code is not ready it, just mark it to be loaded.
|
||||
if ( CKEDITOR.status != 'basic_ready' )
|
||||
{
|
||||
CKEDITOR.loadFullCore._load = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Destroy this function.
|
||||
delete CKEDITOR.loadFullCore;
|
||||
|
||||
// Append the script to the head.
|
||||
var script = document.createElement( 'script' );
|
||||
script.type = 'text/javascript';
|
||||
script.src = CKEDITOR.basePath + 'ckeditor.js';
|
||||
|
||||
document.getElementsByTagName( 'head' )[0].appendChild( script );
|
||||
};
|
||||
|
||||
/**
|
||||
* The time to wait (in seconds) to load the full editor code after the
|
||||
* page load, if the "ckeditor_basic" file is used. If set to zero, the
|
||||
* editor is loaded on demand, as soon as an instance is created.
|
||||
*
|
||||
* This value must be set on the page before the page load completion.
|
||||
* @type Number
|
||||
* @default 0 (zero)
|
||||
* @example
|
||||
* // Loads the full source after five seconds.
|
||||
* CKEDITOR.loadFullCoreTimeout = 5;
|
||||
*/
|
||||
CKEDITOR.loadFullCoreTimeout = 0;
|
||||
|
||||
/**
|
||||
* The class name used to identify <textarea> elements to be replace
|
||||
* by CKEditor instances.
|
||||
* @type String
|
||||
* @default 'ckeditor'
|
||||
* @example
|
||||
* <b>CKEDITOR.replaceClass</b> = 'rich_editor';
|
||||
*/
|
||||
CKEDITOR.replaceClass = 'ckeditor';
|
||||
|
||||
/**
|
||||
* Enables the replacement of all textareas with class name matching
|
||||
* {@link CKEDITOR.replaceClass}.
|
||||
* @type Boolean
|
||||
* @default true
|
||||
* @example
|
||||
* // Disable the auto-replace feature.
|
||||
* <b>CKEDITOR.replaceByClassEnabled</b> = false;
|
||||
*/
|
||||
CKEDITOR.replaceByClassEnabled = true;
|
||||
|
||||
var createInstance = function( elementOrIdOrName, config, creationFunction, data )
|
||||
{
|
||||
if ( CKEDITOR.env.isCompatible )
|
||||
{
|
||||
// Load the full core.
|
||||
if ( CKEDITOR.loadFullCore )
|
||||
CKEDITOR.loadFullCore();
|
||||
|
||||
var editor = creationFunction( elementOrIdOrName, config, data );
|
||||
CKEDITOR.add( editor );
|
||||
return editor;
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Replaces a <textarea> or a DOM element (DIV) with a CKEditor
|
||||
* instance. For textareas, the initial value in the editor will be the
|
||||
* textarea value. For DOM elements, their innerHTML will be used
|
||||
* instead. We recommend using TEXTAREA and DIV elements only.
|
||||
* @param {Object|String} elementOrIdOrName The DOM element (textarea), its
|
||||
* ID or name.
|
||||
* @param {Object} [config] The specific configurations to apply to this
|
||||
* editor instance. Configurations set here will override global CKEditor
|
||||
* settings.
|
||||
* @returns {CKEDITOR.editor} The editor instance created.
|
||||
* @example
|
||||
* <textarea id="myfield" name="myfield"><:/textarea>
|
||||
* ...
|
||||
* <b>CKEDITOR.replace( 'myfield' )</b>;
|
||||
* @example
|
||||
* var textarea = document.body.appendChild( document.createElement( 'textarea' ) );
|
||||
* <b>CKEDITOR.replace( textarea )</b>;
|
||||
*/
|
||||
CKEDITOR.replace = function( elementOrIdOrName, config )
|
||||
{
|
||||
return createInstance( elementOrIdOrName, config, CKEDITOR.editor.replace );
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a new editor instance inside a specific DOM element.
|
||||
* @param {Object|String} elementOrId The DOM element or its ID.
|
||||
* @param {Object} [config] The specific configurations to apply to this
|
||||
* editor instance. Configurations set here will override global CKEditor
|
||||
* settings.
|
||||
* @param {String} [data] Since 3.3. Initial value for the instance.
|
||||
* @returns {CKEDITOR.editor} The editor instance created.
|
||||
* @example
|
||||
* <div id="editorSpace"><:/div>
|
||||
* ...
|
||||
* <b>CKEDITOR.appendTo( 'editorSpace' )</b>;
|
||||
*/
|
||||
CKEDITOR.appendTo = function( elementOrId, config, data )
|
||||
{
|
||||
return createInstance( elementOrId, config, CKEDITOR.editor.appendTo, data );
|
||||
};
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
* Documented at ckeditor.js.
|
||||
*/
|
||||
CKEDITOR.add = function( editor )
|
||||
{
|
||||
// For now, just put the editor in the pending list. It will be
|
||||
// processed as soon as the full code gets loaded.
|
||||
var pending = this._.pending || ( this._.pending = [] );
|
||||
pending.push( editor );
|
||||
};
|
||||
|
||||
/**
|
||||
* Replace all <textarea> elements available in the document with
|
||||
* editor instances.
|
||||
* @example
|
||||
* // Replace all <textarea> elements in the page.
|
||||
* CKEDITOR.replaceAll();
|
||||
* @example
|
||||
* // Replace all <textarea class="myClassName"> elements in the page.
|
||||
* CKEDITOR.replaceAll( 'myClassName' );
|
||||
* @example
|
||||
* // Selectively replace <textarea> elements, based on custom assertions.
|
||||
* CKEDITOR.replaceAll( function( textarea, config )
|
||||
* {
|
||||
* // Custom code to evaluate the replace, returning false
|
||||
* // if it must not be done.
|
||||
* // It also passes the "config" parameter, so the
|
||||
* // developer can customize the instance.
|
||||
* } );
|
||||
*/
|
||||
CKEDITOR.replaceAll = function()
|
||||
{
|
||||
var textareas = document.getElementsByTagName( 'textarea' );
|
||||
|
||||
for ( var i = 0 ; i < textareas.length ; i++ )
|
||||
{
|
||||
var config = null;
|
||||
var textarea = textareas[i];
|
||||
var name = textarea.name;
|
||||
|
||||
// The "name" and/or "id" attribute must exist.
|
||||
if ( !textarea.name && !textarea.id )
|
||||
continue;
|
||||
|
||||
if ( typeof arguments[0] == 'string' )
|
||||
{
|
||||
// The textarea class name could be passed as the function
|
||||
// parameter.
|
||||
|
||||
var classRegex = new RegExp( '(?:^| )' + arguments[0] + '(?:$| )' );
|
||||
|
||||
if ( !classRegex.test( textarea.className ) )
|
||||
continue;
|
||||
}
|
||||
else if ( typeof arguments[0] == 'function' )
|
||||
{
|
||||
// An assertion function could be passed as the function parameter.
|
||||
// It must explicitly return "false" to ignore a specific <textarea>.
|
||||
config = {};
|
||||
if ( arguments[0]( textarea, config ) === false )
|
||||
continue;
|
||||
}
|
||||
|
||||
this.replace( textarea, config );
|
||||
}
|
||||
};
|
||||
|
||||
(function()
|
||||
{
|
||||
var onload = function()
|
||||
{
|
||||
var loadFullCore = CKEDITOR.loadFullCore,
|
||||
loadFullCoreTimeout = CKEDITOR.loadFullCoreTimeout;
|
||||
|
||||
// Replace all textareas with the default class name.
|
||||
if ( CKEDITOR.replaceByClassEnabled )
|
||||
CKEDITOR.replaceAll( CKEDITOR.replaceClass );
|
||||
|
||||
CKEDITOR.status = 'basic_ready';
|
||||
|
||||
if ( loadFullCore && loadFullCore._load )
|
||||
loadFullCore();
|
||||
else if ( loadFullCoreTimeout )
|
||||
{
|
||||
setTimeout( function()
|
||||
{
|
||||
if ( CKEDITOR.loadFullCore )
|
||||
CKEDITOR.loadFullCore();
|
||||
}
|
||||
, loadFullCoreTimeout * 1000 );
|
||||
}
|
||||
};
|
||||
|
||||
if ( window.addEventListener )
|
||||
window.addEventListener( 'load', onload, false );
|
||||
else if ( window.attachEvent )
|
||||
window.attachEvent( 'onload', onload );
|
||||
})();
|
||||
|
||||
CKEDITOR.status = 'basic_loaded';
|
||||
})();
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
CKEDITOR.command = function( editor, commandDefinition )
|
||||
{
|
||||
this.uiItems = [];
|
||||
|
||||
this.exec = function( data )
|
||||
{
|
||||
if ( this.state == CKEDITOR.TRISTATE_DISABLED )
|
||||
return false;
|
||||
|
||||
if ( this.editorFocus ) // Give editor focus if necessary (#4355).
|
||||
editor.focus();
|
||||
|
||||
return ( commandDefinition.exec.call( this, editor, data ) !== false );
|
||||
};
|
||||
|
||||
CKEDITOR.tools.extend( this, commandDefinition,
|
||||
// Defaults
|
||||
{
|
||||
modes : { wysiwyg : 1 },
|
||||
editorFocus : true,
|
||||
state : CKEDITOR.TRISTATE_OFF
|
||||
});
|
||||
|
||||
// Call the CKEDITOR.event constructor to initialize this instance.
|
||||
CKEDITOR.event.call( this );
|
||||
};
|
||||
|
||||
CKEDITOR.command.prototype =
|
||||
{
|
||||
enable : function()
|
||||
{
|
||||
if ( this.state == CKEDITOR.TRISTATE_DISABLED )
|
||||
this.setState( ( !this.preserveState || ( typeof this.previousState == 'undefined' ) ) ? CKEDITOR.TRISTATE_OFF : this.previousState );
|
||||
},
|
||||
|
||||
disable : function()
|
||||
{
|
||||
this.setState( CKEDITOR.TRISTATE_DISABLED );
|
||||
},
|
||||
|
||||
setState : function( newState )
|
||||
{
|
||||
// Do nothing if there is no state change.
|
||||
if ( this.state == newState )
|
||||
return false;
|
||||
|
||||
this.previousState = this.state;
|
||||
|
||||
// Set the new state.
|
||||
this.state = newState;
|
||||
|
||||
// Fire the "state" event, so other parts of the code can react to the
|
||||
// change.
|
||||
this.fire( 'state' );
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
toggleState : function()
|
||||
{
|
||||
if ( this.state == CKEDITOR.TRISTATE_OFF )
|
||||
this.setState( CKEDITOR.TRISTATE_ON );
|
||||
else if ( this.state == CKEDITOR.TRISTATE_ON )
|
||||
this.setState( CKEDITOR.TRISTATE_OFF );
|
||||
}
|
||||
};
|
||||
|
||||
CKEDITOR.event.implementOn( CKEDITOR.command.prototype, true );
|
||||
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the "virtual" {@link CKEDITOR.commandDefinition} class,
|
||||
* which contains the defintion of a command. This file is for
|
||||
* documentation purposes only.
|
||||
*/
|
||||
|
||||
/**
|
||||
* (Virtual Class) Do not call this constructor. This class is not really part
|
||||
* of the API. It just illustrates the features of command objects to be
|
||||
* passed to the {@link CKEDITOR.editor.prototype.addCommand} function.
|
||||
* @name CKEDITOR.commandDefinition
|
||||
* @constructor
|
||||
* @example
|
||||
*/
|
||||
|
||||
/**
|
||||
* Executes the command.
|
||||
* @name CKEDITOR.commandDefinition.prototype.exec
|
||||
* @function
|
||||
* @param {CKEDITOR.editor} editor The editor within which run the command.
|
||||
* @param {Object} [data] Additional data to be used to execute the command.
|
||||
* @returns {Boolean} Whether the command has been successfully executed.
|
||||
* Defaults to "true", if nothing is returned.
|
||||
* @example
|
||||
* editorInstance.addCommand( 'sample',
|
||||
* {
|
||||
* exec : function( editor )
|
||||
* {
|
||||
* alert( 'Executing a command for the editor name "' + editor.name + '"!' );
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
|
||||
/**
|
||||
* Whether the command need to be hooked into the redo/undo system.
|
||||
* @name CKEDITOR.commandDefinition.canUndo
|
||||
* @type {Boolean} If not defined or 'true' both hook into undo system, set it
|
||||
* to 'false' explicitly keep it out.
|
||||
* @field
|
||||
* @example
|
||||
* editorInstance.addCommand( 'alertName',
|
||||
* {
|
||||
* exec : function( editor )
|
||||
* {
|
||||
* alert( editor.name );
|
||||
* },
|
||||
* canUndo : false // No support for undo/redo
|
||||
* });
|
||||
*/
|
||||
|
||||
/**
|
||||
* Whether the command is asynchronous, which means the 'afterCommandExec' event
|
||||
* will be fired by the command itself manually, and the 'exec' function return value
|
||||
* of this command is not to be returned.
|
||||
* @name CKEDITOR.commandDefinition.async
|
||||
* @type {Boolean} If defined as 'true', the command is asynchronous.
|
||||
* @example
|
||||
* editorInstance.addCommand( 'alertName',
|
||||
* {
|
||||
* exec : function( editor )
|
||||
* {
|
||||
* // Asynchronous operation below.
|
||||
* CKEDITOR.ajax.loadXml( 'data.xml' );
|
||||
* },
|
||||
* async : true // The command need some time to complete after exec function returns.
|
||||
* });
|
||||
*/
|
||||
|
||||
/**
|
||||
* Whether the command should give focus to the editor before execution.
|
||||
* @name CKEDITOR.commandDefinition.editorFocus
|
||||
* @type {Boolean}
|
||||
* @example
|
||||
* editorInstance.addCommand( 'maximize',
|
||||
* {
|
||||
* exec : function( editor )
|
||||
* {
|
||||
* },
|
||||
* editorFocus : false // The command doesn't require focusing the editing document.
|
||||
* });
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Whether the command state should be set to {@link CKEDITOR.TRISTATE_DISABLED} on startup.
|
||||
* @name CKEDITOR.commandDefinition.startDisabled
|
||||
* @type {Boolean}
|
||||
* @default false
|
||||
* @example
|
||||
* editorInstance.addCommand( 'unlink',
|
||||
* {
|
||||
* exec : function( editor )
|
||||
* {
|
||||
* },
|
||||
* startDisabled : true // Command is unavailable until selection is inside a link.
|
||||
* });
|
||||
*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the "virtual" {@link CKEDITOR.dataProcessor} class, which
|
||||
* defines the basic structure of data processor objects to be
|
||||
* set to {@link CKEDITOR.editor.dataProcessor}.
|
||||
*/
|
||||
|
||||
/**
|
||||
* If defined, points to the data processor which is responsible to translate
|
||||
* and transform the editor data on input and output.
|
||||
* Generaly it will point to an instance of {@link CKEDITOR.htmlDataProcessor},
|
||||
* which handles HTML data. The editor may also handle other data formats by
|
||||
* using different data processors provided by specific plugins.
|
||||
* @name CKEDITOR.editor.dataProcessor
|
||||
* @type CKEDITOR.dataProcessor
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents a data processor, which is responsible to translate and transform
|
||||
* the editor data on input and output.
|
||||
* This class is not really part of the API. It's here for documentation
|
||||
* purposes, and serves as the base ("interface") for data processors
|
||||
* implementation.
|
||||
* @name CKEDITOR.dataProcessor
|
||||
* @contructor
|
||||
* @example
|
||||
*/
|
||||
|
||||
/**
|
||||
* Transforms input data into HTML to be loaded in the editor.
|
||||
* While the editor is able to handle non HTML data (like BBCode), at runtime
|
||||
* it can handle HTML data only. The role of the data processor is transforming
|
||||
* the input data into HTML through this function.
|
||||
* @name CKEDITOR.dataProcessor.prototype.toHtml
|
||||
* @function
|
||||
* @param {String} data The input data to be transformed.
|
||||
* @param {String} [fixForBody] The tag name to be used if the data must be
|
||||
* fixed because it is supposed to be loaded direcly into the <body>
|
||||
* tag. This is generally not used by non-HTML data processors.
|
||||
* @example
|
||||
* // Tranforming BBCode data, having a custom BBCode data processor.
|
||||
* var data = 'This is [b]an example[/b].';
|
||||
* var html = editor.dataProcessor.toHtml( data ); // '<p>This is <b>an example</b>.</p>'
|
||||
*/
|
||||
|
||||
/**
|
||||
* Transforms HTML into data to be outputted by the editor, in the format
|
||||
* expected by the data processor.
|
||||
* While the editor is able to handle non HTML data (like BBCode), at runtime
|
||||
* it can handle HTML data only. The role of the data processor is transforming
|
||||
* the HTML data containined by the editor into a specific data format through
|
||||
* this function.
|
||||
* @name CKEDITOR.dataProcessor.prototype.toDataFormat
|
||||
* @function
|
||||
* @param {String} html The HTML to be transformed.
|
||||
* @param {String} fixForBody The tag name to be used if the output data is
|
||||
* coming from <body> and may be eventually fixed for it. This is
|
||||
* generally not used by non-HTML data processors.
|
||||
* // Tranforming into BBCode data, having a custom BBCode data processor.
|
||||
* var html = '<p>This is <b>an example</b>.</p>';
|
||||
* var data = editor.dataProcessor.toDataFormat( html ); // 'This is [b]an example[/b].'
|
||||
*/
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dom} object, which contains DOM
|
||||
* manipulation objects and function.
|
||||
*/
|
||||
|
||||
/**
|
||||
* DOM manipulation objects and function.<br /><br />
|
||||
* @see CKEDITOR.dom.element
|
||||
* @see CKEDITOR.dom.node
|
||||
* @namespace
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.dom =
|
||||
{};
|
||||
|
||||
// PACKAGER_RENAME( CKEDITOR.dom )
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dom.comment} class, which represents
|
||||
* a DOM comment node.
|
||||
*/
|
||||
|
||||
CKEDITOR.dom.comment = CKEDITOR.tools.createClass(
|
||||
{
|
||||
base : CKEDITOR.dom.node,
|
||||
|
||||
$ : function( text, ownerDocument )
|
||||
{
|
||||
if ( typeof text == 'string' )
|
||||
text = ( ownerDocument ? ownerDocument.$ : document ).createComment( text );
|
||||
|
||||
this.base( text );
|
||||
},
|
||||
|
||||
proto :
|
||||
{
|
||||
type : CKEDITOR.NODE_COMMENT,
|
||||
|
||||
getOuterHtml : function()
|
||||
{
|
||||
return '<!--' + this.$.nodeValue + '-->';
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dom.document} class, which
|
||||
* represents a DOM document.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents a DOM document.
|
||||
* @constructor
|
||||
* @augments CKEDITOR.dom.domObject
|
||||
* @param {Object} domDocument A native DOM document.
|
||||
* @example
|
||||
* var document = new CKEDITOR.dom.document( document );
|
||||
*/
|
||||
CKEDITOR.dom.document = function( domDocument )
|
||||
{
|
||||
CKEDITOR.dom.domObject.call( this, domDocument );
|
||||
};
|
||||
|
||||
// PACKAGER_RENAME( CKEDITOR.dom.document )
|
||||
|
||||
CKEDITOR.dom.document.prototype = new CKEDITOR.dom.domObject();
|
||||
|
||||
CKEDITOR.tools.extend( CKEDITOR.dom.document.prototype,
|
||||
/** @lends CKEDITOR.dom.document.prototype */
|
||||
{
|
||||
/**
|
||||
* Appends a CSS file to the document.
|
||||
* @param {String} cssFileUrl The CSS file URL.
|
||||
* @example
|
||||
* <b>CKEDITOR.document.appendStyleSheet( '/mystyles.css' )</b>;
|
||||
*/
|
||||
appendStyleSheet : function( cssFileUrl )
|
||||
{
|
||||
if ( this.$.createStyleSheet )
|
||||
this.$.createStyleSheet( cssFileUrl );
|
||||
else
|
||||
{
|
||||
var link = new CKEDITOR.dom.element( 'link' );
|
||||
link.setAttributes(
|
||||
{
|
||||
rel :'stylesheet',
|
||||
type : 'text/css',
|
||||
href : cssFileUrl
|
||||
});
|
||||
|
||||
this.getHead().append( link );
|
||||
}
|
||||
},
|
||||
|
||||
appendStyleText : function( cssStyleText )
|
||||
{
|
||||
if ( this.$.createStyleSheet )
|
||||
{
|
||||
var styleSheet = this.$.createStyleSheet( "" );
|
||||
styleSheet.cssText = cssStyleText ;
|
||||
}
|
||||
else
|
||||
{
|
||||
var style = new CKEDITOR.dom.element( 'style', this );
|
||||
style.append( new CKEDITOR.dom.text( cssStyleText, this ) );
|
||||
this.getHead().append( style );
|
||||
}
|
||||
},
|
||||
|
||||
createElement : function( name, attribsAndStyles )
|
||||
{
|
||||
var element = new CKEDITOR.dom.element( name, this );
|
||||
|
||||
if ( attribsAndStyles )
|
||||
{
|
||||
if ( attribsAndStyles.attributes )
|
||||
element.setAttributes( attribsAndStyles.attributes );
|
||||
|
||||
if ( attribsAndStyles.styles )
|
||||
element.setStyles( attribsAndStyles.styles );
|
||||
}
|
||||
|
||||
return element;
|
||||
},
|
||||
|
||||
createText : function( text )
|
||||
{
|
||||
return new CKEDITOR.dom.text( text, this );
|
||||
},
|
||||
|
||||
focus : function()
|
||||
{
|
||||
this.getWindow().focus();
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets and element based on its id.
|
||||
* @param {String} elementId The element id.
|
||||
* @returns {CKEDITOR.dom.element} The element instance, or null if not found.
|
||||
* @example
|
||||
* var element = <b>CKEDITOR.document.getById( 'myElement' )</b>;
|
||||
* alert( element.getId() ); // "myElement"
|
||||
*/
|
||||
getById : function( elementId )
|
||||
{
|
||||
var $ = this.$.getElementById( elementId );
|
||||
return $ ? new CKEDITOR.dom.element( $ ) : null;
|
||||
},
|
||||
|
||||
getByAddress : function( address, normalized )
|
||||
{
|
||||
var $ = this.$.documentElement;
|
||||
|
||||
for ( var i = 0 ; $ && i < address.length ; i++ )
|
||||
{
|
||||
var target = address[ i ];
|
||||
|
||||
if ( !normalized )
|
||||
{
|
||||
$ = $.childNodes[ target ];
|
||||
continue;
|
||||
}
|
||||
|
||||
var currentIndex = -1;
|
||||
|
||||
for (var j = 0 ; j < $.childNodes.length ; j++ )
|
||||
{
|
||||
var candidate = $.childNodes[ j ];
|
||||
|
||||
if ( normalized === true &&
|
||||
candidate.nodeType == 3 &&
|
||||
candidate.previousSibling &&
|
||||
candidate.previousSibling.nodeType == 3 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
currentIndex++;
|
||||
|
||||
if ( currentIndex == target )
|
||||
{
|
||||
$ = candidate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $ ? new CKEDITOR.dom.node( $ ) : null;
|
||||
},
|
||||
|
||||
getElementsByTag : function( tagName, namespace )
|
||||
{
|
||||
if ( !CKEDITOR.env.ie && namespace )
|
||||
tagName = namespace + ':' + tagName;
|
||||
return new CKEDITOR.dom.nodeList( this.$.getElementsByTagName( tagName ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the <head> element for this document.
|
||||
* @returns {CKEDITOR.dom.element} The <head> element.
|
||||
* @example
|
||||
* var element = <b>CKEDITOR.document.getHead()</b>;
|
||||
* alert( element.getName() ); // "head"
|
||||
*/
|
||||
getHead : function()
|
||||
{
|
||||
var head = this.$.getElementsByTagName( 'head' )[0];
|
||||
head = new CKEDITOR.dom.element( head );
|
||||
|
||||
return (
|
||||
this.getHead = function()
|
||||
{
|
||||
return head;
|
||||
})();
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the <body> element for this document.
|
||||
* @returns {CKEDITOR.dom.element} The <body> element.
|
||||
* @example
|
||||
* var element = <b>CKEDITOR.document.getBody()</b>;
|
||||
* alert( element.getName() ); // "body"
|
||||
*/
|
||||
getBody : function()
|
||||
{
|
||||
var body = new CKEDITOR.dom.element( this.$.body );
|
||||
|
||||
return (
|
||||
this.getBody = function()
|
||||
{
|
||||
return body;
|
||||
})();
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the DOM document element for this document.
|
||||
* @returns {CKEDITOR.dom.element} The DOM document element.
|
||||
*/
|
||||
getDocumentElement : function()
|
||||
{
|
||||
var documentElement = new CKEDITOR.dom.element( this.$.documentElement );
|
||||
|
||||
return (
|
||||
this.getDocumentElement = function()
|
||||
{
|
||||
return documentElement;
|
||||
})();
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the window object that holds this document.
|
||||
* @returns {CKEDITOR.dom.window} The window object.
|
||||
*/
|
||||
getWindow : function()
|
||||
{
|
||||
var win = new CKEDITOR.dom.window( this.$.parentWindow || this.$.defaultView );
|
||||
|
||||
return (
|
||||
this.getWindow = function()
|
||||
{
|
||||
return win;
|
||||
})();
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
/**
|
||||
* DocumentFragment is a "lightweight" or "minimal" Document object. It is
|
||||
* commonly used to extract a portion of a document's tree or to create a new
|
||||
* fragment of a document. Various operations may take DocumentFragment objects
|
||||
* as arguments and results in all the child nodes of the DocumentFragment being
|
||||
* moved to the child list of this node.
|
||||
*
|
||||
* @param {Object} ownerDocument
|
||||
*/
|
||||
CKEDITOR.dom.documentFragment = function( ownerDocument )
|
||||
{
|
||||
ownerDocument = ownerDocument || CKEDITOR.document;
|
||||
this.$ = ownerDocument.$.createDocumentFragment();
|
||||
};
|
||||
|
||||
CKEDITOR.tools.extend( CKEDITOR.dom.documentFragment.prototype,
|
||||
CKEDITOR.dom.element.prototype,
|
||||
{
|
||||
type : CKEDITOR.NODE_DOCUMENT_FRAGMENT,
|
||||
insertAfterNode : function( node )
|
||||
{
|
||||
node = node.$;
|
||||
node.parentNode.insertBefore( this.$, node.nextSibling );
|
||||
}
|
||||
},
|
||||
true,
|
||||
{
|
||||
'append' : 1,
|
||||
'appendBogus' : 1,
|
||||
'getFirst' : 1,
|
||||
'getLast' : 1,
|
||||
'appendTo' : 1,
|
||||
'moveChildren' : 1,
|
||||
'insertBefore' : 1,
|
||||
'insertAfterNode' : 1,
|
||||
'replace' : 1,
|
||||
'trim' : 1,
|
||||
'type' : 1,
|
||||
'ltrim' : 1,
|
||||
'rtrim' : 1,
|
||||
'getDocument' : 1,
|
||||
'getChildCount' : 1,
|
||||
'getChild' : 1,
|
||||
'getChildren' : 1
|
||||
} );
|
||||
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.editor} class, which is the base
|
||||
* for other classes representing DOM objects.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents a DOM object. This class is not intended to be used directly. It
|
||||
* serves as the base class for other classes representing specific DOM
|
||||
* objects.
|
||||
* @constructor
|
||||
* @param {Object} nativeDomObject A native DOM object.
|
||||
* @augments CKEDITOR.event
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.dom.domObject = function( nativeDomObject )
|
||||
{
|
||||
if ( nativeDomObject )
|
||||
{
|
||||
/**
|
||||
* The native DOM object represented by this class instance.
|
||||
* @type Object
|
||||
* @example
|
||||
* var element = new CKEDITOR.dom.element( 'span' );
|
||||
* alert( element.$.nodeType ); // "1"
|
||||
*/
|
||||
this.$ = nativeDomObject;
|
||||
}
|
||||
};
|
||||
|
||||
CKEDITOR.dom.domObject.prototype = (function()
|
||||
{
|
||||
// Do not define other local variables here. We want to keep the native
|
||||
// listener closures as clean as possible.
|
||||
|
||||
var getNativeListener = function( domObject, eventName )
|
||||
{
|
||||
return function( domEvent )
|
||||
{
|
||||
// In FF, when reloading the page with the editor focused, it may
|
||||
// throw an error because the CKEDITOR global is not anymore
|
||||
// available. So, we check it here first. (#2923)
|
||||
if ( typeof CKEDITOR != 'undefined' )
|
||||
domObject.fire( eventName, new CKEDITOR.dom.event( domEvent ) );
|
||||
};
|
||||
};
|
||||
|
||||
return /** @lends CKEDITOR.dom.domObject.prototype */ {
|
||||
|
||||
getPrivate : function()
|
||||
{
|
||||
var priv;
|
||||
|
||||
// Get the main private function from the custom data. Create it if not
|
||||
// defined.
|
||||
if ( !( priv = this.getCustomData( '_' ) ) )
|
||||
this.setCustomData( '_', ( priv = {} ) );
|
||||
|
||||
return priv;
|
||||
},
|
||||
|
||||
/** @ignore */
|
||||
on : function( eventName )
|
||||
{
|
||||
// We customize the "on" function here. The basic idea is that we'll have
|
||||
// only one listener for a native event, which will then call all listeners
|
||||
// set to the event.
|
||||
|
||||
// Get the listeners holder object.
|
||||
var nativeListeners = this.getCustomData( '_cke_nativeListeners' );
|
||||
|
||||
if ( !nativeListeners )
|
||||
{
|
||||
nativeListeners = {};
|
||||
this.setCustomData( '_cke_nativeListeners', nativeListeners );
|
||||
}
|
||||
|
||||
// Check if we have a listener for that event.
|
||||
if ( !nativeListeners[ eventName ] )
|
||||
{
|
||||
var listener = nativeListeners[ eventName ] = getNativeListener( this, eventName );
|
||||
|
||||
if ( this.$.addEventListener )
|
||||
this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture );
|
||||
else if ( this.$.attachEvent )
|
||||
this.$.attachEvent( 'on' + eventName, listener );
|
||||
}
|
||||
|
||||
// Call the original implementation.
|
||||
return CKEDITOR.event.prototype.on.apply( this, arguments );
|
||||
},
|
||||
|
||||
/** @ignore */
|
||||
removeListener : function( eventName )
|
||||
{
|
||||
// Call the original implementation.
|
||||
CKEDITOR.event.prototype.removeListener.apply( this, arguments );
|
||||
|
||||
// If we don't have listeners for this event, clean the DOM up.
|
||||
if ( !this.hasListeners( eventName ) )
|
||||
{
|
||||
var nativeListeners = this.getCustomData( '_cke_nativeListeners' );
|
||||
var listener = nativeListeners && nativeListeners[ eventName ];
|
||||
if ( listener )
|
||||
{
|
||||
if ( this.$.removeEventListener )
|
||||
this.$.removeEventListener( eventName, listener, false );
|
||||
else if ( this.$.detachEvent )
|
||||
this.$.detachEvent( 'on' + eventName, listener );
|
||||
|
||||
delete nativeListeners[ eventName ];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes any listener set on this object.
|
||||
* To avoid memory leaks we must assure that there are no
|
||||
* references left after the object is no longer needed.
|
||||
*/
|
||||
removeAllListeners : function()
|
||||
{
|
||||
var nativeListeners = this.getCustomData( '_cke_nativeListeners' );
|
||||
for ( var eventName in nativeListeners )
|
||||
{
|
||||
var listener = nativeListeners[ eventName ];
|
||||
if ( this.$.removeEventListener )
|
||||
this.$.removeEventListener( eventName, listener, false );
|
||||
else if ( this.$.detachEvent )
|
||||
this.$.detachEvent( 'on' + eventName, listener );
|
||||
|
||||
delete nativeListeners[ eventName ];
|
||||
}
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
(function( domObjectProto )
|
||||
{
|
||||
var customData = {};
|
||||
|
||||
/**
|
||||
* Determines whether the specified object is equal to the current object.
|
||||
* @name CKEDITOR.dom.domObject.prototype.equals
|
||||
* @function
|
||||
* @param {Object} object The object to compare with the current object.
|
||||
* @returns {Boolean} "true" if the object is equal.
|
||||
* @example
|
||||
* var doc = new CKEDITOR.dom.document( document );
|
||||
* alert( doc.equals( CKEDITOR.document ) ); // "true"
|
||||
* alert( doc == CKEDITOR.document ); // "false"
|
||||
*/
|
||||
domObjectProto.equals = function( object )
|
||||
{
|
||||
return ( object && object.$ === this.$ );
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets a data slot value for this object. These values are shared by all
|
||||
* instances pointing to that same DOM object.
|
||||
* @name CKEDITOR.dom.domObject.prototype.setCustomData
|
||||
* @function
|
||||
* @param {String} key A key used to identify the data slot.
|
||||
* @param {Object} value The value to set to the data slot.
|
||||
* @returns {CKEDITOR.dom.domObject} This DOM object instance.
|
||||
* @see CKEDITOR.dom.domObject.prototype.getCustomData
|
||||
* @example
|
||||
* var element = new CKEDITOR.dom.element( 'span' );
|
||||
* element.setCustomData( 'hasCustomData', true );
|
||||
*/
|
||||
domObjectProto.setCustomData = function( key, value )
|
||||
{
|
||||
var expandoNumber = this.getUniqueId(),
|
||||
dataSlot = customData[ expandoNumber ] || ( customData[ expandoNumber ] = {} );
|
||||
|
||||
dataSlot[ key ] = value;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the value set to a data slot in this object.
|
||||
* @name CKEDITOR.dom.domObject.prototype.getCustomData
|
||||
* @function
|
||||
* @param {String} key The key used to identify the data slot.
|
||||
* @returns {Object} This value set to the data slot.
|
||||
* @see CKEDITOR.dom.domObject.prototype.setCustomData
|
||||
* @example
|
||||
* var element = new CKEDITOR.dom.element( 'span' );
|
||||
* alert( element.getCustomData( 'hasCustomData' ) ); // e.g. 'true'
|
||||
*/
|
||||
domObjectProto.getCustomData = function( key )
|
||||
{
|
||||
var expandoNumber = this.$._cke_expando,
|
||||
dataSlot = expandoNumber && customData[ expandoNumber ];
|
||||
|
||||
return dataSlot && dataSlot[ key ];
|
||||
};
|
||||
|
||||
/**
|
||||
* @name CKEDITOR.dom.domObject.prototype.removeCustomData
|
||||
*/
|
||||
domObjectProto.removeCustomData = function( key )
|
||||
{
|
||||
var expandoNumber = this.$._cke_expando,
|
||||
dataSlot = expandoNumber && customData[ expandoNumber ],
|
||||
retval = dataSlot && dataSlot[ key ];
|
||||
|
||||
if ( typeof retval != 'undefined' )
|
||||
delete dataSlot[ key ];
|
||||
|
||||
return retval || null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes any data stored on this object.
|
||||
* To avoid memory leaks we must assure that there are no
|
||||
* references left after the object is no longer needed.
|
||||
* @name CKEDITOR.dom.domObject.prototype.clearCustomData
|
||||
* @function
|
||||
*/
|
||||
domObjectProto.clearCustomData = function()
|
||||
{
|
||||
// Clear all event listeners
|
||||
this.removeAllListeners();
|
||||
|
||||
var expandoNumber = this.$._cke_expando;
|
||||
expandoNumber && delete customData[ expandoNumber ];
|
||||
};
|
||||
|
||||
/**
|
||||
* @name CKEDITOR.dom.domObject.prototype.getCustomData
|
||||
*/
|
||||
domObjectProto.getUniqueId = function()
|
||||
{
|
||||
return this.$._cke_expando || ( this.$._cke_expando = CKEDITOR.tools.getNextNumber() );
|
||||
};
|
||||
|
||||
// Implement CKEDITOR.event.
|
||||
CKEDITOR.event.implementOn( domObjectProto );
|
||||
|
||||
})( CKEDITOR.dom.domObject.prototype );
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
(function()
|
||||
{
|
||||
// Elements that may be considered the "Block boundary" in an element path.
|
||||
var pathBlockElements = { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,dd:1 };
|
||||
|
||||
// Elements that may be considered the "Block limit" in an element path.
|
||||
var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1 };
|
||||
|
||||
// Check if an element contains any block element.
|
||||
var checkHasBlock = function( element )
|
||||
{
|
||||
var childNodes = element.getChildren();
|
||||
|
||||
for ( var i = 0, count = childNodes.count() ; i < count ; i++ )
|
||||
{
|
||||
var child = childNodes.getItem( i );
|
||||
|
||||
if ( child.type == CKEDITOR.NODE_ELEMENT && CKEDITOR.dtd.$block[ child.getName() ] )
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
CKEDITOR.dom.elementPath = function( lastNode )
|
||||
{
|
||||
var block = null;
|
||||
var blockLimit = null;
|
||||
var elements = [];
|
||||
|
||||
var e = lastNode;
|
||||
|
||||
while ( e )
|
||||
{
|
||||
if ( e.type == CKEDITOR.NODE_ELEMENT )
|
||||
{
|
||||
if ( !this.lastElement )
|
||||
this.lastElement = e;
|
||||
|
||||
var elementName = e.getName();
|
||||
if ( CKEDITOR.env.ie && e.$.scopeName != 'HTML' )
|
||||
elementName = e.$.scopeName.toLowerCase() + ':' + elementName;
|
||||
|
||||
if ( !blockLimit )
|
||||
{
|
||||
if ( !block && pathBlockElements[ elementName ] )
|
||||
block = e;
|
||||
|
||||
if ( pathBlockLimitElements[ elementName ] )
|
||||
{
|
||||
// DIV is considered the Block, if no block is available (#525)
|
||||
// and if it doesn't contain other blocks.
|
||||
if ( !block && elementName == 'div' && !checkHasBlock( e ) )
|
||||
block = e;
|
||||
else
|
||||
blockLimit = e;
|
||||
}
|
||||
}
|
||||
|
||||
elements.push( e );
|
||||
|
||||
if ( elementName == 'body' )
|
||||
break;
|
||||
}
|
||||
e = e.getParent();
|
||||
}
|
||||
|
||||
this.block = block;
|
||||
this.blockLimit = blockLimit;
|
||||
this.elements = elements;
|
||||
};
|
||||
})();
|
||||
|
||||
CKEDITOR.dom.elementPath.prototype =
|
||||
{
|
||||
/**
|
||||
* Compares this element path with another one.
|
||||
* @param {CKEDITOR.dom.elementPath} otherPath The elementPath object to be
|
||||
* compared with this one.
|
||||
* @returns {Boolean} "true" if the paths are equal, containing the same
|
||||
* number of elements and the same elements in the same order.
|
||||
*/
|
||||
compare : function( otherPath )
|
||||
{
|
||||
var thisElements = this.elements;
|
||||
var otherElements = otherPath && otherPath.elements;
|
||||
|
||||
if ( !otherElements || thisElements.length != otherElements.length )
|
||||
return false;
|
||||
|
||||
for ( var i = 0 ; i < thisElements.length ; i++ )
|
||||
{
|
||||
if ( !thisElements[ i ].equals( otherElements[ i ] ) )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dom.event} class, which
|
||||
* represents the a native DOM event object.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents a native DOM event object.
|
||||
* @constructor
|
||||
* @param {Object} domEvent A native DOM event object.
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.dom.event = function( domEvent )
|
||||
{
|
||||
/**
|
||||
* The native DOM event object represented by this class instance.
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
this.$ = domEvent;
|
||||
};
|
||||
|
||||
CKEDITOR.dom.event.prototype =
|
||||
{
|
||||
/**
|
||||
* Gets the key code associated to the event.
|
||||
* @returns {Number} The key code.
|
||||
* @example
|
||||
* alert( event.getKey() ); "65" is "a" has been pressed
|
||||
*/
|
||||
getKey : function()
|
||||
{
|
||||
return this.$.keyCode || this.$.which;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets a number represeting the combination of the keys pressed during the
|
||||
* event. It is the sum with the current key code and the {@link CKEDITOR.CTRL},
|
||||
* {@link CKEDITOR.SHIFT} and {@link CKEDITOR.ALT} constants.
|
||||
* @returns {Number} The number representing the keys combination.
|
||||
* @example
|
||||
* alert( event.getKeystroke() == 65 ); // "a" key
|
||||
* alert( event.getKeystroke() == CKEDITOR.CTRL + 65 ); // CTRL + "a" key
|
||||
* alert( event.getKeystroke() == CKEDITOR.CTRL + CKEDITOR.SHIFT + 65 ); // CTRL + SHIFT + "a" key
|
||||
*/
|
||||
getKeystroke : function()
|
||||
{
|
||||
var keystroke = this.getKey();
|
||||
|
||||
if ( this.$.ctrlKey || this.$.metaKey )
|
||||
keystroke += CKEDITOR.CTRL;
|
||||
|
||||
if ( this.$.shiftKey )
|
||||
keystroke += CKEDITOR.SHIFT;
|
||||
|
||||
if ( this.$.altKey )
|
||||
keystroke += CKEDITOR.ALT;
|
||||
|
||||
return keystroke;
|
||||
},
|
||||
|
||||
/**
|
||||
* Prevents the original behavior of the event to happen. It can optionally
|
||||
* stop propagating the event in the event chain.
|
||||
* @param {Boolean} [stopPropagation] Stop propagating this event in the
|
||||
* event chain.
|
||||
* @example
|
||||
* var element = CKEDITOR.document.getById( 'myElement' );
|
||||
* element.on( 'click', function( ev )
|
||||
* {
|
||||
* // The DOM event object is passed by the "data" property.
|
||||
* var domEvent = ev.data;
|
||||
* // Prevent the click to chave any effect in the element.
|
||||
* domEvent.preventDefault();
|
||||
* });
|
||||
*/
|
||||
preventDefault : function( stopPropagation )
|
||||
{
|
||||
var $ = this.$;
|
||||
if ( $.preventDefault )
|
||||
$.preventDefault();
|
||||
else
|
||||
$.returnValue = false;
|
||||
|
||||
if ( stopPropagation )
|
||||
this.stopPropagation();
|
||||
},
|
||||
|
||||
stopPropagation : function()
|
||||
{
|
||||
var $ = this.$;
|
||||
if ( $.stopPropagation )
|
||||
$.stopPropagation();
|
||||
else
|
||||
$.cancelBubble = true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the DOM node where the event was targeted to.
|
||||
* @returns {CKEDITOR.dom.node} The target DOM node.
|
||||
* @example
|
||||
* var element = CKEDITOR.document.getById( 'myElement' );
|
||||
* element.on( 'click', function( ev )
|
||||
* {
|
||||
* // The DOM event object is passed by the "data" property.
|
||||
* var domEvent = ev.data;
|
||||
* // Add a CSS class to the event target.
|
||||
* domEvent.getTarget().addClass( 'clicked' );
|
||||
* });
|
||||
*/
|
||||
|
||||
getTarget : function()
|
||||
{
|
||||
var rawNode = this.$.target || this.$.srcElement;
|
||||
return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* CTRL key (1000).
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.CTRL = 1000;
|
||||
|
||||
/**
|
||||
* SHIFT key (2000).
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.SHIFT = 2000;
|
||||
|
||||
/**
|
||||
* ALT key (4000).
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.ALT = 4000;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
CKEDITOR.dom.nodeList = function( nativeList )
|
||||
{
|
||||
this.$ = nativeList;
|
||||
};
|
||||
|
||||
CKEDITOR.dom.nodeList.prototype =
|
||||
{
|
||||
count : function()
|
||||
{
|
||||
return this.$.length;
|
||||
},
|
||||
|
||||
getItem : function( index )
|
||||
{
|
||||
var $node = this.$[ index ];
|
||||
return $node ? new CKEDITOR.dom.node( $node ) : null;
|
||||
}
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dom.text} class, which represents
|
||||
* a DOM text node.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents a DOM text node.
|
||||
* @constructor
|
||||
* @augments CKEDITOR.dom.node
|
||||
* @param {Object|String} text A native DOM text node or a string containing
|
||||
* the text to use to create a new text node.
|
||||
* @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain
|
||||
* the node in case of new node creation. Defaults to the current document.
|
||||
* @example
|
||||
* var nativeNode = document.createTextNode( 'Example' );
|
||||
* var text = CKEDITOR.dom.text( nativeNode );
|
||||
* @example
|
||||
* var text = CKEDITOR.dom.text( 'Example' );
|
||||
*/
|
||||
CKEDITOR.dom.text = function( text, ownerDocument )
|
||||
{
|
||||
if ( typeof text == 'string' )
|
||||
text = ( ownerDocument ? ownerDocument.$ : document ).createTextNode( text );
|
||||
|
||||
// Theoretically, we should call the base constructor here
|
||||
// (not CKEDITOR.dom.node though). But, IE doesn't support expando
|
||||
// properties on text node, so the features provided by domObject will not
|
||||
// work for text nodes (which is not a big issue for us).
|
||||
//
|
||||
// CKEDITOR.dom.domObject.call( this, element );
|
||||
|
||||
/**
|
||||
* The native DOM text node represented by this class instance.
|
||||
* @type Object
|
||||
* @example
|
||||
* var element = new CKEDITOR.dom.text( 'Example' );
|
||||
* alert( element.$.nodeType ); // "3"
|
||||
*/
|
||||
this.$ = text;
|
||||
};
|
||||
|
||||
CKEDITOR.dom.text.prototype = new CKEDITOR.dom.node();
|
||||
|
||||
CKEDITOR.tools.extend( CKEDITOR.dom.text.prototype,
|
||||
/** @lends CKEDITOR.dom.text.prototype */
|
||||
{
|
||||
/**
|
||||
* The node type. This is a constant value set to
|
||||
* {@link CKEDITOR.NODE_TEXT}.
|
||||
* @type Number
|
||||
* @example
|
||||
*/
|
||||
type : CKEDITOR.NODE_TEXT,
|
||||
|
||||
getLength : function()
|
||||
{
|
||||
return this.$.nodeValue.length;
|
||||
},
|
||||
|
||||
getText : function()
|
||||
{
|
||||
return this.$.nodeValue;
|
||||
},
|
||||
|
||||
/**
|
||||
* Breaks this text node into two nodes at the specified offset,
|
||||
* keeping both in the tree as siblings. This node then only contains
|
||||
* all the content up to the offset point. A new text node, which is
|
||||
* inserted as the next sibling of this node, contains all the content
|
||||
* at and after the offset point. When the offset is equal to the
|
||||
* length of this node, the new node has no data.
|
||||
* @param {Number} The position at which to split, starting from zero.
|
||||
* @returns {CKEDITOR.dom.text} The new text node.
|
||||
*/
|
||||
split : function( offset )
|
||||
{
|
||||
// If the offset is after the last char, IE creates the text node
|
||||
// on split, but don't include it into the DOM. So, we have to do
|
||||
// that manually here.
|
||||
if ( CKEDITOR.env.ie && offset == this.getLength() )
|
||||
{
|
||||
var next = this.getDocument().createText( '' );
|
||||
next.insertAfter( this );
|
||||
return next;
|
||||
}
|
||||
|
||||
var doc = this.getDocument();
|
||||
var retval = new CKEDITOR.dom.text( this.$.splitText( offset ), doc );
|
||||
|
||||
// IE BUG: IE8 does not update the childNodes array in DOM after splitText(),
|
||||
// we need to make some DOM changes to make it update. (#3436)
|
||||
if ( CKEDITOR.env.ie8 )
|
||||
{
|
||||
var workaround = new CKEDITOR.dom.text( '', doc );
|
||||
workaround.insertAfter( retval );
|
||||
workaround.remove();
|
||||
}
|
||||
|
||||
return retval;
|
||||
},
|
||||
|
||||
/**
|
||||
* Extracts characters from indexA up to but not including indexB.
|
||||
* @param {Number} indexA An integer between 0 and one less than the
|
||||
* length of the text.
|
||||
* @param {Number} [indexB] An integer between 0 and the length of the
|
||||
* string. If omitted, extracts characters to the end of the text.
|
||||
*/
|
||||
substring : function( indexA, indexB )
|
||||
{
|
||||
// We need the following check due to a Firefox bug
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=458886
|
||||
if ( typeof indexB != 'number' )
|
||||
return this.$.nodeValue.substr( indexA );
|
||||
else
|
||||
return this.$.nodeValue.substring( indexA, indexB );
|
||||
}
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dom.document} class, which
|
||||
* represents a DOM document.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents a DOM window.
|
||||
* @constructor
|
||||
* @augments CKEDITOR.dom.domObject
|
||||
* @param {Object} domWindow A native DOM window.
|
||||
* @example
|
||||
* var document = new CKEDITOR.dom.window( window );
|
||||
*/
|
||||
CKEDITOR.dom.window = function( domWindow )
|
||||
{
|
||||
CKEDITOR.dom.domObject.call( this, domWindow );
|
||||
};
|
||||
|
||||
CKEDITOR.dom.window.prototype = new CKEDITOR.dom.domObject();
|
||||
|
||||
CKEDITOR.tools.extend( CKEDITOR.dom.window.prototype,
|
||||
/** @lends CKEDITOR.dom.window.prototype */
|
||||
{
|
||||
/**
|
||||
* Moves the selection focus to this window.
|
||||
* @function
|
||||
* @example
|
||||
* var win = new CKEDITOR.dom.window( window );
|
||||
* <b>win.focus()</b>;
|
||||
*/
|
||||
focus : function()
|
||||
{
|
||||
// Webkit is sometimes failed to focus iframe, blur it first(#3835).
|
||||
if ( CKEDITOR.env.webkit && this.$.parent )
|
||||
this.$.parent.focus();
|
||||
this.$.focus();
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the width and height of this window's viewable area.
|
||||
* @function
|
||||
* @returns {Object} An object with the "width" and "height"
|
||||
* properties containing the size.
|
||||
* @example
|
||||
* var win = new CKEDITOR.dom.window( window );
|
||||
* var size = <b>win.getViewPaneSize()</b>;
|
||||
* alert( size.width );
|
||||
* alert( size.height );
|
||||
*/
|
||||
getViewPaneSize : function()
|
||||
{
|
||||
var doc = this.$.document,
|
||||
stdMode = doc.compatMode == 'CSS1Compat';
|
||||
return {
|
||||
width : ( stdMode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0,
|
||||
height : ( stdMode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the current position of the window's scroll.
|
||||
* @function
|
||||
* @returns {Object} An object with the "x" and "y" properties
|
||||
* containing the scroll position.
|
||||
* @example
|
||||
* var win = new CKEDITOR.dom.window( window );
|
||||
* var pos = <b>win.getScrollPosition()</b>;
|
||||
* alert( pos.x );
|
||||
* alert( pos.y );
|
||||
*/
|
||||
getScrollPosition : function()
|
||||
{
|
||||
var $ = this.$;
|
||||
|
||||
if ( 'pageXOffset' in $ )
|
||||
{
|
||||
return {
|
||||
x : $.pageXOffset || 0,
|
||||
y : $.pageYOffset || 0
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
var doc = $.document;
|
||||
return {
|
||||
x : doc.documentElement.scrollLeft || doc.body.scrollLeft || 0,
|
||||
y : doc.documentElement.scrollTop || doc.body.scrollTop || 0
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,233 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.dtd} object, which holds the DTD
|
||||
* mapping for XHTML 1.0 Transitional. This file was automatically
|
||||
* generated from the file: xhtml1-transitional.dtd.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Holds and object representation of the HTML DTD to be used by the editor in
|
||||
* its internal operations.
|
||||
*
|
||||
* Each element in the DTD is represented by a
|
||||
* property in this object. Each property contains the list of elements that
|
||||
* can be contained by the element. Text is represented by the "#" property.
|
||||
*
|
||||
* Several special grouping properties are also available. Their names start
|
||||
* with the "$" character.
|
||||
* @namespace
|
||||
* @example
|
||||
* // Check if "div" can be contained in a "p" element.
|
||||
* alert( !!CKEDITOR.dtd[ 'p' ][ 'div' ] ); "false"
|
||||
* @example
|
||||
* // Check if "p" can be contained in a "div" element.
|
||||
* alert( !!CKEDITOR.dtd[ 'div' ][ 'p' ] ); "true"
|
||||
* @example
|
||||
* // Check if "p" is a block element.
|
||||
* alert( !!CKEDITOR.dtd.$block[ 'p' ] ); "true"
|
||||
*/
|
||||
CKEDITOR.dtd = (function()
|
||||
{
|
||||
var X = CKEDITOR.tools.extend,
|
||||
|
||||
A = {isindex:1,fieldset:1},
|
||||
B = {input:1,button:1,select:1,textarea:1,label:1},
|
||||
C = X({a:1},B),
|
||||
D = X({iframe:1},C),
|
||||
E = {hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1},
|
||||
F = {ins:1,del:1,script:1,style:1},
|
||||
G = X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F),
|
||||
H = X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G),
|
||||
I = X({p:1},H),
|
||||
J = X({iframe:1},H,B),
|
||||
K = {img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1},
|
||||
|
||||
L = X({a:1},J),
|
||||
M = {tr:1},
|
||||
N = {'#':1},
|
||||
O = X({param:1},K),
|
||||
P = X({form:1},A,D,E,I),
|
||||
Q = {li:1},
|
||||
R = {style:1,script:1},
|
||||
S = {base:1,link:1,meta:1,title:1},
|
||||
T = X(S,R),
|
||||
U = {head:1,body:1},
|
||||
V = {html:1};
|
||||
|
||||
var block = {address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1};
|
||||
|
||||
return /** @lends CKEDITOR.dtd */ {
|
||||
|
||||
// The "$" items have been added manually.
|
||||
|
||||
// List of elements living outside body.
|
||||
$nonBodyContent: X(V,U,S),
|
||||
|
||||
/**
|
||||
* List of block elements, like "p" or "div".
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$block : block,
|
||||
|
||||
/**
|
||||
* List of block limit elements.
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$blockLimit : { body:1,div:1,td:1,th:1,caption:1,form:1 },
|
||||
|
||||
$inline : L, // Just like span.
|
||||
|
||||
$body : X({script:1,style:1}, block),
|
||||
|
||||
$cdata : {script:1,style:1},
|
||||
|
||||
/**
|
||||
* List of empty (self-closing) elements, like "br" or "img".
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$empty : {area:1,base:1,br:1,col:1,hr:1,img:1,input:1,link:1,meta:1,param:1},
|
||||
|
||||
/**
|
||||
* List of list item elements, like "li" or "dd".
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$listItem : {dd:1,dt:1,li:1},
|
||||
|
||||
/**
|
||||
* List of list root elements.
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$list: { ul:1,ol:1,dl:1},
|
||||
|
||||
/**
|
||||
* Elements that accept text nodes, but are not possible to edit into
|
||||
* the browser.
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$nonEditable : {applet:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,script:1,textarea:1,param:1},
|
||||
|
||||
/**
|
||||
* List of elements that can be ignored if empty, like "b" or "span".
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$removeEmpty : {abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1},
|
||||
|
||||
/**
|
||||
* List of elements that have tabindex set to zero by default.
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$tabIndex : {a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},
|
||||
|
||||
/**
|
||||
* List of elements used inside the "table" element, like "tbody" or "td".
|
||||
* @type Object
|
||||
* @example
|
||||
*/
|
||||
$tableContent : {caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},
|
||||
|
||||
html: U,
|
||||
head: T,
|
||||
style: N,
|
||||
script: N,
|
||||
body: P,
|
||||
base: {},
|
||||
link: {},
|
||||
meta: {},
|
||||
title: N,
|
||||
col : {},
|
||||
tr : {td:1,th:1},
|
||||
img : {},
|
||||
colgroup : {col:1},
|
||||
noscript : P,
|
||||
td : P,
|
||||
br : {},
|
||||
th : P,
|
||||
center : P,
|
||||
kbd : L,
|
||||
button : X(I,E),
|
||||
basefont : {},
|
||||
h5 : L,
|
||||
h4 : L,
|
||||
samp : L,
|
||||
h6 : L,
|
||||
ol : Q,
|
||||
h1 : L,
|
||||
h3 : L,
|
||||
option : N,
|
||||
h2 : L,
|
||||
form : X(A,D,E,I),
|
||||
select : {optgroup:1,option:1},
|
||||
font : L,
|
||||
ins : L,
|
||||
menu : Q,
|
||||
abbr : L,
|
||||
label : L,
|
||||
table : {thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},
|
||||
code : L,
|
||||
script : N,
|
||||
tfoot : M,
|
||||
cite : L,
|
||||
li : P,
|
||||
input : {},
|
||||
iframe : P,
|
||||
strong : L,
|
||||
textarea : N,
|
||||
noframes : P,
|
||||
big : L,
|
||||
small : L,
|
||||
span : L,
|
||||
hr : {},
|
||||
dt : L,
|
||||
sub : L,
|
||||
optgroup : {option:1},
|
||||
param : {},
|
||||
bdo : L,
|
||||
'var' : L,
|
||||
div : P,
|
||||
object : O,
|
||||
sup : L,
|
||||
dd : P,
|
||||
strike : L,
|
||||
area : {},
|
||||
dir : Q,
|
||||
map : X({area:1,form:1,p:1},A,F,E),
|
||||
applet : O,
|
||||
dl : {dt:1,dd:1},
|
||||
del : L,
|
||||
isindex : {},
|
||||
fieldset : X({legend:1},K),
|
||||
thead : M,
|
||||
ul : Q,
|
||||
acronym : L,
|
||||
b : L,
|
||||
a : J,
|
||||
blockquote : P,
|
||||
caption : L,
|
||||
i : L,
|
||||
u : L,
|
||||
tbody : M,
|
||||
s : L,
|
||||
address : X(D,I),
|
||||
tt : L,
|
||||
legend : L,
|
||||
q : L,
|
||||
pre : X(G,C),
|
||||
p : L,
|
||||
em : L,
|
||||
dfn : L
|
||||
};
|
||||
})();
|
||||
|
||||
// PACKAGER_RENAME( CKEDITOR.dtd )
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,182 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
if ( !CKEDITOR.editor )
|
||||
{
|
||||
/**
|
||||
* No element is linked to the editor instance.
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.ELEMENT_MODE_NONE = 0;
|
||||
|
||||
/**
|
||||
* The element is to be replaced by the editor instance.
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.ELEMENT_MODE_REPLACE = 1;
|
||||
|
||||
/**
|
||||
* The editor is to be created inside the element.
|
||||
* @constant
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.ELEMENT_MODE_APPENDTO = 2;
|
||||
|
||||
/**
|
||||
* Represents an editor instance. This constructor should be rarely used,
|
||||
* being the {@link CKEDITOR} methods preferible.
|
||||
* @constructor
|
||||
* @param {Object} instanceConfig Configuration values for this specific
|
||||
* instance.
|
||||
* @param {CKEDITOR.dom.element} [element] The element linked to this
|
||||
* instance.
|
||||
* @param {Number} [mode] The mode in which the element is linked to this
|
||||
* instance.
|
||||
* @param {String} [data] Since 3.3. Initial value for the instance.
|
||||
* @augments CKEDITOR.event
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.editor = function( instanceConfig, element, mode, data )
|
||||
{
|
||||
this._ =
|
||||
{
|
||||
// Save the config to be processed later by the full core code.
|
||||
instanceConfig : instanceConfig,
|
||||
element : element,
|
||||
data : data
|
||||
};
|
||||
|
||||
/**
|
||||
* The mode in which the {@link #element} is linked to this editor
|
||||
* instance. It can be any of the following values:
|
||||
* <ul>
|
||||
* <li><b>CKEDITOR.ELEMENT_MODE_NONE</b>: No element is linked to the
|
||||
* editor instance.</li>
|
||||
* <li><b>CKEDITOR.ELEMENT_MODE_REPLACE</b>: The element is to be
|
||||
* replaced by the editor instance.</li>
|
||||
* <li><b>CKEDITOR.ELEMENT_MODE_APPENDTO</b>: The editor is to be
|
||||
* created inside the element.</li>
|
||||
* </ul>
|
||||
* @name CKEDITOR.editor.prototype.elementMode
|
||||
* @type Number
|
||||
* @example
|
||||
* var editor = CKEDITOR.replace( 'editor1' );
|
||||
* alert( <b>editor.elementMode</b> ); "1"
|
||||
*/
|
||||
this.elementMode = mode || CKEDITOR.ELEMENT_MODE_NONE;
|
||||
|
||||
// Call the CKEDITOR.event constructor to initialize this instance.
|
||||
CKEDITOR.event.call( this );
|
||||
|
||||
this._init();
|
||||
};
|
||||
|
||||
/**
|
||||
* Replaces a <textarea> or a DOM element (DIV) with a CKEditor
|
||||
* instance. For textareas, the initial value in the editor will be the
|
||||
* textarea value. For DOM elements, their innerHTML will be used
|
||||
* instead. We recommend using TEXTAREA and DIV elements only. Do not use
|
||||
* this function directly. Use {@link CKEDITOR.replace} instead.
|
||||
* @param {Object|String} elementOrIdOrName The DOM element (textarea), its
|
||||
* ID or name.
|
||||
* @param {Object} [config] The specific configurations to apply to this
|
||||
* editor instance. Configurations set here will override global CKEditor
|
||||
* settings.
|
||||
* @returns {CKEDITOR.editor} The editor instance created.
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.editor.replace = function( elementOrIdOrName, config )
|
||||
{
|
||||
var element = elementOrIdOrName;
|
||||
|
||||
if ( typeof element != 'object' )
|
||||
{
|
||||
// Look for the element by id. We accept any kind of element here.
|
||||
element = document.getElementById( elementOrIdOrName );
|
||||
|
||||
// If not found, look for elements by name. In this case we accept only
|
||||
// textareas.
|
||||
if ( !element )
|
||||
{
|
||||
var i = 0,
|
||||
textareasByName = document.getElementsByName( elementOrIdOrName );
|
||||
|
||||
while ( ( element = textareasByName[ i++ ] ) && element.tagName.toLowerCase() != 'textarea' )
|
||||
{ /*jsl:pass*/ }
|
||||
}
|
||||
|
||||
if ( !element )
|
||||
throw '[CKEDITOR.editor.replace] The element with id or name "' + elementOrIdOrName + '" was not found.';
|
||||
}
|
||||
|
||||
// Do not replace the textarea right now, just hide it. The effective
|
||||
// replacement will be done by the _init function.
|
||||
element.style.visibility = 'hidden';
|
||||
|
||||
// Create the editor instance.
|
||||
return new CKEDITOR.editor( config, element, CKEDITOR.ELEMENT_MODE_REPLACE );
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a new editor instance inside a specific DOM element. Do not use
|
||||
* this function directly. Use {@link CKEDITOR.appendTo} instead.
|
||||
* @param {Object|String} elementOrId The DOM element or its ID.
|
||||
* @param {Object} [config] The specific configurations to apply to this
|
||||
* editor instance. Configurations set here will override global CKEditor
|
||||
* settings.
|
||||
* @param {String} [data] Since 3.3. Initial value for the instance.
|
||||
* @returns {CKEDITOR.editor} The editor instance created.
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.editor.appendTo = function( elementOrId, config, data )
|
||||
{
|
||||
var element = elementOrId;
|
||||
if ( typeof element != 'object' )
|
||||
{
|
||||
element = document.getElementById( elementOrId );
|
||||
|
||||
if ( !element )
|
||||
throw '[CKEDITOR.editor.appendTo] The element with id "' + elementOrId + '" was not found.';
|
||||
}
|
||||
|
||||
// Create the editor instance.
|
||||
return new CKEDITOR.editor( config, element, CKEDITOR.ELEMENT_MODE_APPENDTO, data );
|
||||
};
|
||||
|
||||
CKEDITOR.editor.prototype =
|
||||
{
|
||||
/**
|
||||
* Initializes the editor instance. This function will be overriden by the
|
||||
* full CKEDITOR.editor implementation (editor.js).
|
||||
* @private
|
||||
*/
|
||||
_init : function()
|
||||
{
|
||||
var pending = CKEDITOR.editor._pending || ( CKEDITOR.editor._pending = [] );
|
||||
pending.push( this );
|
||||
},
|
||||
|
||||
// Both fire and fireOnce will always pass this editor instance as the
|
||||
// "editor" param in CKEDITOR.event.fire. So, we override it to do that
|
||||
// automaticaly.
|
||||
|
||||
/** @ignore */
|
||||
fire : function( eventName, data )
|
||||
{
|
||||
return CKEDITOR.event.prototype.fire.call( this, eventName, data, this );
|
||||
},
|
||||
|
||||
/** @ignore */
|
||||
fireOnce : function( eventName, data )
|
||||
{
|
||||
return CKEDITOR.event.prototype.fireOnce.call( this, eventName, data, this );
|
||||
}
|
||||
};
|
||||
|
||||
// "Inherit" (copy actually) from CKEDITOR.event.
|
||||
CKEDITOR.event.implementOn( CKEDITOR.editor.prototype, true );
|
||||
}
|
||||
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the {@link CKEDITOR.env} object, which constains
|
||||
* environment and browser information.
|
||||
*/
|
||||
|
||||
if ( !CKEDITOR.env )
|
||||
{
|
||||
/**
|
||||
* Environment and browser information.
|
||||
* @namespace
|
||||
* @example
|
||||
*/
|
||||
CKEDITOR.env = (function()
|
||||
{
|
||||
var agent = navigator.userAgent.toLowerCase();
|
||||
var opera = window.opera;
|
||||
|
||||
var env =
|
||||
/** @lends CKEDITOR.env */
|
||||
{
|
||||
/**
|
||||
* Indicates that CKEditor is running on Internet Explorer.
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.ie )
|
||||
* alert( "I'm on IE!" );
|
||||
*/
|
||||
ie : /*@cc_on!@*/false,
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on Opera.
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.opera )
|
||||
* alert( "I'm on Opera!" );
|
||||
*/
|
||||
opera : ( !!opera && opera.version ),
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on a WebKit based browser, like
|
||||
* Safari.
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.webkit )
|
||||
* alert( "I'm on WebKit!" );
|
||||
*/
|
||||
webkit : ( agent.indexOf( ' applewebkit/' ) > -1 ),
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on Adobe AIR.
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.air )
|
||||
* alert( "I'm on AIR!" );
|
||||
*/
|
||||
air : ( agent.indexOf( ' adobeair/' ) > -1 ),
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on Macintosh.
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.mac )
|
||||
* alert( "I love apples!" );
|
||||
*/
|
||||
mac : ( agent.indexOf( 'macintosh' ) > -1 ),
|
||||
|
||||
quirks : ( document.compatMode == 'BackCompat' ),
|
||||
|
||||
mobile : ( agent.indexOf( 'mobile' ) > -1 ),
|
||||
|
||||
isCustomDomain : function()
|
||||
{
|
||||
return this.ie && document.domain != window.location.hostname;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on a Gecko based browser, like
|
||||
* Firefox.
|
||||
* @name CKEDITOR.env.gecko
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.gecko )
|
||||
* alert( "I'm riding a gecko!" );
|
||||
*/
|
||||
env.gecko = ( navigator.product == 'Gecko' && !env.webkit && !env.opera );
|
||||
|
||||
var version = 0;
|
||||
|
||||
// Internet Explorer 6.0+
|
||||
if ( env.ie )
|
||||
{
|
||||
version = parseFloat( agent.match( /msie (\d+)/ )[1] );
|
||||
|
||||
/**
|
||||
* Indicate IE8 browser.
|
||||
*/
|
||||
env.ie8 = !!document.documentMode;
|
||||
|
||||
/**
|
||||
* Indicte IE8 document mode.
|
||||
*/
|
||||
env.ie8Compat = document.documentMode == 8;
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on an IE7-like environment, which
|
||||
* includes IE7 itself and IE8's IE7 document mode.
|
||||
* @type Boolean
|
||||
*/
|
||||
env.ie7Compat = ( ( version == 7 && !document.documentMode )
|
||||
|| document.documentMode == 7 );
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on an IE6-like environment, which
|
||||
* includes IE6 itself and IE7 and IE8 quirks mode.
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.ie6Compat )
|
||||
* alert( "I'm on IE6 or quirks mode!" );
|
||||
*/
|
||||
env.ie6Compat = ( version < 7 || env.quirks );
|
||||
|
||||
}
|
||||
|
||||
// Gecko.
|
||||
if ( env.gecko )
|
||||
{
|
||||
var geckoRelease = agent.match( /rv:([\d\.]+)/ );
|
||||
if ( geckoRelease )
|
||||
{
|
||||
geckoRelease = geckoRelease[1].split( '.' );
|
||||
version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Opera 9.50+
|
||||
if ( env.opera )
|
||||
version = parseFloat( opera.version() );
|
||||
|
||||
// Adobe AIR 1.0+
|
||||
// Checked before Safari because AIR have the WebKit rich text editor
|
||||
// features from Safari 3.0.4, but the version reported is 420.
|
||||
if ( env.air )
|
||||
version = parseFloat( agent.match( / adobeair\/(\d+)/ )[1] );
|
||||
|
||||
// WebKit 522+ (Safari 3+)
|
||||
if ( env.webkit )
|
||||
version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
|
||||
|
||||
/**
|
||||
* Contains the browser version.
|
||||
*
|
||||
* For gecko based browsers (like Firefox) it contains the revision
|
||||
* number with first three parts concatenated with a padding zero
|
||||
* (e.g. for revision 1.9.0.2 we have 10900).
|
||||
*
|
||||
* For webkit based browser (like Safari and Chrome) it contains the
|
||||
* WebKit build version (e.g. 522).
|
||||
* @name CKEDITOR.env.version
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.ie && <b>CKEDITOR.env.version</b> <= 6 )
|
||||
* alert( "Ouch!" );
|
||||
*/
|
||||
env.version = version;
|
||||
|
||||
/**
|
||||
* Indicates that CKEditor is running on a compatible browser.
|
||||
* @name CKEDITOR.env.isCompatible
|
||||
* @type Boolean
|
||||
* @example
|
||||
* if ( CKEDITOR.env.isCompatible )
|
||||
* alert( "Your browser is pretty cool!" );
|
||||
*/
|
||||
env.isCompatible =
|
||||
!env.mobile && (
|
||||
( env.ie && version >= 6 ) ||
|
||||
( env.gecko && version >= 10801 ) ||
|
||||
( env.opera && version >= 9.5 ) ||
|
||||
( env.air && version >= 1 ) ||
|
||||
( env.webkit && version >= 522 ) ||
|
||||
false );
|
||||
|
||||
// The CSS class to be appended on the main UI containers, making it
|
||||
// easy to apply browser specific styles to it.
|
||||
env.cssClass =
|
||||
'cke_browser_' + (
|
||||
env.ie ? 'ie' :
|
||||
env.gecko ? 'gecko' :
|
||||
env.opera ? 'opera' :
|
||||
env.air ? 'air' :
|
||||
env.webkit ? 'webkit' :
|
||||
'unknown' );
|
||||
|
||||
if ( env.quirks )
|
||||
env.cssClass += ' cke_browser_quirks';
|
||||
|
||||
if ( env.ie )
|
||||
{
|
||||
env.cssClass += ' cke_browser_ie' + (
|
||||
env.version < 7 ? '6' :
|
||||
env.version >= 8 ? '8' :
|
||||
'7' );
|
||||
|
||||
if ( env.quirks )
|
||||
env.cssClass += ' cke_browser_iequirks';
|
||||
}
|
||||
|
||||
if ( env.gecko && version < 10900 )
|
||||
env.cssClass += ' cke_browser_gecko18';
|
||||
|
||||
return env;
|
||||
})();
|
||||
}
|
||||
|
||||
// PACKAGER_RENAME( CKEDITOR.env )
|
||||
// PACKAGER_RENAME( CKEDITOR.env.ie )
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.html or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileOverview Defines the "virtual" {@link CKEDITOR.eventInfo} class, which
|
||||
* contains the defintions of the event object passed to event listeners.
|
||||
* This file is for documentation purposes only.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class is not really part of the API. It just illustrates the features
|
||||
* of the event object passed to event listeners by a {@link CKEDITOR.event}
|
||||
* based object.
|
||||
* @name CKEDITOR.eventInfo
|
||||
* @constructor
|
||||
* @example
|
||||
* // Do not do this.
|
||||
* var myEvent = new CKEDITOR.eventInfo(); // Error: CKEDITOR.eventInfo is undefined
|
||||
*/
|
||||
|
||||
/**
|
||||
* The event name.
|
||||
* @name CKEDITOR.eventInfo.prototype.name
|
||||
* @field
|
||||
* @type String
|
||||
* @example
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* alert( <b>event.name</b> ); // "someEvent"
|
||||
* });
|
||||
* someObject.fire( 'someEvent' );
|
||||
*/
|
||||
|
||||
/**
|
||||
* The object that publishes (sends) the event.
|
||||
* @name CKEDITOR.eventInfo.prototype.sender
|
||||
* @field
|
||||
* @type Object
|
||||
* @example
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* alert( <b>event.sender</b> == someObject ); // "true"
|
||||
* });
|
||||
* someObject.fire( 'someEvent' );
|
||||
*/
|
||||
|
||||
/**
|
||||
* The editor instance that holds the sender. May be the same as sender. May be
|
||||
* null if the sender is not part of an editor instance, like a component
|
||||
* running in standalone mode.
|
||||
* @name CKEDITOR.eventInfo.prototype.editor
|
||||
* @field
|
||||
* @type CKEDITOR.editor
|
||||
* @example
|
||||
* myButton.on( 'someEvent', function( event )
|
||||
* {
|
||||
* alert( <b>event.editor</b> == myEditor ); // "true"
|
||||
* });
|
||||
* myButton.fire( 'someEvent', null, <b>myEditor</b> );
|
||||
*/
|
||||
|
||||
/**
|
||||
* Any kind of additional data. Its format and usage is event dependent.
|
||||
* @name CKEDITOR.eventInfo.prototype.data
|
||||
* @field
|
||||
* @type Object
|
||||
* @example
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* alert( <b>event.data</b> ); // "Example"
|
||||
* });
|
||||
* someObject.fire( 'someEvent', <b>'Example'</b> );
|
||||
*/
|
||||
|
||||
/**
|
||||
* Any extra data appended during the listener registration.
|
||||
* @name CKEDITOR.eventInfo.prototype.listenerData
|
||||
* @field
|
||||
* @type Object
|
||||
* @example
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* alert( <b>event.listenerData</b> ); // "Example"
|
||||
* }
|
||||
* , null, <b>'Example'</b> );
|
||||
*/
|
||||
|
||||
/**
|
||||
* Indicates that no further listeners are to be called.
|
||||
* @name CKEDITOR.eventInfo.prototype.stop
|
||||
* @function
|
||||
* @example
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* <b>event.stop()</b>;
|
||||
* });
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* // This one will not be called.
|
||||
* });
|
||||
* alert( someObject.fire( 'someEvent' ) ); // "false"
|
||||
*/
|
||||
|
||||
/**
|
||||
* Indicates that the event is to be cancelled (if cancelable).
|
||||
* @name CKEDITOR.eventInfo.prototype.cancel
|
||||
* @function
|
||||
* @example
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* <b>event.cancel()</b>;
|
||||
* });
|
||||
* someObject.on( 'someEvent', function( event )
|
||||
* {
|
||||
* // This one will not be called.
|
||||
* });
|
||||
* alert( someObject.fire( 'someEvent' ) ); // "true"
|
||||
*/
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user