1{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE ScopedTypeVariables #-}
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
24 Copyright : Copyright (C) 2006-2016 John MacFarlane
25 License : GNU GPL, version 2 or above
27 Maintainer : John MacFarlane <jgm@berkeley.edu>
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
43> markdownToRST :: String -> Either PandocError String
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')@.
58 module Text.Pandoc.Definition
60 , module Text.Pandoc.Generic
62 , module Text.Pandoc.Options
64 , module Text.Pandoc.Logging
72 , module Text.Pandoc.Error
73 -- * Lists of readers and writers
77 -- * Readers: converting /to/ Pandoc format
97 -- * Writers: converting /from/ Pandoc format
140 -- * Rendering templates and default templates
141 , module Text.Pandoc.Templates
145 , getDefaultExtensions
149import Control.Monad.Except (throwError)
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
208import Text.Parsec.Error
210parseFormatSpec :: String
211 -> Either ParseError (String, Extensions -> Extensions)
212parseFormatSpec = parse formatSpec ""
213 where formatSpec = do
215 extMods <- many extMod
216 return (name, \x -> foldl (flip ($)) x extMods)
217 formatName = many1 $ noneOf "-+"
219 polarity <- oneOf "-+"
220 name <- many $ noneOf "-+"
221 ext <- case safeRead ("Ext_" ++ name) of
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 ->
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)
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) ]
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)
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
324 Ext_auto_identifiers]
325getDefaultExtensions "html" = extensionsFromList
326 [Ext_auto_identifiers,
329getDefaultExtensions "html4" = getDefaultExtensions "html"
330getDefaultExtensions "html5" = getDefaultExtensions "html"
331getDefaultExtensions "epub" = extensionsFromList
336getDefaultExtensions "epub2" = getDefaultExtensions "epub"
337getDefaultExtensions "epub3" = getDefaultExtensions "epub"
338getDefaultExtensions "latex" = extensionsFromList
340 Ext_auto_identifiers]
341getDefaultExtensions "context" = extensionsFromList
343 Ext_auto_identifiers]
344getDefaultExtensions "textile" = extensionsFromList
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)
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)
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
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list