vty-5.35: src/Graphics/Vty/Input/Paste.hs
-- | This module provides bracketed paste support as described at
--
-- http://cirw.in/blog/bracketed-paste
module Graphics.Vty.Input.Paste
( parseBracketedPaste
, bracketedPasteStarted
, bracketedPasteFinished
)
where
import qualified Data.ByteString.Char8 as BS8
import Data.ByteString.Char8 (ByteString)
import Graphics.Vty.Input.Events
import Graphics.Vty.Input.Classify.Types
bracketedPasteStart :: ByteString
bracketedPasteStart = BS8.pack "\ESC[200~"
bracketedPasteEnd :: ByteString
bracketedPasteEnd = BS8.pack "\ESC[201~"
-- | Does the input start a bracketed paste?
bracketedPasteStarted :: ByteString -> Bool
bracketedPasteStarted = BS8.isPrefixOf bracketedPasteStart
-- | Does the input contain a complete bracketed paste?
bracketedPasteFinished :: ByteString -> Bool
bracketedPasteFinished = BS8.isInfixOf bracketedPasteEnd
-- | Parse a bracketed paste. This should only be called on a string if
-- both 'bracketedPasteStarted' and 'bracketedPasteFinished' return
-- 'True'.
parseBracketedPaste :: ByteString -> KClass
parseBracketedPaste s =
Valid (EvPaste p) (BS8.drop endLen rest')
where
startLen = BS8.length bracketedPasteStart
endLen = BS8.length bracketedPasteEnd
(_, rest ) = BS8.breakSubstring bracketedPasteStart s
(p, rest') = BS8.breakSubstring bracketedPasteEnd . BS8.drop startLen $ rest