#!/usr/bin/python
#
# kconfig2wiki - Kconfig to MediaWiki converter for
# http://www.coreboot.org/Coreboot_Options
#
# Copyright (C) 2010 coresystems GmbH
# based on http://landley.net/kdocs/make/menuconfig2html.py
# Copyright (C) by Rob Landley
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#

helplen = 0
extra_chapters = 0

##
## Remove quotes from Kconfig string options
##
def zapquotes(str):
	if str[0]=='"': str = str[1:str.rfind('"')]
	return str

##
## Escape HTML special characters
##
def htmlescape(str):
	return str.strip().replace("&","&amp;").replace("<","&lt;").replace(">","&gt;")

##
## Process Kconfig file
##
def readfile(filename):
	import sys
	global helplen

	source=filename.replace("src/","").replace("/Kconfig","").replace("Kconfig","toplevel")

	try:
		lines = open(filename).read().split("\n")
	except IOError:
		sys.stderr.write("File %s missing\n" % filename)
		return
	config = None
	description = None
	configtype = None
	for i in lines:
		if helplen:
			i = i.expandtabs()
			if not len(i) or i[:helplen].isspace():
				sys.stdout.write("%s\n" % htmlescape(i))
				continue
			else:
				helplen = 0
				sys.stdout.write("||\n")

		words = i.strip().split(None,1)
		if not len(words): continue

		if words[0] in ("config", "menuconfig"):
			config = words[1]
			description = ""
		elif words[0] in ("bool", "boolean", "tristate", "string", "hex", "int"):
			 configtype = htmlescape(zapquotes(words[0]))
			 if len(words)>1: description = htmlescape(zapquotes(words[1]))
		elif words[0]=="prompt":
			description = htmlescape(zapquotes(words[1]))
		elif words[0] in ("help", "---help---"):
			sys.stdout.write("|- bgcolor=\"#eeeeee\"\n")
			sys.stdout.write("| %s || %s || %s || %s || \n" % (config,source,configtype,description) )
			helplen = len(i[:i.find(words[0])].expandtabs())
		elif words[0] == "comment":
			sys.stdout.write("|- bgcolor=\"#eeeeee\"\n")
			sys.stdout.write("| || || (comment) || || %s ||\n" % htmlescape(zapquotes(words[1])))
		elif words[0]=="menu":
			if len(words)>1:
				temp = htmlescape(zapquotes(words[1]))
				if extra_chapters:
					sys.stdout.write("== Menu: %s ==\n" % temp)
					sys.stdout.write("{| border=\"0\" style=\"font-size: smaller\"\n");
					sys.stdout.write("|- bgcolor=\"#6699dd\"\n")
					sys.stdout.write("! align=\"left\" | Option\n")
					sys.stdout.write("! align=\"left\" | Source\n")
					sys.stdout.write("! align=\"left\" | Format\n")
					sys.stdout.write("! align=\"left\" | Short&nbsp;Description\n")
					sys.stdout.write("! align=\"left\" | Description\n")
				else:
					# Don't start an extra chapter for a
					# new menu
					sys.stdout.write("|- bgcolor=\"#6699dd\"\n")
					sys.stdout.write("! align=\"left\" | Menu: %s || || || ||\n" % temp)
		elif words[0] == "endmenu":
			if extra_chapters:
				sys.stdout.write("|}\n")
			sys.stdout.write("\n")
		elif words[0] == "source":
			fn=zapquotes(words[1])
			readfile(fn)
		elif words[0] in ("default","depends", "select", "if", "endif", "#"): pass
		#else: sys.stderr.write("unknown: %s\n" % i)
	if helplen: sys.stdout.write("||\n")

def main():
	import sys, time

	if len(sys.argv)!=3:
		sys.stderr.write("Usage: kconfig2wiki kconfigfile version\n")
		sys.exit(1)

	sys.stdout.write("This is an automatically generated list of '''coreboot compile-time options'''.\n")
	sys.stdout.write("\nLast update: %s. (r%s)\n" % (time.strftime('%Y/%m/%d %H:%M:%S'),sys.argv[2]))
	sys.stdout.write("{| border=\"0\" style=\"font-size: smaller\"\n");
	sys.stdout.write("|- bgcolor=\"#6699dd\"\n")
	sys.stdout.write("! align=\"left\" | Option\n")
	sys.stdout.write("! align=\"left\" | Source\n")
	sys.stdout.write("! align=\"left\" | Format\n")
	sys.stdout.write("! align=\"left\" | Short&nbsp;Description\n")
	sys.stdout.write("! align=\"left\" | Description\n")
	readfile(sys.argv[1])
	sys.stdout.write("|}\n")

if __name__ == "__main__":
	main()
