Iros
 
Loading...
Searching...
No Matches
style.h
Go to the documentation of this file.
1#pragma once
2
5
11enum class Color {
12 Black = 0,
13 Red = 1,
14 Green = 2,
15 Yellow = 3,
16 Blue = 4,
18 Cyan = 6,
19 White = 7,
21};
22
23enum class Effect {
24 None = 0,
25 Bold = 1,
26 Faint = 2,
27 Italic = 3,
29 Blink = 5,
33};
34
36public:
37 constexpr explicit BackgroundColor(Color color) : m_color(color) {}
38
39 constexpr auto color() const -> Color { return m_color; }
40
41private:
42 Color m_color { Color::Default };
43};
44
45class Style {
46public:
47 constexpr Style() = default;
48
49 constexpr Style(Color foreground) : m_foreground(foreground) {}
50 constexpr Style(BackgroundColor background) : m_background(background) {}
51 constexpr Style(Effect effect) : m_effect(effect) {}
52
54 : m_foreground(foreground), m_background(background), m_effect(effect) {}
55
56 constexpr auto foreground() const -> Color { return m_foreground; }
57 constexpr auto background() const -> Color { return m_background.color(); }
58 constexpr auto effect() const -> Effect { return m_effect; }
59
60 template<concepts::Encoding Enc>
61 constexpr auto render_to_ansi_escapes() const {
62 // Use a bounded context to avoid allocating a string.
64
65 auto context = TargetContext {};
66 (void) present_encoded_context<Enc>("\033[{};{};{}m"_sv, context, util::to_underlying(effect()),
69
70 auto context_for_reset = TargetContext {};
71 (void) present_encoded_context<Enc>("\033[0m"_sv, context_for_reset);
72
73 return Tuple(util::move(context).output(), util::move(context_for_reset).output());
74 }
75
76private:
77 Color m_foreground { Color::Default };
78 BackgroundColor m_background { Color::Default };
79 Effect m_effect { Effect::None };
80};
81
82constexpr auto operator|(Color color, BackgroundColor background) {
83 return Style(color, background, Effect::None);
84}
85
86constexpr auto operator|(BackgroundColor background, Color color) {
87 return Style(color, background, Effect::None);
88}
89
90constexpr auto operator|(Color color, Effect effect) {
91 return Style(color, BackgroundColor(Color::Default), effect);
92}
93
94constexpr auto operator|(Effect effect, Color color) {
95 return Style(color, BackgroundColor(Color::Default), effect);
96}
97
98constexpr auto operator|(BackgroundColor background, Effect effect) {
99 return Style(Color::Default, background, effect);
100}
101
102constexpr auto operator|(Effect effect, BackgroundColor background) {
103 return Style(Color::Default, background, effect);
104}
105
106constexpr auto operator|(Style style, Color color) {
107 return Style(color, BackgroundColor(style.background()), style.effect());
108}
109
110constexpr auto operator|(Color color, Style style) {
111 return Style(color, BackgroundColor(style.background()), style.effect());
112}
113
114constexpr auto operator|(Style style, BackgroundColor background) {
115 return Style(style.foreground(), background, style.effect());
116}
117
118constexpr auto operator|(BackgroundColor background, Style style) {
119 return Style(style.foreground(), background, style.effect());
120}
121
122constexpr auto operator|(Style style, Effect effect) {
123 return Style(style.foreground(), BackgroundColor(style.background()), effect);
124}
125
126constexpr auto operator|(Effect effect, Style style) {
127 return Style(style.foreground(), BackgroundColor(style.background()), effect);
128}
129
130template<concepts::Formattable T>
131class Styled {
132public:
133 constexpr explicit Styled(T&& argument, Style style) : m_argument(util::forward<T>(argument)), m_style(style) {}
134
135private:
136 template<concepts::Encoding Enc>
138 FormatParseContext<Enc>& parse_context, bool debug) {
139 return format::formatter<T, Enc>(parse_context, debug) % [](concepts::CopyConstructible auto formatter) {
140 return [=]<concepts::FormatContext Context>(Context& context, Styled const& value) {
141 if constexpr (requires { typename Context::SupportsStyle; }) {
142 return context.with_style(value.m_style, [&] {
143 return formatter(context, value.m_argument);
144 });
145 } else {
146 return formatter(context, value.m_argument);
147 }
148 };
149 };
150 }
151
152 T&& m_argument;
153 Style m_style;
154};
155
156template<typename T>
158}
159
160namespace di::format {
162using style::Color;
163using style::Effect;
164using style::Style;
165using style::Styled;
166}
167
168namespace di {
169using format::Styled;
170
174}
Definition bounded_format_context.h:9
Definition format_parse_context.h:14
constexpr BackgroundColor(Color color)
Definition style.h:37
constexpr auto color() const -> Color
Definition style.h:39
Definition style.h:45
constexpr auto effect() const -> Effect
Definition style.h:58
constexpr Style(Effect effect)
Definition style.h:51
constexpr Style(Color foreground)
Definition style.h:49
constexpr Style(BackgroundColor background)
Definition style.h:50
constexpr auto background() const -> Color
Definition style.h:57
constexpr Style(Color foreground, BackgroundColor background, Effect effect)
Definition style.h:53
constexpr auto render_to_ansi_escapes() const
Definition style.h:61
constexpr auto foreground() const -> Color
Definition style.h:56
constexpr Style()=default
Definition style.h:131
constexpr Styled(T &&argument, Style style)
Definition style.h:133
constexpr friend auto tag_invoke(types::Tag< format::formatter_in_place >, InPlaceType< Styled >, FormatParseContext< Enc > &parse_context, bool debug)
Definition style.h:137
Definition tuple_forward_declaration.h:5
Definition operations.h:34
Definition format_context.h:9
Definition style.h:6
Effect
Definition style.h:23
@ Bold
Definition style.h:25
@ Italic
Definition style.h:27
@ DoubleUnderline
Definition style.h:32
@ None
Definition style.h:24
@ Underline
Definition style.h:28
@ Faint
Definition style.h:26
@ Inverted
Definition style.h:30
@ Blink
Definition style.h:29
@ StrikeThrough
Definition style.h:31
Styled(T &&, Style) -> Styled< T && >
constexpr auto operator|(Color color, BackgroundColor background)
Definition style.h:82
Color
Represent a ANSI terminal color.
Definition style.h:11
@ Cyan
Definition style.h:18
@ White
Definition style.h:19
@ Yellow
Definition style.h:15
@ Default
Definition style.h:20
@ Blue
Definition style.h:16
@ Magenta
Definition style.h:17
@ Green
Definition style.h:14
@ Black
Definition style.h:12
@ Red
Definition style.h:13
Definition bounded_format_context.h:7
constexpr auto formatter(FormatParseContext< Enc > &parse_context, bool debug=false)
Definition formatter.h:27
constexpr auto present_encoded_context
Definition present_encoded_context.h:24
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto to_underlying
Definition to_underlying.h:15
Definition zstring_parser.h:9
format::Effect FormatEffect
Definition style.h:173
format::BackgroundColor FormatBackgroundColor
Definition style.h:172
format::Color FormatColor
Definition style.h:171
Definition in_place_type.h:5