1
0
Fork 0
zar/src/formatting/colour.zig
2020-07-18 13:29:55 +01:00

82 lines
3.5 KiB
Zig

const std = @import("std");
const eql = std.mem.eql;
const terminal_version = @import("build_options").terminal_version;
const disable_colour = @import("build_options").disable_colour;
const TextColour = "#D8DEE9";
const DarkerTextColour = "#E5E9F0";
const DarkestTextColour = "#ECEFF4";
const AccentLightColour = "#88C0D0";
const AccentMediumColour = "#81A1C1";
const AccentDarkColour = "#5E81AC";
const RedColour = "#BF616A";
const OrangeColour = "#D08770";
const YellowColour = "#EBCB8B";
const GreenColour = "#A3BE8C";
const PurpleColour = "#B48EAD";
const TerminalResetColour = "\u{001b}[37m";
const TerminalTextColour = TerminalResetColour;
const TerminalDarkerTextColour = TerminalResetColour;
const TerminalDarkestTextColour = TerminalResetColour;
const TerminalAccentLightColour = "\u{001b}[38;5;38m";
const TerminalAccentMediumColour = "\u{001b}[38;5;32m";
const TerminalAccentDarkColour = "\u{001b}[38;5;26m";
const TerminalRedColour = "\u{001b}[31m";
const TerminalOrangeColour = "\u{001b}[31;1m";
const TerminalYellowColour = "\u{001b}[33m";
const TerminalGreenColour = "\u{001b}[32m";
const TerminalPurpleColour = "\u{001b}[35m";
inline fn getColourFromColour(clr: []const u8) []const u8 {
if (clr[0] == '#' or clr[0] == '\u{001b}') {
return clr;
} else if (eql(u8, clr, "text")) {
return if (!terminal_version) TextColour else TerminalTextColour;
} else if (eql(u8, clr, "dark")) {
return if (!terminal_version) DarkerTextColour else TerminalDarkerTextColour;
} else if (eql(u8, clr, "darkest")) {
return if (!terminal_version) DarkestTextColour else TerminalDarkestTextColour;
} else if (eql(u8, clr, "accentlight")) {
return if (!terminal_version) AccentLightColour else TerminalAccentLightColour;
} else if (eql(u8, clr, "accentmedium")) {
return if (!terminal_version) AccentMediumColour else TerminalAccentMediumColour;
} else if (eql(u8, clr, "accentdark")) {
return if (!terminal_version) AccentDarkColour else TerminalAccentDarkColour;
} else if (eql(u8, clr, "red")) {
return if (!terminal_version) RedColour else TerminalRedColour;
} else if (eql(u8, clr, "orange")) {
return if (!terminal_version) OrangeColour else TerminalOrangeColour;
} else if (eql(u8, clr, "yellow")) {
return if (!terminal_version) YellowColour else TerminalYellowColour;
} else if (eql(u8, clr, "green")) {
return if (!terminal_version) GreenColour else TerminalGreenColour;
} else if (eql(u8, clr, "purple")) {
return if (!terminal_version) PurpleColour else TerminalPurpleColour;
} else {
unreachable;
}
}
/// This colours a string but at comptime.
pub fn comptimeColour(comptime clr: []const u8, comptime str: []const u8) []const u8 {
if (disable_colour) return str;
const proper_colour = comptime getColourFromColour(clr);
if (terminal_version) {
return proper_colour ++ str ++ TerminalResetColour;
} else {
return "<span color=\"" ++ proper_colour ++ "\">" ++ str ++ "</span>";
}
}
/// This colours a dynamic string at runtime.
pub fn colour(alloc: *std.mem.Allocator, clr: []const u8, str: []const u8) ![]const u8 {
if (disable_colour) return str;
const proper_colour = getColourFromColour(clr);
if (terminal_version) {
return try std.fmt.allocPrint(alloc, "{}{}" ++ TerminalResetColour, .{ proper_colour, str });
} else {
return try std.fmt.allocPrint(alloc, "<span color=\"{}\">{}</span>", .{ proper_colour, str });
}
}