#!/usr/bin/python

# Copyright (c) 2005 by Matthias Urlichs <smurf@smurf.noris.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of Version 2 of the GNU General Public License as
# published by the Free Software Foundation. See the file COPYING.txt
# or (on Debian systems) /usr/share/common-licenses/GPL-2 for details.

"""\
This test script grabs a number of interesting key maps from
keymapper.fakemaps, generates a decision tree, saves that in an
in-memory file, and then runs each key map against the file's
interpreter to see if the correct map is returned.
"""

from keymapper.parse.maps import parse_map,EmptyMapError,MapInputError
from keymapper.tree import Tree, gen_report
import keymapper.tree
from keymapper.file import FileReporter
from keymapper.graph import GraphReporter
from keymapper.script import Script
from keymapper.fakequery import FakeQuery
from keymapper.parse.linux import parse_file as parse_linux
from keymapper.parse.linux import FileProblem

import sys
import codecs
from optparse import OptionParser, OptParseError
from subprocess import Popen,PIPE
try:
	from cStringIO import StringIO
except ImportError:
	from StringIO import StringIO

parser = OptionParser(usage="%prog list...", version="%prog 0.1")
parser.remove_option("-h")
#parser.remove_option("--help")
parser.add_option("-?","--help", action="help", help="show this help text")
parser.add_option("-v","--verbose", action="count", dest="verbose", help="be more verbose")
parser.add_option("-m","--minlen", action="store", dest="minlen", type="int", default=30, help="Too-short Keymaps are skipped (default: 30 entries)")
parser.add_option("-g","--graph", action="store_const", dest="format", const="graphviz",
	help="generate a hopefully-nice-looking .dot file")
parser.add_option("--maps", action="store_const", dest="format", const="mapdump",
	help="print the to-be-processed keymaps")
parser.add_option("-o","--output", action="store", dest="filename",
	help="output file (default: stdout)")

(opts, args) = parser.parse_args()
if not args:
	parser.error("no arguments supplied")
	sys.exit(1)

t = Tree()

keymapper.tree.trace = opts.verbose

if opts.filename:
	out=open(opts.filename,"w")
else:
	out=sys.stdout
if opts.format == "graphviz":
	out = codecs.getwriter("latin1")(out,"replace")
else:
	out = codecs.getwriter("utf-8")(out)

for f in args:
	for l in open(f):
		comment = l.find('#')
		if comment > -1: l = l[:comment]
		l = l.strip()
		if l == "": continue
		if " " in l or "\t" in l:
			(name,code) = l.split()
		else:
			name = l
			code = "utf-8"
#		code = codecs.getreader(code)
#		pipe = Popen(("loadkeys","-q","-M",name), stdout=PIPE).stdout
#		pipe = code(pipe)


		try:
			if opts.verbose:
				print "Parsing:",name
#			map = parse_map(name,pipe)
			map = parse_linux(name)
		except EmptyMapError:
			print >>sys.stderr,"Map '%s' skipped: empty" % name
		except MapInputError,exc:
			n,l,p = exc.args
			print >>sys.stderr,"Map '%s' skipped: data format error at %d:%d" % (n,l,p)
		except UnicodeDecodeError:
			print >>sys.stderr,"Map '%s' skipped: codec error" % name
		except FileProblem,e:
			print >>sys.stderr,"... skipped '%s'" % e.args
		else:
			if opts.minlen > len(map):
				print >>sys.stderr,"... skipped '%s': only %d keys" % (map,len(map))
				continue;

			if opts.format == "mapdump":
				print >>out,map.dump()
			else:
				t.add(map)
			
if opts.format == "mapdump":
	sys.exit(0)

t.gen_tree()

if opts.format == "graphviz":
	gen_report(t,GraphReporter(out))
else:
	gen_report(t,FileReporter(out))

# done!
