texmath 0.9.2 → 0.9.3
raw patch · 3 files changed
+45/−21 lines, 3 files
Files
- changelog +5/−0
- src/Text/TeXMath/Readers/TeX/Macros.hs +39/−20
- texmath.cabal +1/−1
changelog view
@@ -1,3 +1,8 @@+texmath (0.9.3)++ * Expose pMacroDefinition in Text.TeXMath.Readers.TeX.Macros,+ with generalized type.+ texmath (0.9.2) * Support `\newenvironment` and `\renewenvironment`.
src/Text/TeXMath/Readers/TeX/Macros.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE RankNTypes #-}+{-# LANGUAGE FlexibleContexts #-} {- Copyright (C) 2010 John MacFarlane <jgm@berkeley.edu> @@ -24,17 +25,19 @@ module Text.TeXMath.Readers.TeX.Macros ( Macro , parseMacroDefinitions+ , pMacroDefinition , applyMacros ) where import Data.Char (isDigit, isLetter) import Control.Monad-import Text.ParserCombinators.Parsec+import Text.Parsec import Control.Applicative ((<*)) data Macro = Macro { macroDefinition :: String- , macroParser :: forall st . GenParser Char st String }+ , macroParser :: forall st m s . Stream s m Char =>+ ParsecT s st m String } instance Show Macro where show m = "Macro " ++ show (macroDefinition m)@@ -51,7 +54,8 @@ -- | Parses one or more macro definitions separated by comments & space. -- Return list of macros parsed + remainder of string.-pMacroDefinitions :: GenParser Char st ([Macro], String)+pMacroDefinitions :: (Monad m, Stream s m Char)+ => ParsecT s st m ([Macro], s) pMacroDefinitions = do pSkipSpaceComments defs <- sepEndBy pMacroDefinition pSkipSpaceComments@@ -60,11 +64,13 @@ -- | Parses a @\\newcommand@ or @\\renewcommand@ macro definition and -- returns a 'Macro'.-pMacroDefinition :: GenParser Char st Macro+pMacroDefinition :: (Monad m, Stream s m Char)+ => ParsecT s st m Macro pMacroDefinition = newcommand <|> declareMathOperator <|> newenvironment -- | Skip whitespace and comments.-pSkipSpaceComments :: GenParser Char st ()+pSkipSpaceComments :: (Monad m, Stream s m Char)+ => ParsecT s st m () pSkipSpaceComments = spaces >> skipMany (comment >> spaces) -- | Applies a list of macros to a string recursively until a fixed@@ -73,7 +79,8 @@ applyMacros :: [Macro] -> String -> String applyMacros [] s = s applyMacros ms s =- maybe s id $ iterateToFixedPoint ((2 * length ms) + 1) (applyMacrosOnce ms) s+ maybe s id $ iterateToFixedPoint ((2 * length ms) + 1)+ (applyMacrosOnce ms) s ------------------------------------------------------------------------------ @@ -99,13 +106,15 @@ , ctrlseq , count 1 anyChar ] -ctrlseq :: GenParser Char st String+ctrlseq :: (Monad m, Stream s m Char)+ => ParsecT s st m String ctrlseq = do char '\\' res <- many1 letter <|> count 1 anyChar return $ '\\' : res -newcommand :: GenParser Char st Macro+newcommand :: (Monad m, Stream s m Char)+ => ParsecT s st m Macro newcommand = try $ do char '\\' -- we ignore differences between these so far:@@ -147,7 +156,8 @@ Nothing -> args return $ apply args' $ "{" ++ body ++ "}" -newenvironment :: GenParser Char st Macro+newenvironment :: (Monad m, Stream s m Char)+ => ParsecT s st m Macro newenvironment = try $ do char '\\' -- we ignore differences between these so far:@@ -197,7 +207,8 @@ $ opener ++ body ++ closer -- | Parser for \DeclareMathOperator(*) command.-declareMathOperator :: GenParser Char st Macro+declareMathOperator :: (Monad m, Stream s m Char)+ => ParsecT s st m Macro declareMathOperator = try $ do string "\\DeclareMathOperator" pSkipSpaceComments@@ -229,17 +240,20 @@ apply args (x:xs) = x : apply args xs apply _ "" = "" -skipComment :: GenParser Char st ()+skipComment :: (Monad m, Stream s m Char)+ => ParsecT s st m () skipComment = skipMany comment -comment :: GenParser Char st ()+comment :: (Monad m, Stream s m Char)+ => ParsecT s st m () comment = do char '%' skipMany (notFollowedBy newline >> anyChar) newline return () -numArgs :: GenParser Char st Int+numArgs :: (Monad m, Stream s m Char)+ => ParsecT s st m Int numArgs = option 0 $ try $ do pSkipSpaceComments char '['@@ -249,13 +263,16 @@ char ']' return $ read [n] -optArg :: GenParser Char st (Maybe String)+optArg :: (Monad m, Stream s m Char)+ => ParsecT s st m (Maybe String) optArg = option Nothing $ (liftM Just $ inBrackets) -escaped :: String -> GenParser Char st String+escaped :: (Monad m, Stream s m Char)+ => String -> ParsecT s st m String escaped xs = try $ char '\\' >> oneOf xs >>= \x -> return ['\\',x] -inBrackets :: GenParser Char st String+inBrackets :: (Monad m, Stream s m Char)+ => ParsecT s st m String inBrackets = try $ do char '[' pSkipSpaceComments@@ -263,15 +280,17 @@ (try $ pSkipSpaceComments >> char ']') return $ concat res -inbraces :: GenParser Char st String+inbraces :: (Monad m, Stream s m Char)+ => ParsecT s st m String inbraces = try $ do char '{'- res <- manyTill (pSkipSpaceComments >>+ res <- manyTill (skipComment >> (inbraces' <|> count 1 anyChar <|> escaped "{}"))- (try $ pSkipSpaceComments >> char '}')+ (try $ skipComment >> char '}') return $ concat res -inbraces' :: GenParser Char st String+inbraces' :: (Monad m, Stream s m Char)+ => ParsecT s st m String inbraces' = do res <- inbraces return $ '{' : (res ++ "}")
texmath.cabal view
@@ -1,5 +1,5 @@ Name: texmath-Version: 0.9.2+Version: 0.9.3 Cabal-Version: >= 1.10 Build-type: Simple Synopsis: Conversion between formats used to represent mathematics.