Last active
June 8, 2021 06:28
-
-
Save Jarred-Sumner/91906647ed36381876d996d2f2c3a6d6 to your computer and use it in GitHub Desktop.
<red>red color</r><b>bold</r><red><b>red bold</r>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const print = @import("std").debug.print; | |
var enable_ansi_colors = true; | |
// Valid colors: | |
// <black> | |
// <blue> | |
// <cyan> | |
// <green> | |
// <magenta> | |
// <red> | |
// <white> | |
// <yellow> | |
// <b> - bold | |
// <d> - dim | |
// </r> - reset | |
// <r> - reset | |
fn _pretty(comptime fmt: string, args: anytype, comptime printer: anytype, comptime is_enabled: bool) void { | |
comptime var new_fmt: [fmt.len * 2]u8 = undefined; | |
comptime var new_fmt_i: usize = 0; | |
comptime const ED = "\x1b["; | |
@setEvalBranchQuota(9999); | |
comptime var i: usize = 0; | |
comptime while (i < fmt.len) { | |
const c = fmt[i]; | |
switch (c) { | |
'\\' => { | |
i += 1; | |
if (fmt.len < i) { | |
switch (fmt[i]) { | |
'<', '>' => { | |
i += 1; | |
}, | |
else => { | |
new_fmt[new_fmt_i] = '\\'; | |
new_fmt_i += 1; | |
new_fmt[new_fmt_i] = fmt[i]; | |
new_fmt_i += 1; | |
}, | |
} | |
} | |
}, | |
'>' => { | |
i += 1; | |
}, | |
'<' => { | |
i += 1; | |
var is_reset = fmt[i] == '/'; | |
if (is_reset) i += 1; | |
var start: usize = i; | |
while (i < fmt.len and fmt[i] != '>') { | |
i += 1; | |
} | |
const color_name = fmt[start..i]; | |
const color_str = color_picker: { | |
if (std.mem.eql(u8, color_name, "black")) { | |
break :color_picker ED ++ "30m"; | |
} else if (std.mem.eql(u8, color_name, "blue")) { | |
break :color_picker ED ++ "34m"; | |
} else if (std.mem.eql(u8, color_name, "b")) { | |
break :color_picker ED ++ "1m"; | |
} else if (std.mem.eql(u8, color_name, "d")) { | |
break :color_picker ED ++ "2m"; | |
} else if (std.mem.eql(u8, color_name, "cyan")) { | |
break :color_picker ED ++ "36m"; | |
} else if (std.mem.eql(u8, color_name, "green")) { | |
break :color_picker ED ++ "32m"; | |
} else if (std.mem.eql(u8, color_name, "magenta")) { | |
break :color_picker ED ++ "35m"; | |
} else if (std.mem.eql(u8, color_name, "red")) { | |
break :color_picker ED ++ "31m"; | |
} else if (std.mem.eql(u8, color_name, "white")) { | |
break :color_picker ED ++ "37m"; | |
} else if (std.mem.eql(u8, color_name, "yellow")) { | |
break :color_picker ED ++ "33m"; | |
} else if (std.mem.eql(u8, color_name, "r")) { | |
is_reset = true; | |
break :color_picker ""; | |
} else { | |
@compileError("Invalid color name passed:" ++ color_name); | |
} | |
}; | |
var orig = new_fmt_i; | |
if (is_enabled) { | |
if (!is_reset) { | |
orig = new_fmt_i; | |
new_fmt_i += color_str.len; | |
std.mem.copy(u8, new_fmt[orig..new_fmt_i], color_str); | |
} | |
if (is_reset) { | |
const reset_sequence = "\x1b[0m"; | |
orig = new_fmt_i; | |
new_fmt_i += reset_sequence.len; | |
std.mem.copy(u8, new_fmt[orig..new_fmt_i], reset_sequence); | |
} | |
} | |
}, | |
else => { | |
new_fmt[new_fmt_i] = fmt[i]; | |
new_fmt_i += 1; | |
i += 1; | |
}, | |
} | |
}; | |
printer(new_fmt[0..new_fmt_i], args); | |
} | |
pub fn pretty(comptime fmt: string, args: anytype) { | |
if (enable_ansi_colors) { | |
_pretty(fmt, args, print, true); | |
} else { | |
_pretty(fmt, args, print, false); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment