1""" 2Clipboard for command line interface. 3""" 4from __future__ import unicode_literals 5 6from abc import ABCMeta, abstractmethod 7 8import six 9from six import with_metaclass 10 11from prompt_toolkit.selection import SelectionType 12 13__all__ = [ 14 'Clipboard', 15 'ClipboardData', 16 'DummyClipboard', 17 'DynamicClipboard', 18] 19 20 21class ClipboardData(object): 22 """ 23 Text on the clipboard. 24 25 :param text: string 26 :param type: :class:`~prompt_toolkit.selection.SelectionType` 27 """ 28 def __init__(self, text='', type=SelectionType.CHARACTERS): 29 assert isinstance(text, six.string_types) 30 assert type in (SelectionType.CHARACTERS, SelectionType.LINES, SelectionType.BLOCK) 31 32 self.text = text 33 self.type = type 34 35 36class Clipboard(with_metaclass(ABCMeta, object)): 37 """ 38 Abstract baseclass for clipboards. 39 (An implementation can be in memory, it can share the X11 or Windows 40 keyboard, or can be persistent.) 41 """ 42 @abstractmethod 43 def set_data(self, data): 44 """ 45 Set data to the clipboard. 46 47 :param data: :class:`~.ClipboardData` instance. 48 """ 49 50 def set_text(self, text): # Not abstract. 51 """ 52 Shortcut for setting plain text on clipboard. 53 """ 54 assert isinstance(text, six.string_types) 55 self.set_data(ClipboardData(text)) 56 57 def rotate(self): 58 """ 59 For Emacs mode, rotate the kill ring. 60 """ 61 62 @abstractmethod 63 def get_data(self): 64 """ 65 Return clipboard data. 66 """ 67 68 69class DummyClipboard(Clipboard): 70 """ 71 Clipboard implementation that doesn't remember anything. 72 """ 73 def set_data(self, data): 74 pass 75 76 def set_text(self, text): 77 pass 78 79 def rotate(self): 80 pass 81 82 def get_data(self): 83 return ClipboardData() 84 85 86class DynamicClipboard(Clipboard): 87 """ 88 Clipboard class that can dynamically returns any Clipboard. 89 90 :param get_clipboard: Callable that returns a :class:`.Clipboard` instance. 91 """ 92 def __init__(self, get_clipboard): 93 assert callable(get_clipboard) 94 self.get_clipboard = get_clipboard 95 96 def _clipboard(self): 97 clipboard = self.get_clipboard() or DummyClipboard() 98 assert isinstance(clipboard, Clipboard) 99 return clipboard 100 101 def set_data(self, data): 102 self._clipboard().set_data(data) 103 104 def set_text(self, text): 105 self._clipboard().set_text(text) 106 107 def rotate(self): 108 self._clipboard().rotate() 109 110 def get_data(self): 111 return self._clipboard().get_data() 112