git.iko.soy/typeable/pandoc
on 34412cf help sign in
385 lines 16 kB history raw
1{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE GADTs #-}
3{-# LANGUAGE ScopedTypeVariables #-}
4{-
5Copyright (C) 2006-2016 John MacFarlane <jgm@berkeley.edu>
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20-}
22{- |
23 Module : Text.Pandoc
24 Copyright : Copyright (C) 2006-2016 John MacFarlane
25 License : GNU GPL, version 2 or above
27 Maintainer : John MacFarlane <jgm@berkeley.edu>
28 Stability : alpha
29 Portability : portable
31This helper module exports the main writers, readers, and data
32structure definitions from the Pandoc libraries.
34A typical application will chain together a reader and a writer
35to convert strings from one format to another. For example, the
36following simple program will act as a filter converting markdown
37fragments to reStructuredText, using reference-style links instead of
38inline links:
40> module Main where
41> import Text.Pandoc
43> markdownToRST :: String -> Either PandocError String
44> markdownToRST =
45> writeRST def {writerReferenceLinks = True} . readMarkdown def
47> main = getContents >>= either error return markdownToRST >>= putStrLn
49Note: all of the readers assume that the input text has @'\n'@
50line endings. So if you get your input text from a web form,
51you should remove @'\r'@ characters using @filter (/='\r')@.
53-}
55module Text.Pandoc
56 (
57 -- * Definitions
58 module Text.Pandoc.Definition
59 -- * Generics
60 , module Text.Pandoc.Generic
61 -- * Options
62 , module Text.Pandoc.Options
63 -- * Logging
64 , module Text.Pandoc.Logging
65 -- * Typeclass
66 , PandocMonad
67 , runIO
68 , runPure
69 , runIOorExplode
70 , setVerbosity
71 -- * Error handling
72 , module Text.Pandoc.Error
73 -- * Lists of readers and writers
74 , readers
75 -- , writers
76 , writers
77 -- * Readers: converting /to/ Pandoc format
78 , Reader (..)
79 , readDocx
80 , readOdt
81 , readMarkdown
82 , readCommonMark
83 , readMediaWiki
84 , readRST
85 , readOrg
86 , readLaTeX
87 , readHtml
88 , readTextile
89 , readDocBook
90 , readOPML
91 , readHaddock
92 , readNative
93 , readJSON
94 , readTWiki
95 , readTxt2Tags
96 , readEPUB
97 -- * Writers: converting /from/ Pandoc format
98 , Writer(..)
99 , writeNative
100 , writeJSON
101 , writeMarkdown
102 , writePlain
103 , writeRST
104 , writeLaTeX
105 , writeBeamer
106 , writeConTeXt
107 , writeTexinfo
108 , writeHtml4
109 , writeHtml4String
110 , writeHtml5
111 , writeHtml5String
112 , writeRevealJs
113 , writeS5
114 , writeSlidy
115 , writeSlideous
116 , writeDZSlides
117 , writeICML
118 , writeDocbook4
119 , writeDocbook5
120 , writeOPML
121 , writeOpenDocument
122 , writeMan
123 , writeMediaWiki
124 , writeDokuWiki
125 , writeZimWiki
126 , writeTextile
127 , writeRTF
128 , writeODT
129 , writeDocx
130 , writeEPUB2
131 , writeEPUB3
132 , writeFB2
133 , writeOrg
134 , writeAsciiDoc
135 , writeHaddock
136 , writeCommonMark
137 , writeCustom
138 , writeTEI
139 , writeMuse
140 -- * Rendering templates and default templates
141 , module Text.Pandoc.Templates
142 -- * Miscellaneous
143 , getReader
144 , getWriter
145 , getDefaultExtensions
146 , pandocVersion
147 ) where
149import Control.Monad.Except (throwError)
150import Data.Aeson
151import qualified Data.ByteString.Lazy as BL
152import Data.List (intercalate)
153import Text.Pandoc.Class
154import Text.Pandoc.Definition
155import Text.Pandoc.Error
156import Text.Pandoc.Generic
157import Text.Pandoc.Logging
158import Text.Pandoc.Options
159import Text.Pandoc.Readers.CommonMark
160import Text.Pandoc.Readers.DocBook
161import Text.Pandoc.Readers.Docx
162import Text.Pandoc.Readers.EPUB
163import Text.Pandoc.Readers.Haddock
164import Text.Pandoc.Readers.HTML
165import Text.Pandoc.Readers.LaTeX
166import Text.Pandoc.Readers.Markdown
167import Text.Pandoc.Readers.MediaWiki
168import Text.Pandoc.Readers.Native
169import Text.Pandoc.Readers.Odt
170import Text.Pandoc.Readers.OPML
171import Text.Pandoc.Readers.Org
172import Text.Pandoc.Readers.RST
173import Text.Pandoc.Readers.Textile
174import Text.Pandoc.Readers.TWiki
175import Text.Pandoc.Readers.Txt2Tags
176import Text.Pandoc.Shared (mapLeft, pandocVersion, safeRead)
177import Text.Pandoc.Templates
178import qualified Text.Pandoc.UTF8 as UTF8
179import Text.Pandoc.Writers.AsciiDoc
180import Text.Pandoc.Writers.CommonMark
181import Text.Pandoc.Writers.ConTeXt
182import Text.Pandoc.Writers.Custom
183import Text.Pandoc.Writers.Docbook
184import Text.Pandoc.Writers.Docx
185import Text.Pandoc.Writers.DokuWiki
186import Text.Pandoc.Writers.EPUB
187import Text.Pandoc.Writers.FB2
188import Text.Pandoc.Writers.Haddock
189import Text.Pandoc.Writers.HTML
190import Text.Pandoc.Writers.ICML
191import Text.Pandoc.Writers.LaTeX
192import Text.Pandoc.Writers.Man
193import Text.Pandoc.Writers.Markdown
194import Text.Pandoc.Writers.MediaWiki
195import Text.Pandoc.Writers.Muse
196import Text.Pandoc.Writers.Native
197import Text.Pandoc.Writers.ODT
198import Text.Pandoc.Writers.OpenDocument
199import Text.Pandoc.Writers.OPML
200import Text.Pandoc.Writers.Org
201import Text.Pandoc.Writers.RST
202import Text.Pandoc.Writers.RTF
203import Text.Pandoc.Writers.TEI
204import Text.Pandoc.Writers.Texinfo
205import Text.Pandoc.Writers.Textile
206import Text.Pandoc.Writers.ZimWiki
207import Text.Parsec
208import Text.Parsec.Error
210parseFormatSpec :: String
211 -> Either ParseError (String, Extensions -> Extensions)
212parseFormatSpec = parse formatSpec ""
213 where formatSpec = do
214 name <- formatName
215 extMods <- many extMod
216 return (name, \x -> foldl (flip ($)) x extMods)
217 formatName = many1 $ noneOf "-+"
218 extMod = do
219 polarity <- oneOf "-+"
220 name <- many $ noneOf "-+"
221 ext <- case safeRead ("Ext_" ++ name) of
222 Just n -> return n
223 Nothing
224 | name == "lhs" -> return Ext_literate_haskell
225 | otherwise -> fail $ "Unknown extension: " ++ name
226 return $ case polarity of
227 '-' -> disableExtension ext
228 _ -> enableExtension ext
230data Reader m = StringReader (ReaderOptions -> String -> m Pandoc)
231 | ByteStringReader (ReaderOptions -> BL.ByteString -> m Pandoc)
233-- | Association list of formats and readers.
234readers :: PandocMonad m => [(String, Reader m)]
235readers = [ ("native" , StringReader readNative)
236 ,("json" , StringReader $ \o s ->
237 case readJSON o s of
238 Right doc -> return doc
239 Left _ -> throwError $ PandocParseError "JSON parse error")
240 ,("markdown" , StringReader readMarkdown)
241 ,("markdown_strict" , StringReader readMarkdown)
242 ,("markdown_phpextra" , StringReader readMarkdown)
243 ,("markdown_github" , StringReader readMarkdown)
244 ,("markdown_mmd", StringReader readMarkdown)
245 ,("commonmark" , StringReader readCommonMark)
246 ,("rst" , StringReader readRST)
247 ,("mediawiki" , StringReader readMediaWiki)
248 ,("docbook" , StringReader readDocBook)
249 ,("opml" , StringReader readOPML)
250 ,("org" , StringReader readOrg)
251 ,("textile" , StringReader readTextile) -- TODO : textile+lhs
252 ,("html" , StringReader readHtml)
253 ,("latex" , StringReader readLaTeX)
254 ,("haddock" , StringReader readHaddock)
255 ,("twiki" , StringReader readTWiki)
256 ,("docx" , ByteStringReader readDocx)
257 ,("odt" , ByteStringReader readOdt)
258 ,("t2t" , StringReader readTxt2Tags)
259 ,("epub" , ByteStringReader readEPUB)
260 ]
262data Writer m = StringWriter (WriterOptions -> Pandoc -> m String)
263 | ByteStringWriter (WriterOptions -> Pandoc -> m BL.ByteString)
265-- | Association list of formats and writers.
266writers :: PandocMonad m => [ ( String, Writer m) ]
267writers = [
268 ("native" , StringWriter writeNative)
269 ,("json" , StringWriter $ \o d -> return $ writeJSON o d)
270 ,("docx" , ByteStringWriter writeDocx)
271 ,("odt" , ByteStringWriter writeODT)
272 ,("epub" , ByteStringWriter writeEPUB3)
273 ,("epub2" , ByteStringWriter writeEPUB2)
274 ,("epub3" , ByteStringWriter writeEPUB3)
275 ,("fb2" , StringWriter writeFB2)
276 ,("html" , StringWriter writeHtml5String)
277 ,("html4" , StringWriter writeHtml4String)
278 ,("html5" , StringWriter writeHtml5String)
279 ,("icml" , StringWriter writeICML)
280 ,("s5" , StringWriter writeS5)
281 ,("slidy" , StringWriter writeSlidy)
282 ,("slideous" , StringWriter writeSlideous)
283 ,("dzslides" , StringWriter writeDZSlides)
284 ,("revealjs" , StringWriter writeRevealJs)
285 ,("docbook" , StringWriter writeDocbook5)
286 ,("docbook4" , StringWriter writeDocbook4)
287 ,("docbook5" , StringWriter writeDocbook5)
288 ,("opml" , StringWriter writeOPML)
289 ,("opendocument" , StringWriter writeOpenDocument)
290 ,("latex" , StringWriter writeLaTeX)
291 ,("beamer" , StringWriter writeBeamer)
292 ,("context" , StringWriter writeConTeXt)
293 ,("texinfo" , StringWriter writeTexinfo)
294 ,("man" , StringWriter writeMan)
295 ,("markdown" , StringWriter writeMarkdown)
296 ,("markdown_strict" , StringWriter writeMarkdown)
297 ,("markdown_phpextra" , StringWriter writeMarkdown)
298 ,("markdown_github" , StringWriter writeMarkdown)
299 ,("markdown_mmd" , StringWriter writeMarkdown)
300 ,("plain" , StringWriter writePlain)
301 ,("rst" , StringWriter writeRST)
302 ,("mediawiki" , StringWriter writeMediaWiki)
303 ,("dokuwiki" , StringWriter writeDokuWiki)
304 ,("zimwiki" , StringWriter writeZimWiki)
305 ,("textile" , StringWriter writeTextile)
306 ,("rtf" , StringWriter writeRTF)
307 ,("org" , StringWriter writeOrg)
308 ,("asciidoc" , StringWriter writeAsciiDoc)
309 ,("haddock" , StringWriter writeHaddock)
310 ,("commonmark" , StringWriter writeCommonMark)
311 ,("tei" , StringWriter writeTEI)
312 ,("muse" , StringWriter writeMuse)
313 ]
315getDefaultExtensions :: String -> Extensions
316getDefaultExtensions "markdown_strict" = strictExtensions
317getDefaultExtensions "markdown_phpextra" = phpMarkdownExtraExtensions
318getDefaultExtensions "markdown_mmd" = multimarkdownExtensions
319getDefaultExtensions "markdown_github" = githubMarkdownExtensions
320getDefaultExtensions "markdown" = pandocExtensions
321getDefaultExtensions "plain" = plainExtensions
322getDefaultExtensions "org" = extensionsFromList
323 [Ext_citations,
324 Ext_auto_identifiers]
325getDefaultExtensions "html" = extensionsFromList
326 [Ext_auto_identifiers,
327 Ext_native_divs,
328 Ext_native_spans]
329getDefaultExtensions "html4" = getDefaultExtensions "html"
330getDefaultExtensions "html5" = getDefaultExtensions "html"
331getDefaultExtensions "epub" = extensionsFromList
332 [Ext_raw_html,
333 Ext_native_divs,
334 Ext_native_spans,
335 Ext_epub_html_exts]
336getDefaultExtensions "epub2" = getDefaultExtensions "epub"
337getDefaultExtensions "epub3" = getDefaultExtensions "epub"
338getDefaultExtensions "latex" = extensionsFromList
339 [Ext_smart,
340 Ext_auto_identifiers]
341getDefaultExtensions "context" = extensionsFromList
342 [Ext_smart,
343 Ext_auto_identifiers]
344getDefaultExtensions "textile" = extensionsFromList
345 [Ext_old_dashes,
346 Ext_smart,
347 Ext_raw_html,
348 Ext_auto_identifiers]
349getDefaultExtensions _ = extensionsFromList
350 [Ext_auto_identifiers]
352-- | Retrieve reader based on formatSpec (format+extensions).
353getReader :: PandocMonad m => String -> Either String (Reader m)
354getReader s =
355 case parseFormatSpec s of
356 Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]
357 Right (readerName, setExts) ->
358 case lookup readerName readers of
359 Nothing -> Left $ "Unknown reader: " ++ readerName
360 Just (StringReader r) -> Right $ StringReader $ \o ->
361 r o{ readerExtensions = setExts $
362 getDefaultExtensions readerName }
363 Just (ByteStringReader r) -> Right $ ByteStringReader $ \o ->
364 r o{ readerExtensions = setExts $
365 getDefaultExtensions readerName }
367getWriter :: PandocMonad m => String -> Either String (Writer m)
368getWriter s
369 = case parseFormatSpec s of
370 Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]
371 Right (writerName, setExts) ->
372 case lookup writerName writers of
373 Nothing -> Left $ "Unknown writer: " ++ writerName
374 Just (StringWriter r) -> Right $ StringWriter $
375 \o -> r o{ writerExtensions = setExts $
376 getDefaultExtensions writerName }
377 Just (ByteStringWriter r) -> Right $ ByteStringWriter $
378 \o -> r o{ writerExtensions = setExts $
379 getDefaultExtensions writerName }
381readJSON :: ReaderOptions -> String -> Either PandocError Pandoc
382readJSON _ = mapLeft PandocParseError . eitherDecode' . UTF8.fromStringLazy
384writeJSON :: WriterOptions -> Pandoc -> String
385writeJSON _ = UTF8.toStringLazy . encode