module Text.LaTeX.Base.Render
(
Text
, module Data.String
, Render (..)
, renderAppend
, renderChars
, renderCommas
, renderFile
, rendertex
, readFileTex
) where
import Data.Text (Text,lines,unlines)
import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Class
import Data.String
import Data.Monoid (Monoid (..))
import qualified Data.Text.IO as T
import Data.Text.Encoding
import Data.List (intersperse)
import qualified Data.ByteString as B
class Show a => Render a where
render :: a -> Text
render = fromString . show
renderAppend :: Render a => [a] -> Text
renderAppend = mconcat . fmap render
renderChars :: Render a => Char -> [a] -> Text
renderChars c = mconcat . intersperse (fromString [c]) . fmap render
renderCommas :: Render a => [a] -> Text
renderCommas = renderChars ','
renderFile :: Render a => FilePath -> a -> IO ()
renderFile f = B.writeFile f . encodeUtf8 . render
readFileTex :: FilePath -> IO Text
readFileTex = fmap decodeUtf8 . B.readFile
rendertex :: (Render a,LaTeXC l) => a -> l
rendertex = fromLaTeX . TeXRaw . render
instance Render LaTeX where
render (TeXRaw t) = t
render (TeXComm name []) = "\\" <> fromString name <> "{}"
render (TeXComm name args) =
"\\"
<> fromString name
<> renderAppend args
render (TeXCommS name) = "\\" <> fromString name
render (TeXEnv name args c) =
"\\begin{"
<> fromString name
<> "}"
<> renderAppend args
<> render c
<> "\\end{"
<> fromString name
<> "}"
render (TeXMath l) = "$" <> render l <> "$"
render (TeXNewLine b) = " \\\\" <> ( if b then "*" else mempty ) <> " "
render (TeXOp sym l1 l2) = render l1 <> fromString sym <> render l2
render (TeXBraces l) = "{" <> render l <> "}"
render (TeXComment c) =
let xs = Data.Text.lines c
in (" " <>) $ Data.Text.unlines $ fmap ("% " <>) xs
render (TeXSeq l1 l2) = render l1 <> render l2
render TeXEmpty = mempty
instance Render TeXArg where
render (OptArg l) = "[" <> render l <> "]"
render (FixArg l) = "{" <> render l <> "}"
render (MOptArg []) = mempty
render (MOptArg ls) = "[" <> renderCommas ls <> "]"
render (SymArg l) = "<" <> render l <> ">"
render (MSymArg ls) = "<" <> renderCommas ls <> ">"
instance Render Int where
instance Render Integer where
instance Render Float where
instance Render Double where