packages feed

erd-0.2.1.0: src/Erd/Render.hs

{-# LANGUAGE OverloadedStrings #-}

module Erd.Render
  (htmlAttr,
   htmlFont,
   recordAttr,
   withLabelFmt
  ) where

import qualified Erd.ER                            as ER

import qualified Data.GraphViz.Attributes.Complete as A
import qualified Data.GraphViz.Attributes.HTML     as H
import qualified Data.Text.Lazy                    as L
import           Text.Printf                       (printf)

-- | Converts a single attribute to an HTML table row.
htmlAttr :: ER.Attribute -> H.Row
htmlAttr a = H.Cells [cell]
  where cell    = H.LabelCell cellAttrs (H.Text $ withLabelFmt " [%s]" opts name)
        name    = fkfmt $ pkfmt $ htmlFont opts (ER.field a)
        pkfmt s = if ER.pk a then [H.Format H.Underline s] else s
        fkfmt s = if ER.fk a then [H.Format H.Italics s] else s
        opts    = ER.aoptions a
        cellAttrs = ER.optionsTo ER.optToHtml opts
-- | Converts a single attribute to a RecordField ( an element of a dot table )
recordAttr :: ER.Attribute -> A.RecordField
recordAttr a = A.FieldLabel $ ER.field a -- should change to add port support!
-- | Formats an arbitrary string with the options given (using only font
-- attributes).
htmlFont :: ER.Options -> L.Text -> H.Text
htmlFont opts s = [H.Font (ER.optionsTo ER.optToFont opts) [H.Str s]]

-- | Formats HTML text with a label. The format string given should be
-- in `Data.Text.printf` style. (Only font options are used from the options
-- given.)
withLabelFmt :: String -> ER.Options -> H.Text -> H.Text
withLabelFmt fmt opts s =
  case ER.optionsTo ER.optToLabel opts of
    (x:_) -> s ++ htmlFont opts (L.pack $ printf fmt $ L.unpack x)
    _     -> s