Skip to content

Instantly share code, notes, and snippets.

@csabahenk
Last active September 21, 2015 16:53
Show Gist options
  • Save csabahenk/2cfbcb3a9d8db63feda4 to your computer and use it in GitHub Desktop.
Save csabahenk/2cfbcb3a9d8db63feda4 to your computer and use it in GitHub Desktop.
Ruby module to generate HTML tables
require 'cgi'
require 'date'
module MakeTable
extend self
Tabletags = [%w[th td], "tr", "table"]
CSS = <<EOS
table,th,td {
border-collapse:collapse;
border:1px solid black;
}
th,td {
padding:5px;
}
EOS
def maketag tree, tags, i=0, indent=" "
if Array === tree
tree = tree.map.with_index { |e,j|
maketag e, tags[0...-1].map { |t| Array === t ? t[[j,t.size-1].min] : t }, i+1, indent
}.join
elsif tags.empty?
raise "tag underflow"
end
pad = "\n" + indent * i
# Use some whitespace heuristic to find out
# if we wrapping raw text or formatted output
# of an earlier invocations of maketag. Hacky,
# but good for now.
tree = tree =~ /^\s|\n/ ?
"#{tree}#{pad}" :
CGI.escapeHTML(tree.to_s)
tag = tags[-1]
"#{pad}<#{tag}>#{tree}</#{tag.sub(/\s.*/, "")}>"
end
def normalize_row row, header
row = row.values_at *header if Hash === row
return row unless row.size == 2
label, fields = row
case fields
when Array
[label] + fields
when Hash
[label] + header[1..-1].map { |h| fields[h] }
when String, Numeric, Time, Date, Symbol, false, true, nil
row
else
[label] + header[1..-1].map { |h| fields.respond_to?(h) ? fields.send(h) : nil }
end
end
def maketable rows, header, indentlevel:0, indent:" ", standalone:false, css:CSS
table = maketag [header] + rows.map{|r| normalize_row r, header}, Tabletags,
indentlevel + (standalone ? 2 : 0), indent
return table unless standalone
maketag [
[[css], ['style type="text/css" media="screen"', "head"]],
[table, ["body"]]
].map { |td| maketag *(td + [indentlevel + 1, indent]) }.join, ["html"], indentlevel, indent
end
end
class Array
def wrep *a
open("|w3m -dump -T text/html #{ENV["W3MOPTS"]}", "w"){|f|
f << MakeTable.maketable(map.with_index{|e,i|[i,e]}, ["", a].flatten, standalone:true)
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment