179 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
							 | 
						|||
| 
								 | 
							
								 * For licensing, see LICENSE.md or http://ckeditor.com/license
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								( function() {
							 | 
						|||
| 
								 | 
							
									var cssStyle = CKEDITOR.htmlParser.cssStyle,
							 | 
						|||
| 
								 | 
							
										cssLength = CKEDITOR.tools.cssLength;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									var cssLengthRegex = /^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// Replacing the former CSS length value with the later one, with
							 | 
						|||
| 
								 | 
							
									// adjustment to the length  unit.
							 | 
						|||
| 
								 | 
							
									function replaceCssLength( length1, length2 ) {
							 | 
						|||
| 
								 | 
							
										var parts1 = cssLengthRegex.exec( length1 ),
							 | 
						|||
| 
								 | 
							
											parts2 = cssLengthRegex.exec( length2 );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// Omit pixel length unit when necessary,
							 | 
						|||
| 
								 | 
							
										// e.g. replaceCssLength( 10, '20px' ) -> 20
							 | 
						|||
| 
								 | 
							
										if ( parts1 ) {
							 | 
						|||
| 
								 | 
							
											if ( !parts1[ 2 ] && parts2[ 2 ] == 'px' )
							 | 
						|||
| 
								 | 
							
												return parts2[ 1 ];
							 | 
						|||
| 
								 | 
							
											if ( parts1[ 2 ] == 'px' && !parts2[ 2 ] )
							 | 
						|||
| 
								 | 
							
												return parts2[ 1 ] + 'px';
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										return length2;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									var htmlFilterRules = {
							 | 
						|||
| 
								 | 
							
										elements: {
							 | 
						|||
| 
								 | 
							
											$: function( element ) {
							 | 
						|||
| 
								 | 
							
												var attributes = element.attributes,
							 | 
						|||
| 
								 | 
							
													realHtml = attributes && attributes[ 'data-cke-realelement' ],
							 | 
						|||
| 
								 | 
							
													realFragment = realHtml && new CKEDITOR.htmlParser.fragment.fromHtml( decodeURIComponent( realHtml ) ),
							 | 
						|||
| 
								 | 
							
													realElement = realFragment && realFragment.children[ 0 ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												// Width/height in the fake object are subjected to clone into the real element.
							 | 
						|||
| 
								 | 
							
												if ( realElement && element.attributes[ 'data-cke-resizable' ] ) {
							 | 
						|||
| 
								 | 
							
													var styles = new cssStyle( element ).rules,
							 | 
						|||
| 
								 | 
							
														realAttrs = realElement.attributes,
							 | 
						|||
| 
								 | 
							
														width = styles.width,
							 | 
						|||
| 
								 | 
							
														height = styles.height;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													width && ( realAttrs.width = replaceCssLength( realAttrs.width, width ) );
							 | 
						|||
| 
								 | 
							
													height && ( realAttrs.height = replaceCssLength( realAttrs.height, height ) );
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												return realElement;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									var plugin = CKEDITOR.plugins.add( 'fakeobjects', {
							 | 
						|||
| 
								 | 
							
										lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										init: function( editor ) {
							 | 
						|||
| 
								 | 
							
											// Allow image with all styles and classes plus src, alt and title attributes.
							 | 
						|||
| 
								 | 
							
											// We need them when fakeobject is pasted.
							 | 
						|||
| 
								 | 
							
											editor.filter.allow( 'img[!data-cke-realelement,src,alt,title](*){*}', 'fakeobjects' );
							 | 
						|||
| 
								 | 
							
										},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										afterInit: function( editor ) {
							 | 
						|||
| 
								 | 
							
											var dataProcessor = editor.dataProcessor,
							 | 
						|||
| 
								 | 
							
												htmlFilter = dataProcessor && dataProcessor.htmlFilter;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											if ( htmlFilter )
							 | 
						|||
| 
								 | 
							
												htmlFilter.addRules( htmlFilterRules );
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									} );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/**
							 | 
						|||
| 
								 | 
							
									 * @member CKEDITOR.editor
							 | 
						|||
| 
								 | 
							
									 * @todo
							 | 
						|||
| 
								 | 
							
									 */
							 | 
						|||
| 
								 | 
							
									CKEDITOR.editor.prototype.createFakeElement = function( realElement, className, realElementType, isResizable ) {
							 | 
						|||
| 
								 | 
							
										var lang = this.lang.fakeobjects,
							 | 
						|||
| 
								 | 
							
											label = lang[ realElementType ] || lang.unknown;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										var attributes = {
							 | 
						|||
| 
								 | 
							
											'class': className,
							 | 
						|||
| 
								 | 
							
											'data-cke-realelement': encodeURIComponent( realElement.getOuterHtml() ),
							 | 
						|||
| 
								 | 
							
											'data-cke-real-node-type': realElement.type,
							 | 
						|||
| 
								 | 
							
											alt: label,
							 | 
						|||
| 
								 | 
							
											title: label,
							 | 
						|||
| 
								 | 
							
											align: realElement.getAttribute( 'align' ) || ''
							 | 
						|||
| 
								 | 
							
										};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// Do not set "src" on high-contrast so the alt text is displayed. (#8945)
							 | 
						|||
| 
								 | 
							
										if ( !CKEDITOR.env.hc )
							 | 
						|||
| 
								 | 
							
											attributes.src = CKEDITOR.getUrl( plugin.path + 'images/spacer.gif' );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if ( realElementType )
							 | 
						|||
| 
								 | 
							
											attributes[ 'data-cke-real-element-type' ] = realElementType;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if ( isResizable ) {
							 | 
						|||
| 
								 | 
							
											attributes[ 'data-cke-resizable' ] = isResizable;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											var fakeStyle = new cssStyle();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											var width = realElement.getAttribute( 'width' ),
							 | 
						|||
| 
								 | 
							
												height = realElement.getAttribute( 'height' );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											width && ( fakeStyle.rules.width = cssLength( width ) );
							 | 
						|||
| 
								 | 
							
											height && ( fakeStyle.rules.height = cssLength( height ) );
							 | 
						|||
| 
								 | 
							
											fakeStyle.populate( attributes );
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										return this.document.createElement( 'img', { attributes: attributes } );
							 | 
						|||
| 
								 | 
							
									};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/**
							 | 
						|||
| 
								 | 
							
									 * @member CKEDITOR.editor
							 | 
						|||
| 
								 | 
							
									 * @todo
							 | 
						|||
| 
								 | 
							
									 */
							 | 
						|||
| 
								 | 
							
									CKEDITOR.editor.prototype.createFakeParserElement = function( realElement, className, realElementType, isResizable ) {
							 | 
						|||
| 
								 | 
							
										var lang = this.lang.fakeobjects,
							 | 
						|||
| 
								 | 
							
											label = lang[ realElementType ] || lang.unknown,
							 | 
						|||
| 
								 | 
							
											html;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										var writer = new CKEDITOR.htmlParser.basicWriter();
							 | 
						|||
| 
								 | 
							
										realElement.writeHtml( writer );
							 | 
						|||
| 
								 | 
							
										html = writer.getHtml();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										var attributes = {
							 | 
						|||
| 
								 | 
							
											'class': className,
							 | 
						|||
| 
								 | 
							
											'data-cke-realelement': encodeURIComponent( html ),
							 | 
						|||
| 
								 | 
							
											'data-cke-real-node-type': realElement.type,
							 | 
						|||
| 
								 | 
							
											alt: label,
							 | 
						|||
| 
								 | 
							
											title: label,
							 | 
						|||
| 
								 | 
							
											align: realElement.attributes.align || ''
							 | 
						|||
| 
								 | 
							
										};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// Do not set "src" on high-contrast so the alt text is displayed. (#8945)
							 | 
						|||
| 
								 | 
							
										if ( !CKEDITOR.env.hc )
							 | 
						|||
| 
								 | 
							
											attributes.src = CKEDITOR.getUrl( plugin.path + 'images/spacer.gif' );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if ( realElementType )
							 | 
						|||
| 
								 | 
							
											attributes[ 'data-cke-real-element-type' ] = realElementType;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if ( isResizable ) {
							 | 
						|||
| 
								 | 
							
											attributes[ 'data-cke-resizable' ] = isResizable;
							 | 
						|||
| 
								 | 
							
											var realAttrs = realElement.attributes,
							 | 
						|||
| 
								 | 
							
												fakeStyle = new cssStyle();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											var width = realAttrs.width,
							 | 
						|||
| 
								 | 
							
												height = realAttrs.height;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											width != undefined && ( fakeStyle.rules.width = cssLength( width ) );
							 | 
						|||
| 
								 | 
							
											height != undefined && ( fakeStyle.rules.height = cssLength( height ) );
							 | 
						|||
| 
								 | 
							
											fakeStyle.populate( attributes );
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										return new CKEDITOR.htmlParser.element( 'img', attributes );
							 | 
						|||
| 
								 | 
							
									};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/**
							 | 
						|||
| 
								 | 
							
									 * @member CKEDITOR.editor
							 | 
						|||
| 
								 | 
							
									 * @todo
							 | 
						|||
| 
								 | 
							
									 */
							 | 
						|||
| 
								 | 
							
									CKEDITOR.editor.prototype.restoreRealElement = function( fakeElement ) {
							 | 
						|||
| 
								 | 
							
										if ( fakeElement.data( 'cke-real-node-type' ) != CKEDITOR.NODE_ELEMENT )
							 | 
						|||
| 
								 | 
							
											return null;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										var element = CKEDITOR.dom.element.createFromHtml( decodeURIComponent( fakeElement.data( 'cke-realelement' ) ), this.document );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if ( fakeElement.data( 'cke-resizable' ) ) {
							 | 
						|||
| 
								 | 
							
											var width = fakeElement.getStyle( 'width' ),
							 | 
						|||
| 
								 | 
							
												height = fakeElement.getStyle( 'height' );
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											width && element.setAttribute( 'width', replaceCssLength( element.getAttribute( 'width' ), width ) );
							 | 
						|||
| 
								 | 
							
											height && element.setAttribute( 'height', replaceCssLength( element.getAttribute( 'height' ), height ) );
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										return element;
							 | 
						|||
| 
								 | 
							
									};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								} )();
							 |