# -*- coding: iso8859-1 -*-
"""
A little script to fix up HTML pages referring to files on the system.
"""

import os
import shutil
import sys
import xml.sax
from datetime import datetime

from myxml import StartEndHandler, makeAttString


class SimplePreprocessor(StartEndHandler):
	def __init__(self):
		self.toc = []
		self.toCopy = []
		self.defaultRoot = os.environ["HOME"]
		StartEndHandler.__init__(self)

	def _end_downloadable(self, name, atts, content):
		sourcePath = os.path.join(self.defaultRoot, atts["source"])
		fName = os.path.basename(sourcePath)
		self.toCopy.append((sourcePath, fName))
		return '<a href="%s" class="downloadable">%s</a>'%(
			fName, fName)

	def _end_inlinesource(self, name, atts, content):
		sourcefile = os.path.join(self.defaultRoot, atts["source"])
		self.toCopy.append((sourcefile, None))
		return ('<div class="source">\n'
			'<pre>\n%s</pre>\n'
			'<p>File: %s</p>\n'
			'</div>')%(
				open(sourcefile).read(), sourcefile)

	def _end_linksource(self, name, atts, content):
		target = atts.get("target", os.path.basename(atts["source"]))
		self.toCopy.append((os.path.join(self.defaultRoot, atts["source"]), 
			target))
		if not content:
			content = target
		return '<a href="%s">%s</a>'%(target, content)

	def _end_h2(self, name, atts, content):
		atts = dict(atts)
		if "toc" in atts:
			label = atts.pop("toc")
			self.toc.append((label, content))
			template = '<a name="%s">%%s</a>'%label
		else:
			template = '%s'
		return template%("<h2%s>%s</h2>"%(makeAttString(atts), content))

	def _end_toc(self, name, atts, content):
		return '<div id="toc"><ul class="toc">%s</ul></div>'%(
			"\n".join(['<li><a href="#%s">%s</a></li>'%(tag, title)
				for tag, title in self.toc]))

	def _end_now(self, name, atts, content):
		return datetime.utcnow().strftime("%Y-%m-%d, %H:%M")+" UTC"

	def _defaultEnd(self, name, atts, content):
		return "<%s%s>%s</%s>"%(name, makeAttString(atts) , content, name)


def parseCommandLine():
	from optparse import OptionParser
	parser = OptionParser(usage="%prog [options]")
	parser.add_option("-d", "--deps", help="dump dependencies",
		dest="dumpDeps", action="store_true")
	opts, args = parser.parse_args()
	if args:
		parser.print_help()
		sys.exit(1)
	return opts, args


def doCopy(toCopy):
	for src, dest in toCopy:
		if dest is None:
			continue
		srcTime = os.path.getmtime(src)
		if not os.path.exists(dest) or srcTime>os.path.getmtime(dest):
			shutil.copyfile(src, dest)
			os.utime(dest, (srcTime, srcTime))


def main():
	opts, _ = parseCommandLine()
	conv = SimplePreprocessor()
	xml.sax.parse(sys.stdin, conv)
	if opts.dumpDeps:
		sys.stdout.write(" ".join([src for src, dest in conv.toCopy])+"\n")
	else:
		sys.stdout.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN\n"'
			'"http://www.w3.org/TR/html4/strict.dtd">\n')
		sys.stdout.write(conv.getResult().encode("utf-8")+"\n")
		doCopy(conv.toCopy)


if __name__=="__main__":
	main()
