11import  'dart:math'  as  math;
22
3+ import  'package:flutter/foundation.dart'  show  kIsWeb;
34import  'package:flutter/services.dart'  show  ClipboardData, Clipboard;
45import  'package:flutter/widgets.dart' ;
5- import  'package:html/parser.dart'  as  html_parser;
66import  'package:meta/meta.dart'  show  experimental;
77
88import  '../../quill_delta.dart' ;
99import  '../common/structs/image_url.dart' ;
1010import  '../common/structs/offset_value.dart' ;
1111import  '../common/utils/embeds.dart' ;
1212import  '../delta/delta_diff.dart' ;
13- import  '../delta/delta_x.dart' ;
1413import  '../document/attribute.dart' ;
1514import  '../document/document.dart' ;
1615import  '../document/nodes/embeddable.dart' ;
1716import  '../document/nodes/leaf.dart' ;
1817import  '../document/structs/doc_change.dart' ;
1918import  '../document/style.dart' ;
2019import  '../editor/config/editor_configurations.dart' ;
21- import  '../editor_toolbar_controller_shared/clipboard/clipboard_service_provider.dart' ;
2220import  '../toolbar/config/simple_toolbar_configurations.dart' ;
2321import  'quill_controller_configurations.dart' ;
22+ import  'quill_controller_rich_paste.dart' ;
23+ 
24+ import  'web/quill_controller_web_stub.dart' 
25+     if  (dart.library.html) 'web/quill_controller_web_real.dart' ;
2426
2527typedef  ReplaceTextCallback  =  bool  Function (int  index, int  len, Object ?  data);
2628typedef  DeleteCallback  =  void  Function (int  cursorPosition, bool  forward);
@@ -38,7 +40,11 @@ class QuillController extends ChangeNotifier {
3840    this .readOnly =  false ,
3941    this .editorFocusNode,
4042  })  :  _document =  document,
41-         _selection =  selection;
43+         _selection =  selection {
44+     if  (kIsWeb) {
45+       initializeWebPasteEvent ();
46+     }
47+   }
4248
4349  factory  QuillController .basic (
4450          {QuillControllerConfigurations  configurations = 
@@ -132,8 +138,8 @@ class QuillController extends ChangeNotifier {
132138
133139  bool  ignoreFocusOnTextChange =  false ;
134140
135-   /// Skip requestKeyboard being called in  
136-   /// RawEditorState# _didChangeTextEditingValue 
141+   /// Skip requestKeyboard being called 
142+   /// in  [QuillRawEditorState. _didChangeTextEditingValue]  
137143bool  skipRequestKeyboard =  false ;
138144
139145  /// True when this [QuillController]  instance has been disposed. 
@@ -472,6 +478,9 @@ class QuillController extends ChangeNotifier {
472478    }
473479
474480    _isDisposed =  true ;
481+     if  (kIsWeb) {
482+       closeWebPasteEvent ();
483+     }
475484    super .dispose ();
476485  }
477486
@@ -565,13 +574,13 @@ class QuillController extends ChangeNotifier {
565574      return  true ;
566575    }
567576
568-     final  pasteUsingHtmlSuccess =  await  _pasteHTML ();
577+     final  pasteUsingHtmlSuccess =  await  pasteHTML ();
569578    if  (pasteUsingHtmlSuccess) {
570579      updateEditor? .call ();
571580      return  true ;
572581    }
573582
574-     final  pasteUsingMarkdownSuccess =  await  _pasteMarkdown ();
583+     final  pasteUsingMarkdownSuccess =  await  pasteMarkdown ();
575584    if  (pasteUsingMarkdownSuccess) {
576585      updateEditor? .call ();
577586      return  true ;
@@ -616,15 +625,6 @@ class QuillController extends ChangeNotifier {
616625    return  false ;
617626  }
618627
619-   void  _pasteUsingDelta (Delta  deltaFromClipboard) {
620-     replaceText (
621-       selection.start,
622-       selection.end -  selection.start,
623-       deltaFromClipboard,
624-       TextSelection .collapsed (offset:  selection.end),
625-     );
626-   }
627- 
628628  /// Return true if can paste internal image 
629629Future <bool > _pasteInternalImage () async  {
630630    final  copiedImageUrl =  _copiedImageUrl;
@@ -653,59 +653,6 @@ class QuillController extends ChangeNotifier {
653653    return  false ;
654654  }
655655
656-   /// Return true if can paste using HTML 
657- Future <bool > _pasteHTML () async  {
658-     final  clipboardService =  ClipboardServiceProvider .instance;
659- 
660-     Future <String ?> getHTML () async  {
661-       if  (await  clipboardService.canProvideHtmlTextFromFile ()) {
662-         return  await  clipboardService.getHtmlTextFromFile ();
663-       }
664-       if  (await  clipboardService.canProvideHtmlText ()) {
665-         return  await  clipboardService.getHtmlText ();
666-       }
667-       return  null ;
668-     }
669- 
670-     final  htmlText =  await  getHTML ();
671-     if  (htmlText !=  null ) {
672-       final  htmlBody =  html_parser.parse (htmlText).body? .outerHtml;
673-       // ignore: deprecated_member_use_from_same_package 
674-       final  deltaFromClipboard =  DeltaX .fromHtml (htmlBody ??  htmlText);
675- 
676-       _pasteUsingDelta (deltaFromClipboard);
677- 
678-       return  true ;
679-     }
680-     return  false ;
681-   }
682- 
683-   /// Return true if can paste using Markdown 
684- Future <bool > _pasteMarkdown () async  {
685-     final  clipboardService =  ClipboardServiceProvider .instance;
686- 
687-     Future <String ?> getMarkdown () async  {
688-       if  (await  clipboardService.canProvideMarkdownTextFromFile ()) {
689-         return  await  clipboardService.getMarkdownTextFromFile ();
690-       }
691-       if  (await  clipboardService.canProvideMarkdownText ()) {
692-         return  await  clipboardService.getMarkdownText ();
693-       }
694-       return  null ;
695-     }
696- 
697-     final  markdownText =  await  getMarkdown ();
698-     if  (markdownText !=  null ) {
699-       // ignore: deprecated_member_use_from_same_package 
700-       final  deltaFromClipboard =  DeltaX .fromMarkdown (markdownText);
701- 
702-       _pasteUsingDelta (deltaFromClipboard);
703- 
704-       return  true ;
705-     }
706-     return  false ;
707-   }
708- 
709656  void  replaceTextWithEmbeds (
710657    int  index,
711658    int  len,
0 commit comments