#!/usr/bin/env ruby -wKU

sect, word = *ARGV
page = %x{ man #{sect} #{word}|col -b }

if page =~ /^([A-Za-z0-9_.\-]+)\(\d\)/
  name = $1.downcase
else
  name = '(unknown)'
end

STDOUT << <<-HTML
<html>
<head>
  <meta name="Content-Type" content="text/html; charset=UTF-8" />
  <title>Documentation for “#{word}”</title>
  <script type="text/javascript">
    function man (sect, word) {
      var page = TextMate.system('"$TM_SUPPORT_PATH/bin/html_man.sh" ' + sect + ' ' + word, null).outputString;
      window.location="tm-file://" + page;
    }
  </script>
</head>
<body style="margin: none">
HTML


toc = [ ]
see_also = [ ]

page.gsub!(/&/, '&amp;')
page.gsub!(/</, '&lt;')
page.gsub!(/``(.*?)''/, '‘‘\1’’')
page.gsub!(/`([^`\n]*?)'/, '‘\1’')
page.gsub!(/\n*^([A-Z0-9][A-Z0-9_\- ]+)$\n/) { toc << $1; "</pre>\n<h2 id='#$1'>#{$1.capitalize}</h2>\n<pre>" }
page.gsub!(/\b([a-z0-9_.\-]+)\((\d)\)/) { see_also << [ $1, $2 ]; "<a href='javascript:man(#$2, &quot;#$1&quot;)'>#$1</a>(#$2)" }

STDOUT << "<div style=\"position: fixed; top: 0; left: 0; height: 3em; background-color: #eef; width: 100%; z-index: 100\">\n"

STDOUT << "<select style='float: right; margin: 1em 1em 0 0;' onchange=\"document.location = this.value; document.body.scrollTop -= 45\">\n"
STDOUT << "<option value=''>&mdash; Select a section &mdash;</option>\n"
STDOUT << toc.map { |section| "<option value='##{section}'>#{section.capitalize}</option>\n" }.join
STDOUT << "</select>\n"

STDOUT << "<select style='float: right; margin: 1em 1em 0 0;' onchange=\"man(this.value.split(':')[0], this.value.split(':')[1])\">\n"
STDOUT << "<option value=''>&mdash; See also &mdash;</option>\n"
STDOUT << see_also.sort.uniq.map { |(word,section)| "<option value='#{section}:#{word}'>#{word}(#{section})</option>\n" }.join
STDOUT << "</select>\n"

STDOUT << "<h2 style=\"margin: 0.25em 0 0 0.25em\">#{name}</h2>"
STDOUT << "</div>\n"
STDOUT << "<pre style=\"margin-top: 3em; padding-top: 1em; z-index: -100\">\n"

STDOUT << page
