#!/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. # 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("&","&").replace("<","<").replace(">",">") ## ## 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 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. (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 Description\n") sys.stdout.write("! align=\"left\" | Description\n") readfile(sys.argv[1]) sys.stdout.write("|}\n") if __name__ == "__main__": main()