-- |
-- Module    : Text.Pandoc.PlantUML.Filter
--
-- pandoc-plantuml-diagrams is a filter for Pandoc that automatically
-- renders UML diagrams with PlantUML.
module Text.Pandoc.PlantUML.Filter (processBlocks) where

import Text.Pandoc.JSON
import Control.Monad

import Text.Pandoc.PlantUML.Filter.Types
import Text.Pandoc.PlantUML.Filter.FileNameGenerator
import Text.Pandoc.PlantUML.Filter.Formats
import Text.Pandoc.PlantUML.Filter.OutputBlock

-- | Processes a block in the context of the give format.
-- The call syntax is compatible with the json filter provided
-- by Pandoc.
--
processBlocks :: ImageIO m => Maybe Format -> Block -> m Block
processBlocks (Just format) block@(CodeBlock attr@(_, classes, _) contents)
  | "uml" `elem` classes       = do
    ensureRendered imageFileName (DiagramSource contents)
    return $ resultBlock imageFileName attr
  | otherwise                  = return block
  where imageFileName = ImageFileName (fileNameForSource (DiagramSource contents)) (imageFormatTypeFor format)
processBlocks _ x              = return x

ensureRendered :: ImageIO m => ImageFileName -> DiagramSource -> m ()
ensureRendered imageFileName source = inCaseNotExists imageFileName $ renderImage imageFileName source

inCaseNotExists :: ImageIO m => ImageFileName -> m () -> m ()
inCaseNotExists fileName action = doesImageExist fileName >>= flip unless action