## @file # # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # from __future__ import print_function from __future__ import absolute_import import os from .message import * class BaseDoxygeItem: def __init__(self, name, tag=''): self.mName = name self.mTag = tag self.mDescription = '' self.mText = [] def AddDescription(self, desc): self.mDescription = '%s%s' % (self.mDescription, desc) def __str__(self): return '\n'.join(self.mText) def Generate(self): """This interface need to be override""" class Section(BaseDoxygeItem): def Generate(self): """This interface need to be override""" if len(self.mTag) != 0: self.mText.append(' \section %s %s' % (self.mName, self.mTag)) else: self.mText.append(' \section %s' % self.mName) self.mText.append(self.mDescription) return self.mText class Page(BaseDoxygeItem): def __init__(self, name, tag=None, isSort=True): BaseDoxygeItem.__init__(self, name, tag) self.mSubPages = [] self.mIsMainPage = False self.mSections = [] self.mIsSort = isSort def GetSubpageCount(self): return len(self.mSubPages) def AddPage(self, subpage): self.mSubPages.append(subpage) return subpage def AddPages(self, pageArray): if pageArray is None: return for page in pageArray: self.AddPage(page) def AddSection(self, section): self.mSections.append(section) self.mSections.sort(key=lambda x: x.mName.lower()) def Generate(self): if self.mIsMainPage: self.mText.append('/** \mainpage %s' % self.mName) self.mIsSort = False else: self.mText.append('/** \page %s %s' % (self.mTag, self.mName)) if len(self.mDescription) != 0: self.mText.append(self.mDescription) endIndex = len(self.mText) self.mSections.sort(key=lambda x: x.mName.lower()) for sect in self.mSections: self.mText += sect.Generate() endIndex = len(self.mText) if len(self.mSubPages) != 0: self.mText.insert(endIndex, "

\section content_index INDEX") endIndex = len(self.mText) self.mText.insert(endIndex, '

') endIndex += 1 self.mText.insert(endIndex, ' **/') return self.mText class DoxygenFile(Page): def __init__(self, name, file): Page.__init__(self, name) self.mFilename = file self.mIsMainPage = True def GetFilename(self): return self.mFilename.replace('/', '\\') def Save(self): str = self.Generate() try: f = open(self.mFilename, 'w') f.write('\n'.join(str)) f.close() except IOError as e: ErrorMsg ('Fail to write file %s' % self.mFilename) return False return True doxygenConfigTemplate = """ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = %(ProjectName)s PROJECT_NUMBER = %(ProjectVersion)s OUTPUT_DIRECTORY = %(OutputDir)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 = %(StripPath)s STRIP_FROM_INC_PATH = SHORT_NAMES = YES JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = YES INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 1 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO DISTRIBUTE_GROUP_DOC = YES SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = YES GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = NO SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES WARN_FORMAT = "$file:$line: $text " WARN_LOGFILE = %(WarningFile)s INPUT = %(FileList)s INPUT_ENCODING = UTF-8 FILE_PATTERNS = %(Pattern)s RECURSIVE = NO EXCLUDE = *.svn EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = .svn EXCLUDE_SYMBOLS = EXAMPLE_PATH = %(ExamplePath)s EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = NO USE_HTAGS = NO VERBATIM_HEADERS = NO ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = %(WhetherGenerateHtmlHelp)s HTML_DYNAMIC_SECTIONS = NO CHM_FILE = index.chm HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = %(WhetherGenerateTreeView)s TREEVIEW_WIDTH = 250 GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SEARCH_INCLUDES = YES INCLUDE_PATH = %(IncludePath)s INCLUDE_FILE_PATTERNS = *.h PREDEFINED = %(PreDefined)s EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = NO TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = NO MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = YES DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES SEARCHENGINE = NO """ class DoxygenConfigFile: def __init__(self): self.mProjectName = '' self.mOutputDir = '' self.mFileList = [] self.mIncludeList = [] self.mStripPath = '' self.mExamplePath = '' self.mPattern = ['*.c', '*.h', '*.asm', '*.s', '.nasm', '*.html', '*.dox'] self.mMode = 'HTML' self.mWarningFile = '' self.mPreDefined = [] self.mProjectVersion = 0.1 def SetChmMode(self): self.mMode = 'CHM' def SetHtmlMode(self): self.mMode = 'HTML' def SetProjectName(self, str): self.mProjectName = str def SetProjectVersion(self, str): self.mProjectVersion = str def SetOutputDir(self, str): self.mOutputDir = str def SetStripPath(self, str): self.mStripPath = str def SetExamplePath(self, str): self.mExamplePath = str def SetWarningFilePath(self, str): self.mWarningFile = str.replace('\\', '/') def FileExists(self, path): if path is None: return False if len(path) == 0: return False for p in self.mFileList: if path.lower() == p.lower(): return True return False def AddFile(self, path): if path is None: return if len(path) == 0: return path = path.replace('\\', '/') if not self.FileExists(path): self.mFileList.append(path) def AddIncludePath(self, path): path = path.replace('\\', '/') if path not in self.mIncludeList: self.mIncludeList.append(path) def AddPattern(self, pattern): self.mPattern.append(pattern) def AddPreDefined(self, macro): self.mPreDefined.append(macro) def Generate(self, path): files = ' \\\n'.join(self.mFileList) includes = ' \\\n'.join(self.mIncludeList) patterns = ' \\\n'.join(self.mPattern) if self.mMode.lower() == 'html': sHtmlHelp = 'NO' sTreeView = 'YES' else: sHtmlHelp = 'YES' sTreeView = 'NO' text = doxygenConfigTemplate % {'ProjectName':self.mProjectName, 'OutputDir':self.mOutputDir, 'StripPath':self.mStripPath, 'ExamplePath':self.mExamplePath, 'FileList':files, 'Pattern':patterns, 'WhetherGenerateHtmlHelp':sHtmlHelp, 'WhetherGenerateTreeView':sTreeView, 'IncludePath':includes, 'WarningFile':self.mWarningFile, 'PreDefined':' '.join(self.mPreDefined), 'ProjectVersion':self.mProjectVersion} try: f = open(path, 'w') f.write(text) f.close() except IOError as e: ErrorMsg ('Fail to generate doxygen config file %s' % path) return False return True ######################################################################## # TEST CODE ######################################################################## if __name__== '__main__': df = DoxygenFile('Platform Document', 'm:\tree') df.AddPage(Page('Module', 'module')) p = df.AddPage(Page('Library', 'library')) p.AddDescription(desc) p.AddPage(Page('PCD', 'pcds')) df.Generate() print(df)