Unify Errors.
This commit is contained in:
parent
52859b9863
commit
3574b98f81
27 changed files with 83 additions and 64 deletions
|
@ -180,7 +180,7 @@ import Text.Pandoc.Templates
|
|||
import Text.Pandoc.Options
|
||||
import Text.Pandoc.Shared (safeRead, mapLeft, pandocVersion)
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad, runIOorExplode, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad, runIOorExplode)
|
||||
import Data.Aeson
|
||||
import qualified Data.ByteString.Lazy as BL
|
||||
import Data.List (intercalate)
|
||||
|
@ -387,7 +387,7 @@ class ToJSONFilter a => ToJsonFilter a
|
|||
toJsonFilter = toJSONFilter
|
||||
|
||||
readJSON :: ReaderOptions -> String -> Either PandocError Pandoc
|
||||
readJSON _ = mapLeft ParseFailure . eitherDecode' . UTF8.fromStringLazy
|
||||
readJSON _ = mapLeft PandocParseError . eitherDecode' . UTF8.fromStringLazy
|
||||
|
||||
writeJSON :: WriterOptions -> Pandoc -> String
|
||||
writeJSON _ = UTF8.toStringLazy . encode
|
||||
|
|
|
@ -39,7 +39,6 @@ module Text.Pandoc.Class ( PandocMonad(..)
|
|||
, addWarningWithPos
|
||||
, PandocIO(..)
|
||||
, PandocPure(..)
|
||||
, PandocExecutionError(..)
|
||||
, FileInfo(..)
|
||||
, runIO
|
||||
, runIOorExplode
|
||||
|
@ -83,12 +82,12 @@ import Control.Monad.State hiding (fail)
|
|||
import Control.Monad.Reader hiding (fail)
|
||||
import Control.Monad.Except hiding (fail)
|
||||
import Data.Word (Word8)
|
||||
import Data.Typeable
|
||||
import Data.Default
|
||||
import System.IO.Error
|
||||
import qualified Data.Map as M
|
||||
import Text.Pandoc.Error
|
||||
|
||||
class (Functor m, Applicative m, Monad m, MonadError PandocExecutionError m) => PandocMonad m where
|
||||
class (Functor m, Applicative m, Monad m, MonadError PandocError m) => PandocMonad m where
|
||||
lookupEnv :: String -> m (Maybe String)
|
||||
getCurrentTime :: m UTCTime
|
||||
getCurrentTimeZone :: m TimeZone
|
||||
|
@ -143,12 +142,6 @@ addWarningWithPos mbpos msg =
|
|||
warn $
|
||||
msg ++ maybe "" (\pos -> " " ++ show pos) mbpos
|
||||
|
||||
-- We can add to this as we go
|
||||
data PandocExecutionError = PandocFileReadError FilePath
|
||||
| PandocShouldNeverHappenError String
|
||||
| PandocParseError String
|
||||
| PandocSomeError String
|
||||
deriving (Show, Typeable)
|
||||
|
||||
-- Nothing in this for now, but let's put it there anyway.
|
||||
data PandocStateIO = PandocStateIO { ioStWarnings :: [String]
|
||||
|
@ -168,35 +161,35 @@ instance Default PandocEnvIO where
|
|||
, ioEnvOutputFile = Nothing -- stdout
|
||||
}
|
||||
|
||||
runIO :: PandocIO a -> IO (Either PandocExecutionError a)
|
||||
runIO :: PandocIO a -> IO (Either PandocError a)
|
||||
runIO ma = flip evalStateT def $ flip runReaderT def $ runExceptT $ unPandocIO ma
|
||||
|
||||
withMediaBag :: PandocMonad m => m a -> m (a, MediaBag)
|
||||
withMediaBag ma = ((,)) <$> ma <*> getMediaBag
|
||||
|
||||
runIOorExplode :: PandocIO a -> IO a
|
||||
runIOorExplode ma = do
|
||||
eitherVal <- runIO ma
|
||||
case eitherVal of
|
||||
Right x -> return x
|
||||
Left (PandocFileReadError fp) -> error $ "problem reading " ++ fp
|
||||
Left (PandocShouldNeverHappenError s) -> error s
|
||||
Left (PandocParseError s) -> error $ "parse error" ++ s
|
||||
Left (PandocSomeError s) -> error s
|
||||
runIOorExplode ma = handleError <$> runIO ma
|
||||
-- eitherVal <- runIO ma
|
||||
-- case eitherVal of
|
||||
-- Right x -> return x
|
||||
-- Left (PandocFileReadError fp) -> error $ "problem reading " ++ fp
|
||||
-- Left (PandocShouldNeverHappenError s) -> error s
|
||||
-- Left (PandocParseError s) -> error $ "parse error" ++ s
|
||||
-- Left (PandocSomeError s) -> error s
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
newtype PandocIO a = PandocIO {
|
||||
unPandocIO :: ExceptT PandocExecutionError (ReaderT PandocEnvIO (StateT PandocStateIO IO)) a
|
||||
unPandocIO :: ExceptT PandocError (ReaderT PandocEnvIO (StateT PandocStateIO IO)) a
|
||||
} deriving ( MonadIO
|
||||
, Functor
|
||||
, Applicative
|
||||
, Monad
|
||||
, MonadReader PandocEnvIO
|
||||
, MonadState PandocStateIO
|
||||
, MonadError PandocExecutionError
|
||||
, MonadError PandocError
|
||||
)
|
||||
|
||||
instance PandocMonad PandocIO where
|
||||
|
@ -303,20 +296,18 @@ instance Default PureEnv where
|
|||
, envOutputFile = Nothing
|
||||
}
|
||||
|
||||
instance E.Exception PandocExecutionError
|
||||
|
||||
newtype PandocPure a = PandocPure {
|
||||
unPandocPure :: ExceptT PandocExecutionError
|
||||
unPandocPure :: ExceptT PandocError
|
||||
(ReaderT PureEnv (State PureState)) a
|
||||
} deriving ( Functor
|
||||
, Applicative
|
||||
, Monad
|
||||
, MonadReader PureEnv
|
||||
, MonadState PureState
|
||||
, MonadError PandocExecutionError
|
||||
, MonadError PandocError
|
||||
)
|
||||
|
||||
runPure :: PandocPure a -> Either PandocExecutionError a
|
||||
runPure :: PandocPure a -> Either PandocError a
|
||||
runPure x = flip evalState def $ flip runReaderT def $ runExceptT $ unPandocPure x
|
||||
|
||||
instance PandocMonad PandocPure where
|
||||
|
|
|
@ -33,17 +33,24 @@ module Text.Pandoc.Error (PandocError(..), handleError) where
|
|||
|
||||
import Text.Parsec.Error
|
||||
import Text.Parsec.Pos hiding (Line)
|
||||
import GHC.Generics (Generic)
|
||||
import Data.Generics (Typeable)
|
||||
import Control.Exception (Exception)
|
||||
|
||||
type Input = String
|
||||
|
||||
data PandocError = -- | Generic parse failure
|
||||
ParseFailure String
|
||||
-- | Error thrown by a Parsec parser
|
||||
| ParsecError Input ParseError
|
||||
deriving (Show, Typeable, Generic)
|
||||
data PandocError = PandocFileReadError FilePath
|
||||
| PandocShouldNeverHappenError String
|
||||
| PandocSomeError String
|
||||
| PandocParseError String
|
||||
| PandocParsecError Input ParseError
|
||||
deriving (Show, Typeable)
|
||||
|
||||
|
||||
-- data PandocError = -- | Generic parse failure
|
||||
-- ParseFailure String
|
||||
-- -- | Error thrown by a Parsec parser
|
||||
-- | ParsecError Input ParseError
|
||||
-- deriving (Show, Typeable, Generic)
|
||||
|
||||
instance Exception PandocError
|
||||
|
||||
|
@ -52,8 +59,11 @@ handleError :: Either PandocError a -> a
|
|||
handleError (Right r) = r
|
||||
handleError (Left err) =
|
||||
case err of
|
||||
ParseFailure string -> error string
|
||||
ParsecError input err' ->
|
||||
PandocFileReadError fp -> error $ "problem reading " ++ fp
|
||||
PandocShouldNeverHappenError s -> error s
|
||||
PandocSomeError s -> error s
|
||||
PandocParseError s -> error s
|
||||
PandocParsecError input err' ->
|
||||
let errPos = errorPos err'
|
||||
errLine = sourceLine errPos
|
||||
errColumn = sourceColumn errPos
|
||||
|
|
|
@ -885,7 +885,7 @@ readWithM :: (Monad m)
|
|||
-> String -- ^ input
|
||||
-> m (Either PandocError a)
|
||||
readWithM parser state input =
|
||||
mapLeft (ParsecError input) `liftM` runParserT parser state "source" input
|
||||
mapLeft (PandocParsecError input) `liftM` runParserT parser state "source" input
|
||||
|
||||
|
||||
-- | Parse a string with a given parser and state
|
||||
|
|
|
@ -96,8 +96,9 @@ import qualified Data.Sequence as Seq (null)
|
|||
#if !(MIN_VERSION_base(4,8,0))
|
||||
import Data.Traversable (traverse)
|
||||
#endif
|
||||
import Text.Pandoc.Error
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
readDocx :: PandocMonad m
|
||||
|
|
|
@ -32,7 +32,8 @@ import Data.Maybe (mapMaybe, fromMaybe)
|
|||
import qualified Data.Map as M (Map, lookup, fromList, elems)
|
||||
import Data.Monoid ((<>))
|
||||
import Control.DeepSeq (deepseq, NFData)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
import Debug.Trace (trace)
|
||||
|
|
|
@ -68,7 +68,8 @@ import Text.Pandoc.CSS (foldOrElse, pickStyleAttrProps)
|
|||
import Data.Monoid ((<>))
|
||||
import Text.Parsec.Error
|
||||
import qualified Data.Set as Set
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import Control.Monad.Except (throwError)
|
||||
|
||||
|
||||
|
|
|
@ -25,8 +25,9 @@ import Text.Pandoc.Options
|
|||
import Documentation.Haddock.Parser
|
||||
import Documentation.Haddock.Types
|
||||
import Debug.Trace (trace)
|
||||
import Text.Pandoc.Error
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
|
||||
-- | Parse Haddock markup and return a 'Pandoc' document.
|
||||
|
@ -40,7 +41,7 @@ readHaddock opts s = case readHaddockEither opts s of
|
|||
|
||||
readHaddockEither :: ReaderOptions -- ^ Reader options
|
||||
-> String -- ^ String to parse
|
||||
-> Either PandocExecutionError Pandoc
|
||||
-> Either PandocError Pandoc
|
||||
readHaddockEither opts =
|
||||
#if MIN_VERSION_haddock_library(1,2,0)
|
||||
Right . B.doc . docHToBlocks . trace' . _doc . parseParas
|
||||
|
|
|
@ -57,7 +57,7 @@ import Text.Pandoc.Highlighting (fromListingsLanguage)
|
|||
import Text.Pandoc.ImageSize (numUnit, showFl)
|
||||
import Text.Pandoc.Error
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..), PandocPure)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocPure)
|
||||
|
||||
-- | Parse LaTeX from string and return 'Pandoc' document.
|
||||
readLaTeX :: PandocMonad m
|
||||
|
@ -939,7 +939,7 @@ type IncludeParser = ParserT String [String] IO String
|
|||
|
||||
-- | Replace "include" commands with file contents.
|
||||
handleIncludes :: String -> IO (Either PandocError String)
|
||||
handleIncludes s = mapLeft (ParsecError s) <$> runParserT includeParser' [] "input" s
|
||||
handleIncludes s = mapLeft (PandocParsecError s) <$> runParserT includeParser' [] "input" s
|
||||
|
||||
includeParser' :: IncludeParser
|
||||
includeParser' =
|
||||
|
|
|
@ -68,7 +68,8 @@ import Debug.Trace (trace)
|
|||
import Data.Monoid ((<>))
|
||||
import Control.Monad.Trans (lift)
|
||||
import Control.Monad.Except (throwError, catchError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
type MarkdownParser m = ParserT [Char] ParserState m
|
||||
|
|
|
@ -58,7 +58,8 @@ import Data.Maybe (fromMaybe)
|
|||
import Text.Printf (printf)
|
||||
import Debug.Trace (trace)
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error(PandocError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
-- | Read mediawiki from an input string and return a Pandoc document.
|
||||
readMediaWiki :: PandocMonad m
|
||||
|
|
|
@ -65,5 +65,5 @@ readInlines :: String -> Either PandocError [Inline]
|
|||
readInlines s = maybe ((:[]) <$> readInline s) Right (safeRead s)
|
||||
|
||||
readInline :: String -> Either PandocError Inline
|
||||
readInline s = maybe (Left . ParseFailure $ "Could not read: " ++ s) Right (safeRead s)
|
||||
readInline s = maybe (Left . PandocParseError $ "Could not read: " ++ s) Right (safeRead s)
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ import Control.Monad.State
|
|||
import Data.Default
|
||||
import Control.Monad.Except
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
type OPML m = StateT OPMLState m
|
||||
|
||||
|
@ -65,7 +65,7 @@ attrValue attr elt =
|
|||
Just z -> z
|
||||
Nothing -> ""
|
||||
|
||||
-- exceptT :: PandocMonad m => Either PandocExecutionError a -> OPML m a
|
||||
-- exceptT :: PandocMonad m => Either PandocError a -> OPML m a
|
||||
-- exceptT = either throwError return
|
||||
|
||||
asHtml :: PandocMonad m => String -> OPML m Inlines
|
||||
|
|
|
@ -41,7 +41,7 @@ import System.FilePath
|
|||
|
||||
import Control.Monad.Except (throwError)
|
||||
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
import Text.Pandoc.Definition
|
||||
import Text.Pandoc.Error
|
||||
|
@ -78,7 +78,7 @@ readOdt' _ bytes = bytesToOdt bytes-- of
|
|||
bytesToOdt :: B.ByteString -> Either PandocError (Pandoc, MediaBag)
|
||||
bytesToOdt bytes = case toArchiveOrFail bytes of
|
||||
Right archive -> archiveToOdt archive
|
||||
Left _ -> Left $ ParseFailure "Couldn't parse odt file."
|
||||
Left _ -> Left $ PandocParseError "Couldn't parse odt file."
|
||||
|
||||
--
|
||||
archiveToOdt :: Archive -> Either PandocError (Pandoc, MediaBag)
|
||||
|
@ -99,7 +99,7 @@ archiveToOdt archive
|
|||
|
||||
| otherwise
|
||||
-- Not very detailed, but I don't think more information would be helpful
|
||||
= Left $ ParseFailure "Couldn't parse odt file."
|
||||
= Left $ PandocParseError "Couldn't parse odt file."
|
||||
where
|
||||
filePathIsOdtMedia :: FilePath -> Bool
|
||||
filePathIsOdtMedia fp =
|
||||
|
|
|
@ -31,8 +31,9 @@ import Text.Pandoc.Readers.Org.Blocks ( blockList, meta )
|
|||
import Text.Pandoc.Readers.Org.Parsing ( OrgParser, readWithM )
|
||||
import Text.Pandoc.Readers.Org.ParserState ( optionsToParserState )
|
||||
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import Text.Pandoc.Definition
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Options
|
||||
|
||||
import Control.Monad.Except ( throwError )
|
||||
|
|
|
@ -51,7 +51,8 @@ import Data.Char (toLower, isHexDigit, isSpace)
|
|||
import Data.Monoid ((<>))
|
||||
import Control.Monad.Except (throwError)
|
||||
import Control.Monad.Trans (lift)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
-- | Parse reStructuredText string and return Pandoc document.
|
||||
|
|
|
@ -48,7 +48,7 @@ import qualified Data.Foldable as F
|
|||
import Text.Pandoc.Error
|
||||
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
-- | Read twiki from an input string and return a Pandoc document.
|
||||
|
|
|
@ -68,7 +68,8 @@ import Control.Monad ( guard, liftM, when )
|
|||
import Data.Monoid ((<>))
|
||||
import Text.Printf
|
||||
import Debug.Trace (trace)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import Control.Monad.Except (throwError)
|
||||
|
||||
-- | Parse a Textile text and return a Pandoc document.
|
||||
|
|
|
@ -50,7 +50,8 @@ import Control.Monad.Reader (Reader, runReader, asks)
|
|||
import Data.Time.Format (formatTime)
|
||||
import Text.Pandoc.Compat.Time (defaultTimeLocale)
|
||||
import Control.Monad.Except (throwError, catchError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
type T2T = ParserT String ParserState (Reader T2TMeta)
|
||||
|
|
|
@ -65,7 +65,8 @@ import Text.Pandoc.MIME (MimeType, getMimeType, extensionFromMimeType)
|
|||
import Text.Blaze.Html.Renderer.Utf8 (renderHtml)
|
||||
import Text.HTML.TagSoup (Tag(TagOpen), fromAttrib, parseTags)
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
-- A Chapter includes a list of blocks and maybe a section
|
||||
|
|
|
@ -46,7 +46,8 @@ import Text.Pandoc.Definition
|
|||
import Text.Pandoc.Options (WriterOptions(..), HTMLMathMethod(..), def)
|
||||
import Text.Pandoc.Shared (orderedListMarkers, isHeaderBlock, capitalize,
|
||||
linesToPara)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
-- | Data to be written at the end of the document:
|
||||
|
|
|
@ -69,7 +69,8 @@ import qualified Text.XML.Light as XML
|
|||
import System.FilePath (takeExtension)
|
||||
import Data.Aeson (Value)
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
data WriterState = WriterState
|
||||
{ stNotes :: [Html] -- ^ List of notes
|
||||
|
|
|
@ -41,8 +41,9 @@ import Data.Maybe (fromMaybe)
|
|||
import Text.Pandoc.Pretty
|
||||
import Text.Pandoc.Builder (deleteMeta)
|
||||
import Control.Monad.State
|
||||
import Text.Pandoc.Error
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
type Notes = [[Block]]
|
||||
data WriterState = WriterState { stNotes :: Notes
|
||||
|
|
|
@ -58,7 +58,8 @@ import qualified Data.Vector as V
|
|||
import qualified Data.Text as T
|
||||
import qualified Data.Set as Set
|
||||
import Network.HTTP ( urlEncode )
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
type Notes = [[Block]]
|
||||
type Ref = ([Inline], Target, Attr)
|
||||
|
|
|
@ -40,8 +40,9 @@ import Text.Pandoc.Writers.Markdown (writeMarkdown)
|
|||
import Text.Pandoc.Pretty
|
||||
import Text.Pandoc.Compat.Time
|
||||
import qualified Text.Pandoc.Builder as B
|
||||
import Text.Pandoc.Error
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
|
||||
-- | Convert Pandoc document to string in OPML format.
|
||||
writeOPML :: PandocMonad m => WriterOptions -> Pandoc -> m String
|
||||
|
|
|
@ -44,7 +44,8 @@ import qualified Data.Map as M
|
|||
import Text.Printf ( printf )
|
||||
import Text.Pandoc.ImageSize
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class (PandocMonad)
|
||||
import qualified Text.Pandoc.Class as P
|
||||
|
||||
-- | Convert Image inlines into a raw RTF embedded image, read from a file,
|
||||
|
|
|
@ -45,7 +45,8 @@ import Network.URI ( isURI, unEscapeString )
|
|||
import System.FilePath
|
||||
import qualified Data.Set as Set
|
||||
import Control.Monad.Except (throwError)
|
||||
import Text.Pandoc.Class ( PandocMonad, PandocExecutionError(..) )
|
||||
import Text.Pandoc.Error
|
||||
import Text.Pandoc.Class ( PandocMonad)
|
||||
|
||||
data WriterState =
|
||||
WriterState { stStrikeout :: Bool -- document contains strikeout
|
||||
|
|
Loading…
Add table
Reference in a new issue