module Data.DICOM.Pretty (
ppObject
) where
import Text.Printf
import Text.PrettyPrint ((<>), (<+>))
import qualified Text.PrettyPrint as P
import Data.DICOM.Object
import Data.DICOM.Tag
import Data.DICOM.VL
import Data.DICOM.VR
import qualified Data.ByteString.Char8 as BC
ppElementContent :: P.Doc -> ElementContent -> P.Doc
ppElementContent d (BytesContent bs) = P.hsep [d, P.sizedText 40 $ BC.unpack bs]
ppElementContent d (SequenceContent s) = P.vcat [d, P.nest 4 . P.vcat . map ppSequenceItem . runSequence $ s]
ppSequenceItem :: SequenceItem -> P.Doc
ppSequenceItem si = P.vcat
[ P.text "Item"
<+> P.parens ((P.text . show . sequenceItemLength $ si) <> P.text "b")
, P.vcat (map ppElement $ sequenceItemElements si)
]
ppTagGroup :: TagGroup -> P.Doc
ppTagGroup tg = P.text (printf "%04x" $ runTagGroup tg)
ppTagElement :: TagElement -> P.Doc
ppTagElement te = P.text (printf "%04x" $ runTagElement te)
ppTag :: Tag -> P.Doc
ppTag _tag = P.parens $
ppTagGroup (tagGroup _tag)
<> P.comma
<> P.space
<> ppTagElement (tagElement _tag)
ppVL :: VL -> P.Doc
ppVL = P.sizedText 4 . printf "%4d" . runVL
ppVR :: VR -> P.Doc
ppVR = P.sizedText 2 . show
ppElement :: Element -> P.Doc
ppElement e =
ppTag (elementTag e)
<+> ppVL (elementVL e)
<+> ppVR (elementVR e)
`ppElementContent` elementContent e
ppObject :: Object -> P.Doc
ppObject (Object els) = P.vcat (map ppElement els)