Browse Source

Add support for pasting lists from google docs.

Mateusz Samsel 6 years ago
parent
commit
589071ca21

+ 47 - 0
packages/ckeditor5-paste-from-office/src/filters/common.js

@@ -0,0 +1,47 @@
+/**
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+/**
+ * @module paste-from-office/filters/common
+ */
+
+export function unwrapParagraph( elementOrDocumentFragment, writer ) {
+	const iterableNodes = elementOrDocumentFragment.is( 'element' ) ? elementOrDocumentFragment.getChildren() : elementOrDocumentFragment;
+
+	for ( const element of iterableNodes ) {
+		if ( element.is( 'element', 'p' ) && element.parent.is( 'element', 'li' ) ) {
+			const parent = element.parent;
+			const childIndex = parent.getChildIndex( element );
+			const removedElement = writer.remove( element )[ 0 ];
+
+			writer.insertChild( childIndex, removedElement.getChildren(), parent );
+		}
+
+		if ( element.is( 'element' ) && element.childCount ) {
+			unwrapParagraph( element, writer );
+		}
+	}
+}
+
+export function moveNestedListToListItem( elementOrDocumentFragment, writer ) {
+	const iterableNodes = elementOrDocumentFragment.is( 'element' ) ? elementOrDocumentFragment.getChildren() : elementOrDocumentFragment;
+
+	for ( const element of iterableNodes ) {
+		if ( isList( element ) && isList( element.parent ) ) {
+			const previous = element.previousSibling;
+			const removedElement = writer.remove( element )[ 0 ];
+
+			writer.insertChild( previous.childCount, removedElement, previous );
+		}
+
+		if ( element.is( 'element' ) && element.childCount ) {
+			moveNestedListToListItem( element, writer );
+		}
+	}
+}
+
+function isList( element ) {
+	return element.is( 'element', 'ol' ) || element.is( 'element', 'ul' );
+}

+ 7 - 0
packages/ckeditor5-paste-from-office/src/normalizers/googledocsnormalizer.js

@@ -8,6 +8,10 @@
  */
 
 import removeBoldWrapper from '../filters/removeboldwrapper';
+import {
+	unwrapParagraph,
+	moveNestedListToListItem
+} from '../filters/common';
 import UpcastWriter from '@ckeditor/ckeditor5-engine/src/view/upcastwriter';
 
 const googleDocsMatch = /id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;
@@ -32,5 +36,8 @@ export default class GoogleDocsNormalizer {
 		const writer = new UpcastWriter();
 
 		removeBoldWrapper( data.content, writer );
+
+		unwrapParagraph( data.content, writer );
+		moveNestedListToListItem( data.content, writer );
 	}
 }