## @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) |