function trim(s) { sub(/^[[:space:]]+/, "", s) sub(/[[:space:]]+$/, "", s) return s } function is_table_row(line, t) { t = line return (t ~ /^[[:space:]]*\|/ && t ~ /\|[[:space:]]*$/) } function is_table_sep(line, t) { if (!is_table_row(line)) return 0 t = line gsub(/[|:\-[:space:]]/, "", t) return (t == "" && line ~ /-/) } function split_row(line, out, n, i, raw) { raw = line sub(/^[[:space:]]*\|/, "", raw) sub(/\|[[:space:]]*$/, "", raw) n = split(raw, out, /\|/) for (i = 1; i <= n; i++) out[i] = trim(out[i]) return n } function align_for(sep, t) { t = trim(sep) if (t ~ /^:-+:$/) return "center" if (t ~ /^:-+$/) return "left" if (t ~ /^-+:$/) return "right" return "" } function render_cell(cell, inner) { inner = trim(cell) if (inner ~ /^```.*```$/) { sub(/^```[[:space:]]*/, "", inner) sub(/[[:space:]]*```$/, "", inner) return "
" inner "
" } return inner } BEGIN { count = 0 } { lines[++count] = $0 } END { in_pre = 0 i = 1 while (i <= count) { if (lines[i] ~ /^
/) {
            in_pre = 1
            print lines[i]
            i++
            continue
        }
        if (in_pre) {
            print lines[i]
            if (lines[i] ~ /^<\/code><\/pre>/) in_pre = 0
            i++
            continue
        }

        if (i < count && is_table_row(lines[i]) && is_table_sep(lines[i + 1])) {
            n_header = split_row(lines[i], header)
            n_sep = split_row(lines[i + 1], sep)
            n_cols = (n_header > n_sep ? n_header : n_sep)

            print ""
            print ""
            print ""
            for (c = 1; c <= n_cols; c++) {
                cell = (c <= n_header ? render_cell(header[c]) : "")
                a = (c <= n_sep ? align_for(sep[c]) : "")
                if (a != "") print ""
                else print ""
            }
            print ""
            print ""

            j = i + 2
            print ""
            while (j <= count && is_table_row(lines[j])) {
                n_body = split_row(lines[j], body)
                print ""
                for (c = 1; c <= n_cols; c++) {
                    cell = (c <= n_body ? render_cell(body[c]) : "")
                    a = (c <= n_sep ? align_for(sep[c]) : "")
                    if (a != "") print ""
                    else print ""
                }
                print ""
                j++
            }
            print ""
            print "
" cell "" cell "
" cell "" cell "
" i = j continue } if (is_table_sep(lines[i]) && i < count && is_table_row(lines[i + 1])) { n_sep = split_row(lines[i], sep) n_cols = n_sep print "" print "" print "" for (c = 1; c <= n_cols; c++) { a = align_for(sep[c]) if (a != "") print "" else print "" } print "" print "" j = i + 1 print "" while (j <= count && is_table_row(lines[j])) { n_body = split_row(lines[j], body) print "" for (c = 1; c <= n_cols; c++) { cell = (c <= n_body ? render_cell(body[c]) : "") a = (c <= n_sep ? align_for(sep[c]) : "") if (a != "") print "" else print "" } print "" j++ } print "" print "
" cell "" cell "
" i = j continue } print lines[i] i++ } }