summaryrefslogtreecommitdiff
path: root/pandoc.hs
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2013-08-08 15:15:58 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2013-08-08 15:15:58 -0700
commit99bb066bb925134b506d39c8d6694fe81337d9c1 (patch)
tree51beae592444e1da080c774aac4e747744c4231f /pandoc.hs
parent83f263110f364e87d8c0908b4a52be801aa77802 (diff)
Pass writename as argument to filters.
This way filters can figure out what the target format is and react appropriately. Example: #!/usr/bin/env runghc import Text.Pandoc.JSON import Data.Char main = toJSONFilter cap where cap (Just "html") (Str xs) = Str $ map toUpper xs cap _ x = x This capitalizes text only for html output.
Diffstat (limited to 'pandoc.hs')
-rw-r--r--pandoc.hs17
1 files changed, 11 insertions, 6 deletions
diff --git a/pandoc.hs b/pandoc.hs
index 94d206103..fdf0b35b7 100644
--- a/pandoc.hs
+++ b/pandoc.hs
@@ -37,13 +37,13 @@ import Text.Pandoc.Shared ( tabFilter, readDataFileUTF8, safeRead,
headerShift, normalize, err, warn )
import Text.Pandoc.XML ( toEntities, fromEntities )
import Text.Pandoc.SelfContained ( makeSelfContained )
+import Text.Pandoc.Process (pipeProcess)
import Text.Highlighting.Kate ( languages, Style, tango, pygments,
espresso, zenburn, kate, haddock, monochrome )
import System.Environment ( getArgs, getProgName )
import System.Exit ( exitWith, ExitCode (..) )
import System.FilePath
import System.Console.GetOpt
-import System.Process (readProcess)
import Data.Char ( toLower )
import Data.List ( intercalate, isPrefixOf, sort )
import System.Directory ( getAppUserDataDirectory, doesFileExist, findExecutable )
@@ -59,6 +59,7 @@ import Network.HTTP (simpleHTTP, mkRequest, getResponseBody, RequestMethod(..))
import Network.URI (parseURI, isURI, URI(..))
import qualified Data.ByteString.Lazy as B
import Text.CSL.Reference (Reference(..))
+import Data.Aeson (eitherDecode', encode)
copyrightMessage :: String
copyrightMessage = "\nCopyright (C) 2006-2013 John MacFarlane\n" ++
@@ -88,9 +89,13 @@ wrapWords indent c = wrap' (c - indent) (c - indent)
isTextFormat :: String -> Bool
isTextFormat s = takeWhile (`notElem` "+-") s `notElem` ["odt","docx","epub","epub3"]
-externalFilter :: FilePath -> Pandoc -> IO Pandoc
-externalFilter f d = E.catch
- (readJSON def `fmap` readProcess f [] (writeJSON def d))
+externalFilter :: FilePath -> [String] -> Pandoc -> IO Pandoc
+externalFilter f args' d = E.catch
+ (do (exitcode, outbs, errbs) <- pipeProcess Nothing f args' $ encode d
+ case exitcode of
+ ExitSuccess -> return $ either error id $ eitherDecode' outbs
+ ExitFailure _ -> err 83 $ "Error running filter `" ++ UTF8.toStringLazy outbs ++
+ UTF8.toStringLazy errbs ++ "'")
(\e -> let _ = (e :: E.SomeException)
in err 83 $ "Error running filter `" ++ f ++ "'")
@@ -132,7 +137,7 @@ data Opt = Opt
, optReferenceLinks :: Bool -- ^ Use reference links in writing markdown, rst
, optWrapText :: Bool -- ^ Wrap text
, optColumns :: Int -- ^ Line length in characters
- , optPlugins :: [Pandoc -> IO Pandoc] -- ^ Plugins to apply
+ , optPlugins :: [[String] -> Pandoc -> IO Pandoc] -- ^ Plugins to apply
, optEmailObfuscation :: ObfuscationMethod
, optIdentifierPrefix :: String
, optIndentedCodeClasses :: [String] -- ^ Default classes for indented code blocks
@@ -1115,7 +1120,7 @@ main = do
reader readerOpts
let doc0 = foldr ($) doc transforms
- doc1 <- foldrM ($) doc0 plugins
+ doc1 <- foldrM ($) doc0 $ map ($ [writerName']) plugins
let writeBinary :: B.ByteString -> IO ()
writeBinary = B.writeFile (UTF8.encodePath outputFile)