#!/usr/bin/env python
#
# kconfig2wiki - Kconfig to MediaWiki converter for
# https://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.
#

import glob

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])
			for name in glob.glob(fn):
				readfile(name)
		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\n" % 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()
