summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-15 23:25:13 +0000
committergman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-15 23:25:13 +0000
commit198a4cc4264c83a9dfbeb6c000edfbe130dc4001 (patch)
treef5ba325761d2a01dd128d107369822025a7e56fd
parent1af924c1a438a37bd270d3f6d06c320732972ba4 (diff)
downloadchromium_src-198a4cc4264c83a9dfbeb6c000edfbe130dc4001.zip
chromium_src-198a4cc4264c83a9dfbeb6c000edfbe130dc4001.tar.gz
chromium_src-198a4cc4264c83a9dfbeb6c000edfbe130dc4001.tar.bz2
More docs changes.
*) Made enums show up *) Right justified return type *) moved class name to right column in summary area *) pretty print code examples *) changed [inherited] to [inhertied from <class>] *) Changed name in details area to Class.Name or Namespace.Name *) Add subtypes so ParticleEmitter shows up in docs for o3djs.particle *) Grabbed new nixysa so properties show up Review URL: http://codereview.chromium.org/155600 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20806 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--o3d/DEPS2
-rw-r--r--o3d/DEPS_gyp2
-rw-r--r--o3d/documentation/build.scons11
-rwxr-xr-xo3d/documentation/build_docs.py26
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/class.tmpl125
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/publish.js125
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/header.html4
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/prettify.css34
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/prettify.js23
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css8
-rw-r--r--o3d/plugin/idl/client.idl3
11 files changed, 307 insertions, 56 deletions
diff --git a/o3d/DEPS b/o3d/DEPS
index 40bbda2..dfe3760 100644
--- a/o3d/DEPS
+++ b/o3d/DEPS
@@ -1,7 +1,7 @@
vars = {
"chromium_trunk":
"http://src.chromium.org/svn/trunk",
- "nixysa_rev": "26",
+ "nixysa_rev": "28",
"o3d_code_rev": "94",
}
diff --git a/o3d/DEPS_gyp b/o3d/DEPS_gyp
index 59fd381..3502a0f 100644
--- a/o3d/DEPS_gyp
+++ b/o3d/DEPS_gyp
@@ -1,7 +1,7 @@
vars = {
"chromium_trunk":
"http://src.chromium.org/svn/trunk",
- "nixysa_rev": "26",
+ "nixysa_rev": "28",
"chromium_rev": "19644",
"o3d_code_rev": "94",
}
diff --git a/o3d/documentation/build.scons b/o3d/documentation/build.scons
index 71c9770..1d68f9f 100644
--- a/o3d/documentation/build.scons
+++ b/o3d/documentation/build.scons
@@ -39,6 +39,7 @@ Import('O3D_JS_SOURCES')
env.Replace(
JSDOC_DIR = '$SCONSTRUCT_DIR/documentation',
JSDOC_EZT_TEMPLATE_DIR = '$JSDOC_DIR/jsdoc-toolkit-templates/',
+ JSDOC_EXTERNS_DIR = '$JSDOC_DIR/externs/',
PYTHONPATH = ['$NIXYSA_DIR',
'$GFLAGS_DIR/python',
'$PLY_DIR']
@@ -66,4 +67,12 @@ env.JSDocs('base.js', LOCAL_JS_SOURCES + LOCAL_IDL_SOURCES +
'$JSDOC_EZT_TEMPLATE_DIR/namespaces.tmpl',
'$JSDOC_EZT_TEMPLATE_DIR/publish.js',
'$JSDOC_EZT_TEMPLATE_DIR/static/header.html',
- '$JSDOC_EZT_TEMPLATE_DIR/static/footer.html'])
+ '$JSDOC_EZT_TEMPLATE_DIR/static/footer.html',
+ '$JSDOC_EZT_TEMPLATE_DIR/static/stylesheet.css',
+ '$JSDOC_EZT_TEMPLATE_DIR/static/tabs.css',
+ '$JSDOC_EZT_TEMPLATE_DIR/static/tab_l.gif',
+ '$JSDOC_EZT_TEMPLATE_DIR/static/tab_r.gif',
+ '$JSDOC_EZT_TEMPLATE_DIR/static/tab_b.gif',
+ '$JSDOC_EXTERNS_DIR/externs.js',
+ '$JSDOC_EXTERNS_DIR/o3d-extra-externs.js',
+ '$JSDOC_DIR/build_docs.py'])
diff --git a/o3d/documentation/build_docs.py b/o3d/documentation/build_docs.py
index 72669a3..d244524 100755
--- a/o3d/documentation/build_docs.py
+++ b/o3d/documentation/build_docs.py
@@ -171,7 +171,7 @@ def RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, prefix, mode,
def BuildJavaScriptForDocsFromIDLs(idl_files, output_dir):
- RunNixysa(idl_files, 'jsheader', output_dir, [])
+ RunNixysa(idl_files, 'jsheader', output_dir, ['--properties-equal-undefined'])
def BuildJavaScriptForExternsFromIDLs(idl_files, output_dir):
@@ -212,18 +212,20 @@ def BuildCompiledO3DJS(o3djs_files,
MakePath('JSCompiler_deploy.jar'),
'--property_renaming', 'OFF',
'--variable_renaming', 'LOCAL',
+ '--remove_dead_assignments', 'false',
+ '--remove_dead_code', 'false',
+ '--remove_unused_vars', 'false',
+ '--remove_unused_prototype_props', 'false',
+ #'--check_missing_return', 'true',
+ #
+ '--collapse_variable_declarations', 'false',
+ '--disable_function_inline', 'true',
+ #'--disable_convert_to_dotted_properties', 'true',
+ #'--inline_functions', 'false',
# TODO(gman): Remove the flags below once the compiled js actually works.
#'--pretty_print',
- #'--inline_functions', 'False',
- #'--remove_dead_code', 'False',
- #'--remove_unused_vars', 'False',
- #'--remove_unused_prototype_props', 'False',
- #'--collapse_variable_declarations', 'False',
- #'--collapse_variable_declarations', 'OFF',
- #'--disable_function_inline', 'True',
- #'--print_input_delimiter', 'True',
- #'--remove_dead_assignments', 'False',
- #'--strip_whitespace_and_comments_only', 'True',
+ #'--print_input_delimiter', 'true',
+ #'--strip_whitespace_and_comments_only', 'true',
##'--logging_level', '',
'--strict',
'--externs=%s' % externs_path,
@@ -234,6 +236,8 @@ def BuildCompiledO3DJS(o3djs_files,
def CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath):
files = ['stylesheet.css',
+ 'prettify.css',
+ 'prettify.js',
'tabs.css',
'tab_l.gif',
'tab_r.gif',
diff --git a/o3d/documentation/jsdoc-toolkit-templates/class.tmpl b/o3d/documentation/jsdoc-toolkit-templates/class.tmpl
index 77a8b4f..1f30c40 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/class.tmpl
+++ b/o3d/documentation/jsdoc-toolkit-templates/class.tmpl
@@ -55,20 +55,49 @@ thisClass = data;
</ul>
</if>
+<!-- ========== PUBLIC TYPES =========== -->
+{! var ownTypes = getPublicTypes(data).sort(makeSortby("name"));
+ var justEnums = [];
+ for (var ot = 0; ot < ownTypes.length; ++ot) {
+ if (isEnum(ownTypes[ot])) {
+ justEnums.push(ownTypes[ot]);
+ }
+ }
+!}
+<if test="ownTypes.length">
+ <h2>Public Types</h2>
+ <table class="summary">
+ <for each="property" in="ownTypes">
+ <tr>
+ <td>
+ <if test="isEnum(property)">
+ enum <a class="el" href="#{+property.name+}">{+property.name+}</a>
+ </if>
+ <if test="!isEnum(property)">
+ {+linkifySingleType(makeName('[Type Summary]'), property.memberOf+'.'+property.name)+}
+ </if>
+ </td>
+ <td>{+linkifySingleType(makeName('[Type Summary inherit]'), getParentName(property))+}</td>
+ </tr>
+ </for>
+ </table>
+</if>
+
+
<!-- ========== METHOD SUMMARY =========== -->
<if test="thisClass.methods.length">
{! var ownMethods = data.methods.sort(makeSortby("name")); !}
<if test="ownMethods.length">
<h2>Public Member Functions</h2>
- <table>
+ <table class="summary">
<for each="method" in="ownMethods">
<if test="!method.isPrivate">
- <tr><td><li></li></td>
- <td>
- <if test="method.isStatic||!method.memberOf">&lt;Global&gt; </if>
+ <tr>
+ <td class="type">
<if test="method.type.length">{+linkifyTypeSpec(makeName('[Method Summary]', thisClass.alias, method.name), method.type)+}&nbsp;</if>
</td>
- <td><a class="el" href="#{+method.name+}">{+getQualifiedName(method)+}</a>{+makeSignature(method.params)+}</td>
+ <td><a class="el" href="#{+method.name+}">{+method.name+}</a>{+makeSignature(method.params)+}</td>
+ <td>{+linkifySingleType(makeName('[Method Summary inherit]'), getParentName(method))+}</td>
</tr>
</if>
</for>
@@ -77,24 +106,21 @@ thisClass = data;
</if>
<!-- =========== FIELD SUMMARY =========== -->
-<if test="data.properties.length">
- {! var ownProperties = data.properties.sort(makeSortby("name")); !}
- <if test="ownProperties.length">
- <h2>Public Properties</h2>
- <table>
- <for each="property" in="ownProperties">
- <if test="!property.isPrivate && !property.isNamespace">
- <tr><td><li></li></td>
- <td>
- <if test="property.isStatic||!property.memberOf">&lt;Global&gt;&nbsp;</if>
- {+linkifyTypeSpec(makeName('[Property Summary]', thisClass.alias, property.name), getPropertyType(property))+}
- </td>
- <td><a class="el" href="#{+property.name+}">{+getQualifiedName(property)+}</a></td>
- </tr>
- </if>
- </for>
- </table>
- </if>
+{! var ownProperties = getPublicProperties(data).sort(makeSortby("name")); !}
+<if test="ownProperties.length">
+ <h2>Public Properties</h2>
+ <table class="summary">
+ <for each="property" in="ownProperties">
+ <tr>
+ <td class="type">
+ <if test="property.isStatic||!property.memberOf">&lt;Global&gt;&nbsp;</if>
+ {+linkifyTypeSpec(makeName('[Property Summary]', thisClass.alias, property.name), getPropertyType(property))+}
+ </td>
+ <td><a class="el" href="#{+property.name+}">{+property.name+}</a></td>
+ <td>{+linkifySingleType(makeName('[Prop Summary inherit]'), getParentName(property))+}</td>
+ </tr>
+ </for>
+ </table>
</if>
<!-- =========== END FIELD SUMMARY =========== -->
@@ -162,6 +188,45 @@ thisClass = data;
</div>
</if>
+
+<!-- =========== TYPES DETAIL ============== -->
+
+<if test="defined(justEnums) && justEnums.length">
+ <hr/>
+ <h2>Public Types Documentation</h2>
+ <for each="property" in="justEnums">
+ <a class="anchor" name="{+property.name+}"></a>
+ <div class="memitem">
+ <div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">{+isEnum(property)?'enum ':''+}{+property.memberOf+"."+property.name+}</td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="memdoc">
+ <p/>
+ {+sanitizeForEZT(property.desc)+}
+ </div>
+
+ <if test="property.see.length">
+ <dl compact><td><b>See Also:</b></dt>
+ <dd><ul>
+ <for each="seeAlso" in="property.see">
+ <li>
+ {+linkifyTypeSpec(makeName('[Property See Also]', thisClass.alias), seeAlso)+}
+ </li>
+ </for>
+ </ul></dd>
+ </dl>
+ </if>
+
+ </div>
+ </for>
+</if>
+
+
<!-- =========== METHOD DETAIL ============== -->
<if test="defined(ownMethods) && ownMethods.length">
<hr/>
@@ -172,11 +237,11 @@ thisClass = data;
<div class="memitem">
<div class="memproto">
<table class="memname">
- {! var tempInherited = member.memberOf == thisClass.alias ? "" : "[[]inherited]"; !}
+ {! var tempInherited = member.memberOf == thisClass.alias ? "" : ("[[]inherited from <a class=\"el\" href=\"" + getLinkToClassByAlias(member.memberOf) + "\">" + member.memberOf + "</a>]"); !}
<if test="member.params && member.params.length">
{!
var tempCSS = "memname";
- var tempName = linkifyTypeSpecForReturn(makeName('[Method Detail]', thisClass.alias, member.name), member.type)+" "+getQualifiedName(member);
+ var tempName = linkifyTypeSpecForReturn(makeName('[Method Detail]', thisClass.alias, member.name), member.type)+" "+getDocName(data, member);
var tempParen = "(";
var tempEnd = member.params.length > 1 ? "" : ")"
!}
@@ -187,7 +252,7 @@ thisClass = data;
<td class="paramtype">{+linkifyTypeSpec(makeName('[Param Detail]', thisClass.alias, member.name, param.name), param.type)+}</td>
<td class="paramname"><em>{+param.name+}</em></td>
<td><if test="$param_last">)</if></td>
- <td><if test="$param_last">{+tempInherited+}</if></td>
+ <td><code><if test="$param_last">{+tempInherited+}</if></code></td>
</tr>
{!
tempCSS = "paramkey";
@@ -198,7 +263,7 @@ thisClass = data;
</if>
<if test="!member.params || member.params.length == 0">
<tr>
- <td class="memname">{+member.memberOf+"."+member.name+}</td>
+ <td class="memname">{+getDocName(data, member)+}</td>
<td>(</td>
<td class="paramtype"></td>
<td class="paramname"></td>
@@ -254,13 +319,14 @@ thisClass = data;
<hr/>
<h2>Member Property Documentation</h2>
<for each="property" in="ownProperties">
- <if test="!property.isPrivate && !property.isNamespace">
<a class="anchor" name="{+property.name+}"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">{+linkifyTypeSpec(makeName('[Property Detail]', thisClass.alias, property.name), getPropertyType(property))+} {+getQualifiedName(property)+}</td>
+ <td class="memname">{+linkifyTypeSpec(makeName('[Property Detail]', thisClass.alias, property.name), getPropertyType(property))+} {+getDocName(data, property)+}
+ {+ (property.memberOf == thisClass.alias) ? "" : ("[[]inherited from <a class=\"el\" href=\"" + getLinkToClassByAlias(property.memberOf) + "\">" + property.memberOf + "</a>]") +}
+ </td>
</tr>
</table>
</div>
@@ -283,7 +349,6 @@ thisClass = data;
</if>
</div>
- </if>
</for>
</if>
diff --git a/o3d/documentation/jsdoc-toolkit-templates/publish.js b/o3d/documentation/jsdoc-toolkit-templates/publish.js
index 41bdf93..70229a3 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/publish.js
+++ b/o3d/documentation/jsdoc-toolkit-templates/publish.js
@@ -36,6 +36,7 @@
var g_symbolSet; // so we can look stuff up below.
+var g_symbolArray;
var g_filePrefix;
var g_skipRE;
var g_validJSDOCTypes = {
@@ -62,6 +63,23 @@ var g_templates = [];
* @param {SymbolSet} symbolSet Set of all symbols in all files.
*/
function publish(symbolSet) {
+ try {
+ publishInternal(symbolSet);
+ } catch (e) {
+ generateError(e);
+ }
+
+ if (g_numErrors > 0) {
+ print('Num Errors: ' + g_numErrors);
+ System.exit(1);
+ }
+}
+
+/**
+ * Called by us to catch errors.
+ * @param {SymbolSet} symbolSet Set of all symbols in all files.
+ */
+function publishInternal(symbolSet) {
publish.conf = { // trailing slash expected for dirs
ext: '.ezt',
outDir: JSDOC.opt.d,
@@ -106,6 +124,7 @@ function publish(symbolSet) {
try {
var templatesDir = publish.conf.templatesDir;
var classTemplate = new JSDOC.JsPlate(templatesDir + 'class.tmpl');
+ var exportsTemplate = new JSDOC.JsPlate(templatesDir + 'exports.tmpl');
var membersTemplate = new JSDOC.JsPlate(templatesDir + 'members.tmpl');
var classTreeTemplate = new JSDOC.JsPlate(templatesDir + 'classtree.tmpl');
var fileListTemplate = new JSDOC.JsPlate(templatesDir + 'filelist.tmpl');
@@ -124,6 +143,7 @@ function publish(symbolSet) {
// get an array version of the symbolset, useful for filtering
var symbols = symbolSet.toArray();
+ g_symbolArray = symbols;
// create the hilited source code files
if (false) {
@@ -134,6 +154,13 @@ function publish(symbolSet) {
}
}
+ // Comment this lines in to see all symbol information.
+ //for (var ii = 0; ii < symbols.length; ++ii) {
+ // var symbol = symbols[ii];
+ // print('------[' + symbol.name + ']-------------------------------------');
+ // dumpObject(symbol, 5);
+ //}
+
// get a list of all the classes in the symbolset
var classes = symbols.filter(isaClass).sort(makeSortby('alias'));
var filteredClasses = [];
@@ -156,8 +183,10 @@ function publish(symbolSet) {
filteredClasses.push(symbol);
// Comment these lines in to see what data is available to the templates.
- //print('----------------------------------------------------------------');
- //dumpObject(symbol, 5);
+ //if (symbol.name == 'Client' || symbol.name == 'particles') {
+ // print('------[' + symbol.name + ']-----------------------------------');
+ // dumpObject(symbol, 5);
+ //}
// <a href='symbol.source'>symbol.filename</a>
symbol.source = symbol.srcFile; // This is used as a link to the source
@@ -203,10 +232,8 @@ function publish(symbolSet) {
IO.saveFile(publish.conf.outDir, 'namespaces' + publish.conf.ext, namespaces);
IO.saveFile(publish.conf.htmlDir, 'namespaces.html', namespaces);
- if (g_numErrors > 0) {
- print('Num Errors: ' + g_numErrors);
- System.exit(1);
- }
+ var exports = exportsTemplate.process(symbols);
+ IO.saveFile(publish.conf.outDir, 'exports.js', fileList);
}
/**
@@ -458,6 +485,7 @@ function getPropertyType(property) {
* @return {string} Sanitized string.
*/
function sanitizeForEZT(str) {
+ str = str.replace(/<pre>/g, '<pre class="prettyprint">');
return str.replace(/\[/g, '[[]').replace(/\n\n/g, '<br/><br/>');
}
@@ -769,6 +797,65 @@ function linkifyTypeSpecForReturn(place, str) {
}
/**
+ * Check if a symbol is an enum.
+ * @param {!Symbol} symbol Symbol to check.
+ * @return {boolean} true if symbol is an enum
+ */
+function isEnum(symbol) {
+ if (symbol.isStatic && !symbol.isNamespace) {
+ if (symbol.comment && symbol.comment.tagTexts) {
+ for (var ii = 0; ii < symbol.comment.tagTexts.length; ++ii) {
+ var tag = symbol.comment.tagTexts[ii];
+ if (startsWith(tag.toString(), 'enum')) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * Gets the public properties of a symbol.
+ * @param {!Symbol} symbol The symbol to get properties from.
+ * @return {!Array.<!Symbol>} The public properties of the symbol.
+ */
+function getPublicProperties(symbol) {
+ var publicProperties = [];
+ for (var ii = 0; ii < symbol.properties.length; ++ii) {
+ var property = symbol.properties[ii];
+ if (!property.isPrivate && !property.isNamespace && !isEnum(property)) {
+ publicProperties.push(property);
+ }
+ }
+ return publicProperties;
+}
+
+/**
+ * Gets the public types of a symbol.
+ * @param {!Symbol} symbol The symbol to get properties from.
+ * @return {!Array.<!Symbol>} The public types of the symbol.
+ */
+function getPublicTypes(symbol) {
+ var publicTypes = [];
+ for (var ii = 0; ii < symbol.properties.length; ++ii) {
+ var type = symbol.properties[ii];
+ if (!type.isPrivate && !type.isNamespace && isEnum(type)) {
+ publicTypes.push(type);
+ }
+ }
+ for (var ii = 0; ii < g_symbolArray.length; ++ii) {
+ var type = g_symbolArray[ii];
+ if (type.memberOf == symbol.alias &&
+ !type.isPrivate &&
+ type.is('CONSTRUCTOR')) {
+ publicTypes.push(type);
+ }
+ }
+ return publicTypes;
+}
+
+/**
* Gets a symbol for a type.
* This is here mostly for debugging so you can insert a print before or after
* each call to g_symbolSet.getSymbol.
@@ -791,17 +878,37 @@ function getSourcePath(symbol) {
}
/**
+ * Gets the name of the parent of a symbol.
+ * @param {!Symbol} symbol The symbol to get the parent of
+ * @return {string} The parent's name.
+ */
+function getParentName(symbol) {
+ var parent = getSymbol(symbol.memberOf);
+ return parent.isNamespace ? symbol.memberOf : parent.name;
+}
+
+/**
* Gets a qualified name. Used for members. For namespaces will return the fully
* qualified name. For objects will return just ObjectName.method
* @param {!Symbol} method The method or property to get a qualified name for.
* @return {string} The qualified name for the method or property.
*/
function getQualifiedName(method) {
- var parent = getSymbol(method.memberOf);
+ return getParentName(method) + '.' + method.name;
+}
+
+/**
+ * Gets a Documentation name. For members of a namespace returns the fully
+ * qualified name. For members of a class returns ClassName.name
+ * @param {!Symbol} parent Symbol that we are making docs for.
+ * @param {!Symbol} child Method or property of parent to get doc name for.
+ * @return {string} Doc name for child.
+ */
+function getDocName(parent, child) {
if (parent.isNamespace) {
- return method.memberOf + "." + method.name
+ return child.memberOf + "." + child.name;
}
- return parent.name + '.' + method.name;
+ return parent.name + "." + child.name;
}
/**
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/header.html b/o3d/documentation/jsdoc-toolkit-templates/static/header.html
index b5d9bd6..e06b775 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/static/header.html
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/header.html
@@ -10,9 +10,11 @@
[#] <link href="/css/semantic_headers.css" rel="stylesheet" type="text/css" />
[#] <link href="{+getTopURL()+}stylesheet.css" rel="stylesheet" type="text/css">
[#] <link href="{+getTopURL()+}tabs.css" rel="stylesheet" type="text/css">
+[#] <link href="{+getTopURL()+}prettify.css" rel="stylesheet" type="text/css">
+[#] <script type="text/javascript" src="{+getTopURL()+}prettify.js"></script>
[#] </head>
[#]
-[#] <body class="gc-documentation">
+[#] <body class="gc-documentation" onload="prettyPrint()">
[#]
[#] [define content_section]#gc-pagecontent[end]
[#] [define navigation_section]#gc-toc[end]
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/prettify.css b/o3d/documentation/jsdoc-toolkit-templates/static/prettify.css
new file mode 100644
index 0000000..69d11f7
--- /dev/null
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/prettify.css
@@ -0,0 +1,34 @@
+.str{ color: #008 }
+.kwd{ color: #808 }
+.com{ color: #800 }
+.typ{ color: #606 }
+.lit{ color: #066 }
+.pun{ color: #660 }
+.pln{ color: #060 }
+.tag{ color: #008 }
+.atn{ color: #606 }
+.atv{ color: #080 }
+.dec{ color: #606 }
+.prettyprint{
+ font-family: Fixed, monospace;
+ font-size: 95%;
+ margin: 4px 8px 4px 2px;
+ padding: 4px 6px;
+ border: 1px solid #CCC;
+ background-color: #f5f5f5;
+}
+.re.prettyprint{
+}
+@media print {
+ .str{ color: #060 }
+ .kwd{ color: #006; font-weight: bold }
+ .com{ color: #600; font-style: italic }
+ .typ{ color: #404; font-weight: bold }
+ .lit{ color: #044 }
+ .pun{ color: #440 }
+ .pln{ color: #000 }
+ .tag{ color: #006;font-weight: bold }
+ .atn{ color: #404 }
+ .atv{ color: #060 }
+}
+
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/prettify.js b/o3d/documentation/jsdoc-toolkit-templates/static/prettify.js
new file mode 100644
index 0000000..8fc4c93
--- /dev/null
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/prettify.js
@@ -0,0 +1,23 @@
+function H(){var x=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);H=function(){return x};return x}(function(){function x(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var y="break continue do else for if return while ",U=y+"auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",D=U+"catch class delete false import new operator private protected public this throw true try ",
+I=D+"alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ",J=D+"boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",V=J+"as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ",
+K=D+"debugger eval export function get null set undefined var with Infinity NaN ",L="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",M=y+"and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",N=y+"alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",
+O=y+"case done elif esac eval fi function in local set then until ",W=I+V+K+L+M+N+O;function X(b){return b>="a"&&b<="z"||b>="A"&&b<="Z"}function u(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Y=(function(){var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=","~","break","case","continue",
+"delete","do","else","finally","instanceof","return","throw","try","typeof"],a="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)";for(var c=0;c<b.length;++c){var d=b[c];a+=X(d.charAt(0))?"|\\b"+d:"|"+d.replace(/([^=<>:&])/g,"\\$1")}a+="|^)\\s*$";return new RegExp(a)})(),P=/&/g,Q=/</g,R=/>/g,Z=/\"/g;function $(b){return b.replace(P,"&amp;").replace(Q,"&lt;").replace(R,"&gt;").replace(Z,"&quot;")}function E(b){return b.replace(P,"&amp;").replace(Q,"&lt;").replace(R,"&gt;")}var aa=
+/&lt;/g,ba=/&gt;/g,ca=/&apos;/g,da=/&quot;/g,ea=/&amp;/g,fa=/&nbsp;/g;function ga(b){var a=b.indexOf("&");if(a<0)return b;for(--a;(a=b.indexOf("&#",a+1))>=0;){var c=b.indexOf(";",a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)==="x"){d=d.substring(1);g=16}var e=parseInt(d,g);if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(aa,"<").replace(ba,">").replace(ca,"'").replace(da,'"').replace(ea,"&").replace(fa," ")}function S(b){return"XMP"===b.tagName}
+function z(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push("<",c);for(var d=0;d<b.attributes.length;++d){var g=b.attributes[d];if(!g.specified)continue;a.push(" ");z(g,a)}a.push(">");for(var e=b.firstChild;e;e=e.nextSibling)z(e,a);if(b.firstChild||!/^(?:br|link|img)$/.test(c))a.push("</",c,">");break;case 2:a.push(b.name.toLowerCase(),'="',$(b.value),'"');break;case 3:case 4:a.push(E(b.nodeValue));break}}var F=null;function ha(b){if(null===F){var a=document.createElement("PRE");
+a.appendChild(document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));F=!/</.test(a.innerHTML)}if(F){var c=b.innerHTML;if(S(b))c=E(c);return c}var d=[];for(var g=b.firstChild;g;g=g.nextSibling)z(g,d);return d.join("")}function ia(b){var a=0;return function(c){var d=null,g=0;for(var e=0,h=c.length;e<h;++e){var f=c.charAt(e);switch(f){case "\t":if(!d)d=[];d.push(c.substring(g,e));var i=b-a%b;a+=i;for(;i>=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break;
+case "\n":a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join("")}}var ja=/(?:[^<]+|<!--[\s\S]*?--\>|<!\[CDATA\[([\s\S]*?)\]\]>|<\/?[a-zA-Z][^>]*>|<)/g,ka=/^<!--/,la=/^<\[CDATA\[/,ma=/^<br\b/i;function na(b){var a=b.match(ja),c=[],d=0,g=[];if(a)for(var e=0,h=a.length;e<h;++e){var f=a[e];if(f.length>1&&f.charAt(0)==="<"){if(ka.test(f))continue;if(la.test(f)){c.push(f.substring(9,f.length-3));d+=f.length-12}else if(ma.test(f)){c.push("\n");++d}else g.push(d,f)}else{var i=ga(f);
+c.push(i);d+=i.length}}return{source:c.join(""),tags:g}}function v(b,a){var c={};(function(){var g=b.concat(a);for(var e=g.length;--e>=0;){var h=g[e],f=h[3];if(f)for(var i=f.length;--i>=0;)c[f.charAt(i)]=h}})();var d=a.length;return function(g,e){e=e||0;var h=[e,"pln"],f="",i=0,j=g;while(j.length){var o,m=null,k,l=c[j.charAt(0)];if(l){k=j.match(l[1]);m=k[0];o=l[0]}else{for(var n=0;n<d;++n){l=a[n];var p=l[2];if(p&&!p.test(f))continue;k=j.match(l[1]);if(k){m=k[0];o=l[0];break}}if(!m){o="pln";m=j.substring(0,
+1)}}h.push(e+i,o);i+=m.length;j=j.substring(m.length);if(o!=="com"&&/\S/.test(m))f=m}return h}}var oa=v([],[["pln",/^[^<]+/,null],["dec",/^<!\w[^>]*(?:>|$)/,null],["com",/^<!--[\s\S]*?(?:--\>|$)/,null],["src",/^<\?[\s\S]*?(?:\?>|$)/,null],["src",/^<%[\s\S]*?(?:%>|$)/,null],["src",/^<(script|style|xmp)\b[^>]*>[\s\S]*?<\/\1\b[^>]*>/i,null],["tag",/^<\/?\w[^<>]*>/,null]]);function pa(b){var a=oa(b);for(var c=0;c<a.length;c+=2)if(a[c+1]==="src"){var d,g;d=a[c];g=c+2<a.length?a[c+2]:b.length;var e=b.substring(d,
+g),h=e.match(/^(<[^>]*>)([\s\S]*)(<\/[^>]*>)$/);if(h)a.splice(c,2,d,"tag",d+h[1].length,"src",d+h[1].length+(h[2]||"").length,"tag")}return a}var qa=v([["atv",/^\'[^\']*(?:\'|$)/,null,"'"],["atv",/^\"[^\"]*(?:\"|$)/,null,'"'],["pun",/^[<>\/=]+/,null,"<>/="]],[["tag",/^[\w:\-]+/,/^</],["atv",/^[\w\-]+/,/^=/],["atn",/^[\w:\-]+/,null],["pln",/^\s+/,null," \t\r\n"]]);function ra(b,a){for(var c=0;c<a.length;c+=2){var d=a[c+1];if(d==="tag"){var g,e;g=a[c];e=c+2<a.length?a[c+2]:b.length;var h=b.substring(g,
+e),f=qa(h,g);u(f,a,c,2);c+=f.length-2}}return a}function r(b){var a=[],c=[];if(b.tripleQuotedStrings)a.push(["str",/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""]);else if(b.multiLineStrings)a.push(["str",/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]);else a.push(["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
+null,"\"'"]);c.push(["pln",/^(?:[^\'\"\`\/\#]+)/,null," \r\n"]);if(b.hashComments)a.push(["com",/^#[^\r\n]*/,null,"#"]);if(b.cStyleComments)c.push(["com",/^\/\/[^\r\n]*/,null]);if(b.regexLiterals)c.push(["str",/^\/(?:[^\\\*\/\[]|\\[\s\S]|\[(?:[^\]\\]|\\.)*(?:\]|$))+(?:\/|$)/,Y]);if(b.cStyleComments)c.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null]);var d=x(b.keywords);b=null;var g=v(a,c),e=v([],[["pln",/^\s+/,null," \r\n"],["pln",/^[a-z_$@][a-z_$@0-9]*/i,null],["lit",/^0x[a-f0-9]+[a-z]/i,null],["lit",
+/^(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?[a-z]*/i,null,"123456789"],["pun",/^[^\s\w\.$@]+/,null]]);function h(f,i){for(var j=0;j<i.length;j+=2){var o=i[j+1];if(o==="pln"){var m,k,l,n;m=i[j];k=j+2<i.length?i[j+2]:f.length;l=f.substring(m,k);n=e(l,m);for(var p=0,t=n.length;p<t;p+=2){var w=n[p+1];if(w==="pln"){var A=n[p],B=p+2<t?n[p+2]:l.length,s=f.substring(A,B);if(s===".")n[p+1]="pun";else if(s in d)n[p+1]="kwd";else if(/^@?[A-Z][A-Z$]*[a-z][A-Za-z$]*$/.test(s))n[p+1]=s.charAt(0)==="@"?"lit":
+"typ"}}u(n,i,j,2);j+=n.length-2}}return i}return function(f){var i=g(f);i=h(f,i);return i}}var G=r({keywords:W,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function sa(b,a){for(var c=0;c<a.length;c+=2){var d=a[c+1];if(d==="src"){var g,e;g=a[c];e=c+2<a.length?a[c+2]:b.length;var h=G(b.substring(g,e));for(var f=0,i=h.length;f<i;f+=2)h[f]+=g;u(h,a,c,2);c+=h.length-2}}return a}function ta(b,a){var c=false;for(var d=0;d<a.length;d+=2){var g=a[d+1],e,h;if(g==="atn"){e=
+a[d];h=d+2<a.length?a[d+2]:b.length;c=/^on|^style$/i.test(b.substring(e,h))}else if(g==="atv"){if(c){e=a[d];h=d+2<a.length?a[d+2]:b.length;var f=b.substring(e,h),i=f.length,j=i>=2&&/^[\"\']/.test(f)&&f.charAt(0)===f.charAt(i-1),o,m,k;if(j){m=e+1;k=h-1;o=f}else{m=e+1;k=h-1;o=f.substring(1,f.length-1)}var l=G(o);for(var n=0,p=l.length;n<p;n+=2)l[n]+=m;if(j){l.push(k,"atv");u(l,a,d+2,0)}else u(l,a,d,2)}c=false}}return a}function ua(b){var a=pa(b);a=ra(b,a);a=sa(b,a);a=ta(b,a);return a}function va(b,
+a,c){var d=[],g=0,e=null,h=null,f=0,i=0,j=ia(8);function o(k){if(k>g){if(e&&e!==h){d.push("</span>");e=null}if(!e&&h){e=h;d.push('<span class="',e,'">')}var l=E(j(b.substring(g,k))).replace(/(\r\n?|\n| ) /g,"$1&nbsp;").replace(/\r\n?|\n/g,"<br />");d.push(l);g=k}}while(true){var m;m=f<a.length?(i<c.length?a[f]<=c[i]:true):false;if(m){o(a[f]);if(e){d.push("</span>");e=null}d.push(a[f+1]);f+=2}else if(i<c.length){o(c[i]);h=c[i+1];i+=2}else break}o(b.length);if(e)d.push("</span>");return d.join("")}
+var C={};function q(b,a){for(var c=a.length;--c>=0;){var d=a[c];if(!C.hasOwnProperty(d))C[d]=b;else if("console"in window)console.log("cannot override language handler %s",d)}}q(G,["default-code"]);q(ua,["default-markup","html","htm","xhtml","xml","xsl"]);q(r({keywords:I,hashComments:true,cStyleComments:true}),["c","cc","cpp","cs","cxx","cyc"]);q(r({keywords:J,cStyleComments:true}),["java"]);q(r({keywords:O,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);q(r({keywords:M,hashComments:true,
+multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);q(r({keywords:L,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);q(r({keywords:N,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);q(r({keywords:K,cStyleComments:true,regexLiterals:true}),["js"]);function T(b,a){try{var c=na(b),d=c.source,g=c.tags;if(!C.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";var e=C[a].call({},d);return va(d,g,e)}catch(h){if("console"in window){console.log(h);
+console.trace()}return b}}function wa(b){var a=H(),c=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],d=[];for(var g=0;g<c.length;++g)for(var e=0;e<c[g].length;++e)d.push(c[g][e]);c=null;var h=0;function f(){var i=(new Date).getTime()+250;for(;h<d.length&&(new Date).getTime()<i;h++){var j=d[h];if(j.className&&j.className.indexOf("prettyprint")>=0){var o=j.className.match(/\blang-(\w+)\b/);if(o)o=o[1];var m=false;for(var k=j.parentNode;k;k=
+k.parentNode)if((k.tagName==="pre"||k.tagName==="code"||k.tagName==="xmp")&&k.className&&k.className.indexOf("prettyprint")>=0){m=true;break}if(!m){var l=ha(j);l=l.replace(/(?:\r\n?|\n)$/,"");var n=T(l,o);if(!S(j))j.innerHTML=n;else{var p=document.createElement("PRE");for(var t=0;t<j.attributes.length;++t){var w=j.attributes[t];if(w.specified)p.setAttribute(w.name,w.value)}p.innerHTML=n;j.parentNode.replaceChild(p,j);p=j}if(a&&j.tagName==="PRE"){var A=j.getElementsByTagName("br");for(var B=A.length;--B>=
+0;){var s=A[B];s.parentNode.replaceChild(document.createTextNode("\r\n"),s)}}}}}if(h<d.length)setTimeout(f,250);else if(b)b()}f()}window.PR_normalizedHtml=z;window.prettyPrintOne=T;window.prettyPrint=wa;window.PR={createSimpleLexer:v,registerLangHandler:q,sourceDecorator:r,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css b/o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css
index be09224..3a4f825 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css
@@ -222,6 +222,14 @@ TD.tiny{
#doxygen-ref CAPTION {
font-weight: bold;
}
+#doxygen-ref .contents .summary {
+ line-height: 1em;
+}
+#doxygen-ref .contents .summary TD {
+}
+#doxygen-ref .contents .summary .type {
+ text-align: right;
+}
.memdoc {
padding-left: 30px;
}
diff --git a/o3d/plugin/idl/client.idl b/o3d/plugin/idl/client.idl
index fb16e1d..80568c7 100644
--- a/o3d/plugin/idl/client.idl
+++ b/o3d/plugin/idl/client.idl
@@ -183,7 +183,6 @@ class Client {
[const, noreturndocs] ObjectArray GetObjectsByClassName(String class_name);
%[
- \var RenderMode,
\li RENDERMODE_CONTINUOUS, Draw as often as possible up to refresh rate.
\li RENDERMODE_ON_DEMAND, Draw once then only when the OS requests it
(like uncovering part of a window.)
@@ -530,7 +529,7 @@ class Client {
[userglue_getter, getter] ObjectBaseArray objects_;
%[
- Clears the error returned by GetLastError.
+ Clears the error returned in lastError.
%]
void ClearLastError();