From 61e503b88b555eaab7c7171e1ce4f21b14c4ef7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Go=C5=82aszewski?= Date: Tue, 6 Aug 2019 13:59:47 +0200 Subject: [PATCH 01/11] Handle invalid nested list in list upcast converter. --- src/converters.js | 43 ++++++++++++++++++++++-- tests/listediting.js | 80 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/src/converters.js b/src/converters.js index 5b2ae0e..477077a 100644 --- a/src/converters.js +++ b/src/converters.js @@ -347,7 +347,10 @@ export function viewModelConverter( evt, data, conversionApi ) { // 2. Handle `listItem` model element attributes. conversionStore.indent = conversionStore.indent || 0; - writer.setAttribute( 'listIndent', conversionStore.indent, listItem ); + + const modifier = getIndentModifier( data.viewItem, conversionStore ); + + writer.setAttribute( 'listIndent', conversionStore.indent + modifier, listItem ); // Set 'bulleted' as default. If this item is pasted into a context, const type = data.viewItem.parent && data.viewItem.parent.name == 'ol' ? 'numbered' : 'bulleted'; @@ -385,6 +388,40 @@ export function viewModelConverter( evt, data, conversionApi ) { } } +function getIndentModifier( listItem, conversionStore ) { + // Ensure proper conversion store value. + conversionStore.indentModifiers = conversionStore.indentModifiers || new WeakMap(); + + const viewItem = listItem.parent; + + // View + if ( !viewItem || !viewItem.parent ) { + return 0; + } + + const parent = viewItem.parent; + const parentName = parent && parent.name; + + let modifier = 0; + + if ( parentName == 'ul' ) { + const previousSibling = viewItem.previousSibling; + + if ( previousSibling ) { + if ( previousSibling.is( 'li' ) ) { + modifier = 1; + } else { + modifier = conversionStore.indentModifiers.get( previousSibling ); + } + } + } + + // Update the stored modifiers info. + conversionStore.indentModifiers.set( viewItem, modifier ); + + return modifier; +} + /** * A view-to-model converter for `