- Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCodeExtract.hs
More file actions
Latest commit
55 lines (49 loc) · 1.58 KB
/
Copy pathCodeExtract.hs
File metadata and controls
55 lines (49 loc) · 1.58 KB
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
{-# LANGUAGE PatternGuards #-}
moduleMainwhere
importText.Pandoc.Definition
importText.Pandoc.Generic
importText.Pandoc.Readers.Markdown
importText.Pandoc.Templates
importSystem.Environment
importSystem.FilePath
importqualifiedData.SetasS
importqualifiedData.MapasM
importData.IORef
importSystem.IO
importData.Default
main =do args <- getArgs
case args of
[file] ->do f <-readFile file
let p = readMarkdown def f
process p
_ ->error usage
usage ="usage: extract <file>"
process::Pandoc->IO()
process p =do
s <- newIORef S.empty
m <- newIORef M.empty
bottomUpM (extractCode s m) p
t <- readIORef m
M.foldrWithKey writeTemplate (return()) t
writeTemplate templateF vars k
=do template <-readFile templateF
writeFile dest (renderTemplate vars template)
k
where
(dest,_) = splitExtension templateF
extractCode::IORef (S.SetString) ->IORef (M.MapString [(String,String)]) ->
Block->IOBlock
extractCode r m b@(CodeBlock (id,cls,attrs) code)
|Just fileName <-lookup"file" attrs =
do s <- readIORef r
ifS.member fileName s
thenappendFile fileName (code ++"\n")
elsedowriteFile fileName (code ++"\n")
writeIORef r (S.insert fileName s)
return b
|Just template <-lookup"template" attrs,
Just var <-lookup"var" attrs =
do t <- readIORef m
writeIORef m (M.insertWith (++) template [(var,code ++"\n")] t)
return b
extractCode r m b =return b