fleather icon indicating copy to clipboard operation
fleather copied to clipboard

When copying a list, the last item does not retain the list formatting

Open simonbengtsson opened this issue 1 year ago • 4 comments

Steps to Reproduce

  1. Write a couple of bullet points in editor
  2. Copy all bullet points
  3. Log the delta obtained in a clipboard manager and observe that all bullet points except for the last one has a new line with the "ul" attribute defined which means this will not be treated as a bullet item when pasted somewhere later.

Environment

  • OS: macos
  • Flutter version: 3.22.1
  • Fleather version: master

Logs

Document delta:

  • insert⟨ hello ⟩
  • insert⟨ ⏎ ⟩ + {block: ul}
  • insert⟨ world ⟩
  • insert⟨ ⏎ ⟩ + {block: ul}

FleatherClipboardData delta:

  • insert⟨ hello ⟩
  • insert⟨ ⏎ ⟩ + {block: ul}
  • insert⟨ world ⟩

simonbengtsson avatar May 29 '24 19:05 simonbengtsson

In addition to the above issue there is also a minor issue that pasting adds an extra new line when the last item is a list item. Except for these issues the following class works for copy pasting all types of text formatting (lists, bold etc) both inside fleather editor and from/to other editors such as Notion.

class SimpleMarkdownClipboardManager extends ClipboardManager {
  const SimpleMarkdownClipboardManager();

  @override
  Future<void> setData(FleatherClipboardData data) async {
    final plainText = data.plainText;
    final clipboardDelta = data.delta;
    if (clipboardDelta != null && clipboardDelta.length > 0) {
      // Add new line since required by ParchmentDocument.fromDelta
      final delta = clipboardDelta.concat(Delta()..insert('\n'));
      final doc = ParchmentDocument.fromDelta(delta);
      final markdown = parchmentMarkdown.encode(doc);
      await Clipboard.setData(ClipboardData(text: markdown));
    } else if (plainText != null) {
      await Clipboard.setData(ClipboardData(text: plainText));
    }
  }

  @override
  Future<FleatherClipboardData?> getData() async {
    final data = await Clipboard.getData(Clipboard.kTextPlain);
    final markdown = data?.text ?? '';
    
    // Many editors such as Notion use "- " as plaint text format for unordered lists
    markdown = markdown.replaceAll('\n- ', '\n* ');
    
    final doc = parchmentMarkdown.decode(markdown);
    return FleatherClipboardData(delta: doc.toDelta());
  }
}

simonbengtsson avatar May 29 '24 20:05 simonbengtsson

After diving into the "extra new line when pasting bullet list" issue mentioned above I realized it is actually reproducible in the quilljs playground as well. And they have an issue describing it here: https://github.com/slab/quill/issues/1483.

simonbengtsson avatar May 30 '24 06:05 simonbengtsson

Hi @simonbengtsson, I'm encountering the same issue. Could you please share any steps you took to resolve it, or what you've found out so far?

lvxduck avatar Jul 16 '25 02:07 lvxduck

I have not resolved it unfortunately. The latest is in the last comment above.

simonbengtsson avatar Jul 16 '25 13:07 simonbengtsson