#!/usr/bin/env python
"""
	Ozone: doxygen based information gathering tool
	     ------------
	Ozone Version 0.2 - Romain Gaucher - http://rgaucher.info
	(Python 2.6 port, replaced popen2 by subprocess... still dirty code)
"""
import os,sys,re
from subprocess import *
# 0 - proj name
# 1 - output dir
# 2 - strip from (local path)
# 3 - OPT for C   : YES / NO
# 4 - OPT for Java: YES / NO
# 5 - Input directory
doxyfile = """
#---------------------------------------------------------------------------
# Generated by Ozone by Romain Gaucher - http://rgaucher.info
#---------------------------------------------------------------------------
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           = %s
OUTPUT_DIRECTORY       = %s
CREATE_SUBDIRS         = YES
OUTPUT_LANGUAGE        = English
BRIEF_MEMBER_DESC      = YES
REPEAT_BRIEF           = YES
ABBREVIATE_BRIEF       = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the
ALWAYS_DETAILED_SEC    = NO
INLINE_INHERITED_MEMB  = NO
FULL_PATH_NAMES        = YES
STRIP_FROM_PATH        = "%s"
STRIP_FROM_INC_PATH    = 
SHORT_NAMES            = NO
JAVADOC_AUTOBRIEF      = NO
QT_AUTOBRIEF           = NO
MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP         = YES
INHERIT_DOCS           = YES
SEPARATE_MEMBER_PAGES  = NO
TAB_SIZE               = 4
OPTIMIZE_OUTPUT_FOR_C  = %s
OPTIMIZE_OUTPUT_JAVA   = %s
OPTIMIZE_FOR_FORTRAN   = NO
OPTIMIZE_OUTPUT_VHDL   = NO
BUILTIN_STL_SUPPORT    = NO
CPP_CLI_SUPPORT        = NO
SIP_SUPPORT            = NO
DISTRIBUTE_GROUP_DOC   = NO
SUBGROUPING            = YES
TYPEDEF_HIDES_STRUCT   = YES
EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_STATIC         = YES
EXTRACT_LOCAL_CLASSES  = YES
EXTRACT_LOCAL_METHODS  = YES
EXTRACT_ANON_NSPACES   = YES
HIDE_UNDOC_MEMBERS     = NO
HIDE_UNDOC_CLASSES     = NO
HIDE_FRIEND_COMPOUNDS  = NO
HIDE_IN_BODY_DOCS      = NO
INTERNAL_DOCS          = YES
CASE_SENSE_NAMES       = NO
HIDE_SCOPE_NAMES       = NO
SHOW_INCLUDE_FILES     = YES
INLINE_INFO            = YES
SORT_MEMBER_DOCS       = YES
SORT_BRIEF_DOCS        = NO
SORT_GROUP_NAMES       = NO
SORT_BY_SCOPE_NAME     = NO
GENERATE_TODOLIST      = NO
GENERATE_TESTLIST      = NO
GENERATE_BUGLIST       = NO
GENERATE_DEPRECATEDLIST= NO
MAX_INITIALIZER_LINES  = 30
SHOW_USED_FILES        = YES
SHOW_DIRECTORIES       = YES
QUIET                  = YES
INPUT                  = %s
INPUT_ENCODING         = UTF-8
FILE_PATTERNS          = *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.jsp *.ii *.ixx *.ipp *.i++ *.inl \
                         *.h *.hh *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.py
RECURSIVE              = YES
EXCLUDE_SYMLINKS       = YES
EXAMPLE_PATTERNS       = *
EXAMPLE_RECURSIVE      = NO
FILTER_SOURCE_FILES    = NO
#---------------------------------------------------------------------------
SOURCE_BROWSER         = YES
INLINE_SOURCES         = YES
STRIP_CODE_COMMENTS    = NO
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION    = NO
REFERENCES_LINK_SOURCE = YES
USE_HTAGS              = NO
VERBATIM_HEADERS       = YES
ALPHABETICAL_INDEX     = YES
COLS_IN_ALPHA_INDEX    = 5
#---------------------------------------------------------------------------
GENERATE_HTML          = YES
HTML_OUTPUT            = html
HTML_FILE_EXTENSION    = .html
HTML_ALIGN_MEMBERS     = YES
GENERATE_HTMLHELP      = NO
GENERATE_DOCSET        = NO
DOCSET_FEEDNAME        = "Doxygen generated docs"
DOCSET_BUNDLE_ID       = org.doxygen.Project
HTML_DYNAMIC_SECTIONS  = NO
GENERATE_CHI           = NO
BINARY_TOC             = NO
TOC_EXPAND             = NO
DISABLE_INDEX          = NO
ENUM_VALUES_PER_LINE   = 4
GENERATE_TREEVIEW      = YES
TREEVIEW_WIDTH         = 250
#---------------------------------------------------------------------------
GENERATE_XML           = YES
XML_OUTPUT             = xml
XML_PROGRAMLISTING     = YES
#---------------------------------------------------------------------------
GENERATE_PERLMOD       = NO
GENERATE_AUTOGEN_DEF   = NO
GENERATE_MAN           = NO
GENERATE_RTF           = NO
GENERATE_LATEX         = NO
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = NO
SEARCH_INCLUDES        = YES
SKIP_FUNCTION_MACROS   = NO
#---------------------------------------------------------------------------
CLASS_DIAGRAMS         = YES
HIDE_UNDOC_RELATIONS   = YES
HAVE_DOT               = YES
CLASS_GRAPH            = YES
COLLABORATION_GRAPH    = YES
GROUP_GRAPHS           = YES
UML_LOOK               = YES
TEMPLATE_RELATIONS     = YES
INCLUDE_GRAPH          = YES
INCLUDED_BY_GRAPH      = YES
CALL_GRAPH             = YES
CALLER_GRAPH           = YES
GRAPHICAL_HIERARCHY    = YES
DIRECTORY_GRAPH        = YES
DOT_IMAGE_FORMAT       = png
DOT_GRAPH_MAX_NODES    = 50
MAX_DOT_GRAPH_DEPTH    = 1000
DOT_TRANSPARENT        = YES
DOT_MULTI_TARGETS      = YES
GENERATE_LEGEND        = YES
DOT_CLEANUP            = YES
#---------------------------------------------------------------------------
SEARCHENGINE           = NO
"""

language = "c"
src_dir  = os.curdir

def strip_characters(str_buffer):
	return str_buffer.replace('\n','')


def launch_process(cmd_str):
	"""
		Launch a processus and return the stdout/stderr output
	"""
	#r,w,e = popen2.popen3(cmd_str)
	p = call(cmd_str, shell=True)
	(r,w,e) = (p.stdin, p.stdout, p.stderr)
	b1    = e.readlines()
	b2    = r.readlines()
	r.close()
	e.close()
	w.close()

def help():
	print " ozone - doxygen wrapper"
	print ""
	print " ./ozone.py --language [java|c|cpp] --input /input/src/dir --doc /output/doc/dir"

def language_name(l_name):
	l_name = l_name.lower()
	if l_name not in ('c','cpp','java'):
		return None
	return l_name

def extract_name(src_directory):
	return re.sub('[^a-zA-Z0-9_\.]+','.',src_directory)

if __name__ == "__main__":
	nargs     = len(sys.argv)
	curdir    = os.curdir
	if nargs == 7:
		for i in range(nargs):
			s = sys.argv[i].lower()
			if s == "--language":
				language = language_name(sys.argv[i+1])
			elif s == "--input":
				src_dir  = sys.argv[i+1]
			elif s == "--doc":
				doc_dir  = sys.argv[i+1]
		if not os.path.isdir(doc_dir):
			os.mkdir(doc_dir)		
		# You can also test with a single file
		if not os.path.isdir(src_dir):
			print " The 'input' parameters must be directories"
			sys.exit(0)
		else:
			d_java = "NO"
			d_c    = "NO"
			if language == "java":
				d_java = "YES"
			else:
				d_c    = "YES"

			p_name    = extract_name(src_dir.replace(os.curdir,''))			
			d_handler = open("Doxyfile." + p_name, "w")
			d_handler.write(doxyfile % (p_name,os.path.abspath(doc_dir),os.path.abspath(src_dir),d_c,d_java,os.path.abspath(src_dir)))
			d_handler.close()
			print "Doxygen is running..."
			launch_process("doxygen Doxyfile." + p_name)
			print "Doxygen finished"
	else:
		help()		
