BEGIN { pre = 0 margin = margin ? margin : 4 # Core lines txs = "" # text style lns = "\033[1m" # link number style lus = "\033[36m" # link url style lts = "\033[4m" # link text style pfs = "" # preformatted style # Advanced lines h1s = "\033[1;4m" # h1 style h2s = "\033[1m" # h2 style h3s = "\033[3m" # h3 style lis = "" # list item style # Reset res = "\033[0m" # reset style } /```/ { pre = ! pre next } pre { mark = "```" fmt = pfs "%s" res text = $0 } /^#/ { match($0, /#+/) mark = substr($0, RSTART, RLENGTH) sub(/#+[[:space:]]*/, "", $0) level = length(mark) if (level == 1) { fmt = h1s "%s" res } else if (level == 2) { fmt = h2s "%s" res } else { fmt = h3s "%s" res } } /^=>/ { mark = "=>" sub(/=>[[:space:]]*/, "", $0) desc = $1 text = "" for (w = 2; w <= NF; w++) { text = text (text ? " " : "") $w } fmt = lns "[" (++ln) "]" res " " lts "%s" res "\t" lus "%s" res } /^\*[[:space:]]/ { mark = "*" sub(/\*[[:space:]]*/, "", $0) fmt = lis "%s" res } { mark = mark ? mark : mark fmt = fmt ? fmt : "%s" text = text ? text : fold($0, " ") desc = desc ? desc : "" printf "%-" margin "s" fmt "\n", mark, text, desc mark = fmt = text = desc = "" } function fold(str, sep, cols, out, cmd, i, j, len, chars, c, last, f, first) { if (! cols) { # checks if stdout is a tty if (system("test -t 1")) { cols = 80 } else { cmd = "tput cols" cmd | getline cols close(cmd) } } # squeeze tabs and newlines to spaces gsub(/[\t\n]/, " ", str) # if "sep" is empty, just fold on cols with substr if (! length(sep)) { len = length(str) out = substr(str, 1, cols) for (i = cols + 1; i <= len; i += cols) { out = out "\n" for (j = 1; j < margin; j++) { out = out " " } out = out substr(str, i, cols) } return out # otherwise, we have to loop over every character (can't split() on sep, it # would destroy the existing separators) } else { # split string into char array len = split(str, chars, "") # set boolean, used to assign the first line differently first = 1 for (i = 1; i <= len; i += last) { f = 0 for (c = i + cols - 1; c >= i; c--) { if (index(sep, chars[c])) { last = c - i + 1 f = 1 break } } if (! f) { last = cols } if (first) { out = substr(str, i, last) first = 0 } else { out = out "\n" for (j = 0; j < margin; j++) { out = out " " } out = out substr(str, i, cols) } } } # return the output return out }