|
|
@@ -4,7 +4,7 @@
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
- * @module paste-from-office/filters/utils
|
|
|
+ * @module paste-from-office/filters/parse
|
|
|
*/
|
|
|
|
|
|
/* globals DOMParser */
|
|
|
@@ -12,6 +12,8 @@
|
|
|
import DomConverter from '@ckeditor/ckeditor5-engine/src/view/domconverter';
|
|
|
import { NBSP_FILLER } from '@ckeditor/ckeditor5-engine/src/view/filler';
|
|
|
|
|
|
+import { normalizeSpacing, normalizeSpacerunSpans } from './space';
|
|
|
+
|
|
|
/**
|
|
|
* Parses provided HTML extracting contents of `<body>` and `<style>` tags.
|
|
|
*
|
|
|
@@ -89,45 +91,3 @@ function extractStyles( htmlDocument ) {
|
|
|
stylesString: stylesString.join( ' ' )
|
|
|
};
|
|
|
}
|
|
|
-
|
|
|
-// Replaces last space preceding elements closing tag with ` `. Such operation prevents spaces from being removed
|
|
|
-// during further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).
|
|
|
-// This method also takes into account Word specific `<o:p></o:p>` empty tags.
|
|
|
-//
|
|
|
-// @param {String} htmlString HTML string in which spacing should be normalized.
|
|
|
-// @returns {String} Input HTML with spaces normalized.
|
|
|
-function normalizeSpacing( htmlString ) {
|
|
|
- return normalizeSafariSpaceSpans( normalizeSafariSpaceSpans( htmlString ) ) // Run normalization two times to cover nested spans.
|
|
|
- .replace( / <\//g, '\u00A0</' )
|
|
|
- .replace( / <o:p><\/o:p>/g, '\u00A0<o:p></o:p>' );
|
|
|
-}
|
|
|
-
|
|
|
-// Normalizes specific spacing generated by Safari when content pasted from Word (`<span class="Apple-converted-space"> </span>`)
|
|
|
-// by replacing all spaces sequences longer than 1 space with ` ` pairs. This prevents spaces from being removed during
|
|
|
-// further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).
|
|
|
-//
|
|
|
-// This function is similar to {@link module:clipboard/utils/normalizeclipboarddata normalizeClipboardData util} but uses
|
|
|
-// regular spaces / sequence for replacement.
|
|
|
-//
|
|
|
-// @param {String} htmlString HTML string in which spacing should be normalized
|
|
|
-// @returns {String} Input HTML with spaces normalized.
|
|
|
-function normalizeSafariSpaceSpans( htmlString ) {
|
|
|
- return htmlString.replace( /<span(?: class="Apple-converted-space"|)>(\s+)<\/span>/g, ( fullMatch, spaces ) => {
|
|
|
- return spaces.length === 1 ? ' ' : Array( spaces.length + 1 ).join( '\u00A0 ' ).substr( 0, spaces.length );
|
|
|
- } );
|
|
|
-}
|
|
|
-
|
|
|
-// Normalizes spacing in special Word `spacerun spans` (`<span style='mso-spacerun:yes'>\s+</span>`) by replacing
|
|
|
-// all spaces with ` ` pairs. This prevents spaces from being removed during further DOM/View processing
|
|
|
-// (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).
|
|
|
-//
|
|
|
-// @param {Document} htmlDocument Native `Document` object in which spacing should be normalized.
|
|
|
-function normalizeSpacerunSpans( htmlDocument ) {
|
|
|
- htmlDocument.querySelectorAll( 'span[style*=spacerun]' ).forEach( el => {
|
|
|
- // Use `el.childNodes[ 0 ].data.length` instead of `el.innerText.length`. For `el.innerText.length` which
|
|
|
- // contains spaces mixed with ` ` Edge browser returns incorrect length.
|
|
|
- const innerTextLength = el.childNodes[ 0 ].data.length;
|
|
|
-
|
|
|
- el.innerHTML = Array( innerTextLength + 1 ).join( '\u00A0 ' ).substr( 0, innerTextLength );
|
|
|
- } );
|
|
|
-}
|