index.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import {
  4. MimeData
  5. } from 'phosphor/lib/core/mimedata';
  6. import {
  7. Token
  8. } from 'phosphor/lib/core/token';
  9. /* tslint:disable */
  10. /**
  11. * The clipboard token.
  12. */
  13. export
  14. const IClipboard = new Token<IClipboard>('jupyter.services.clipboard');
  15. /* tslint:enable */
  16. /**
  17. * The clipboard interface.
  18. */
  19. export
  20. interface IClipboard extends MimeData {}
  21. /**
  22. * Copy text to the system clipboard.
  23. *
  24. * #### Notes
  25. * This can only be called in response to a user input event.
  26. */
  27. export
  28. function copyToClipboard(text: string): void {
  29. let node = document.body;
  30. let handler = (event: ClipboardEvent) => {
  31. let data = event.clipboardData || (window as any).clipboardData;
  32. data.setData('text', text);
  33. event.preventDefault();
  34. node.removeEventListener('copy', handler);
  35. };
  36. node.addEventListener('copy', handler);
  37. generateClipboardEvent(node);
  38. }
  39. /**
  40. * Generate a clipboard event on a node.
  41. *
  42. * @param node - The element on which to generate the event.
  43. *
  44. * @param type - The type of event to generate: `'copy'` or `'cut'`.
  45. * `'paste'` events cannot be programmatically generated.
  46. *
  47. * #### Notes
  48. * This can only be called in response to a user input event.
  49. */
  50. export
  51. function generateClipboardEvent(node: HTMLElement, type='copy'): void {
  52. // http://stackoverflow.com/a/5210367
  53. // Identify selected text.
  54. let sel = window.getSelection();
  55. // Save the current selection.
  56. let savedRanges: any[] = [];
  57. for (let i = 0, len = sel.rangeCount; i < len; ++i) {
  58. savedRanges[i] = sel.getRangeAt(i).cloneRange();
  59. }
  60. // Select the node content.
  61. let range = document.createRange();
  62. range.selectNodeContents(node);
  63. sel.removeAllRanges();
  64. sel.addRange(range);
  65. // Execute the command.
  66. document.execCommand(type);
  67. // Restore the previous selection.
  68. sel = window.getSelection();
  69. sel.removeAllRanges();
  70. for (let i = 0, len = savedRanges.length; i < len; ++i) {
  71. sel.addRange(savedRanges[i]);
  72. }
  73. }