import re
import os.path

out_flag = "name proto" # others values availables : "name only"
src_base = "/home/iri/Works/devscol/win32/" # relative or absolute path
doc_html_path = "doc_html" # relative or absolute path

# Notepad ++
'''
out_file = "scol.xml"

header = '<?xml version="1.0" encoding="Windows-1252" ?>\n\
<NotepadPlus>\n\
\t<AutoComplete language="Scol">\n\
\t\t<Environment ignoreCase="no" startFunc="(" stopFunc=")" paramSeparator="," terminal=";" />\n'
footer = "\t</AutoComplete>\n</NotepadPlus>"

before_key = "";
after_key = "\t\t\t</Overload>\n\t\t</KeyWord>\n"

key_before = "\t\t<KeyWord name=\""
key_after = "\" />\n"

protoResult_before = "\t\t<KeyWord name=\""
protoResult_center = "\" func=\"yes\">\n\t\t\t<Overload retVal=\""
protoResult_after = "\" >\n"

protoParam_before = ""
protoParam_center = "\t\t\t\t<Param name=\""
protoParam_after = "\" />\n"
'''

# Gedit
'''
out_file = "scol.api"

header = ''
footer = ''

before_key = "";
after_key = "\n"

key_before = ""
key_after = "\n"

protoResult_before = ""
protoResult_center = " %"
protoResult_after = "%"

protoParam_before = " "
protoParam_center = ""
protoParam_after = ""
'''

# Bluefish 2.x or after

out_file = "scol.bf" # copy (or replace) it after the content of scol.bflang2 file

header = '\t<!-- copy it after the content of scol.bflang2 file -->\n\n\t<group class="scolfunctions" highlight="scolfunction" autocomplete="1" autocomplete_append=" " autocomplete_backup_cursor="1">\n'
footer = "\t</group>\n\n"

before_key = "";
after_key = "\n"

key_before = "\t\t<element pattern=\""
key_after = "\"/>\n"

protoResult_before = ""
protoResult_center = ""
protoResult_after = ""

protoParam_before = ""
protoParam_center = ""
protoParam_after = ""

out_flag = "name only" # proto not supported yet by BlueFish


# Raw (only list all functions and types)
'''
out_file = "scol.txt"

header = ''
footer = ""

before_key = "";
after_key = "\n"

key_before = ""
key_after = "\n"

protoResult_before = ""
protoResult_center = " "
protoResult_after = ""

protoParam_before = " "
protoParam_center = ""
protoParam_after = ""
'''


# Internals functions, don't change ** begin **
apis = []

def listdirectory (path, ext): 
    listfiles = [] 
    for root, dirs, files in os.walk (path): 
        for f in files: 
        	e = os.path.splitext (f)[1]
        	if ext == e:
				listfiles.append (os.path.join (root, f)) 
    return listfiles
    
def writeKey (key):
	return key_before + key + key_after
	
def writeProtoParam (key, param):
	return protoParam_before + key + protoParam_center + param + protoParam_after
	
def writeProtoResult (key, result):
	return protoResult_before + key + protoResult_center + result + protoResult_after

def saveApi (apis):
	for key, result, params in apis:
		if out_flag == "name only" or (result == None and params == None):
			s = writeKey (key)
			obj_api.write (s)
		elif out_flag == "name proto":
			s = before_key
			s = s + writeProtoResult (key, result)
			for param in params:
				s = s + writeProtoParam ("", param)
			s = s + after_key
			obj_api.write (s)
		else:
			s = writeKey (key)
			obj_api.write (s)
			
# flag : 1 -> doxygen syntax, 0 : no doxygen syntax
def writeApi (files, apis, flag):
	for f in files:	
		obj_fichier = open (f, "r")
		text = obj_fichier.read ()
		obj_fichier.close ()
		
		regex = re.compile (pattern, re.I)
		search = regex.findall (text)
		
		if search:
			for s in search:
				n = text.find (s)
				if s.find(" ") != -1:
					continue
				if out_flag == "name only":
					apis.append ((s, None, None))
				elif out_flag == "name proto":
					ch = text
					if flag:
						n = text.find (s+" ")
						N = text[n:].find ("*/")
						ch = text[n:n+N]
					if ch.find ("internal") != -1 and flag: # (try to) avoid internal function
						continue
					regex_type = re.compile (pattern_type, re.I)
					search_type = regex_type.findall (ch)
					regex_result = re.compile (pattern_result, re.I)
					search_result = regex_result.search (ch)
					r = None
					if search_result:
						r = search_result.group (1)
					if search_type:
						apitmp = []
						for t in search_type:
							apitmp.append (t)
						apis.append ((s, r, apitmp))
					else:
						apis.append ((s, None, None))
	return apis

obj_api = open (out_file, "w")

#header
obj_api.write (header)

# Internals functions, don't change ** end **  


# API Cryo-Networks (before 2002)   
begin_balise = '<font size=\"\+1\"><b>'
end_balise = '</b></font>'
pattern = begin_balise + '(.*)' + end_balise

begin_balise_type = "<tr> <td></td> <td></td> <td></td> <td>"
end_balise_type = "</td> <td>"
pattern_type = begin_balise_type + '(.*)' + end_balise_type

begin_balise_result = "<tr> <td><a href=\"#result\">"
end_balise_result = "</a>"
pattern_result = begin_balise_result + '(.*)' + end_balise_result

extension = ".html"
pathbase = doc_html_path

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 0)


# API Kyrien
begin_balise = '<font color=\"#ff0000\">\*NEW\*&nbsp&nbsp</font><b><a href=\"\">'
end_balise = '</a>'
pattern = begin_balise + '(.*)' + end_balise

tmp = out_flag
out_flag = "name only"

files = sorted (listdirectory (pathbase, extension))
# writeApi (files, 0)
apis = writeApi (files, apis, 0)
out_flag = tmp


# plugins : common config
begin_balise = 'brief '
end_balise = ' : '
pattern = begin_balise + '(.*)' + end_balise

begin_balise_type = "param "
end_balise_type = " : "
pattern_type = begin_balise_type + '(.*)' + end_balise_type

begin_balise_result = "return "
end_balise_result = " : "
pattern_result = begin_balise_result + '(.*)' + end_balise_result

# plugins / audio
extension = ".cpp"
pathbase = src_base + "plugins/audio/audio"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / Epoc
extension = ".cpp"
pathbase = src_base + "plugins/Epoc/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / Glove5DT
extension = ".cpp"
pathbase = src_base + "plugins/glove5DT/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / joypad
extension = ".cpp"
pathbase = src_base + "plugins/joypad/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / lib2d_GTK
extension = ".c"
pathbase = src_base + "plugins/lib2d_GTK/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / neurosky
extension = ".cpp"
pathbase = src_base + "plugins/neurosky/neurosky/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / nonin
extension = ".cpp"
pathbase = src_base + "plugins/nonin/nonin/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / OpenNiScol
extension = ".cpp"
pathbase = src_base + "plugins/OpenNiSCOL/OpenNiSCOL"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / OptiTrack
extension = ".cpp"
pathbase = src_base + "plugins/OptiTrack/sources"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / Science
extension = ".c"
pathbase = src_base + "plugins/science"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / security
extension = ".cpp"
pathbase = src_base + "plugins/security/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / SO3Engine / Basis 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLBasic"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / SO3Engine / Pack 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLPack"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / SO3Engine / Animation 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLAnimation"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / SO3Engine / Material 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLMaterial"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / SO3Engine / PhysicGraph 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLPhysicGraph"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / SO3Engine / Renderer 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLRenderer"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / SO3Engine / SceneGraph 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLSceneGraph"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / SO3Engine / Utils 
extension = ".cpp"
pathbase = src_base + "plugins/SO3Engine/SO3Engine/SCOLUtils"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / SpacePointFusion
extension = ".cpp"
pathbase = src_base + "plugins/SpacePointFusion/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / speech
extension = ".cpp"
pathbase = src_base + "plugins/speech/sources"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / Sqlite3
extension = ".c"
pathbase = src_base + "plugins/Sqlite3"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / test
extension = ".c"
pathbase = src_base + "plugins/test"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / usbuirt
extension = ".cpp"
pathbase = src_base + "plugins/usbuirt/sources"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / util_g
extension = ".c"
pathbase = src_base + "plugins/utils_g/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)

# plugins / wiimote
extension = ".cpp"
pathbase = src_base + "plugins/wiimote/src"

#files = sorted (listdirectory (pathbase, extension))
#apis = writeApi (files, apis, 1)

# plugins / wsystem
extension = ".cpp"
pathbase = src_base + "plugins/wsystem/src"

files = sorted (listdirectory (pathbase, extension))
apis = writeApi (files, apis, 1)


# Internals functions, don't change ** begin **
saveApi (sorted (apis, key=lambda a: a[0].lower()))
# apis.sort(cmp=lambda x, y: cmp(x[0].lower(), y[0].lower()))
# saveApi (apis)

# footer
obj_api.write (footer)
			
obj_api.close ()
# Internals functions, don't change ** end **

