#!/usr/bin/awk
# Read TSV, write gopher lawn format
# Version 1

function indent(str,     retval) {
   gsub(/\n/, "\n  ", str)
   retval = "  " str
   return retval
}

function decode(str) {
   gsub(/\\t/, "\t", str)
   gsub(/\\r/, "\r", str)
   gsub(/\\n/, "\n", str)
   return str
}

# print_wrap() will break long lines into line continuations

function print_wrap(str, len) {
   line = 1
   buf = str
   while (length(buf) > len) {
       chunk = substr(buf, 1, len)
       if (match(chunk, / [^ ]*$/)) {
           before = substr(buf, 1, RSTART-1)
           after = substr(buf, RSTART+1)
           if (line == 1) {
               print before
           } else {
               print "  " before
           }
           buf = after
       } else {
           break
       }
       line++
   }
   if (line == 1) {
       print buf
   } else {
       print "  " buf
   }
}

BEGIN {
   FS = "\t"
   delete seen
   delete header
}

# process TSV header

NR == 1 {
   for (i = 1; i <= NF; i++) {
       name = $i
       if (seen[name] > 0) {
           print "Error: Duplicate field name \"" name "\""
           exit -1
       }
       seen[name] = 1
       header[i] = name
   }
}

# process each TSV row

NR > 1 {
   for (i = 1; i <= NF; i++) {
       if (length($i) == 0) {
           # name only, empty value
           print header[i] ":"
       } else if ($i ~ /\\[nrt]/) {
           # name and block value
           printf "%s: \\\n%s\n", header[i], indent(decode($i))
       } else {
           # name and value, possibly with line continuations
           line = header[i] ": " $i
           print_wrap(line, 70)
       }
   }

   # print record separator (RS)
   print ""
}