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