blob: 6d26a81c517781b6ddb31be1b078796b90725a33 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import Data.List (isPrefixOf)
import System.Directory (doesFileExist)
import System.FilePath ((<.>), (</>))
import System.Process (readProcess)
import Text.Pandoc.JSON
insertPreamble :: Block -> [Block] -> [Block]
insertPreamble preamble = foldr step []
where
step refs@(Div (_, ["references"], _) _) xs = preamble : refs : xs
step x xs = x:xs
doPreamble :: Maybe Format -> Pandoc -> IO Pandoc
doPreamble maybeFormat input@(Pandoc meta blocks) =
findPreambleFile format meta
>>= maybe (return input)
(\file -> do
ls <- readFile file
return $ Pandoc meta (insertPreamble (lsBlock ls) blocks))
where
lsBlock ls = RawBlock format ls
format = maybe (Format "latex") id maybeFormat
findPreambleFile :: Format -> Meta -> IO (Maybe FilePath)
findPreambleFile (Format format) meta =
case lookupMeta "citeproc-preamble" meta >>= toPath of
metadataPreamble@(Just _) -> return metadataPreamble
Nothing -> tryDatadir
where
tryDatadir = do
defaultPreamble <- (</> "citeproc-preamble" </> "default" <.> format)
<$> getPandocDatadir
doesFileExist defaultPreamble >>= \exists ->
return $ if exists then Just defaultPreamble else Nothing
getPandocDatadir :: IO FilePath
getPandocDatadir =
drop (length prefix) . head . filter (prefix `isPrefixOf`) . lines
<$> readProcess "pandoc" ["--version"] ""
where
prefix = "Default user data directory: "
toPath :: MetaValue -> Maybe String
toPath (MetaString s) = Just s
toPath _ = Nothing
main :: IO ()
main = toJSONFilter doPreamble
|