8
0
Krzysztof Krztoń 7 лет назад
Родитель
Сommit
a172b26d4c

+ 12 - 10
packages/ckeditor5-paste-from-office/src/filters/list.js

@@ -9,7 +9,6 @@
 
 import Element from '@ckeditor/ckeditor5-engine/src/view/element';
 import Matcher from '@ckeditor/ckeditor5-engine/src/view/matcher';
-import Range from '@ckeditor/ckeditor5-engine/src/view/range';
 import UpcastWriter from '@ckeditor/ckeditor5-engine/src/view/upcastwriter';
 
 /**
@@ -22,13 +21,14 @@ import UpcastWriter from '@ckeditor/ckeditor5-engine/src/view/upcastwriter';
  *
  * @param {module:engine/view/documentfragment~DocumentFragment} documentFragment The view structure which to transform.
  * @param {String} stylesString Styles from which list-like elements styling will be extracted.
+ * @param {module:engine/view/view~View} view
  */
-export function transformListItemLikeElementsIntoLists( documentFragment, stylesString ) {
+export function transformListItemLikeElementsIntoLists( documentFragment, stylesString, view ) {
 	if ( !documentFragment.childCount ) {
 		return;
 	}
 
-	const itemLikeElements = findAllItemLikeElements( documentFragment );
+	const itemLikeElements = findAllItemLikeElements( documentFragment, view );
 
 	if ( !itemLikeElements.length ) {
 		return;
@@ -45,7 +45,7 @@ export function transformListItemLikeElementsIntoLists( documentFragment, styles
 			currentList = insertNewEmptyList( listStyle, itemLikeElement.element, writer );
 		}
 
-		const listItem = transformElementIntoListItem( itemLikeElement.element, writer );
+		const listItem = transformElementIntoListItem( itemLikeElement.element, writer, view );
 
 		writer.appendChild( listItem, currentList );
 	} );
@@ -55,14 +55,15 @@ export function transformListItemLikeElementsIntoLists( documentFragment, styles
 //
 // @param {module:engine/view/documentfragment~DocumentFragment} documentFragment Document fragment
 // in which to look for list-like nodes.
+// @param {module:engine/view/view~View} view
 // @returns {Array.<Object>} Array of found list-like items. Each item is an object containing:
 //
 //		* {module:engine/src/view/element~Element} element List-like element.
 //		* {Number} id List item id parsed from `mso-list` style (see `getListItemData()` function).
 //		* {Number} order List item creation order parsed from `mso-list` style (see `getListItemData()` function).
 //		* {Number} indent List item indentation level parsed from `mso-list` style (see `getListItemData()` function).
-function findAllItemLikeElements( documentFragment ) {
-	const range = Range.createIn( documentFragment );
+function findAllItemLikeElements( documentFragment, view ) {
+	const range = view.createRangeIn( documentFragment );
 
 	// Matcher for finding list-like elements.
 	const itemLikeElementsMatcher = new Matcher( {
@@ -155,8 +156,8 @@ function insertNewEmptyList( listStyle, element, writer ) {
 // @param {module:engine/view/upcastwriter~UpcastWriter} writer
 // @returns {module:engine/view/element~Element} New element to which the given one was transformed. It is
 // inserted in place of the old element (the reference to the old element is lost due to renaming).
-function transformElementIntoListItem( element, writer ) {
-	removeBulletElement( element, writer );
+function transformElementIntoListItem( element, writer, view ) {
+	removeBulletElement( element, writer, view );
 
 	return writer.rename( 'li', element );
 }
@@ -193,7 +194,8 @@ function getListItemData( element ) {
 //
 // @param {module:engine/view/element~Element} element
 // @param {module:engine/view/upcastwriter~UpcastWriter} writer
-function removeBulletElement( element, writer ) {
+// @param {module:engine/view/view~View} view
+function removeBulletElement( element, writer, view ) {
 	// Matcher for finding `span` elements holding lists numbering/bullets.
 	const bulletMatcher = new Matcher( {
 		name: 'span',
@@ -202,7 +204,7 @@ function removeBulletElement( element, writer ) {
 		}
 	} );
 
-	const range = Range.createIn( element );
+	const range = view.createRangeIn( element );
 
 	for ( const value of range ) {
 		if ( value.type === 'elementStart' && bulletMatcher.match( value.item ) ) {

+ 4 - 2
packages/ckeditor5-paste-from-office/src/filters/utils.js

@@ -124,8 +124,10 @@ function normalizeSafariSpaceSpans( htmlString ) {
 // @param {Document} htmlDocument Native `Document` object in which spacing should be normalized.
 function normalizeSpacerunSpans( htmlDocument ) {
 	htmlDocument.querySelectorAll( 'span[style*=spacerun]' ).forEach( el => {
-		const spacesReplacemanet = Array( el.innerText.length + 1 ).join( '\u00A0 ' ).substr( 0, el.innerText.length );
+		// Use `el.childNodes[ 0 ].data.length` instead of `el.innerText.length`. For `el.innerText.length` which
+		// contains spaces mixed with `&nbsp;` Edge browser returns incorrect length.
+		const innerTextLength = el.childNodes[ 0 ].data.length;
 
-		el.innerHTML = spacesReplacemanet;
+		el.innerHTML = Array( innerTextLength + 1 ).join( '\u00A0 ' ).substr( 0, innerTextLength );
 	} );
 }

+ 1 - 1
packages/ckeditor5-paste-from-office/src/pastefromoffice.js

@@ -57,7 +57,7 @@ export default class PasteFromOffice extends Plugin {
 	 */
 	_normalizeWordInput( input ) {
 		const { body, stylesString } = parseHtml( input );
-		transformListItemLikeElementsIntoLists( body, stylesString );
+		transformListItemLikeElementsIntoLists( body, stylesString, this.editor.editing.view );
 
 		return body;
 	}

+ 6 - 5
packages/ckeditor5-paste-from-office/tests/filters/list.js

@@ -5,6 +5,7 @@
 
 import HtmlDataProcessor from '@ckeditor/ckeditor5-engine/src/dataprocessor/htmldataprocessor';
 import { stringify } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
+import View from '@ckeditor/ckeditor5-engine/src/view/view';
 
 import { transformListItemLikeElementsIntoLists } from '../../src/filters/list';
 
@@ -17,7 +18,7 @@ describe( 'Filters', () => {
 				const html = '<p style="mso-list:l0 level1 lfo0"><span style="mso-list:Ignore">1.</span>Item 1</p>';
 				const view = htmlDataProcessor.toView( html );
 
-				transformListItemLikeElementsIntoLists( view, '' );
+				transformListItemLikeElementsIntoLists( view, '', new View() );
 
 				expect( view.childCount ).to.equal( 1 );
 				expect( view.getChild( 0 ).name ).to.equal( 'ol' );
@@ -28,7 +29,7 @@ describe( 'Filters', () => {
 				const html = '<p style="mso-list:l0 level1 lfo0"><span style="mso-list:Ignore">1.</span>Item 1</p>';
 				const view = htmlDataProcessor.toView( html );
 
-				transformListItemLikeElementsIntoLists( view, '@list l0:level1 { mso-level-number-format: bullet; }' );
+				transformListItemLikeElementsIntoLists( view, '@list l0:level1 { mso-level-number-format: bullet; }', new View() );
 
 				expect( view.childCount ).to.equal( 1 );
 				expect( view.getChild( 0 ).name ).to.equal( 'ul' );
@@ -39,7 +40,7 @@ describe( 'Filters', () => {
 				const html = '<h1>H1</h1><p>Foo Bar</p>';
 				const view = htmlDataProcessor.toView( html );
 
-				transformListItemLikeElementsIntoLists( view, '' );
+				transformListItemLikeElementsIntoLists( view, '', new View() );
 
 				expect( view.childCount ).to.equal( 2 );
 				expect( stringify( view ) ).to.equal( html );
@@ -49,7 +50,7 @@ describe( 'Filters', () => {
 				const html = '<p style="mso-list:"><span style="mso-list:Ignore">1.</span>Item 1</p>';
 				const view = htmlDataProcessor.toView( html );
 
-				transformListItemLikeElementsIntoLists( view, '' );
+				transformListItemLikeElementsIntoLists( view, '', new View() );
 
 				expect( view.childCount ).to.equal( 1 );
 				expect( view.getChild( 0 ).name ).to.equal( 'ol' );
@@ -59,7 +60,7 @@ describe( 'Filters', () => {
 			it( 'handles empty body correctly', () => {
 				const view = htmlDataProcessor.toView( '' );
 
-				transformListItemLikeElementsIntoLists( view, '' );
+				transformListItemLikeElementsIntoLists( view, '', new View() );
 
 				expect( view.childCount ).to.equal( 0 );
 				expect( stringify( view ) ).to.equal( '' );