#!/usr/bin/awk -f # Copyright (c) 2022 Robin Jarry BEGIN { # R;G;B colors url = "\033[38;2;255;255;175m" # yellow header = "\033[38;2;175;135;255m" # purple signature = "\033[38;2;175;135;255m" # purple diff_meta = "\033[1;38;2;255;255;255m" # bold white diff_chunk = "\033[38;2;0;205;205m" # cyan diff_add = "\033[38;2;0;205;0m" # green diff_del = "\033[38;2;205;0;0m" # red quote_1 = "\033[38;2;95;175;255m" # blue quote_2 = "\033[38;2;255;135;0m" # orange quote_3 = "\033[38;2;175;135;255m" # purple quote_4 = "\033[38;2;255;95;215m" # pink quote_x = "\033[38;2;128;128;128m" # gray bold = "\033[1m" reset = "\033[0m" # state in_diff = 0 in_signature = 0 in_headers = 0 in_body = 0 # patterns header_pattern = "^[A-Z][[:alnum:]-]+:" url_pattern = "[[:lower:]]+://[[:graph:]]+|(mailto:)?[[:alnum:]_\\+\\.~/-]*[[:alnum:]_]@[[:lower:]][[:alnum:]\\.-]*[[:lower:]]" meta_pattern = "^(diff --git|(new|deleted) file|similarity index|(rename|copy) (to|from)|index|---|\\+\\+\\+) " } function color_quote(line) { level = 0 quotes = "" while (line ~ /^>/) { level += 1 quotes = quotes ">" line = substr(line, 2) while (line ~ /^ /) { quotes = quotes " " line = substr(line, 2) } } if (level == 1) { color = quote_1 } else if (level == 2) { color = quote_2 } else if (level == 3) { color = quote_3 } else if (level == 4) { color = quote_4 } else { color = quote_x } if (match(line, meta_pattern)) { return color quotes bold line reset } else if (line ~ /^\+/) { return color quotes diff_add line reset } else if (line ~ /^-/) { return color quotes diff_del line reset } gsub(url_pattern, url "&" color, line) return color quotes line reset } { # Strip carriage returns from line sub(/\r$/, "") if (in_diff) { if ($0 ~ /^-- ?$/) { in_diff = 0 in_signature = 1 $0 = signature $0 reset } else if ($0 ~ /^@@ /) { gsub(/^@@[^@]+@@/, diff_chunk "&" reset) } else if (match($0, meta_pattern)) { $0 = diff_meta $0 reset } else if ($0 ~ /^\+/) { $0 = diff_add $0 reset } else if ($0 ~ /^-/) { $0 = diff_del $0 reset } else if ($0 !~ /^ / && $0 !~ /^$/) { in_diff = 0 in_body = 1 if ($0 ~ /^>/) { $0 = color_quote($0) } else { gsub(url_pattern, url "&" reset) } } } else if (in_signature) { gsub(url_pattern, url "&" signature) $0 = signature $0 reset } else if (in_headers) { if ($0 ~ /^$/) { in_headers = 0 in_body = 1 } else { sub(header_pattern, header "&" reset) gsub(url_pattern, url "&" reset) } } else if (in_body) { if ($0 ~ /^>/) { $0 = color_quote($0) } else if ($0 ~ /^diff --git /) { in_body = 0 in_diff = 1 $0 = diff_meta $0 reset } else if ($0 ~ /^-- ?$/) { in_body = 0 in_signature = 1 $0 = signature $0 reset } else { gsub(url_pattern, url "&" reset) } } else if ($0 ~ /^diff --git /) { in_diff = 1 $0 = diff_meta $0 reset } else if ($0 ~ /^-- ?$/) { in_signature = 1 $0 = signature $0 reset } else if (match($0, header_pattern)) { in_headers = 1 sub(header_pattern, header "&" reset) gsub(url_pattern, url "&" reset) } else { in_body = 1 if ($0 ~ /^>/) { $0 = color_quote($0) } else { gsub(url_pattern, url "&" reset) } } print }