aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pandoc-citeproc-preamble.hs
blob: 9ce221bd134c01b8469ee6f8b8111ac5fc405726 (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