web-output-0.4.0.0: WebOutput.hs
{-|
This module provides simple utility functions useful to present web
content to the user via their default browser, creating temporary
files. Use 'toTheBrowser' in order to simply show some markup (HTML)
to the user, and use 'manyToTheBrowser' with an array of 'Resource' in
order to show a page linking to multiple files, for example a page
linking to a local style file and a local Javascript file
-}
module WebOutput (
toTheBrowser,
Resource(..),
manyToTheBrowser,
) where
import System.IO.Temp (openTempFile, createTempDirectory)
import Web.Browser (openBrowser)
import System.IO (hPutStr, hFlush)
import System.Directory (getTemporaryDirectory)
import System.FilePath.Posix (combine, FilePath)
import qualified Data.Text as T
import qualified Data.Text.IO as T
-- | Writes its argument to a temporary file and opens the user's browser
-- to show that file. The returned boolean can be ignored
toTheBrowser content = do
dir <- getTemporaryDirectory
path <- writeContentToTempFile dir content "output.html"
openBrowser path
where
writeContentToTempFile dir content fileName = do
(path, handle) <- openTempFile dir "output.html"
hPutStr handle content
hFlush handle
return path
-- | Use the Resource type to create resources that are linking to
-- each other, and you want to show to the user all together. For
-- example one resource could contain some HTML linking to another
-- resource containing Javascript or other.
data Resource = Resource {
location :: FilePath, -- ^ 'location' should contain a relative URL where the resource will be placed. For example this could be @"script.js"@ for a Javascript file
content :: T.Text
}
writeResource (Resource loc con) = T.writeFile loc con
-- | Present multiple files via the user's browser, so that they can
-- reference each other. A temporary directory is created, the files
-- are written there, and the browser is opened on the first resource
-- passed as an argument to this function. The returned boolean can be
-- ignored
manyToTheBrowser resources = do
dir <- getTemporaryDirectory
containing <- createTempDirectory dir "output"
mapM writeResource (combined containing)
(openBrowser . location . head) (combined containing)
where
combined dir = map (applyLocation (combine dir)) resources
applyLocation f (Resource a b) = Resource (f a) b