blob: 5572fe14f83e6d3835e4a46b66b5472321c2f19a (
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
{-
pandoc-citeproc-preamble --- Insert a preamble before pandoc-citeproc's bibliography
Copyright (C) 2015 Sean Whitton
This file is part of pandoc-citeproc-preamble.
pandoc-citeproc-preamble is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
pandoc-citeproc-preamble is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with pandoc-citeproc-preamble. If not, see
<http://www.gnu.org/licenses/>.
-}
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
|