packages feed

servant-pandoc-0.5.0.0: README.md

[![Hackage](https://img.shields.io/hackage/v/servant-pandoc.svg)](https://hackage.haskell.org/package/servant-pandoc) [![Build Status](https://travis-ci.org/mpickering/servant-pandoc.svg)](https://travis-ci.org/mpickering/servant-pandoc)

An extension to [servant-docs] that allows you to use [Pandoc] to
render your Servant API documentation.

[servant-docs]: http://hackage.haskell.org/package/servant-docs
[Pandoc]: http://pandoc.org/

How to use this package
=======================

Generate documentation directly
-------------------------------

A very simple program to render the API documentation as a mediawiki
document might look as follows.

```haskell
import Text.Pandoc
import Servant.Docs.Pandoc
import Servant.Docs
import Data.Default (def)

myApi :: Proxy MyAPI myApi = Proxy

writeDocs :: API -> IO ()
writeDocs api = writeFile "api.mw" (writeMediaWiki def (pandoc api))
```

Create a Pandoc filter
----------------------

The `makeFilter` function allows you to make a filter which can be
used directly with pandoc from the command line. This filter will just
append the API documentation to the end of the document. Example
usage:

```haskell
-- api.hs
main :: IO ()
main = makeFilter (docs myApi)
```

Then to run this:

```sh
pandoc -o api.pdf --filter=api.hs manual.md
```

### Custom filters

A more sophisticated filter might be to actually convert introduction
and note bodies to Markdown before processing (note: this is not
enabled by default as the `pandoc` library is GPL-licensed, whereas
this library uses `pandoc-types` which is BSD3-licensed):

```haskell
import Data.Monoid         (mconcat, (<>))
import Servant.Docs.Pandoc (pandoc)
import Text.Pandoc         (readMarkdown)
import Text.Pandoc.JSON    (Block(Para, Plain), Inline(Str), Pandoc(Pandoc),
                            toJSONFilter)
import Text.Pandoc.Options (def)
import Text.Pandoc.Walk    (walkM)

main :: IO ()
main = toJSONFilter append
  where
    append :: Pandoc -> Pandoc
    append = (<> mconcat (walkM parseMarkdown (pandoc myApi)))

parseMarkdown :: Block -> [Block]
parseMarkdown bl = case bl of
                     Para  [Str str] -> toMarkdown str
                     Plain [Str str] -> toMarkdown str
                     _               -> [bl]
  where
    toMarkdown = either (const [bl]) unPandoc . readMarkdown def

    unPandoc (Pandoc _ bls) = bls
```