here 1.2.2 → 1.2.3
raw patch · 2 files changed
+18/−11 lines, 2 files
Files
- here.cabal +1/−1
- src/Data/String/Here/Interpolated.hs +17/−10
here.cabal view
@@ -1,5 +1,5 @@ name: here-version: 1.2.2+version: 1.2.3 synopsis: Here docs & interpolated strings via quasiquotation description: Here docs & interpolated strings via quasiquotation license: BSD3
src/Data/String/Here/Interpolated.hs view
@@ -7,6 +7,7 @@ import Control.Applicative hiding ((<|>)) import Control.Monad.State +import Data.Char import Data.Maybe import Data.Monoid import Data.String@@ -26,6 +27,7 @@ data HsChompState = HsChompState { quoteState :: QuoteState , braceCt :: Int , consumed :: String+ , prevCharWasIdentChar :: Bool } data QuoteState = None | Single Escaped | Double Escaped@@ -99,30 +101,32 @@ >>= either fail (return . return) . parseExp p_untilUnbalancedCloseBrace :: Parser String-p_untilUnbalancedCloseBrace = evalStateT go $ HsChompState None 0 ""+p_untilUnbalancedCloseBrace = evalStateT go $ HsChompState None 0 "" False where go = do c <- lift anyChar modify $ \st@HsChompState {consumed} -> st {consumed = c:consumed} HsChompState {..} <- get+ let next = setIdentifierCharState c >> go case quoteState of None -> case c of- '{' -> incBraceCt 1 >> go- '}' | braceCt > 0 -> incBraceCt (-1) >> go+ '{' -> incBraceCt 1 >> next+ '}' | braceCt > 0 -> incBraceCt (-1) >> next | otherwise -> stepBack >> return (reverse $ tail consumed)- '\'' -> setQuoteState (Single False) >> go- '"' -> setQuoteState (Double False) >> go- _ -> go+ '\'' -> when (not prevCharWasIdentChar) (setQuoteState $ Single False)+ >> next+ '"' -> setQuoteState (Double False) >> next+ _ -> next Single False -> do case c of '\\' -> setQuoteState (Single True) '\'' -> setQuoteState None _ -> return ()- go- Single True -> setQuoteState (Single False) >> go+ next+ Single True -> setQuoteState (Single False) >> next Double False -> do case c of '\\' -> setQuoteState (Double True) '"' -> setQuoteState None _ -> return ()- go- Double True -> setQuoteState (Double False) >> go+ next+ Double True -> setQuoteState (Double False) >> next stepBack = lift $ updateParserState (\s@State {..} -> s {statePos = incSourceColumn statePos (-1)})@@ -131,6 +135,9 @@ incBraceCt n = modify $ \st@HsChompState {braceCt} -> st {braceCt = braceCt + n} setQuoteState qs = modify $ \st -> st {quoteState = qs}+ setIdentifierCharState c = modify $ \st ->+ st+ {prevCharWasIdentChar = or [isLetter c, isDigit c, c == '_', c == '\'']} p_esc :: Parser StringPart p_esc = Esc <$> (char '\\' *> anyChar)