summaryrefslogtreecommitdiff
path: root/src/Erebos/TextFormat/Ansi.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-01-31 17:48:55 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2026-01-31 20:42:22 +0100
commit0c36f490719f613dc23b6632a4098bd17fb0ab7c (patch)
tree895014981fe22b57b73fe63aba6918520341e5aa /src/Erebos/TextFormat/Ansi.hs
parent0c1f276f3bfc2f25653d1cd7a75b59d9f6afd522 (diff)
Data structure for formatted text
Diffstat (limited to 'src/Erebos/TextFormat/Ansi.hs')
-rw-r--r--src/Erebos/TextFormat/Ansi.hs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/Erebos/TextFormat/Ansi.hs b/src/Erebos/TextFormat/Ansi.hs
new file mode 100644
index 0000000..504e098
--- /dev/null
+++ b/src/Erebos/TextFormat/Ansi.hs
@@ -0,0 +1,59 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Erebos.TextFormat.Ansi (
+ FormattedText,
+
+ AnsiText(..),
+ renderAnsiText,
+) where
+
+import Control.Applicative
+
+import Data.Text (Text)
+import Data.Text qualified as T
+
+import Erebos.TextFormat.Types
+
+
+newtype AnsiText = AnsiText { fromAnsiText :: Text }
+
+renderAnsiText :: FormattedText -> AnsiText
+renderAnsiText = AnsiText . go ( Nothing, Nothing )
+ where
+ go cur@( cfg, cbg ) = \case
+ PlainText text -> text
+ ConcatenatedText ftexts -> mconcat $ map (go cur) ftexts
+ FormattedText (CustomTextColor fg bg) ftext -> mconcat
+ [ ansiColor fg bg
+ , go ( fg <|> cfg, bg <|> cbg ) ftext
+ , ansiColor
+ (if fg /= cfg then cfg <|> Just DefaultColor else Nothing)
+ (if bg /= cbg then cbg <|> Just DefaultColor else Nothing)
+ ]
+
+
+ansiColor :: Maybe Color -> Maybe Color -> Text
+ansiColor Nothing Nothing = ""
+ansiColor (Just fg) Nothing = "\ESC[" <> T.pack (show (colorNum fg)) <> "m"
+ansiColor Nothing (Just bg) = "\ESC[" <> T.pack (show (colorNum bg + 10)) <> "m"
+ansiColor (Just fg) (Just bg) = "\ESC[" <> T.pack (show (colorNum fg)) <> ";" <> T.pack (show (colorNum bg + 10)) <> "m"
+
+colorNum :: Color -> Int
+colorNum = \case
+ DefaultColor -> 39
+ Black -> 30
+ Red -> 31
+ Green -> 32
+ Yellow -> 33
+ Blue -> 34
+ Magenta -> 35
+ Cyan -> 36
+ White -> 37
+ BrightBlack -> 90
+ BrightRed -> 91
+ BrightGreen -> 92
+ BrightYellow -> 93
+ BrightBlue -> 94
+ BrightMagenta -> 95
+ BrightCyan -> 96
+ BrightWhite -> 97