]>
Commit | Line | Data |
---|---|---|
7ccc9c95 YZ |
1 | ## @file\r |
2 | #\r | |
3 | # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r | |
4 | #\r | |
2e351cbe | 5 | # SPDX-License-Identifier: BSD-2-Clause-Patent\r |
7ccc9c95 YZ |
6 | #\r |
7 | \r | |
1ccc4d89 LG |
8 | from __future__ import print_function\r |
9 | from __future__ import absolute_import\r | |
7ccc9c95 YZ |
10 | import os\r |
11 | \r | |
2add3cff | 12 | from .message import *\r |
7ccc9c95 YZ |
13 | \r |
14 | class BaseDoxygeItem:\r | |
15 | def __init__(self, name, tag=''):\r | |
16 | self.mName = name\r | |
17 | self.mTag = tag\r | |
18 | self.mDescription = ''\r | |
19 | self.mText = []\r | |
20 | \r | |
21 | def AddDescription(self, desc):\r | |
22 | self.mDescription = '%s%s' % (self.mDescription, desc)\r | |
23 | \r | |
24 | def __str__(self):\r | |
25 | return '\n'.join(self.mText)\r | |
26 | \r | |
27 | def Generate(self):\r | |
28 | """This interface need to be override"""\r | |
29 | \r | |
30 | class Section(BaseDoxygeItem):\r | |
31 | def Generate(self):\r | |
32 | """This interface need to be override"""\r | |
33 | if len(self.mTag) != 0:\r | |
34 | self.mText.append(' \section %s %s' % (self.mName, self.mTag))\r | |
35 | else:\r | |
36 | self.mText.append(' \section %s' % self.mName)\r | |
37 | \r | |
38 | self.mText.append(self.mDescription)\r | |
39 | return self.mText\r | |
40 | \r | |
41 | class Page(BaseDoxygeItem):\r | |
42 | def __init__(self, name, tag=None, isSort=True):\r | |
43 | BaseDoxygeItem.__init__(self, name, tag)\r | |
44 | self.mSubPages = []\r | |
45 | self.mIsMainPage = False\r | |
46 | self.mSections = []\r | |
47 | self.mIsSort = isSort\r | |
48 | \r | |
49 | def GetSubpageCount(self):\r | |
50 | return len(self.mSubPages)\r | |
51 | \r | |
52 | def AddPage(self, subpage):\r | |
53 | self.mSubPages.append(subpage)\r | |
54 | return subpage\r | |
55 | \r | |
56 | def AddPages(self, pageArray):\r | |
4231a819 | 57 | if pageArray is None:\r |
7ccc9c95 YZ |
58 | return\r |
59 | for page in pageArray:\r | |
60 | self.AddPage(page)\r | |
61 | \r | |
62 | def AddSection(self, section):\r | |
63 | self.mSections.append(section)\r | |
7cc7e054 | 64 | self.mSections.sort(key=lambda x: x.mName.lower())\r |
7ccc9c95 YZ |
65 | \r |
66 | def Generate(self):\r | |
67 | if self.mIsMainPage:\r | |
68 | self.mText.append('/** \mainpage %s' % self.mName)\r | |
69 | self.mIsSort = False\r | |
70 | else:\r | |
71 | self.mText.append('/** \page %s %s' % (self.mTag, self.mName))\r | |
72 | \r | |
73 | if len(self.mDescription) != 0:\r | |
74 | self.mText.append(self.mDescription)\r | |
75 | endIndex = len(self.mText)\r | |
76 | \r | |
7cc7e054 | 77 | self.mSections.sort(key=lambda x: x.mName.lower())\r |
7ccc9c95 YZ |
78 | for sect in self.mSections:\r |
79 | self.mText += sect.Generate()\r | |
80 | \r | |
81 | endIndex = len(self.mText)\r | |
82 | \r | |
83 | if len(self.mSubPages) != 0:\r | |
84 | self.mText.insert(endIndex, "<p> \section content_index INDEX")\r | |
85 | endIndex = len(self.mText)\r | |
86 | self.mText.insert(endIndex, '<ul>')\r | |
87 | endIndex += 1\r | |
88 | if self.mIsSort:\r | |
9ab4ec51 | 89 | self.mSubPages.sort(key=lambda x: x.mName.lower())\r |
7ccc9c95 YZ |
90 | for page in self.mSubPages:\r |
91 | self.mText.insert(endIndex, '<li>\subpage %s \"%s\" </li>' % (page.mTag, page.mName))\r | |
92 | endIndex += 1\r | |
93 | self.mText += page.Generate()\r | |
94 | self.mText.insert(endIndex, '</ul>')\r | |
95 | endIndex += 1\r | |
96 | self.mText.insert(endIndex, ' **/')\r | |
97 | return self.mText\r | |
98 | \r | |
99 | class DoxygenFile(Page):\r | |
100 | def __init__(self, name, file):\r | |
101 | Page.__init__(self, name)\r | |
102 | self.mFilename = file\r | |
103 | self.mIsMainPage = True\r | |
104 | \r | |
105 | def GetFilename(self):\r | |
106 | return self.mFilename.replace('/', '\\')\r | |
107 | \r | |
108 | def Save(self):\r | |
109 | str = self.Generate()\r | |
110 | try:\r | |
111 | f = open(self.mFilename, 'w')\r | |
112 | f.write('\n'.join(str))\r | |
113 | f.close()\r | |
5b0671c1 | 114 | except IOError as e:\r |
7ccc9c95 YZ |
115 | ErrorMsg ('Fail to write file %s' % self.mFilename)\r |
116 | return False\r | |
117 | \r | |
118 | return True\r | |
119 | \r | |
120 | doxygenConfigTemplate = """\r | |
121 | DOXYFILE_ENCODING = UTF-8\r | |
122 | PROJECT_NAME = %(ProjectName)s\r | |
123 | PROJECT_NUMBER = %(ProjectVersion)s\r | |
124 | OUTPUT_DIRECTORY = %(OutputDir)s\r | |
125 | CREATE_SUBDIRS = YES\r | |
126 | OUTPUT_LANGUAGE = English\r | |
127 | BRIEF_MEMBER_DESC = YES\r | |
128 | REPEAT_BRIEF = YES\r | |
129 | ABBREVIATE_BRIEF = "The $name class " \\\r | |
130 | "The $name widget " \\\r | |
131 | "The $name file " \\\r | |
132 | is \\\r | |
133 | provides \\\r | |
134 | specifies \\\r | |
135 | contains \\\r | |
136 | represents \\\r | |
137 | a \\\r | |
138 | an \\\r | |
139 | the\r | |
140 | ALWAYS_DETAILED_SEC = NO\r | |
141 | INLINE_INHERITED_MEMB = NO\r | |
142 | FULL_PATH_NAMES = YES\r | |
143 | STRIP_FROM_PATH = %(StripPath)s\r | |
144 | STRIP_FROM_INC_PATH =\r | |
145 | SHORT_NAMES = YES\r | |
146 | JAVADOC_AUTOBRIEF = NO\r | |
147 | QT_AUTOBRIEF = NO\r | |
148 | MULTILINE_CPP_IS_BRIEF = NO\r | |
149 | DETAILS_AT_TOP = YES\r | |
150 | INHERIT_DOCS = YES\r | |
151 | SEPARATE_MEMBER_PAGES = NO\r | |
152 | TAB_SIZE = 1\r | |
153 | ALIASES =\r | |
154 | OPTIMIZE_OUTPUT_FOR_C = YES\r | |
155 | OPTIMIZE_OUTPUT_JAVA = NO\r | |
156 | BUILTIN_STL_SUPPORT = NO\r | |
157 | CPP_CLI_SUPPORT = NO\r | |
158 | SIP_SUPPORT = NO\r | |
159 | DISTRIBUTE_GROUP_DOC = YES\r | |
160 | SUBGROUPING = YES\r | |
161 | TYPEDEF_HIDES_STRUCT = NO\r | |
162 | \r | |
163 | EXTRACT_ALL = YES\r | |
164 | EXTRACT_PRIVATE = NO\r | |
165 | EXTRACT_STATIC = NO\r | |
166 | EXTRACT_LOCAL_CLASSES = NO\r | |
167 | EXTRACT_LOCAL_METHODS = NO\r | |
168 | EXTRACT_ANON_NSPACES = NO\r | |
169 | HIDE_UNDOC_MEMBERS = NO\r | |
170 | HIDE_UNDOC_CLASSES = NO\r | |
171 | HIDE_FRIEND_COMPOUNDS = NO\r | |
172 | HIDE_IN_BODY_DOCS = NO\r | |
173 | INTERNAL_DOCS = NO\r | |
174 | CASE_SENSE_NAMES = NO\r | |
175 | HIDE_SCOPE_NAMES = NO\r | |
176 | SHOW_INCLUDE_FILES = NO\r | |
177 | INLINE_INFO = YES\r | |
178 | SORT_MEMBER_DOCS = YES\r | |
179 | SORT_BRIEF_DOCS = NO\r | |
180 | SORT_BY_SCOPE_NAME = YES\r | |
181 | GENERATE_TODOLIST = YES\r | |
182 | GENERATE_TESTLIST = YES\r | |
183 | GENERATE_BUGLIST = YES\r | |
184 | GENERATE_DEPRECATEDLIST= YES\r | |
185 | ENABLED_SECTIONS =\r | |
186 | MAX_INITIALIZER_LINES = 30\r | |
187 | SHOW_USED_FILES = NO\r | |
188 | SHOW_DIRECTORIES = NO\r | |
189 | FILE_VERSION_FILTER =\r | |
190 | \r | |
191 | QUIET = NO\r | |
192 | WARNINGS = YES\r | |
193 | WARN_IF_UNDOCUMENTED = YES\r | |
194 | WARN_IF_DOC_ERROR = YES\r | |
195 | WARN_NO_PARAMDOC = YES\r | |
196 | WARN_FORMAT = "$file:$line: $text "\r | |
197 | WARN_LOGFILE = %(WarningFile)s\r | |
198 | \r | |
199 | INPUT = %(FileList)s\r | |
200 | INPUT_ENCODING = UTF-8\r | |
201 | FILE_PATTERNS = %(Pattern)s\r | |
202 | RECURSIVE = NO\r | |
203 | EXCLUDE = *.svn\r | |
204 | EXCLUDE_SYMLINKS = NO\r | |
205 | EXCLUDE_PATTERNS = .svn\r | |
206 | EXCLUDE_SYMBOLS =\r | |
207 | EXAMPLE_PATH = %(ExamplePath)s\r | |
208 | EXAMPLE_PATTERNS = *\r | |
209 | EXAMPLE_RECURSIVE = NO\r | |
210 | IMAGE_PATH =\r | |
211 | INPUT_FILTER =\r | |
212 | FILTER_PATTERNS =\r | |
213 | FILTER_SOURCE_FILES = NO\r | |
214 | \r | |
215 | SOURCE_BROWSER = NO\r | |
216 | INLINE_SOURCES = NO\r | |
217 | STRIP_CODE_COMMENTS = YES\r | |
218 | REFERENCED_BY_RELATION = YES\r | |
219 | REFERENCES_RELATION = YES\r | |
220 | REFERENCES_LINK_SOURCE = NO\r | |
221 | USE_HTAGS = NO\r | |
222 | VERBATIM_HEADERS = NO\r | |
223 | \r | |
224 | ALPHABETICAL_INDEX = NO\r | |
225 | COLS_IN_ALPHA_INDEX = 5\r | |
226 | IGNORE_PREFIX =\r | |
227 | \r | |
228 | GENERATE_HTML = YES\r | |
229 | HTML_OUTPUT = html\r | |
230 | HTML_FILE_EXTENSION = .html\r | |
231 | HTML_HEADER =\r | |
232 | HTML_FOOTER =\r | |
233 | HTML_STYLESHEET =\r | |
234 | HTML_ALIGN_MEMBERS = YES\r | |
235 | GENERATE_HTMLHELP = %(WhetherGenerateHtmlHelp)s\r | |
236 | HTML_DYNAMIC_SECTIONS = NO\r | |
237 | CHM_FILE = index.chm\r | |
238 | HHC_LOCATION =\r | |
239 | GENERATE_CHI = NO\r | |
240 | BINARY_TOC = NO\r | |
241 | TOC_EXPAND = NO\r | |
242 | DISABLE_INDEX = NO\r | |
243 | ENUM_VALUES_PER_LINE = 4\r | |
244 | GENERATE_TREEVIEW = %(WhetherGenerateTreeView)s\r | |
245 | TREEVIEW_WIDTH = 250\r | |
246 | \r | |
247 | GENERATE_LATEX = NO\r | |
248 | LATEX_OUTPUT = latex\r | |
249 | LATEX_CMD_NAME = latex\r | |
250 | MAKEINDEX_CMD_NAME = makeindex\r | |
251 | COMPACT_LATEX = NO\r | |
252 | PAPER_TYPE = a4wide\r | |
253 | EXTRA_PACKAGES =\r | |
254 | LATEX_HEADER =\r | |
255 | PDF_HYPERLINKS = YES\r | |
256 | USE_PDFLATEX = YES\r | |
257 | LATEX_BATCHMODE = NO\r | |
258 | LATEX_HIDE_INDICES = NO\r | |
259 | \r | |
260 | GENERATE_RTF = NO\r | |
261 | RTF_OUTPUT = rtf\r | |
262 | COMPACT_RTF = NO\r | |
263 | RTF_HYPERLINKS = NO\r | |
264 | RTF_STYLESHEET_FILE =\r | |
265 | RTF_EXTENSIONS_FILE =\r | |
266 | \r | |
267 | GENERATE_MAN = NO\r | |
268 | MAN_OUTPUT = man\r | |
269 | MAN_EXTENSION = .3\r | |
270 | MAN_LINKS = NO\r | |
271 | \r | |
272 | GENERATE_XML = NO\r | |
273 | XML_OUTPUT = xml\r | |
274 | XML_SCHEMA =\r | |
275 | XML_DTD =\r | |
276 | XML_PROGRAMLISTING = YES\r | |
277 | \r | |
278 | GENERATE_AUTOGEN_DEF = NO\r | |
279 | \r | |
280 | GENERATE_PERLMOD = NO\r | |
281 | PERLMOD_LATEX = NO\r | |
282 | PERLMOD_PRETTY = YES\r | |
283 | PERLMOD_MAKEVAR_PREFIX =\r | |
284 | \r | |
285 | ENABLE_PREPROCESSING = YES\r | |
286 | MACRO_EXPANSION = YES\r | |
287 | EXPAND_ONLY_PREDEF = YES\r | |
288 | SEARCH_INCLUDES = YES\r | |
289 | INCLUDE_PATH = %(IncludePath)s\r | |
290 | INCLUDE_FILE_PATTERNS = *.h\r | |
291 | PREDEFINED = %(PreDefined)s\r | |
292 | EXPAND_AS_DEFINED =\r | |
293 | SKIP_FUNCTION_MACROS = NO\r | |
294 | \r | |
295 | TAGFILES =\r | |
296 | GENERATE_TAGFILE =\r | |
297 | ALLEXTERNALS = NO\r | |
298 | EXTERNAL_GROUPS = YES\r | |
299 | PERL_PATH = /usr/bin/perl\r | |
300 | \r | |
301 | CLASS_DIAGRAMS = NO\r | |
302 | MSCGEN_PATH =\r | |
303 | HIDE_UNDOC_RELATIONS = YES\r | |
304 | HAVE_DOT = NO\r | |
305 | CLASS_GRAPH = YES\r | |
306 | COLLABORATION_GRAPH = YES\r | |
307 | GROUP_GRAPHS = YES\r | |
308 | UML_LOOK = NO\r | |
309 | TEMPLATE_RELATIONS = NO\r | |
310 | INCLUDE_GRAPH = YES\r | |
311 | INCLUDED_BY_GRAPH = YES\r | |
312 | CALL_GRAPH = NO\r | |
313 | CALLER_GRAPH = NO\r | |
314 | GRAPHICAL_HIERARCHY = YES\r | |
315 | DIRECTORY_GRAPH = YES\r | |
316 | DOT_IMAGE_FORMAT = png\r | |
317 | DOT_PATH =\r | |
318 | DOTFILE_DIRS =\r | |
319 | DOT_GRAPH_MAX_NODES = 50\r | |
320 | MAX_DOT_GRAPH_DEPTH = 1000\r | |
321 | DOT_TRANSPARENT = YES\r | |
322 | DOT_MULTI_TARGETS = NO\r | |
323 | GENERATE_LEGEND = YES\r | |
324 | DOT_CLEANUP = YES\r | |
325 | \r | |
326 | SEARCHENGINE = NO\r | |
327 | \r | |
328 | """\r | |
329 | class DoxygenConfigFile:\r | |
330 | def __init__(self):\r | |
331 | self.mProjectName = ''\r | |
332 | self.mOutputDir = ''\r | |
333 | self.mFileList = []\r | |
334 | self.mIncludeList = []\r | |
335 | self.mStripPath = ''\r | |
336 | self.mExamplePath = ''\r | |
337 | self.mPattern = ['*.c', '*.h',\r | |
338 | '*.asm', '*.s', '.nasm', '*.html', '*.dox']\r | |
339 | self.mMode = 'HTML'\r | |
340 | self.mWarningFile = ''\r | |
341 | self.mPreDefined = []\r | |
342 | self.mProjectVersion = 0.1\r | |
343 | \r | |
344 | def SetChmMode(self):\r | |
345 | self.mMode = 'CHM'\r | |
346 | \r | |
347 | def SetHtmlMode(self):\r | |
348 | self.mMode = 'HTML'\r | |
349 | \r | |
350 | def SetProjectName(self, str):\r | |
351 | self.mProjectName = str\r | |
352 | \r | |
353 | def SetProjectVersion(self, str):\r | |
354 | self.mProjectVersion = str\r | |
355 | \r | |
356 | def SetOutputDir(self, str):\r | |
357 | self.mOutputDir = str\r | |
358 | \r | |
359 | def SetStripPath(self, str):\r | |
360 | self.mStripPath = str\r | |
361 | \r | |
362 | def SetExamplePath(self, str):\r | |
363 | self.mExamplePath = str\r | |
364 | \r | |
365 | def SetWarningFilePath(self, str):\r | |
366 | self.mWarningFile = str.replace('\\', '/')\r | |
367 | \r | |
368 | def FileExists(self, path):\r | |
4231a819 | 369 | if path is None:\r |
7ccc9c95 YZ |
370 | return False\r |
371 | if len(path) == 0:\r | |
372 | return False\r | |
373 | \r | |
374 | for p in self.mFileList:\r | |
375 | if path.lower() == p.lower():\r | |
376 | return True\r | |
377 | \r | |
378 | return False\r | |
379 | \r | |
380 | def AddFile(self, path):\r | |
4231a819 | 381 | if path is None:\r |
7ccc9c95 YZ |
382 | return\r |
383 | \r | |
384 | if len(path) == 0:\r | |
385 | return\r | |
386 | path = path.replace('\\', '/')\r | |
387 | if not self.FileExists(path):\r | |
388 | self.mFileList.append(path)\r | |
389 | \r | |
390 | def AddIncludePath(self, path):\r | |
391 | path = path.replace('\\', '/')\r | |
392 | if path not in self.mIncludeList:\r | |
393 | self.mIncludeList.append(path)\r | |
394 | \r | |
395 | def AddPattern(self, pattern):\r | |
396 | self.mPattern.append(pattern)\r | |
397 | \r | |
398 | def AddPreDefined(self, macro):\r | |
399 | self.mPreDefined.append(macro)\r | |
400 | \r | |
401 | def Generate(self, path):\r | |
402 | files = ' \\\n'.join(self.mFileList)\r | |
403 | includes = ' \\\n'.join(self.mIncludeList)\r | |
404 | patterns = ' \\\n'.join(self.mPattern)\r | |
405 | if self.mMode.lower() == 'html':\r | |
406 | sHtmlHelp = 'NO'\r | |
407 | sTreeView = 'YES'\r | |
408 | else:\r | |
409 | sHtmlHelp = 'YES'\r | |
410 | sTreeView = 'NO'\r | |
411 | \r | |
412 | text = doxygenConfigTemplate % {'ProjectName':self.mProjectName,\r | |
413 | 'OutputDir':self.mOutputDir,\r | |
414 | 'StripPath':self.mStripPath,\r | |
415 | 'ExamplePath':self.mExamplePath,\r | |
416 | 'FileList':files,\r | |
417 | 'Pattern':patterns,\r | |
418 | 'WhetherGenerateHtmlHelp':sHtmlHelp,\r | |
419 | 'WhetherGenerateTreeView':sTreeView,\r | |
420 | 'IncludePath':includes,\r | |
421 | 'WarningFile':self.mWarningFile,\r | |
422 | 'PreDefined':' '.join(self.mPreDefined),\r | |
423 | 'ProjectVersion':self.mProjectVersion}\r | |
424 | try:\r | |
425 | f = open(path, 'w')\r | |
426 | f.write(text)\r | |
427 | f.close()\r | |
5b0671c1 | 428 | except IOError as e:\r |
7ccc9c95 YZ |
429 | ErrorMsg ('Fail to generate doxygen config file %s' % path)\r |
430 | return False\r | |
431 | \r | |
432 | return True\r | |
433 | \r | |
434 | ########################################################################\r | |
435 | # TEST CODE\r | |
436 | ########################################################################\r | |
437 | if __name__== '__main__':\r | |
438 | df = DoxygenFile('Platform Document', 'm:\tree')\r | |
439 | df.AddPage(Page('Module', 'module'))\r | |
440 | p = df.AddPage(Page('Library', 'library'))\r | |
441 | p.AddDescription(desc)\r | |
442 | p.AddPage(Page('PCD', 'pcds'))\r | |
443 | \r | |
444 | df.Generate()\r | |
72443dd2 | 445 | print(df)\r |