Commit 74927607 authored by Nicolas's avatar Nicolas Committed by Victor Zverovich

Add file stream support for stylized text printing. (#967)

parent f54f3d0f
...@@ -423,43 +423,67 @@ template <> ...@@ -423,43 +423,67 @@ template <>
inline void reset_color<wchar_t>(FILE *stream) FMT_NOEXCEPT { inline void reset_color<wchar_t>(FILE *stream) FMT_NOEXCEPT {
fputs(internal::data::WRESET_COLOR, stream); fputs(internal::data::WRESET_COLOR, stream);
} }
// The following specialiazation disables using std::FILE as a character type,
// which is needed because or else
// fmt::print(stderr, fmt::emphasis::bold, "");
// would take stderr (a std::FILE *) as the format string.
template <>
struct is_string<std::FILE *> : std::false_type {};
template <>
struct is_string<const std::FILE *> : std::false_type {};
} // namespace internal } // namespace internal
template < template <
typename S, typename Char = typename internal::char_t<S>::type> typename S, typename Char = typename internal::char_t<S>::type>
void vprint(const text_style &tf, const S &format, void vprint(std::FILE *f, const text_style &ts, const S &format,
basic_format_args<typename buffer_context<Char>::type> args) { basic_format_args<typename buffer_context<Char>::type> args) {
if (tf.has_emphasis()) { if (ts.has_emphasis()) {
internal::fputs<Char>( internal::fputs<Char>(
internal::make_emphasis<Char>(tf.get_emphasis()), stdout); internal::make_emphasis<Char>(ts.get_emphasis()), f);
} }
if (tf.has_foreground()) { if (ts.has_foreground()) {
internal::fputs<Char>( internal::fputs<Char>(
internal::make_foreground_color<Char>(tf.get_foreground()), stdout); internal::make_foreground_color<Char>(ts.get_foreground()), f);
} }
if (tf.has_background()) { if (ts.has_background()) {
internal::fputs<Char>( internal::fputs<Char>(
internal::make_background_color<Char>(tf.get_background()), stdout); internal::make_background_color<Char>(ts.get_background()), f);
} }
vprint(format, args); vprint(f, format, args);
internal::reset_color<Char>(stdout); internal::reset_color<Char>(f);
} }
/** /**
Formats a string and prints it to stdout using ANSI escape sequences to Formats a string and prints it to the specified file stream using ANSI
specify text formatting. escape sequences to specify text formatting.
Example: Example:
fmt::print(fmt::emphasis::bold | fg(fmt::color::red), fmt::print(fmt::emphasis::bold | fg(fmt::color::red),
"Elapsed time: {0:.2f} seconds", 1.23); "Elapsed time: {0:.2f} seconds", 1.23);
*/ */
template <typename String, typename... Args> template <typename String, typename... Args>
typename std::enable_if<internal::is_string<String>::value>::type typename std::enable_if<internal::is_string<String>::value>::type print(
print(const text_style &tf, const String &format_str, const Args & ... args) { std::FILE *f, const text_style &ts, const String &format_str,
const Args &... args) {
internal::check_format_string<Args...>(format_str); internal::check_format_string<Args...>(format_str);
typedef typename internal::char_t<String>::type char_t; typedef typename internal::char_t<String>::type char_t;
typedef typename buffer_context<char_t>::type context_t; typedef typename buffer_context<char_t>::type context_t;
format_arg_store<context_t, Args...> as{args...}; format_arg_store<context_t, Args...> as{args...};
vprint(tf, format_str, basic_format_args<context_t>(as)); vprint(f, ts, format_str, basic_format_args<context_t>(as));
}
/**
Formats a string and prints it to stdout using ANSI escape sequences to
specify text formatting.
Example:
fmt::print(fmt::emphasis::bold | fg(fmt::color::red),
"Elapsed time: {0:.2f} seconds", 1.23);
*/
template <typename String, typename... Args>
typename std::enable_if<internal::is_string<String>::value>::type print(
const text_style &ts, const String &format_str,
const Args &... args) {
return print(stdout, ts, format_str, args...);
} }
#endif #endif
......
...@@ -228,4 +228,8 @@ TEST(ColorsTest, Colors) { ...@@ -228,4 +228,8 @@ TEST(ColorsTest, Colors) {
stdout, stdout,
fmt::print(fg(fmt::color::blue) | fmt::emphasis::bold, "blue/bold"), fmt::print(fg(fmt::color::blue) | fmt::emphasis::bold, "blue/bold"),
"\x1b[1m\x1b[38;2;000;000;255mblue/bold\x1b[0m"); "\x1b[1m\x1b[38;2;000;000;255mblue/bold\x1b[0m");
EXPECT_WRITE(stderr, fmt::print(stderr, fmt::emphasis::bold, "bold error"),
"\x1b[1mbold error\x1b[0m");
EXPECT_WRITE(stderr, fmt::print(stderr, fg(fmt::color::blue), "blue log"),
"\x1b[38;2;000;000;255mblue log\x1b[0m");
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment