on master help sign in
Move bracketed paste functionality to Graphics.Vty.Input.Paste
commitf2a47446e4de4c7adf07ccd675c272f512a4a540 authorJonathan Daugherty <cygnus@foobox.com> dateSat 25 Jun 2016, 13:24 (10 years ago) parent405ca96
4 files changed+49−30
src/Graphics/Vty/Input/Classify.hs+2−29 src/Graphics/Vty/Input/Mouse.hs−1 src/Graphics/Vty/Input/Paste.hs+46 vty.cabal+1
src/Graphics/Vty/Input/Classify.hs+2−29
@@ -13,11 +13,12 @@ module Graphics.Vty.Input.Classify
1313
1414import Graphics.Vty.Input.Events
1515import Graphics.Vty.Input.Mouse
16+import Graphics.Vty.Input.Paste
1617import Graphics.Vty.Input.Classify.Types
1718
1819import Codec.Binary.UTF8.Generic (decode)
1920
20−import Data.List (inits, isPrefixOf, isInfixOf)
21+import Data.List (inits)
2122import qualified Data.Map as M( fromList, lookup )
2223import Data.Maybe ( mapMaybe )
2324import qualified Data.Set as S( fromList, member )
@@ -83,31 +84,3 @@ utf8Length c
8384 | c < 0xE0 = 2
8485 | c < 0xF0 = 3
8586 | otherwise = 4
86−
87−bracketedPasteStart :: String
88−bracketedPasteStart = "\ESC[200~"
89−
90−bracketedPasteEnd :: String
91−bracketedPasteEnd = "\ESC[201~"
92−
93−bracketedPasteStarted :: String -> Bool
94−bracketedPasteStarted = isPrefixOf bracketedPasteStart
95−
96−bracketedPasteFinished :: String -> Bool
97−bracketedPasteFinished = isInfixOf bracketedPasteEnd
98−
99−takeUntil :: (Eq a) => [a] -> [a] -> ([a],[a])
100−takeUntil [] _ = ([], [])
101−takeUntil cs sub
102− | length cs < length sub = (cs, [])
103− | take (length sub) cs == sub = ([], drop (length sub) cs)
104− | otherwise = let (pre, suf) = takeUntil (tail cs) sub
105− in (head cs:pre, suf)
106−
107−parseBracketedPaste :: String -> KClass
108−parseBracketedPaste s =
109− let (p, rest) = takeUntil (drop (length bracketedPasteStart) s) bracketedPasteEnd
110− rest' = if bracketedPasteEnd `isPrefixOf` rest
111− then drop (length bracketedPasteEnd) rest
112− else rest
113− in Valid (EvPaste p) rest'
src/Graphics/Vty/Input/Mouse.hs−1
@@ -13,7 +13,6 @@ import Graphics.Vty.Input.Events
1313import Graphics.Vty.Input.Classify.Types
1414import Graphics.Vty.Input.Classify.Parse
1515
16−import Control.Monad.Trans.Maybe
1716import Control.Monad.State
1817import Data.List (isPrefixOf)
1918import Data.Maybe (catMaybes)
src/Graphics/Vty/Input/Paste.hsnew file+46
@@ -0,0 +1,46 @@
1+-- | This module provides bracketed paste support as described at
2+--
3+-- http://cirw.in/blog/bracketed-paste
4+module Graphics.Vty.Input.Paste
5+ ( parseBracketedPaste
6+ , bracketedPasteStarted
7+ , bracketedPasteFinished
8+ ) where
9+
10+import Graphics.Vty.Input.Events
11+import Graphics.Vty.Input.Classify.Types
12+
13+import Data.List (isPrefixOf, isInfixOf)
14+
15+bracketedPasteStart :: String
16+bracketedPasteStart = "\ESC[200~"
17+
18+bracketedPasteEnd :: String
19+bracketedPasteEnd = "\ESC[201~"
20+
21+-- | Does the input start a bracketed paste?
22+bracketedPasteStarted :: String -> Bool
23+bracketedPasteStarted = isPrefixOf bracketedPasteStart
24+
25+-- | Does the input contain a complete bracketed paste?
26+bracketedPasteFinished :: String -> Bool
27+bracketedPasteFinished = isInfixOf bracketedPasteEnd
28+
29+-- | Parse a bracketed paste. This should only be called on a string if
30+-- both 'bracketedPasteStarted' and 'bracketedPasteFinished' return
31+-- 'True'.
32+parseBracketedPaste :: String -> KClass
33+parseBracketedPaste s =
34+ let (p, rest) = takeUntil (drop (length bracketedPasteStart) s) bracketedPasteEnd
35+ rest' = if bracketedPasteEnd `isPrefixOf` rest
36+ then drop (length bracketedPasteEnd) rest
37+ else rest
38+ in Valid (EvPaste p) rest'
39+
40+takeUntil :: (Eq a) => [a] -> [a] -> ([a],[a])
41+takeUntil [] _ = ([], [])
42+takeUntil cs sub
43+ | length cs < length sub = (cs, [])
44+ | take (length sub) cs == sub = ([], drop (length sub) cs)
45+ | otherwise = let (pre, suf) = takeUntil (tail cs) sub
46+ in (head cs:pre, suf)
vty.cabal+1
@@ -98,6 +98,7 @@ library
9898 Graphics.Vty.Input.Classify.Parse
9999 Graphics.Vty.Input.Loop
100100 Graphics.Vty.Input.Mouse
101+ Graphics.Vty.Input.Paste
101102 Graphics.Vty.Input.Terminfo
102103 Graphics.Vty.PictureToSpans
103104 Graphics.Vty.Span