module DataFlow.SequenceDiagram where import Text.Printf import qualified DataFlow.Core as C import DataFlow.PlantUML import Data.List.Utils convertNewline :: String -> String convertNewline = replace "
" "\\n" bold :: String -> String bold "" = "" bold s = printf "%s" s italic :: String -> String italic "" = "" italic s = -- each line (separated by \n) needs to be wrapped in its own join "\\n" $ map italic' $ split "\\n" s where italic' = printf "%s" convertObject :: C.Object -> Stmt convertObject (C.InputOutput id' name) = Entity id' $ convertNewline name convertObject (C.TrustBoundary _ name objects) = Box (convertNewline name) $ map convertObject objects convertObject (C.Function id' name) = Participant id' $ convertNewline name convertObject (C.Database id' name) = Database id' $ convertNewline name convertObject (C.Flow i1 i2 op desc) = let p = (convertNewline (bold op), italic $ convertNewline desc) s = case p of ("", "") -> "" ("", d) -> d (o, "") -> o (o, d) -> o ++ "\\n" ++ d in Edge i1 i2 s defaultSkinParams :: [Stmt] defaultSkinParams = [ SkinParam "BackgroundColor" "#white", SkinParam "Shadowing" "false", SkinParam "SequenceMessageAlign" "center", SkinParam "DefaultFontName" "Arial", SkinParam "DefaultFontStyle" "bold", SkinParam "DefaultFontColor" "#333333", SkinParam "NoteBackgroundColor" "#fbfb77", SkinParam "NoteBorderColor" "#cbcb47", SkinParam "NoteBackgroundColor" "#ffffcd", SkinParam "NoteBorderColor" "#a9a980", SkinParam "NoteFontColor" "#676735", SkinParam "NoteFontStyle" "italic", SkinParam "SequenceArrowColor" "#555555", SkinParam "SequenceArrowFontColor" "#555555", SkinParam "SequenceArrowFontStyle" "none", SkinParam "SequenceBoxBackgroundColor" "#fafafa", SkinParam "SequenceBoxBorderColor" "#eeeeee", SkinParam "SequenceBoxFontColor" "#666666", SkinParam "SequenceBoxFontSize" "12", SkinParam "SequenceBoxFontStyle" "italic", SkinParam "ParticipantBackgroundColor" "#dde5ff", SkinParam "ParticipantBorderColor" "#cccccc", SkinParam "ParticipantFontColor" "#333333", SkinParam "ParticipantFontStyle" "bold", SkinParam "DatabaseBackgroundColor" "#df4646", SkinParam "DatabaseFontColor" "#red", SkinParam "DatabaseFontStyle" "bold", SkinParam "EntityBackgroundColor" "#999999", SkinParam "SequenceLifeLineBorderColor" "#bbbbbb" ] asSequenceDiagram :: C.Diagram -> Diagram asSequenceDiagram (C.Diagram _ objects) = SequenceDiagram $ defaultSkinParams ++ map convertObject objects