123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445 |
- ## @file
- #
- # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
- #
- # 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, "<p> \section content_index INDEX")
- endIndex = len(self.mText)
- self.mText.insert(endIndex, '<ul>')
- endIndex += 1
- if self.mIsSort:
- self.mSubPages.sort(key=lambda x: x.mName.lower())
- for page in self.mSubPages:
- self.mText.insert(endIndex, '<li>\subpage %s \"%s\" </li>' % (page.mTag, page.mName))
- endIndex += 1
- self.mText += page.Generate()
- self.mText.insert(endIndex, '</ul>')
- 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)
|