#!/usr/bin/env ruby
#encoding: UTF-8

# Adds the creation date, section number, version and a category to a man-page
# or updates these data, as Docutils do not provide these values.

require 'filemagic'
require 'date'

# find the file-type for a given file name
def file_type(file)
  fm = FileMagic.fm
  file_magic = fm.file(file)
  fm.flags = [:mime_type]
  file_mime = fm.file(file)	
  return file_magic, file_mime
end

section = version = category = ''

if ARGV.empty?
  puts "No man-page file given!"
  exit false
elsif !File.exist?(ARGV[0] )
  puts "File %s does not exist" %ARGV[0]
  exit false
elsif !File.writable?(ARGV[0] )
  puts "File %s cannot be modified" %ARGV[0]
  exit false
else
  fname = ARGV[0]
  if ARGV.length > 1
    section = ARGV[1]
  end
  if ARGV.length > 2
    version = ARGV[2]
  end
  if ARGV.length > 3
    category = ARGV[3]
  end
  file = File.new(fname, 'r+')
  ftype = file_type(fname)
  if (ftype[0].include?('troff'))
    line = ''
    out = ''
    begin
      # read file line by line
      while file.gets 
        line = $_
        # anything but the sought header
        if '.' != line && !line.empty? && !line.start_with?('.TH')
          out << line
        else
          if line && !line.empty?
            # cut off every field.
            out << line.match(/.TH [^"]*/)[0]
            out << " \"%s\" \"%s\" \"%s\" \"%s\"\n" %[section, Date.today.strftime('%a %d %b %Y'), version, category]
          end
        end
      end
    rescue EOFError => ex
      puts "No header found!"
      exit 0
    end

    file.pos = 0
    file << out
    file.close
  else
    puts '(' << $0 << ") The file '%s' does not look like a man-page (%s)!\nDoing nothing!" %[fname, ftype[0]]
    exit 0
  end
end
