--- /dev/null
+## @file\r
+#\r
+# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available\r
+# under the terms and conditions of the BSD License which accompanies this\r
+# distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import os\r
+\r
+from message import *\r
+\r
+class BaseDoxygeItem:\r
+ def __init__(self, name, tag=''):\r
+ self.mName = name\r
+ self.mTag = tag\r
+ self.mDescription = ''\r
+ self.mText = []\r
+\r
+ def AddDescription(self, desc):\r
+ self.mDescription = '%s%s' % (self.mDescription, desc)\r
+\r
+ def __str__(self):\r
+ return '\n'.join(self.mText)\r
+\r
+ def Generate(self):\r
+ """This interface need to be override"""\r
+\r
+class Section(BaseDoxygeItem):\r
+ def Generate(self):\r
+ """This interface need to be override"""\r
+ if len(self.mTag) != 0:\r
+ self.mText.append(' \section %s %s' % (self.mName, self.mTag))\r
+ else:\r
+ self.mText.append(' \section %s' % self.mName)\r
+\r
+ self.mText.append(self.mDescription)\r
+ return self.mText\r
+\r
+class Page(BaseDoxygeItem):\r
+ def __init__(self, name, tag=None, isSort=True):\r
+ BaseDoxygeItem.__init__(self, name, tag)\r
+ self.mSubPages = []\r
+ self.mIsMainPage = False\r
+ self.mSections = []\r
+ self.mIsSort = isSort\r
+\r
+ def GetSubpageCount(self):\r
+ return len(self.mSubPages)\r
+\r
+ def AddPage(self, subpage):\r
+ self.mSubPages.append(subpage)\r
+ return subpage\r
+\r
+ def AddPages(self, pageArray):\r
+ if pageArray == None:\r
+ return\r
+ for page in pageArray:\r
+ self.AddPage(page)\r
+\r
+ def AddSection(self, section):\r
+ self.mSections.append(section)\r
+ self.mSections.sort(cmp=lambda x,y: cmp(x.mName.lower(), y.mName.lower()))\r
+\r
+ def Generate(self):\r
+ if self.mIsMainPage:\r
+ self.mText.append('/** \mainpage %s' % self.mName)\r
+ self.mIsSort = False\r
+ else:\r
+ self.mText.append('/** \page %s %s' % (self.mTag, self.mName))\r
+\r
+ if len(self.mDescription) != 0:\r
+ self.mText.append(self.mDescription)\r
+ endIndex = len(self.mText)\r
+\r
+ self.mSections.sort()\r
+ for sect in self.mSections:\r
+ self.mText += sect.Generate()\r
+\r
+ endIndex = len(self.mText)\r
+\r
+ if len(self.mSubPages) != 0:\r
+ self.mText.insert(endIndex, "<p> \section content_index INDEX")\r
+ endIndex = len(self.mText)\r
+ self.mText.insert(endIndex, '<ul>')\r
+ endIndex += 1\r
+ if self.mIsSort:\r
+ self.mSubPages.sort(cmp=lambda x,y: cmp(x.mName.lower(), y.mName.lower()))\r
+ for page in self.mSubPages:\r
+ self.mText.insert(endIndex, '<li>\subpage %s \"%s\" </li>' % (page.mTag, page.mName))\r
+ endIndex += 1\r
+ self.mText += page.Generate()\r
+ self.mText.insert(endIndex, '</ul>')\r
+ endIndex += 1\r
+ self.mText.insert(endIndex, ' **/')\r
+ return self.mText\r
+\r
+class DoxygenFile(Page):\r
+ def __init__(self, name, file):\r
+ Page.__init__(self, name)\r
+ self.mFilename = file\r
+ self.mIsMainPage = True\r
+\r
+ def GetFilename(self):\r
+ return self.mFilename.replace('/', '\\')\r
+\r
+ def Save(self):\r
+ str = self.Generate()\r
+ try:\r
+ f = open(self.mFilename, 'w')\r
+ f.write('\n'.join(str))\r
+ f.close()\r
+ except IOError, e:\r
+ ErrorMsg ('Fail to write file %s' % self.mFilename)\r
+ return False\r
+\r
+ return True\r
+\r
+doxygenConfigTemplate = """\r
+DOXYFILE_ENCODING = UTF-8\r
+PROJECT_NAME = %(ProjectName)s\r
+PROJECT_NUMBER = %(ProjectVersion)s\r
+OUTPUT_DIRECTORY = %(OutputDir)s\r
+CREATE_SUBDIRS = YES\r
+OUTPUT_LANGUAGE = English\r
+BRIEF_MEMBER_DESC = YES\r
+REPEAT_BRIEF = YES\r
+ABBREVIATE_BRIEF = "The $name class " \\\r
+ "The $name widget " \\\r
+ "The $name file " \\\r
+ is \\\r
+ provides \\\r
+ specifies \\\r
+ contains \\\r
+ represents \\\r
+ a \\\r
+ an \\\r
+ the\r
+ALWAYS_DETAILED_SEC = NO\r
+INLINE_INHERITED_MEMB = NO\r
+FULL_PATH_NAMES = YES\r
+STRIP_FROM_PATH = %(StripPath)s\r
+STRIP_FROM_INC_PATH =\r
+SHORT_NAMES = YES\r
+JAVADOC_AUTOBRIEF = NO\r
+QT_AUTOBRIEF = NO\r
+MULTILINE_CPP_IS_BRIEF = NO\r
+DETAILS_AT_TOP = YES\r
+INHERIT_DOCS = YES\r
+SEPARATE_MEMBER_PAGES = NO\r
+TAB_SIZE = 1\r
+ALIASES =\r
+OPTIMIZE_OUTPUT_FOR_C = YES\r
+OPTIMIZE_OUTPUT_JAVA = NO\r
+BUILTIN_STL_SUPPORT = NO\r
+CPP_CLI_SUPPORT = NO\r
+SIP_SUPPORT = NO\r
+DISTRIBUTE_GROUP_DOC = YES\r
+SUBGROUPING = YES\r
+TYPEDEF_HIDES_STRUCT = NO\r
+\r
+EXTRACT_ALL = YES\r
+EXTRACT_PRIVATE = NO\r
+EXTRACT_STATIC = NO\r
+EXTRACT_LOCAL_CLASSES = NO\r
+EXTRACT_LOCAL_METHODS = NO\r
+EXTRACT_ANON_NSPACES = NO\r
+HIDE_UNDOC_MEMBERS = NO\r
+HIDE_UNDOC_CLASSES = NO\r
+HIDE_FRIEND_COMPOUNDS = NO\r
+HIDE_IN_BODY_DOCS = NO\r
+INTERNAL_DOCS = NO\r
+CASE_SENSE_NAMES = NO\r
+HIDE_SCOPE_NAMES = NO\r
+SHOW_INCLUDE_FILES = NO\r
+INLINE_INFO = YES\r
+SORT_MEMBER_DOCS = YES\r
+SORT_BRIEF_DOCS = NO\r
+SORT_BY_SCOPE_NAME = YES\r
+GENERATE_TODOLIST = YES\r
+GENERATE_TESTLIST = YES\r
+GENERATE_BUGLIST = YES\r
+GENERATE_DEPRECATEDLIST= YES\r
+ENABLED_SECTIONS =\r
+MAX_INITIALIZER_LINES = 30\r
+SHOW_USED_FILES = NO\r
+SHOW_DIRECTORIES = NO\r
+FILE_VERSION_FILTER =\r
+\r
+QUIET = NO\r
+WARNINGS = YES\r
+WARN_IF_UNDOCUMENTED = YES\r
+WARN_IF_DOC_ERROR = YES\r
+WARN_NO_PARAMDOC = YES\r
+WARN_FORMAT = "$file:$line: $text "\r
+WARN_LOGFILE = %(WarningFile)s\r
+\r
+INPUT = %(FileList)s\r
+INPUT_ENCODING = UTF-8\r
+FILE_PATTERNS = %(Pattern)s\r
+RECURSIVE = NO\r
+EXCLUDE = *.svn\r
+EXCLUDE_SYMLINKS = NO\r
+EXCLUDE_PATTERNS = .svn\r
+EXCLUDE_SYMBOLS =\r
+EXAMPLE_PATH = %(ExamplePath)s\r
+EXAMPLE_PATTERNS = *\r
+EXAMPLE_RECURSIVE = NO\r
+IMAGE_PATH =\r
+INPUT_FILTER =\r
+FILTER_PATTERNS =\r
+FILTER_SOURCE_FILES = NO\r
+\r
+SOURCE_BROWSER = NO\r
+INLINE_SOURCES = NO\r
+STRIP_CODE_COMMENTS = YES\r
+REFERENCED_BY_RELATION = YES\r
+REFERENCES_RELATION = YES\r
+REFERENCES_LINK_SOURCE = NO\r
+USE_HTAGS = NO\r
+VERBATIM_HEADERS = NO\r
+\r
+ALPHABETICAL_INDEX = NO\r
+COLS_IN_ALPHA_INDEX = 5\r
+IGNORE_PREFIX =\r
+\r
+GENERATE_HTML = YES\r
+HTML_OUTPUT = html\r
+HTML_FILE_EXTENSION = .html\r
+HTML_HEADER =\r
+HTML_FOOTER =\r
+HTML_STYLESHEET =\r
+HTML_ALIGN_MEMBERS = YES\r
+GENERATE_HTMLHELP = %(WhetherGenerateHtmlHelp)s\r
+HTML_DYNAMIC_SECTIONS = NO\r
+CHM_FILE = index.chm\r
+HHC_LOCATION =\r
+GENERATE_CHI = NO\r
+BINARY_TOC = NO\r
+TOC_EXPAND = NO\r
+DISABLE_INDEX = NO\r
+ENUM_VALUES_PER_LINE = 4\r
+GENERATE_TREEVIEW = %(WhetherGenerateTreeView)s\r
+TREEVIEW_WIDTH = 250\r
+\r
+GENERATE_LATEX = NO\r
+LATEX_OUTPUT = latex\r
+LATEX_CMD_NAME = latex\r
+MAKEINDEX_CMD_NAME = makeindex\r
+COMPACT_LATEX = NO\r
+PAPER_TYPE = a4wide\r
+EXTRA_PACKAGES =\r
+LATEX_HEADER =\r
+PDF_HYPERLINKS = YES\r
+USE_PDFLATEX = YES\r
+LATEX_BATCHMODE = NO\r
+LATEX_HIDE_INDICES = NO\r
+\r
+GENERATE_RTF = NO\r
+RTF_OUTPUT = rtf\r
+COMPACT_RTF = NO\r
+RTF_HYPERLINKS = NO\r
+RTF_STYLESHEET_FILE =\r
+RTF_EXTENSIONS_FILE =\r
+\r
+GENERATE_MAN = NO\r
+MAN_OUTPUT = man\r
+MAN_EXTENSION = .3\r
+MAN_LINKS = NO\r
+\r
+GENERATE_XML = NO\r
+XML_OUTPUT = xml\r
+XML_SCHEMA =\r
+XML_DTD =\r
+XML_PROGRAMLISTING = YES\r
+\r
+GENERATE_AUTOGEN_DEF = NO\r
+\r
+GENERATE_PERLMOD = NO\r
+PERLMOD_LATEX = NO\r
+PERLMOD_PRETTY = YES\r
+PERLMOD_MAKEVAR_PREFIX =\r
+\r
+ENABLE_PREPROCESSING = YES\r
+MACRO_EXPANSION = YES\r
+EXPAND_ONLY_PREDEF = YES\r
+SEARCH_INCLUDES = YES\r
+INCLUDE_PATH = %(IncludePath)s\r
+INCLUDE_FILE_PATTERNS = *.h\r
+PREDEFINED = %(PreDefined)s\r
+EXPAND_AS_DEFINED =\r
+SKIP_FUNCTION_MACROS = NO\r
+\r
+TAGFILES =\r
+GENERATE_TAGFILE =\r
+ALLEXTERNALS = NO\r
+EXTERNAL_GROUPS = YES\r
+PERL_PATH = /usr/bin/perl\r
+\r
+CLASS_DIAGRAMS = NO\r
+MSCGEN_PATH =\r
+HIDE_UNDOC_RELATIONS = YES\r
+HAVE_DOT = NO\r
+CLASS_GRAPH = YES\r
+COLLABORATION_GRAPH = YES\r
+GROUP_GRAPHS = YES\r
+UML_LOOK = NO\r
+TEMPLATE_RELATIONS = NO\r
+INCLUDE_GRAPH = YES\r
+INCLUDED_BY_GRAPH = YES\r
+CALL_GRAPH = NO\r
+CALLER_GRAPH = NO\r
+GRAPHICAL_HIERARCHY = YES\r
+DIRECTORY_GRAPH = YES\r
+DOT_IMAGE_FORMAT = png\r
+DOT_PATH =\r
+DOTFILE_DIRS =\r
+DOT_GRAPH_MAX_NODES = 50\r
+MAX_DOT_GRAPH_DEPTH = 1000\r
+DOT_TRANSPARENT = YES\r
+DOT_MULTI_TARGETS = NO\r
+GENERATE_LEGEND = YES\r
+DOT_CLEANUP = YES\r
+\r
+SEARCHENGINE = NO\r
+\r
+"""\r
+class DoxygenConfigFile:\r
+ def __init__(self):\r
+ self.mProjectName = ''\r
+ self.mOutputDir = ''\r
+ self.mFileList = []\r
+ self.mIncludeList = []\r
+ self.mStripPath = ''\r
+ self.mExamplePath = ''\r
+ self.mPattern = ['*.c', '*.h',\r
+ '*.asm', '*.s', '.nasm', '*.html', '*.dox']\r
+ self.mMode = 'HTML'\r
+ self.mWarningFile = ''\r
+ self.mPreDefined = []\r
+ self.mProjectVersion = 0.1\r
+\r
+ def SetChmMode(self):\r
+ self.mMode = 'CHM'\r
+\r
+ def SetHtmlMode(self):\r
+ self.mMode = 'HTML'\r
+\r
+ def SetProjectName(self, str):\r
+ self.mProjectName = str\r
+\r
+ def SetProjectVersion(self, str):\r
+ self.mProjectVersion = str\r
+\r
+ def SetOutputDir(self, str):\r
+ self.mOutputDir = str\r
+\r
+ def SetStripPath(self, str):\r
+ self.mStripPath = str\r
+\r
+ def SetExamplePath(self, str):\r
+ self.mExamplePath = str\r
+\r
+ def SetWarningFilePath(self, str):\r
+ self.mWarningFile = str.replace('\\', '/')\r
+\r
+ def FileExists(self, path):\r
+ if path == None:\r
+ return False\r
+ if len(path) == 0:\r
+ return False\r
+\r
+ for p in self.mFileList:\r
+ if path.lower() == p.lower():\r
+ return True\r
+\r
+ return False\r
+\r
+ def AddFile(self, path):\r
+ if path == None:\r
+ return\r
+\r
+ if len(path) == 0:\r
+ return\r
+ path = path.replace('\\', '/')\r
+ if not self.FileExists(path):\r
+ self.mFileList.append(path)\r
+\r
+ def AddIncludePath(self, path):\r
+ path = path.replace('\\', '/')\r
+ if path not in self.mIncludeList:\r
+ self.mIncludeList.append(path)\r
+\r
+ def AddPattern(self, pattern):\r
+ self.mPattern.append(pattern)\r
+\r
+ def AddPreDefined(self, macro):\r
+ self.mPreDefined.append(macro)\r
+\r
+ def Generate(self, path):\r
+ files = ' \\\n'.join(self.mFileList)\r
+ includes = ' \\\n'.join(self.mIncludeList)\r
+ patterns = ' \\\n'.join(self.mPattern)\r
+ if self.mMode.lower() == 'html':\r
+ sHtmlHelp = 'NO'\r
+ sTreeView = 'YES'\r
+ else:\r
+ sHtmlHelp = 'YES'\r
+ sTreeView = 'NO'\r
+\r
+ text = doxygenConfigTemplate % {'ProjectName':self.mProjectName,\r
+ 'OutputDir':self.mOutputDir,\r
+ 'StripPath':self.mStripPath,\r
+ 'ExamplePath':self.mExamplePath,\r
+ 'FileList':files,\r
+ 'Pattern':patterns,\r
+ 'WhetherGenerateHtmlHelp':sHtmlHelp,\r
+ 'WhetherGenerateTreeView':sTreeView,\r
+ 'IncludePath':includes,\r
+ 'WarningFile':self.mWarningFile,\r
+ 'PreDefined':' '.join(self.mPreDefined),\r
+ 'ProjectVersion':self.mProjectVersion}\r
+ try:\r
+ f = open(path, 'w')\r
+ f.write(text)\r
+ f.close()\r
+ except IOError, e:\r
+ ErrorMsg ('Fail to generate doxygen config file %s' % path)\r
+ return False\r
+\r
+ return True\r
+\r
+########################################################################\r
+# TEST CODE\r
+########################################################################\r
+if __name__== '__main__':\r
+ df = DoxygenFile('Platform Document', 'm:\tree')\r
+ df.AddPage(Page('Module', 'module'))\r
+ p = df.AddPage(Page('Library', 'library'))\r
+ p.AddDescription(desc)\r
+ p.AddPage(Page('PCD', 'pcds'))\r
+\r
+ df.Generate()\r
+ print df\r