[Haskell-cafe] Re: ANN: diagrams 0.2

John MacFarlane jgm at berkeley.edu
Sun Feb 1 01:37:06 EST 2009

+++ Braden Shepherdson [Jan 31 09 18:23 ]:
> Brent Yorgey wrote:
>> I am very pleased to announce the 0.2 release of the diagrams package,
>> an embedded domain-specific language for creating simple graphics in a
>> compositional style.  This release includes a number of significant
>> new features, including:
>>   * support for arbitrary straight and curved paths
>>   * more shape primitives, including polygons and rounded rectangles
>>   * support for rendering text
>>   * PNG, PDF, PS, and SVG output
>>   * built-in color support replaced with external dependence     on the 
>> feature-rich colour library
>> and many more!  More information, examples, and installation
>> instructions can be found at http://code.haskell.org/diagrams.  More
>> features are planned for future releases, so contributions and
>> suggestions are welcome.
>> (Please note: since diagrams depends on the Cairo library, which has
>> unfortunately not been Cabalized, you cannot install the diagrams
>> library with cabal-install, unless you already have the cairo package
>> installed. See the above website for instructions.)
>> A special thanks to Dougal Stanton for his contributions to the
>> library and help in preparing this release.
>> -Brent
> Would this make a handy plugin for gitit? I'm currently putting diagrams  
> together in xfig and saving them to my gitit tree while taking notes in  
> gitit, but being able to write diagrams code into gitit would be great.
> How easy or hard would this be to accomplish?

Not too hard, I think.  Here's code for something similar (for graphviz
diagrams), derived from plugins/DotPlugin.hs in SVN pandoc.

    transform :: Block -> IO Block
    transform (CodeBlock (id, classes, namevals) contents) | "dot" `elem` classes = do
      let (name, outfile) =  case lookup "name" namevals of
                                    Just fn   -> ([Str fn], fn ++ ".png")
                                    Nothing   -> ([], uniqueName contents ++ ".png")
      result <- readProcess "dot" ["-Tpng"] contents
      writeFile outfile result
      return $ Para [Image name (outfile, "")]
    transform x = return x
    -- | Generate a unique filename given the file's contents.
    uniqueName :: String -> String
    uniqueName = showDigest . sha1 . fromString

The 'transform' function will transform delimited code blocks such

    ~~~ {.dot name="diagram1"}
    digraph G {Hello->World}

into images generated by running the contents through graphviz's dot. To
lift this into a transformation of Pandoc documents, you can use syb:

    convertGraphviz :: Pandoc -> IO Pandoc
    convertGraphviz = everywhereM (mkM transform)

With minimal modifications, the same technique should work for


More information about the Haskell-Cafe mailing list