shakespeare 0.10.1.1 → 0.10.2
raw patch · 3 files changed
+43/−36 lines, 3 files
Files
- Text/Shakespeare.hs +8/−8
- Text/Shakespeare/Base.hs +34/−27
- shakespeare.cabal +1/−1
Text/Shakespeare.hs view
@@ -29,8 +29,8 @@ import Text.Shakespeare.Base -- move to Shakespeare?-readFileQ :: FilePath -> Q [Char]-readFileQ fp = do+readFileQ :: FilePath -> Q String+readFileQ fp = qRunIO $ readFileUtf8 fp -- move to Shakespeare?@@ -86,7 +86,7 @@ type Contents = [Content] contentFromString :: ShakespeareSettings -> (String -> [Content])-contentFromString rs s = do+contentFromString rs s = compressContents $ either (error . show) id $ parse (parseContents rs) s s where compressContents :: Contents -> Contents@@ -109,7 +109,7 @@ go (d, False) = ContentUrl d go (d, True) = ContentUrlParam d parseCaret' = either ContentRaw ContentMix `fmap` parseInt intChar- parseChar = ContentRaw `fmap` (many1 $ noneOf [varChar, urlChar, intChar])+ parseChar = ContentRaw `fmap` many1 (noneOf [varChar, urlChar, intChar]) contentsToShakespeare :: ShakespeareSettings -> [Content] -> Q Exp contentsToShakespeare rs a = do@@ -128,16 +128,16 @@ contentToBuilder :: Name -> Content -> Q Exp contentToBuilder _ (ContentRaw s') = do ts <- [|fromText . TS.pack|]- return $ (wrap rs) `AppE` (ts `AppE` LitE (StringL s'))+ return $ wrap rs `AppE` (ts `AppE` LitE (StringL s')) contentToBuilder _ (ContentVar d) = do- return $ (wrap rs) `AppE` ((toBuilder rs) `AppE` derefToExp [] d)+ return $ wrap rs `AppE` (toBuilder rs `AppE` derefToExp [] d) contentToBuilder r (ContentUrl d) = do ts <- [|fromText|]- return $ (wrap rs) `AppE` (ts `AppE` (VarE r `AppE` derefToExp [] d `AppE` ListE []))+ return $ wrap rs `AppE` (ts `AppE` (VarE r `AppE` derefToExp [] d `AppE` ListE [])) contentToBuilder r (ContentUrlParam d) = do ts <- [|fromText|] up <- [|\r' (u, p) -> r' u p|]- return $ (wrap rs) `AppE` (ts `AppE` (up `AppE` VarE r `AppE` derefToExp [] d))+ return $ wrap rs `AppE` (ts `AppE` (up `AppE` VarE r `AppE` derefToExp [] d)) contentToBuilder r (ContentMix d) = do return $ derefToExp [] d `AppE` VarE r
Text/Shakespeare/Base.hs view
@@ -22,7 +22,7 @@ import Language.Haskell.TH.Syntax import Language.Haskell.TH (appE)-import Data.Char (isUpper)+import Data.Char (isUpper, isSymbol) import Text.ParserCombinators.Parsec import Data.List (intercalate) import Data.Ratio (Ratio, numerator, denominator, (%))@@ -31,6 +31,7 @@ import qualified Data.Text.Lazy as TL import qualified System.IO as SIO import qualified Data.Text.Lazy.IO as TIO+import Control.Monad (when) newtype Ident = Ident String deriving (Show, Eq, Read, Data, Typeable)@@ -43,6 +44,7 @@ | DerefRational Rational | DerefString String | DerefBranch Deref Deref+ | DerefList [Deref] deriving (Show, Eq, Read, Data, Typeable) instance Lift Ident where@@ -68,16 +70,24 @@ d <- lift $ denominator r per <- [|(%) :: Int -> Int -> Ratio Int|] dr <- [|DerefRational|]- return $ dr `AppE` (InfixE (Just n) per (Just d))+ return $ dr `AppE` InfixE (Just n) per (Just d) lift (DerefString s) = [|DerefString|] `appE` lift s+ lift (DerefList x) = [|DerefList $(lift x)|] +derefParens, derefCurlyBrackets :: Parser Deref+derefParens = between (char '(') (char ')') parseDeref+derefCurlyBrackets = between (char '{') (char '}') parseDeref++derefList :: Parser Deref+derefList = between (char '[') (char ']') (fmap DerefList $ sepBy parseDeref (char ','))+ parseDeref :: Parser Deref-parseDeref = do- skipMany $ oneOf " \t"+parseDeref = skipMany (oneOf " \t") >> (derefList <|> (do x <- derefSingle- res <- deref' $ (:) x- skipMany $ oneOf " \t"- return res+ (derefInfix x) <|> (do+ res <- deref' $ (:) x+ skipMany $ oneOf " \t"+ return res))) where delim = (many1 (char ' ') >> return()) <|> lookAhead (oneOf "(\"" >> return ())@@ -86,7 +96,15 @@ x <- many1 $ noneOf " \t\n\r()" _ <- char ')' return $ DerefIdent $ Ident x- derefParens = between (char '(') (char ')') parseDeref+ derefInfix x = try $ do+ _ <- many1 $ oneOf " \t"+ op <- many1 (satisfy $ \c -> isSymbol c || c `elem` "-") <?> "operator"+ -- special handling for $, which we don't deal with+ when (op == "$") $ fail "don't handle $"+ let op' = DerefIdent $ Ident op+ _ <- many1 (oneOf " \t")+ y <- derefSingle+ return $ DerefBranch (DerefBranch op' x) y derefSingle = derefOp <|> derefParens <|> numeric <|> strLit<|> ident deref' lhs = dollar <|> derefSingle'@@ -115,13 +133,9 @@ return $ DerefString chars quotedChar = (char '\\' >> escapedChar) <|> noneOf "\"" escapedChar =- (char 'n' >> return '\n') <|>- (char 'r' >> return '\r') <|>- (char 'b' >> return '\b') <|>- (char 't' >> return '\t') <|>- (char '\\' >> return '\\') <|>- (char '"' >> return '"') <|>- (char '\'' >> return '\'')+ let cecs = [('n', '\n'), ('r', '\r'), ('b', '\b'), ('t', '\t')+ ,('\\', '\\'), ('"', '"'), ('\'', '\'')]+ in choice [ char c >> return ec | (c, ec) <- cecs] ident = do mods <- many modul func <- many1 (alphaNum <|> char '_' <|> char '\'')@@ -157,6 +171,7 @@ derefToExp _ (DerefIntegral i) = LitE $ IntegerL i derefToExp _ (DerefRational r) = LitE $ RationalL r derefToExp _ (DerefString s) = LitE $ StringL s+derefToExp s (DerefList ds) = ListE $ map (derefToExp s) ds -- FIXME shouldn't we use something besides a list here? flattenDeref :: Deref -> Maybe [String]@@ -173,9 +188,7 @@ parseVar c = do _ <- char c (char '\\' >> return (Left [c])) <|> (do- _ <- char '{'- deref <- parseDeref- _ <- char '}'+ deref <- derefCurlyBrackets return $ Right deref) <|> (do -- Check for hash just before newline _ <- lookAhead (oneOf "\r\n" >> return ()) <|> eof@@ -191,9 +204,7 @@ (char '\\' >> return (Left [c])) <|> (do x <- (char d >> return True) <|> return False (do- _ <- char '{'- deref <- parseDeref- _ <- char '}'+ deref <- derefCurlyBrackets return $ Right (deref, x)) <|> return (Left $ if x then [c, d] else [c])) @@ -204,18 +215,14 @@ parseInt c = do _ <- char c (char '\\' >> return (Left [c])) <|> (do- _ <- char '{'- deref <- parseDeref- _ <- char '}'+ deref <- derefCurlyBrackets return $ Right deref) <|> return (Left [c]) parseUnder :: Parser (Either String Deref) parseUnder = do _ <- char '_' (char '\\' >> return (Left "_")) <|> (do- _ <- char '{'- deref <- parseDeref- _ <- char '}'+ deref <- derefCurlyBrackets return $ Right deref) <|> return (Left "_") readUtf8File :: FilePath -> IO TL.Text
shakespeare.cabal view
@@ -1,5 +1,5 @@ name: shakespeare-version: 0.10.1.1+version: 0.10.2 license: BSD3 license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>