packages feed

orchid-0.0.6: src/Text/Document/Core/Processing.hs

module Text.Document.Core.Processing where

import Text.XML.Light (Content)

import Text.Document.Core.Type
import Text.Document.Plugin
import Text.Document.PluginRegister
import Text.Xml.Xml

-- Todo: it feels logical to put the result of side-effects back into the
-- printers. But we do not want to be too ambitious.

processDocument :: Format -> (Syn_Document -> a) -> FilePath -> Document -> IO a
processDocument fmt printer work doc = do

  -- Compute the desired semantics from the document.
  let sem   = wrappedSemDocument doc
      io f  = f work doc sem
      nop   = return ()
      procs = processors_Syn_Document sem

  -- Perform the side-effects that plug-ins may require.
  mapM_ (maybe nop io . flip processor fmt) procs

  -- Contruct the pure result from the document semantics.
  return (printer sem)

-- Wrong place?
processToXHTML :: FilePath -> Document -> IO Node
processToXHTML = processDocument XHTML xhtml_Syn_Document

processToLaTeX :: FilePath -> Document -> IO ShowS
processToLaTeX = processDocument LaTeX latex_Syn_Document

processToXML :: FilePath -> Document -> IO Content
processToXML = processDocument XML xml_Syn_Document