* Works with GNU Awk
---
contrib/gmi_color_gawk.awk | 86 ++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
create mode 100644 contrib/gmi_color_gawk.awk
diff --git a/contrib/gmi_color_gawk.awk b/contrib/gmi_color_gawk.awk
new file mode 100644
index 0000000..787ed6b
--- /dev/null
+++ b/contrib/gmi_color_gawk.awk
@@ -0,0 +1,86 @@
+# gmi_color_gawk.awk
+#
+# Markup highlighting of Gemini pages for ANSI terminal
+#
+# IMPORTANT:
+# It uses GNU Awk syntax, it won't work with mawk for example
+
+func print_folded(long_line, prefix) {
+ # Split words into an array
+ split(long_line, list_of_words)
+
+ line_len = 0
+ for(i in list_of_words) {
+ # Check if we go beyond width of the block
+ if ((line_len + length(list_of_words[i])) > 78) {
+ line_len = 0
+ printf("\n")
+ }
+ # Print prefix
+ if (line_len == 0)
+ printf(prefix)
+ line_len += length(list_of_words[i]) + 1
+ printf("%s ", list_of_words[i])
+ }
+
+ # Handle case of empty lines
+ if (length(long_line) == 0)
+ printf(prefix)
+
+ # The line ends with a new-line
+ printf("\n")
+}
+
+BEGIN {
+ code_section = 0
+}
+
+# URL
+match($0, /^(=>) ([^ \t]+).(.*)/, arr) {
+ if (code_section == 0)
+ {
+ print "\033[0;36m" arr[1], arr[2] "\033[0;35m,\n\t\033[1m", arr[3] "\033[0m"
+ next
+ }
+}
+
+# Quote
+match($0, /^>(.*)/, arr) {
+ if (code_section == 0)
+ {
+ printf("\033[0;34m")
+ print_folded(arr[1], "> ")
+ printf("\033[0m")
+ next
+ }
+}
+
+# Code section
+/^```/ {
+ if (code_section == 0)
+ # Activate color for code section
+ print "\033[0;32m```"
+ else
+ # Remove color at the end of the code section
+ print "```\033[0m"
+ code_section = 1 - code_section
+ next
+}
+
+# Heading
+/^#.*/ {
+ if (code_section == 0)
+ {
+ print "\033[0m\033[1m" $0 "\033[0m"
+ next
+ }
+}
+
+# Everything else -- the plain text of the file
+{
+ # Outaide code sections: Wrap long lines, print short lines and as-is
+ if (code_section == 0)
+ print_folded($0, "\033[0m")
+ else
+ print("\033[0;32m" $0)
+}
--
2.25.1