Skip to content

Commit

Permalink
Merge pull request #8417 from ckeditor/i/7805
Browse files Browse the repository at this point in the history
Fix (paste-from-office): Improved a mechanism that detects nested lists while pasting from Word. In some scenarios, pasting nested lists could produce invalid results in the editor. Closes #7805.
  • Loading branch information
jodator authored Nov 5, 2020
2 parents 9701cc8 + 0c273f9 commit be5b989
Show file tree
Hide file tree
Showing 9 changed files with 1,610 additions and 6 deletions.
13 changes: 13 additions & 0 deletions packages/ckeditor5-paste-from-office/src/filters/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@ function removeBulletElement( element, writer ) {
// Whether previous and current item belongs to the same list. It is determined based on `item.id`
// (extracted from `mso-list` style, see #getListItemData) and previous sibling of the current item.
//
// However, it's quite easy to change the `id` attribute for nested lists in Word. It will break the list feature while pasting.
// Let's check also the `indent` attribute. If between those two elements, the difference is equal to 1, we can assume that
// the `currentItem` is a beginning of the nested list because lists in CKEditor 5 always starts with the `indent=0` attribute.
// See: https://github.com/ckeditor/ckeditor5/issues/7805.
//
// @param {Object} previousItem
// @param {Object} currentItem
// @returns {Boolean}
Expand All @@ -370,6 +375,14 @@ function isNewListNeeded( previousItem, currentItem ) {
}

if ( previousItem.id !== currentItem.id ) {
// See: https://github.com/ckeditor/ckeditor5/issues/7805.
//
// * List item 1.
// - Nested list item 1.
if ( currentItem.indent - previousItem.indent === 1 ) {
return false;
}

return true;
}

Expand Down
23 changes: 17 additions & 6 deletions packages/ckeditor5-paste-from-office/tests/_data/list/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import resumeTemplate from './resume-template/input.word2016.html';
import nested from './nested/input.word2016.html';
import nestedMixed from './nested-mixed/input.word2016.html';
import nestedMultiple from './nested-multiple/input.word2016.html';
import nestedMixedId from './nested-mixed-id/input.word2016.html';

import simpleNormalized from './simple/normalized.word2016.html';
import styledNormalized from './styled/normalized.word2016.html';
Expand All @@ -29,6 +30,7 @@ import resumeTemplateNormalized from './resume-template/normalized.word2016.html
import nestedNormalized from './nested/normalized.word2016.html';
import nestedMixedNormalized from './nested-mixed/normalized.word2016.html';
import nestedMultipleNormalized from './nested-multiple/normalized.word2016.html';
import nestedMixedIdNormalized from './nested-mixed-id/normalized.word2016.html';

import simpleModel from './simple/model.word2016.html';
import styledModel from './styled/model.word2016.html';
Expand All @@ -42,6 +44,7 @@ import resumeTemplateModel from './resume-template/model.word2016.html';
import nestedModel from './nested/model.word2016.html';
import nestedMixedModel from './nested-mixed/model.word2016.html';
import nestedMultipleModel from './nested-multiple/model.word2016.html';
import nestedMixedIdModel from './nested-mixed-id/model.word2016.html';

export const fixtures = {
input: {
Expand All @@ -56,7 +59,8 @@ export const fixtures = {
resumeTemplate,
nested,
nestedMixed,
nestedMultiple
nestedMultiple,
nestedMixedId
},
normalized: {
simple: simpleNormalized,
Expand All @@ -70,7 +74,8 @@ export const fixtures = {
resumeTemplate: resumeTemplateNormalized,
nested: nestedNormalized,
nestedMixed: nestedMixedNormalized,
nestedMultiple: nestedMultipleNormalized
nestedMultiple: nestedMultipleNormalized,
nestedMixedId: nestedMixedIdNormalized
},
model: {
simple: simpleModel,
Expand All @@ -84,7 +89,8 @@ export const fixtures = {
resumeTemplate: resumeTemplateModel,
nested: nestedModel,
nestedMixed: nestedMixedModel,
nestedMultiple: nestedMultipleModel
nestedMultiple: nestedMultipleModel,
nestedMixedId: nestedMixedIdModel
}
};

Expand All @@ -101,6 +107,7 @@ import resumeTemplateSafari from './resume-template/input.safari.word2016.html';
import nestedSafari from './nested/input.safari.word2016.html';
import nestedMixedSafari from './nested-mixed/input.safari.word2016.html';
import nestedMultipleSafari from './nested-multiple/input.safari.word2016.html';
import nestedMixedIdSafari from './nested-mixed-id/input.safari.word2016.html';

import simpleNormalizedSafari from './simple/normalized.safari.word2016.html';
import styledNormalizedSafari from './styled/normalized.safari.word2016.html';
Expand All @@ -112,6 +119,7 @@ import heading3StyledNormalizedSafari from './heading3-styled/normalized.safari.
import heading7NormalizedSafari from './heading7/normalized.safari.word2016.html';
import resumeTemplateNormalizedSafari from './resume-template/normalized.safari.word2016.html';
import nestedMultipleNormalizedSafari from './nested-multiple/normalized.safari.word2016.html';
import nestedMixedIdNormalizedSafari from './nested-mixed-id/normalized.safari.word2016.html';

import styledSafariModel from './styled/model.safari.word2016.html';
import resumeTemplateSafariModel from './resume-template/model.safari.word2016.html';
Expand All @@ -130,7 +138,8 @@ export const browserFixtures = {
resumeTemplate: resumeTemplateSafari,
nested: nestedSafari,
nestedMixed: nestedMixedSafari,
nestedMultiple: nestedMultipleSafari
nestedMultiple: nestedMultipleSafari,
nestedMixedId: nestedMixedIdSafari
},
normalized: {
simple: simpleNormalizedSafari,
Expand All @@ -144,7 +153,8 @@ export const browserFixtures = {
resumeTemplate: resumeTemplateNormalizedSafari,
nested: nestedNormalized,
nestedMixed: nestedMixedNormalized,
nestedMultiple: nestedMultipleNormalizedSafari
nestedMultiple: nestedMultipleNormalizedSafari,
nestedMixedId: nestedMixedIdNormalizedSafari
},
model: {
simple: simpleModel,
Expand All @@ -158,7 +168,8 @@ export const browserFixtures = {
resumeTemplate: resumeTemplateSafariModel,
nested: nestedModel,
nestedMixed: nestedMixedModel,
nestedMultiple: nestedMultipleModel
nestedMultiple: nestedMultipleModel,
nestedMixedId: nestedMixedIdModel
}
}
};
Loading

0 comments on commit be5b989

Please sign in to comment.