Blame src/configgen.py

Packit Service 50c9f2
#!/usr/bin/python
Packit Service 50c9f2
# python script to generate configoptions.cpp and config.doc from config.xml
Packit Service 50c9f2
#
Packit Service 50c9f2
# Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit Service 50c9f2
#
Packit Service 50c9f2
# Permission to use, copy, modify, and distribute this software and its
Packit Service 50c9f2
# documentation under the terms of the GNU General Public License is hereby
Packit Service 50c9f2
# granted. No representations are made about the suitability of this software
Packit Service 50c9f2
# for any purpose. It is provided "as is" without express or implied warranty.
Packit Service 50c9f2
# See the GNU General Public License for more details.
Packit Service 50c9f2
#
Packit Service 50c9f2
# Documents produced by Doxygen are derivative works derived from the
Packit Service 50c9f2
# input used in their production; they are not affected by this license.
Packit Service 50c9f2
#
Packit Service 50c9f2
import xml.dom.minidom
Packit Service 50c9f2
import sys
Packit Service 50c9f2
import re
Packit Service 50c9f2
import textwrap
Packit Service 50c9f2
from xml.dom import minidom, Node
Packit Service 50c9f2
Packit Service 50c9f2
def transformDocs(doc):
Packit Service 50c9f2
	# join lines, unless it is an empty line
Packit Service 50c9f2
	# remove doxygen layout constructs
Packit Service 50c9f2
	doc = doc.strip()
Packit Service 50c9f2
	doc = doc.replace("\n", " ")
Packit Service 50c9f2
	doc = doc.replace("\r", " ")
Packit Service 50c9f2
	doc = doc.replace("\t", " ")
Packit Service 50c9f2
	doc = doc.replace("\\&", "&")
Packit Service 50c9f2
	doc = doc.replace("(\\c ", "(")
Packit Service 50c9f2
	doc = doc.replace("\\c ", " ")
Packit Service 50c9f2
	doc = doc.replace("\\b ", " ")
Packit Service 50c9f2
	doc = doc.replace("\\e ", " ")
Packit Service 50c9f2
	doc = doc.replace("\\$", "$")
Packit Service 50c9f2
	doc = doc.replace("\\#include ", "#include ")
Packit Service 50c9f2
	doc = doc.replace("\\#undef ", "#undef ")
Packit Service 50c9f2
	doc = doc.replace("-# ", "\n - ")
Packit Service 50c9f2
	doc = doc.replace(" - ", "\n - ")
Packit Service 50c9f2
	doc = doc.replace("\\sa", "\nSee also: ")
Packit Service 50c9f2
	doc = doc.replace("\\par", "\n")
Packit Service 50c9f2
	doc = doc.replace("@note", "\nNote:")
Packit Service 50c9f2
	doc = doc.replace("\\note", "\nNote:")
Packit Service 50c9f2
	doc = doc.replace("\\verbatim", "\n")
Packit Service 50c9f2
	doc = doc.replace("\\endverbatim", "\n")
Packit Service 50c9f2
	doc = doc.replace("", "")
Packit Service 50c9f2
	doc = doc.replace("", "")
Packit Service 50c9f2
	doc = doc.replace("`", "")
Packit Service 50c9f2
	doc = doc.replace("\\<", "<")
Packit Service 50c9f2
	doc = doc.replace("\\>", ">")
Packit Service 50c9f2
	doc = doc.replace("\\@", "@")
Packit Service 50c9f2
	doc = doc.replace("\\\\", "\\")
Packit Service 50c9f2
	# \ref name "description" -> description
Packit Service 50c9f2
	doc = re.sub('\\\\ref +[^ ]* +"([^"]*)"', '\\1', doc)
Packit Service 50c9f2
	# \ref specials
Packit Service 50c9f2
	# \ref <key> -> description
Packit Service 50c9f2
	doc = re.sub('\\\\ref +doxygen_usage', '"Doxygen usage"', doc)
Packit Service 50c9f2
	doc = re.sub('\\\\ref +extsearch', '"External Indexing and Searching"',
Packit Service 50c9f2
				 doc)
Packit Service 50c9f2
	doc = re.sub('\\\\ref +external', '"Linking to external documentation"',
Packit Service 50c9f2
				 doc)
Packit Service 50c9f2
	# fallback for not handled
Packit Service 50c9f2
	doc = re.sub('\\\\ref', '', doc)
Packit Service 50c9f2
	#description -> description (see: address)
Packit Service 50c9f2
	doc = re.sub('([^<]*)', '\\2 (see: \\1)', doc)
Packit Service 50c9f2
	# LaTeX name as formula -> LaTeX
Packit Service 50c9f2
	doc = doc.replace("\\f$\\mbox{\\LaTeX}\\f$", "LaTeX")
Packit Service 50c9f2
	# Other formula's (now just 2) so explicitly mentioned.
Packit Service 50c9f2
	doc = doc.replace("\\f$2^{(16+\\mbox{LOOKUP\\_CACHE\\_SIZE})}\\f$",
Packit Service 50c9f2
					  "2^(16+LOOKUP_CACHE_SIZE)")
Packit Service 50c9f2
	doc = doc.replace("\\f$2^{16} = 65536\\f$", "2^16=65536")
Packit Service 50c9f2
	# remove consecutive spaces
Packit Service 50c9f2
	doc = re.sub(" +", " ", doc)
Packit Service 50c9f2
	# a dirty trick to get an extra empty line in Doxyfile documentation.
Packit Service 50c9f2
	# 
will be removed later on again, we need it here otherwise splitlines
Packit Service 50c9f2
	# will filter the extra line.
Packit Service 50c9f2
	doc = doc.replace("
", "\n
\n")
Packit Service 50c9f2
	# a dirty trick to go to the next line in Doxyfile documentation.
Packit Service 50c9f2
	# 
will be removed later on again, we need it here otherwise splitlines
Packit Service 50c9f2
	# will filter the line break.
Packit Service 50c9f2
	doc = doc.replace("
", "\n
\n")
Packit Service 50c9f2
	#
Packit Service 50c9f2
	doc = doc.splitlines()
Packit Service 50c9f2
	split_doc = []
Packit Service 50c9f2
	for line in doc:
Packit Service 50c9f2
		split_doc += textwrap.wrap(line, 78)
Packit Service 50c9f2
	# replace \ by \\, replace " by \", and '  ' by a newline with end string
Packit Service 50c9f2
	# and start string at next line
Packit Service 50c9f2
	docC = []
Packit Service 50c9f2
	for line in split_doc:
Packit Service 50c9f2
		if (line.strip() != "
"):
Packit Service 50c9f2
			docC.append(line.strip().replace('\\', '\\\\').
Packit Service 50c9f2
					replace('"', '\\"').replace("
", ""))
Packit Service 50c9f2
	return docC
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def collectValues(node):
Packit Service 50c9f2
	values = []
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if (n.nodeName == "value"):
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if n.getAttribute('name') != "":
Packit Service 50c9f2
					if n.getAttribute('show_docu') != "NO":
Packit Service 50c9f2
						name = "" + n.getAttribute('name') + ""
Packit Service 50c9f2
						desc = n.getAttribute('desc')
Packit Service 50c9f2
						if (desc != ""):
Packit Service 50c9f2
							name += " " + desc
Packit Service 50c9f2
						values.append(name)
Packit Service 50c9f2
	return values
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def addValues(var, node):
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if (n.nodeName == "value"):
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				name = n.getAttribute('name')
Packit Service 50c9f2
				print("  %s->addValue(\"%s\");" % (var, name))
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseHeader(node,objName):
Packit Service 50c9f2
	doc = ""
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			if (n.nodeName == "docs"):
Packit Service 50c9f2
				if (n.getAttribute('doxyfile') != "0"):
Packit Service 50c9f2
					doc += parseDocs(n)
Packit Service 50c9f2
	docC = transformDocs(doc)
Packit Service 50c9f2
	print("  %s->setHeader(" % (objName))
Packit Service 50c9f2
	rng = len(docC)
Packit Service 50c9f2
	for i in range(rng):
Packit Service 50c9f2
		line = docC[i]
Packit Service 50c9f2
		if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
			print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
		else:
Packit Service 50c9f2
			print("              \"%s\"" % (line))
Packit Service 50c9f2
	print("             );")
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def prepCDocs(node):
Packit Service 50c9f2
	type = node.getAttribute('type')
Packit Service 50c9f2
	format = node.getAttribute('format')
Packit Service 50c9f2
	defval = node.getAttribute('defval')
Packit Service 50c9f2
	adefval = node.getAttribute('altdefval')
Packit Service 50c9f2
	doc = "";
Packit Service 50c9f2
	if (type != 'obsolete'):
Packit Service 50c9f2
		for n in node.childNodes:
Packit Service 50c9f2
			if (n.nodeName == "docs"):
Packit Service 50c9f2
				if (n.getAttribute('doxyfile') != "0"):
Packit Service 50c9f2
					if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
						doc += parseDocs(n)
Packit Service 50c9f2
		if (type == 'enum'):
Packit Service 50c9f2
			values = collectValues(node)
Packit Service 50c9f2
			doc += "
Possible values are: "
Packit Service 50c9f2
			rng = len(values)
Packit Service 50c9f2
			for i in range(rng):
Packit Service 50c9f2
				val = values[i]
Packit Service 50c9f2
				if i == rng - 2:
Packit Service 50c9f2
					doc += "%s and " % (val)
Packit Service 50c9f2
				elif i == rng - 1:
Packit Service 50c9f2
					doc += "%s." % (val)
Packit Service 50c9f2
				else:
Packit Service 50c9f2
					doc += "%s, " % (val)
Packit Service 50c9f2
			if (defval != ""):
Packit Service 50c9f2
				doc += "
The default value is: %s." % (defval)
Packit Service 50c9f2
		elif (type == 'int'):
Packit Service 50c9f2
			minval = node.getAttribute('minval')
Packit Service 50c9f2
			maxval = node.getAttribute('maxval')
Packit Service 50c9f2
			doc += "
%s: %s, %s: %s, %s: %s." % (" Minimum value", minval,
Packit Service 50c9f2
					 "maximum value", maxval,
Packit Service 50c9f2
					 "default value", defval)
Packit Service 50c9f2
		elif (type == 'bool'):
Packit Service 50c9f2
			if (node.hasAttribute('altdefval')):
Packit Service 50c9f2
			  doc += "
%s: %s." % ("The default value is", "system dependent")
Packit Service 50c9f2
			else:
Packit Service 50c9f2
			  doc += "
%s: %s." % ("The default value is", "YES" if (defval == "1") else "NO")
Packit Service 50c9f2
		elif (type == 'list'):
Packit Service 50c9f2
			if format == 'string':
Packit Service 50c9f2
				values = collectValues(node)
Packit Service 50c9f2
				rng = len(values)
Packit Service 50c9f2
				for i in range(rng):
Packit Service 50c9f2
					val = values[i]
Packit Service 50c9f2
					if i == rng - 2:
Packit Service 50c9f2
						doc += "%s and " % (val)
Packit Service 50c9f2
					elif i == rng - 1:
Packit Service 50c9f2
						doc += "%s." % (val)
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						doc += "%s, " % (val)
Packit Service 50c9f2
		elif (type == 'string'):
Packit Service 50c9f2
			if format == 'dir':
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					doc += "
The default directory is: %s." % (
Packit Service 50c9f2
						defval)
Packit Service 50c9f2
			elif format == 'file':
Packit Service 50c9f2
				abspath = node.getAttribute('abspath')
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					if abspath != '1':
Packit Service 50c9f2
						doc += "
The default file is: %s." % (
Packit Service 50c9f2
							defval)
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						doc += "
%s: %s%s%s." % (
Packit Service 50c9f2
							"The default file (with absolute path) is",
Packit Service 50c9f2
							"",defval,"")
Packit Service 50c9f2
				else:
Packit Service 50c9f2
					if abspath == '1':
Packit Service 50c9f2
						doc += "
The file has to be specified with full path."
Packit Service 50c9f2
			elif format =='image':
Packit Service 50c9f2
				abspath = node.getAttribute('abspath')
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					if abspath != '1':
Packit Service 50c9f2
						doc += "
The default image is: %s." % (
Packit Service 50c9f2
							defval)
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						doc += "
%s: %s%s%s." % (
Packit Service 50c9f2
							"The default image (with absolute path) is",
Packit Service 50c9f2
							"",defval,"")
Packit Service 50c9f2
				else:
Packit Service 50c9f2
					if abspath == '1':
Packit Service 50c9f2
						doc += "
The image has to be specified with full path."
Packit Service 50c9f2
			else: # format == 'string':
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					doc += "
The default value is: %s." % (
Packit Service 50c9f2
						defval)
Packit Service 50c9f2
		# depends handling
Packit Service 50c9f2
		if (node.hasAttribute('depends')):
Packit Service 50c9f2
			depends = node.getAttribute('depends')
Packit Service 50c9f2
			doc += "
%s \\ref cfg_%s \"%s\" is set to \\c YES." % (
Packit Service 50c9f2
				"This tag requires that the tag", depends.lower(), depends.upper())
Packit Service 50c9f2
Packit Service 50c9f2
	docC = transformDocs(doc)
Packit Service 50c9f2
	return docC;
Packit Service 50c9f2
Packit Service 50c9f2
def parseOption(node):
Packit Service 50c9f2
	# Handling part for Doxyfile
Packit Service 50c9f2
	name = node.getAttribute('id')
Packit Service 50c9f2
	type = node.getAttribute('type')
Packit Service 50c9f2
	format = node.getAttribute('format')
Packit Service 50c9f2
	defval = node.getAttribute('defval')
Packit Service 50c9f2
	adefval = node.getAttribute('altdefval')
Packit Service 50c9f2
	depends = node.getAttribute('depends')
Packit Service 50c9f2
	setting = node.getAttribute('setting')
Packit Service 50c9f2
	docC = prepCDocs(node);
Packit Service 50c9f2
	if len(setting) > 0:
Packit Service 50c9f2
		print("#if %s" % (setting))
Packit Service 50c9f2
	print("  //----")
Packit Service 50c9f2
	if type == 'bool':
Packit Service 50c9f2
		if len(adefval) > 0:
Packit Service 50c9f2
			enabled = adefval
Packit Service 50c9f2
		elif defval == '1':
Packit Service 50c9f2
			enabled = "TRUE"
Packit Service 50c9f2
		else:
Packit Service 50c9f2
			enabled = "FALSE"
Packit Service 50c9f2
		print("  cb = cfg->addBool(")
Packit Service 50c9f2
		print("             \"%s\"," % (name))
Packit Service 50c9f2
		rng = len(docC)
Packit Service 50c9f2
		for i in range(rng):
Packit Service 50c9f2
			line = docC[i]
Packit Service 50c9f2
			if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
				print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
			else:
Packit Service 50c9f2
				print("              \"%s\"," % (line))
Packit Service 50c9f2
		print("              %s" % (enabled))
Packit Service 50c9f2
		print("             );")
Packit Service 50c9f2
		if depends != '':
Packit Service 50c9f2
			print("  cb->addDependency(\"%s\");" % (depends))
Packit Service 50c9f2
	elif type == 'string':
Packit Service 50c9f2
		print("  cs = cfg->addString(")
Packit Service 50c9f2
		print("              \"%s\"," % (name))
Packit Service 50c9f2
		rng = len(docC)
Packit Service 50c9f2
		for i in range(rng):
Packit Service 50c9f2
			line = docC[i]
Packit Service 50c9f2
			if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
				print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
			else:
Packit Service 50c9f2
				print("              \"%s\"" % (line))
Packit Service 50c9f2
		print("             );")
Packit Service 50c9f2
		if defval != '':
Packit Service 50c9f2
			print("  cs->setDefaultValue(\"%s\");" % (defval))
Packit Service 50c9f2
		if format == 'file':
Packit Service 50c9f2
			print("  cs->setWidgetType(ConfigString::File);")
Packit Service 50c9f2
		elif format == 'image':
Packit Service 50c9f2
			print("  cs->setWidgetType(ConfigString::Image);")
Packit Service 50c9f2
		elif format == 'dir':
Packit Service 50c9f2
			print("  cs->setWidgetType(ConfigString::Dir);")
Packit Service 50c9f2
		if depends != '':
Packit Service 50c9f2
			print("  cs->addDependency(\"%s\");" % (depends))
Packit Service 50c9f2
	elif type == 'enum':
Packit Service 50c9f2
		print("  ce = cfg->addEnum(")
Packit Service 50c9f2
		print("              \"%s\"," % (name))
Packit Service 50c9f2
		rng = len(docC)
Packit Service 50c9f2
		for i in range(rng):
Packit Service 50c9f2
			line = docC[i]
Packit Service 50c9f2
			if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
				print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
			else:
Packit Service 50c9f2
				print("              \"%s\"," % (line))
Packit Service 50c9f2
		print("              \"%s\"" % (defval))
Packit Service 50c9f2
		print("             );")
Packit Service 50c9f2
		addValues("ce", node)
Packit Service 50c9f2
		if depends != '':
Packit Service 50c9f2
			print("  ce->addDependency(\"%s\");" % (depends))
Packit Service 50c9f2
	elif type == 'int':
Packit Service 50c9f2
		minval = node.getAttribute('minval')
Packit Service 50c9f2
		maxval = node.getAttribute('maxval')
Packit Service 50c9f2
		print("  ci = cfg->addInt(")
Packit Service 50c9f2
		print("              \"%s\"," % (name))
Packit Service 50c9f2
		rng = len(docC)
Packit Service 50c9f2
		for i in range(rng):
Packit Service 50c9f2
			line = docC[i]
Packit Service 50c9f2
			if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
				print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
			else:
Packit Service 50c9f2
				print("              \"%s\"," % (line))
Packit Service 50c9f2
		print("              %s,%s,%s" % (minval, maxval, defval))
Packit Service 50c9f2
		print("             );")
Packit Service 50c9f2
		if depends != '':
Packit Service 50c9f2
			print("  ci->addDependency(\"%s\");" % (depends))
Packit Service 50c9f2
	elif type == 'list':
Packit Service 50c9f2
		print("  cl = cfg->addList(")
Packit Service 50c9f2
		print("              \"%s\"," % (name))
Packit Service 50c9f2
		rng = len(docC)
Packit Service 50c9f2
		for i in range(rng):
Packit Service 50c9f2
			line = docC[i]
Packit Service 50c9f2
			if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
				print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
			else:
Packit Service 50c9f2
				print("              \"%s\"" % (line))
Packit Service 50c9f2
		print("             );")
Packit Service 50c9f2
		addValues("cl", node)
Packit Service 50c9f2
		if depends != '':
Packit Service 50c9f2
			print("  cl->addDependency(\"%s\");" % (depends))
Packit Service 50c9f2
		if format == 'file':
Packit Service 50c9f2
			print("  cl->setWidgetType(ConfigList::File);")
Packit Service 50c9f2
		elif format == 'dir':
Packit Service 50c9f2
			print("  cl->setWidgetType(ConfigList::Dir);")
Packit Service 50c9f2
		elif format == 'filedir':
Packit Service 50c9f2
			print("  cl->setWidgetType(ConfigList::FileAndDir);")
Packit Service 50c9f2
	elif type == 'obsolete':
Packit Service 50c9f2
		print("  cfg->addObsolete(\"%s\");" % (name))
Packit Service 50c9f2
	if len(setting) > 0:
Packit Service 50c9f2
		print("#else")
Packit Service 50c9f2
		print("  cfg->addDisabled(\"%s\");" % (name))
Packit Service 50c9f2
		print("#endif")
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroups(node):
Packit Service 50c9f2
	name = node.getAttribute('name')
Packit Service 50c9f2
	doc = node.getAttribute('docs')
Packit Service 50c9f2
	print("%s%s" % ("  //-----------------------------------------",
Packit Service 50c9f2
					"----------------------------------"))
Packit Service 50c9f2
	print("  cfg->addInfo(\"%s\",\"%s\");" % (name, doc))
Packit Service 50c9f2
	print("%s%s" % ("  //-----------------------------------------",
Packit Service 50c9f2
					"----------------------------------"))
Packit Service 50c9f2
	print("")
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			parseOption(n)
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroupMap(node):
Packit Service 50c9f2
	map = { 'bool':'bool', 'string':'QCString', 'enum':'QCString', 'int':'int', 'list':'QStrList' }
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			setting = n.getAttribute('setting')
Packit Service 50c9f2
			if len(setting) > 0:
Packit Service 50c9f2
				print("#if %s" % (setting))
Packit Service 50c9f2
			type = n.getAttribute('type')
Packit Service 50c9f2
			name = n.getAttribute('id')
Packit Service 50c9f2
			if type in map:
Packit Service 50c9f2
				print("    %-8s %s;" % (map[type],name))
Packit Service 50c9f2
			if len(setting) > 0:
Packit Service 50c9f2
				print("#endif")
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroupInit(node):
Packit Service 50c9f2
	map = { 'bool':'Bool', 'string':'String', 'enum':'Enum', 'int':'Int', 'list':'List' }
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			setting = n.getAttribute('setting')
Packit Service 50c9f2
			if len(setting) > 0:
Packit Service 50c9f2
				print("#if %s" % (setting))
Packit Service 50c9f2
			type = n.getAttribute('type')
Packit Service 50c9f2
			name = n.getAttribute('id')
Packit Service 50c9f2
			if type in map:
Packit Service 50c9f2
				print("  %-25s = ConfigImpl::instance()->get%s(__FILE__,__LINE__,\"%s\");" % (name,map[type],name))
Packit Service 50c9f2
			if len(setting) > 0:
Packit Service 50c9f2
				print("#endif")
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroupMapInit(node):
Packit Service 50c9f2
	map = { 'bool':'Bool', 'string':'String', 'enum':'String', 'int':'Int', 'list':'List' }
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			setting = n.getAttribute('setting')
Packit Service 50c9f2
			if len(setting) > 0:
Packit Service 50c9f2
				print("#if %s" % (setting))
Packit Service 50c9f2
			type = n.getAttribute('type')
Packit Service 50c9f2
			name = n.getAttribute('id')
Packit Service 50c9f2
			if type in map:
Packit Service 50c9f2
				print("  m_map.insert(\"%s\",new Info%s(&ConfigValues::%s));" % (name,map[type],name))
Packit Service 50c9f2
			if len(setting) > 0:
Packit Service 50c9f2
				print("#endif")
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroupCDocs(node):
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			type = n.getAttribute('type')
Packit Service 50c9f2
			name = n.getAttribute('id')
Packit Service 50c9f2
			docC = prepCDocs(n);
Packit Service 50c9f2
			if type != 'obsolete':
Packit Service 50c9f2
				print("  doc->add(")
Packit Service 50c9f2
				print("              \"%s\"," % (name))
Packit Service 50c9f2
				rng = len(docC)
Packit Service 50c9f2
				for i in range(rng):
Packit Service 50c9f2
					line = docC[i]
Packit Service 50c9f2
					if i != rng - 1:  # since we go from 0 to rng-1
Packit Service 50c9f2
						print("              \"%s\\n\"" % (line))
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						print("              \"%s\"" % (line))
Packit Service 50c9f2
				print("          );")
Packit Service 50c9f2
Packit Service 50c9f2
def parseOptionDoc(node, first):
Packit Service 50c9f2
	# Handling part for documentation
Packit Service 50c9f2
	name = node.getAttribute('id')
Packit Service 50c9f2
	type = node.getAttribute('type')
Packit Service 50c9f2
	format = node.getAttribute('format')
Packit Service 50c9f2
	defval = node.getAttribute('defval')
Packit Service 50c9f2
	adefval = node.getAttribute('altdefval')
Packit Service 50c9f2
	depends = node.getAttribute('depends')
Packit Service 50c9f2
	setting = node.getAttribute('setting')
Packit Service 50c9f2
	doc = ""
Packit Service 50c9f2
	if (type != 'obsolete'):
Packit Service 50c9f2
		for n in node.childNodes:
Packit Service 50c9f2
			if (n.nodeName == "docs"):
Packit Service 50c9f2
				if (n.getAttribute('documentation') != "0"):
Packit Service 50c9f2
					if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
						doc += parseDocs(n)
Packit Service 50c9f2
		if (first):
Packit Service 50c9f2
			print(" \\anchor cfg_%s" % (name.lower()))
Packit Service 50c9f2
			print("
")
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			print("
\\c %s
" % (name))
Packit Service 50c9f2
		else:
Packit Service 50c9f2
			print(" \\anchor cfg_%s" % (name.lower()))
Packit Service 50c9f2
			print("
\\c %s
" % (name))
Packit Service 50c9f2
		print(" \\addindex %s" % (name))
Packit Service 50c9f2
		print(doc)
Packit Service 50c9f2
		if (type == 'enum'):
Packit Service 50c9f2
			values = collectValues(node)
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			print("Possible values are: ")
Packit Service 50c9f2
			rng = len(values)
Packit Service 50c9f2
			for i in range(rng):
Packit Service 50c9f2
				val = values[i]
Packit Service 50c9f2
				if i == rng - 2:
Packit Service 50c9f2
					print("%s and " % (val))
Packit Service 50c9f2
				elif i == rng - 1:
Packit Service 50c9f2
					print("%s." % (val))
Packit Service 50c9f2
				else:
Packit Service 50c9f2
					print("%s, " % (val))
Packit Service 50c9f2
			if (defval != ""):
Packit Service 50c9f2
				print("")
Packit Service 50c9f2
				print("")
Packit Service 50c9f2
				print("The default value is: %s." % (defval))
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
		elif (type == 'int'):
Packit Service 50c9f2
			minval = node.getAttribute('minval')
Packit Service 50c9f2
			maxval = node.getAttribute('maxval')
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			print("%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % (
Packit Service 50c9f2
					 " Minimum value", "", minval, "", 
Packit Service 50c9f2
					 "maximum value", "", maxval, "",
Packit Service 50c9f2
					 "default value", "", defval, ""))
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
		elif (type == 'bool'):
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			if (node.hasAttribute('altdefval')):
Packit Service 50c9f2
				print("The default value is: system dependent.")
Packit Service 50c9f2
			else:
Packit Service 50c9f2
				print("The default value is: %s." % (
Packit Service 50c9f2
					"YES" if (defval == "1") else "NO"))
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
		elif (type == 'list'):
Packit Service 50c9f2
			if format == 'string':
Packit Service 50c9f2
				values = collectValues(node)
Packit Service 50c9f2
				rng = len(values)
Packit Service 50c9f2
				for i in range(rng):
Packit Service 50c9f2
					val = values[i]
Packit Service 50c9f2
					if i == rng - 2:
Packit Service 50c9f2
						print("%s and " % (val))
Packit Service 50c9f2
					elif i == rng - 1:
Packit Service 50c9f2
						print("%s." % (val))
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						print("%s, " % (val))
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
		elif (type == 'string'):
Packit Service 50c9f2
			if format == 'dir':
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					print("")
Packit Service 50c9f2
					print("The default directory is: %s." % (
Packit Service 50c9f2
						defval))
Packit Service 50c9f2
			elif format == 'file':
Packit Service 50c9f2
				abspath = node.getAttribute('abspath')
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					print("")
Packit Service 50c9f2
					if abspath != '1':
Packit Service 50c9f2
						print("The default file is: %s." % (
Packit Service 50c9f2
							defval))
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						print("%s: %s%s%s." % (
Packit Service 50c9f2
							"The default file (with absolute path) is",
Packit Service 50c9f2
							"",defval,""))
Packit Service 50c9f2
				else:
Packit Service 50c9f2
					if abspath == '1':
Packit Service 50c9f2
						print("")
Packit Service 50c9f2
						print("The file has to be specified with full path.")
Packit Service 50c9f2
			elif format =='image':
Packit Service 50c9f2
				abspath = node.getAttribute('abspath')
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					print("")
Packit Service 50c9f2
					if abspath != '1':
Packit Service 50c9f2
						print("The default image is: %s." % (
Packit Service 50c9f2
							defval))
Packit Service 50c9f2
					else:
Packit Service 50c9f2
						print("%s: %s%s%s." % (
Packit Service 50c9f2
							"The default image (with absolute path) is",
Packit Service 50c9f2
							"",defval,""))
Packit Service 50c9f2
				else:
Packit Service 50c9f2
					if abspath == '1':
Packit Service 50c9f2
						print("")
Packit Service 50c9f2
						print("The image has to be specified with full path.")
Packit Service 50c9f2
			else: # format == 'string':
Packit Service 50c9f2
				if defval != '':
Packit Service 50c9f2
					print("")
Packit Service 50c9f2
					print("The default value is: %s." % (
Packit Service 50c9f2
						defval))
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
		# depends handling
Packit Service 50c9f2
		if (node.hasAttribute('depends')):
Packit Service 50c9f2
			depends = node.getAttribute('depends')
Packit Service 50c9f2
			print("")
Packit Service 50c9f2
			print("%s \\ref cfg_%s \"%s\" is set to \\c YES." % (
Packit Service 50c9f2
				"This tag requires that the tag", depends.lower(), depends.upper()))
Packit Service 50c9f2
		return False
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroupsDoc(node):
Packit Service 50c9f2
	name = node.getAttribute('name')
Packit Service 50c9f2
	doc = node.getAttribute('docs')
Packit Service 50c9f2
	print("\section config_%s %s" % (name.lower(), doc))
Packit Service 50c9f2
	# Start of list has been moved to the first option for better
Packit Service 50c9f2
	# anchor placement
Packit Service 50c9f2
	#  print "
"
Packit Service 50c9f2
	#  print ""
Packit Service 50c9f2
	first = True
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			first = parseOptionDoc(n, first)
Packit Service 50c9f2
	if (not first):
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseGroupsList(node, commandsList):
Packit Service 50c9f2
	list = ()
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			type = n.getAttribute('type')
Packit Service 50c9f2
			if type != 'obsolete':
Packit Service 50c9f2
				commandsList = commandsList + (n.getAttribute('id'),)
Packit Service 50c9f2
	return commandsList
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseDocs(node):
Packit Service 50c9f2
	doc = ""
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.TEXT_NODE:
Packit Service 50c9f2
			doc += n.nodeValue.strip()
Packit Service 50c9f2
		if n.nodeType == Node.CDATA_SECTION_NODE:
Packit Service 50c9f2
			doc += n.nodeValue.rstrip("\r\n ").lstrip("\r\n")
Packit Service 50c9f2
	#doc += "
"
Packit Service 50c9f2
	return doc
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseHeaderDoc(node):
Packit Service 50c9f2
	doc = ""
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			if (n.nodeName == "docs"):
Packit Service 50c9f2
				if (n.getAttribute('documentation') != "0"):
Packit Service 50c9f2
					doc += parseDocs(n)
Packit Service 50c9f2
	print(doc)
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def parseFooterDoc(node):
Packit Service 50c9f2
	doc = ""
Packit Service 50c9f2
	for n in node.childNodes:
Packit Service 50c9f2
		if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
			if (n.nodeName == "docs"):
Packit Service 50c9f2
				if (n.getAttribute('documentation') != "0"):
Packit Service 50c9f2
					doc += parseDocs(n)
Packit Service 50c9f2
	print(doc)
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
def main():
Packit Service 50c9f2
	if len(sys.argv)<3 or (not sys.argv[1] in ['-doc','-cpp','-wiz','-maph','-maps']):
Packit Service 50c9f2
		sys.exit('Usage: %s -doc|-cpp|-wiz|-maph|-maps config.xml' % sys.argv[0])
Packit Service 50c9f2
	try:
Packit Service 50c9f2
		doc = xml.dom.minidom.parse(sys.argv[2])
Packit Service 50c9f2
	except Exception as inst:
Packit Service 50c9f2
		sys.stdout = sys.stderr
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print(inst)
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		sys.exit(1)
Packit Service 50c9f2
	elem = doc.documentElement
Packit Service 50c9f2
	if (sys.argv[1] == "-doc"):
Packit Service 50c9f2
		print("/* WARNING: This file is generated!")
Packit Service 50c9f2
		print(" * Do not edit this file, but edit config.xml instead and run")
Packit Service 50c9f2
		print(" * python configgen.py -doc config.xml to regenerate this file!")
Packit Service 50c9f2
		print(" */")
Packit Service 50c9f2
		# process header
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "header"):
Packit Service 50c9f2
					parseHeaderDoc(n)
Packit Service 50c9f2
		# generate list with all commands
Packit Service 50c9f2
		commandsList = ()
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					commandsList = parseGroupsList(n, commandsList)
Packit Service 50c9f2
		print("\\secreflist")
Packit Service 50c9f2
		for x in sorted(commandsList):
Packit Service 50c9f2
			print("\\refitem cfg_%s %s" % (x.lower(), x))
Packit Service 50c9f2
		print("\\endsecreflist")
Packit Service 50c9f2
		# process groups and options
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					parseGroupsDoc(n)
Packit Service 50c9f2
		# process footers
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "footer"):
Packit Service 50c9f2
					parseFooterDoc(n)
Packit Service 50c9f2
	elif (sys.argv[1] == "-maph"):
Packit Service 50c9f2
		print("/* WARNING: This file is generated!")
Packit Service 50c9f2
		print(" * Do not edit this file, but edit config.xml instead and run")
Packit Service 50c9f2
		print(" * python configgen.py -map config.xml to regenerate this file!")
Packit Service 50c9f2
		print(" */")
Packit Service 50c9f2
		print("#ifndef CONFIGVALUES_H")
Packit Service 50c9f2
		print("#define CONFIGVALUES_H")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("#include <qdict.h>")
Packit Service 50c9f2
		print("#include <qstrlist.h>")
Packit Service 50c9f2
		print("#include <qcstring.h>")
Packit Service 50c9f2
		print("#include \"settings.h\"")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("class ConfigValues")
Packit Service 50c9f2
		print("{")
Packit Service 50c9f2
		print("  public:")
Packit Service 50c9f2
		print("    static ConfigValues &instance() { static ConfigValues theInstance; return theInstance; }")
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					parseGroupMap(n)
Packit Service 50c9f2
		print("    void init();")
Packit Service 50c9f2
		print("    struct Info")
Packit Service 50c9f2
		print("    {")
Packit Service 50c9f2
		print("      enum Type { Bool, Int, String, List, Unknown };")
Packit Service 50c9f2
		print("      Info(Type t) : type(t) {}")
Packit Service 50c9f2
		print("      virtual ~Info() {}")
Packit Service 50c9f2
		print("      Type type;")
Packit Service 50c9f2
		print("    };")
Packit Service 50c9f2
		print("    struct InfoBool : public Info")
Packit Service 50c9f2
		print("    {")
Packit Service 50c9f2
		print("      InfoBool(bool ConfigValues::*ptm) : Info(Info::Bool), item(ptm) {}")
Packit Service 50c9f2
		print("      bool ConfigValues::*item;")
Packit Service 50c9f2
		print("    };")
Packit Service 50c9f2
		print("    struct InfoInt : public Info")
Packit Service 50c9f2
		print("    {")
Packit Service 50c9f2
		print("      InfoInt(int ConfigValues::*ptm) : Info(Info::Int), item(ptm) {}")
Packit Service 50c9f2
		print("      int ConfigValues::*item;")
Packit Service 50c9f2
		print("    };")
Packit Service 50c9f2
		print("    struct InfoString : public Info")
Packit Service 50c9f2
		print("    {")
Packit Service 50c9f2
		print("      InfoString(QCString ConfigValues::*ptm) : Info(Info::String), item(ptm) {}")
Packit Service 50c9f2
		print("      QCString ConfigValues::*item;")
Packit Service 50c9f2
		print("    };")
Packit Service 50c9f2
		print("    struct InfoList : public Info")
Packit Service 50c9f2
		print("    {")
Packit Service 50c9f2
		print("      InfoList(QStrList ConfigValues::*ptm) : Info(Info::List), item(ptm) {}")
Packit Service 50c9f2
		print("      QStrList ConfigValues::*item;")
Packit Service 50c9f2
		print("    };")
Packit Service 50c9f2
		print("    const Info *get(const char *tag) const")
Packit Service 50c9f2
		print("    {")
Packit Service 50c9f2
		print("      return m_map.find(tag);")
Packit Service 50c9f2
		print("    }")
Packit Service 50c9f2
		print("  private:")
Packit Service 50c9f2
		print("    ConfigValues();")
Packit Service 50c9f2
		print("    QDict<Info> m_map;")
Packit Service 50c9f2
		print("};")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("#endif")
Packit Service 50c9f2
	elif (sys.argv[1] == "-maps"):
Packit Service 50c9f2
		print("/* WARNING: This file is generated!")
Packit Service 50c9f2
		print(" * Do not edit this file, but edit config.xml instead and run")
Packit Service 50c9f2
		print(" * python configgen.py -maps config.xml to regenerate this file!")
Packit Service 50c9f2
		print(" */")
Packit Service 50c9f2
		print("#include \"configvalues.h\"")
Packit Service 50c9f2
		print("#include \"configimpl.h\"")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("ConfigValues::ConfigValues() : m_map(257)")
Packit Service 50c9f2
		print("{")
Packit Service 50c9f2
		print("  m_map.setAutoDelete(TRUE);")
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					parseGroupMapInit(n)
Packit Service 50c9f2
		print("}")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("void ConfigValues::init()")
Packit Service 50c9f2
		print("{")
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					parseGroupInit(n)
Packit Service 50c9f2
		print("}")
Packit Service 50c9f2
	elif (sys.argv[1] == "-cpp"):
Packit Service 50c9f2
		print("/* WARNING: This file is generated!")
Packit Service 50c9f2
		print(" * Do not edit this file, but edit config.xml instead and run")
Packit Service 50c9f2
		print(" * python configgen.py -cpp config.xml to regenerate this file!")
Packit Service 50c9f2
		print(" */")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("#include \"configoptions.h\"")
Packit Service 50c9f2
		print("#include \"configimpl.h\"")
Packit Service 50c9f2
		print("#include \"portable.h\"")
Packit Service 50c9f2
		print("#include \"settings.h\"")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("void addConfigOptions(ConfigImpl *cfg)")
Packit Service 50c9f2
		print("{")
Packit Service 50c9f2
		print("  ConfigString *cs;")
Packit Service 50c9f2
		print("  ConfigEnum   *ce;")
Packit Service 50c9f2
		print("  ConfigList   *cl;")
Packit Service 50c9f2
		print("  ConfigInt    *ci;")
Packit Service 50c9f2
		print("  ConfigBool   *cb;")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		# process header
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "header"):
Packit Service 50c9f2
					parseHeader(n,'cfg')
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					parseGroups(n)
Packit Service 50c9f2
		print("}")
Packit Service 50c9f2
	elif (sys.argv[1] == "-wiz"):
Packit Service 50c9f2
		print("/* WARNING: This file is generated!")
Packit Service 50c9f2
		print(" * Do not edit this file, but edit config.xml instead and run")
Packit Service 50c9f2
		print(" * python configgen.py -wiz config.xml to regenerate this file!")
Packit Service 50c9f2
		print(" */")
Packit Service 50c9f2
		print("#include \"configdoc.h\"")
Packit Service 50c9f2
		print("#include \"docintf.h\"")
Packit Service 50c9f2
		print("")
Packit Service 50c9f2
		print("void addConfigDocs(DocIntf *doc)")
Packit Service 50c9f2
		print("{")
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "header"):
Packit Service 50c9f2
					parseHeader(n,'doc')
Packit Service 50c9f2
		for n in elem.childNodes:
Packit Service 50c9f2
			if n.nodeType == Node.ELEMENT_NODE:
Packit Service 50c9f2
				if (n.nodeName == "group"):
Packit Service 50c9f2
					parseGroupCDocs(n)
Packit Service 50c9f2
		print("}")
Packit Service 50c9f2
Packit Service 50c9f2
if __name__ == '__main__':
Packit Service 50c9f2
	main()