summaryrefslogtreecommitdiffstats
path: root/o3d
diff options
context:
space:
mode:
authorgman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-14 20:15:54 +0000
committergman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-14 20:15:54 +0000
commitac75f7f4418a8ca304dc030695465fab8ef02f6d (patch)
treed9d2921c0936b61dffdf2610abaa0142c9a5ebf1 /o3d
parent2e066b3eed13cc1dc502a1f9cc7c1ac3891b0bdc (diff)
downloadchromium_src-ac75f7f4418a8ca304dc030695465fab8ef02f6d.zip
chromium_src-ac75f7f4418a8ca304dc030695465fab8ef02f6d.tar.gz
chromium_src-ac75f7f4418a8ca304dc030695465fab8ef02f6d.tar.bz2
Lots more docs changes.
*) added stylesheet.css, tabs.css, tab_?.gif back in *) refactored so classtree.html splits names that are too long. *) removed constructor docs and source link from o3d docs (vs o3djs docs) *) fixed paths in header.html. They used to be statically included but now that they are used by both o3d and o3djs they needed to have certain paths fixed dynamically. *) Pull in new nixysa. Review URL: http://codereview.chromium.org/155526 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20645 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d')
-rw-r--r--o3d/DEPS2
-rw-r--r--o3d/DEPS_gyp2
-rwxr-xr-xo3d/documentation/build_docs.py52
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/annotated.tmpl2
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/class.tmpl14
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/classtree.tmpl4
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/members.tmpl2
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/namespaces.tmpl3
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/publish.js100
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/header.html4
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css (renamed from o3d/documentation/stylesheet.css)0
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/tab_b.gifbin0 -> 35 bytes
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/tab_l.gifbin0 -> 706 bytes
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/tab_r.gifbin0 -> 2585 bytes
-rw-r--r--o3d/documentation/jsdoc-toolkit-templates/static/tabs.css102
15 files changed, 242 insertions, 45 deletions
diff --git a/o3d/DEPS b/o3d/DEPS
index 002cc4a..c33e0d6 100644
--- a/o3d/DEPS
+++ b/o3d/DEPS
@@ -1,7 +1,7 @@
vars = {
"chromium_trunk":
"http://src.chromium.org/svn/trunk",
- "nixysa_rev": "25",
+ "nixysa_rev": "26",
"o3d_code_rev": "93",
}
diff --git a/o3d/DEPS_gyp b/o3d/DEPS_gyp
index 20479c1..1a70021 100644
--- a/o3d/DEPS_gyp
+++ b/o3d/DEPS_gyp
@@ -1,7 +1,7 @@
vars = {
"chromium_trunk":
"http://src.chromium.org/svn/trunk",
- "nixysa_rev": "25",
+ "nixysa_rev": "26",
"chromium_rev": "19644",
"o3d_code_rev": "93",
}
diff --git a/o3d/documentation/build_docs.py b/o3d/documentation/build_docs.py
index 43344fe..72669a3 100755
--- a/o3d/documentation/build_docs.py
+++ b/o3d/documentation/build_docs.py
@@ -39,6 +39,8 @@ import imp
import types
import glob
import subprocess
+import shutil
+
_java_exe = ''
_script_path = os.path.dirname(os.path.realpath(__file__))
@@ -137,15 +139,16 @@ def RunNixysa(idl_files, generate, output_dir, nixysa_options):
idl_files)
-def RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, prefix, o3djs,
- baseURL):
+def RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, prefix, mode,
+ baseURL, topURL):
"""Executes the JSDocToolkit."""
list_filename = MakePath('../scons-out/docs/obj/doclist.conf')
f = open(list_filename, 'w')
f.write('{\nD:{\n')
f.write('prefix: "%s",\n' % prefix)
f.write('baseURL: "%s",\n' % baseURL)
- f.write('o3djs: "%s",\n' % o3djs)
+ f.write('topURL: "%s",\n' % topURL)
+ f.write('mode: "%s",\n' % mode)
f.write('htmlOutDir: "%s",\n' % html_output_dir.replace('\\', '/'))
f.write('endMarker: ""\n')
f.write('},\n')
@@ -180,12 +183,12 @@ def BuildJavaScriptForExternsFromIDLs(idl_files, output_dir):
def BuildO3DDocsFromJavaScript(js_files, ezt_output_dir, html_output_dir):
RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir,
- 'classo3d_1_1_', '', '')
+ 'classo3d_1_1_', 'o3d', '', '')
def BuildO3DJSDocs(js_files, ezt_output_dir, html_output_dir):
- RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, 'js_0_1_', 'true',
- 'jsdocs/')
+ RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, 'js_0_1_', 'o3djs',
+ 'jsdocs/', '../')
def BuildO3DExternsFile(js_files_dir, extra_externs_file, externs_file):
@@ -229,6 +232,19 @@ def BuildCompiledO3DJS(o3djs_files,
['-js=%s' % (x, ) for x in o3djs_files]);
+def CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath):
+ files = ['stylesheet.css',
+ 'tabs.css',
+ 'tab_l.gif',
+ 'tab_r.gif',
+ 'tab_b.gif']
+ for file in files:
+ shutil.copyfile(MakePath('jsdoc-toolkit-templates/static/' + file),
+ MakePath(os.path.join(o3d_docs_ezt_outpath, file)))
+ shutil.copyfile(MakePath('jsdoc-toolkit-templates/static/' + file),
+ MakePath(os.path.join(o3d_docs_html_outpath, file)))
+
+
def main():
"""Builds the O3D API docs and externs and the o3djs docs."""
global _java_exe
@@ -239,19 +255,16 @@ def main():
js_list_basepath = os.path.dirname(js_list_filename)
idl_list_basepath = os.path.dirname(idl_list_filename)
- docs_js_outpath = MakePath('../scons-out/docs/obj/documentation/apijs')
- externs_js_outpath = MakePath('../scons-out/docs/obj/externs')
- o3d_docs_ezt_outpath = MakePath(
- '../scons-out/docs/obj/documentation/reference')
- o3d_docs_html_outpath = MakePath(
- '../scons-out/docs/obj/documentation/local_html')
- o3djs_docs_ezt_outpath = MakePath(
- '../scons-out/docs/obj/documentation/reference/jsdocs')
- o3djs_docs_html_outpath = MakePath(
- '../scons-out/docs/obj/documentation/local_html/jsdocs')
- o3d_externs_path = MakePath('../scons-out/docs/obj/o3d-externs.js')
- compiled_o3djs_outpath = MakePath(
- '../scons-out/docs/obj/documentation/base.js')
+ outpath = '../scons-out/docs/obj/'
+ docs_outpath = '../scons-out/docs/obj/documentation/'
+ docs_js_outpath = MakePath(docs_outpath + 'apijs')
+ externs_js_outpath = MakePath(outpath + '/externs')
+ o3d_docs_ezt_outpath = MakePath(docs_outpath + 'reference')
+ o3d_docs_html_outpath = MakePath(docs_outpath + 'local_html')
+ o3djs_docs_ezt_outpath = MakePath(docs_outpath + 'reference/jsdocs')
+ o3djs_docs_html_outpath = MakePath(docs_outpath + 'local_html/jsdocs')
+ o3d_externs_path = MakePath(outpath + 'o3d-externs.js')
+ compiled_o3djs_outpath = MakePath(docs_outpath + 'base.js')
externs_path = MakePath('externs/externs.js')
o3d_extra_externs_path = MakePath('externs/o3d-extra-externs.js')
@@ -280,6 +293,7 @@ def main():
o3d_externs_path)
BuildO3DJSDocs(o3djs_files + [o3d_externs_path], o3djs_docs_ezt_outpath,
o3djs_docs_html_outpath)
+ CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath)
BuildCompiledO3DJS(o3djs_files,
externs_path,
o3d_externs_path,
diff --git a/o3d/documentation/jsdoc-toolkit-templates/annotated.tmpl b/o3d/documentation/jsdoc-toolkit-templates/annotated.tmpl
index 1388e67..7f87e49 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/annotated.tmpl
+++ b/o3d/documentation/jsdoc-toolkit-templates/annotated.tmpl
@@ -7,7 +7,7 @@
<!-- Genreated by jsdoctoolkit 2.1.0 -->
<div class="navigation" id="top">
</div>
-
+<div class="contents">
<h1>Class List</h1>
Here are the classes, structs, unions and interfaces with brief descriptions:
diff --git a/o3d/documentation/jsdoc-toolkit-templates/class.tmpl b/o3d/documentation/jsdoc-toolkit-templates/class.tmpl
index 0520705..77a8b4f 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/class.tmpl
+++ b/o3d/documentation/jsdoc-toolkit-templates/class.tmpl
@@ -28,7 +28,7 @@ thisClass = data;
<if test="thisClass.classDesc">{+sanitizeForEZT(thisClass.classDesc)+}</if>
<if test="!thisClass.classDesc">{+sanitizeForEZT(thisClass.desc)+}</if>
-<if test="thisClass.srcFile.length">
+<if test="getOutputMode() !== 'o3d' && thisClass.srcFile.length">
<h2>Source</h2>
<a name="_source" href="http://code.google.com/p/o3d/source/browse/trunk/samples/{+getSourcePath(thisClass)+}">{+getSourcePath(thisClass)+}</a>
</if>
@@ -48,7 +48,7 @@ thisClass = data;
<!-- =========== SEE ALSO =========== -->
<!-- ========== CONSTRUCTOR SUMMARY ============== -->
-<if test="!data.isPrivate && !data.isBuiltin() && !data.isNamespace && data.is('CONSTRUCTOR')">
+<if test="shouldWriteConstructor(data)">
<h2>Constructor</h2>
<ul>
<li><a class="el" href="{+data.name+}">{+data.alias+}</a><if test="data.classType != 'Namespace '">{+ makeSignature(data.params) +}</if></li>
@@ -65,10 +65,10 @@ thisClass = data;
<if test="!method.isPrivate">
<tr><td><li></li></td>
<td>
- <if test="method.isStatic||!method.memberOf">&lt;static&gt; </if>
+ <if test="method.isStatic||!method.memberOf">&lt;Global&gt; </if>
<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>
+ <td><a class="el" href="#{+method.name+}">{+getQualifiedName(method)+}</a>{+makeSignature(method.params)+}</td>
</tr>
</if>
</for>
@@ -86,7 +86,7 @@ thisClass = data;
<if test="!property.isPrivate && !property.isNamespace">
<tr><td><li></li></td>
<td>
- <if test="property.isStatic||!property.memberOf">&lt;static&gt;&nbsp;</if>
+ <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>
@@ -100,7 +100,7 @@ thisClass = data;
<!-- =========== END FIELD SUMMARY =========== -->
<!-- ========== CONSTRUCTOR DETAIL ============== -->
-<if test="!data.isPrivate && !data.isBuiltin() && !data.isNamespace && data.is('CONSTRUCTOR')">
+<if test="shouldWriteConstructor(data)">
<hr/>
<h2>Constructor</h2>
<a class="anchor" name="{+data.name+}"></a>
diff --git a/o3d/documentation/jsdoc-toolkit-templates/classtree.tmpl b/o3d/documentation/jsdoc-toolkit-templates/classtree.tmpl
index eddd37a..5080519 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/classtree.tmpl
+++ b/o3d/documentation/jsdoc-toolkit-templates/classtree.tmpl
@@ -3,7 +3,7 @@
<ul>
{! var allNamespaces = data.filter(function($){return $.isNamespace}).sort(makeSortby("alias")); !}
<for each="thisClass" in="allNamespaces">
- <li><a href="/apis/o3d/docs/reference/{+getBaseURL()+}{+getLinkToClassByAlias(thisClass.alias)+}">{+thisClass.name+}</a></li>
+ <li><a href="/apis/o3d/docs/reference/{+getBaseURL()+}{+getLinkToClassByAlias(thisClass.alias)+}">{+hyphenateWord(thisClass.name, 16, '-<br/>')+}</a></li>
</for>
</ul>
</li>
@@ -11,7 +11,7 @@
<ul>
{! var allClasses = data.filter(function($){return !$.isNamespace}).sort(makeSortby("alias")); !}
<for each="thisClass" in="allClasses">
- <li><a href="/apis/o3d/docs/reference/{+getBaseURL()+}{+getLinkToClassByAlias(thisClass.alias)+}">{+thisClass.name+}</a></li>
+ <li><a href="/apis/o3d/docs/reference/{+getBaseURL()+}{+getLinkToClassByAlias(thisClass.alias)+}">{+hyphenateWord(thisClass.name, 16, '-<br/>')+}</a></li>
</for>
</ul>
</li>
diff --git a/o3d/documentation/jsdoc-toolkit-templates/members.tmpl b/o3d/documentation/jsdoc-toolkit-templates/members.tmpl
index 8a37abf..0d5946b 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/members.tmpl
+++ b/o3d/documentation/jsdoc-toolkit-templates/members.tmpl
@@ -20,7 +20,7 @@ This is the complete list of members for
<table>
<!-- ========== CONSTRUCTOR SUMMARY ============== -->
-<if test="!data.isPrivate && !data.isBuiltin() && !data.isNamespace && data.is('CONSTRUCTOR')">
+<if test="shouldWriteConstructor(data)">
<tr class="memlist"><td><a class="el" href="{+getLinkToClassByAlias(thisClass.alias)+}#{+data.name+}">{+data.alias+}</a><if test="data.classType != 'Namespace '">{+ makeSignature(data.params) +}</if></td><td><a class="el" href="{+getLinkToClassByAlias(thisClass.memberOf)+}">{+thisClass.memberOf+}</a></td><td></td></tr>
</if>
diff --git a/o3d/documentation/jsdoc-toolkit-templates/namespaces.tmpl b/o3d/documentation/jsdoc-toolkit-templates/namespaces.tmpl
index c7d5891..13ccfe4 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/namespaces.tmpl
+++ b/o3d/documentation/jsdoc-toolkit-templates/namespaces.tmpl
@@ -7,7 +7,7 @@
<!-- Genreated by jsdoctoolkit 2.1.0 -->
<div class="navigation" id="top">
</div>
-
+<div class="contents">
<h1>Module List</h1>
Here are the modules with brief descriptions:
@@ -20,7 +20,6 @@ Here are the modules with brief descriptions:
</div><!-- end contents -->
</div><!-- end doxygen-ref -->
-
<!-- ============================== footer ================================= -->
<!-- begin static/footer.html -->
{+include("static/footer.html")+}
diff --git a/o3d/documentation/jsdoc-toolkit-templates/publish.js b/o3d/documentation/jsdoc-toolkit-templates/publish.js
index 1040137..41bdf93 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/publish.js
+++ b/o3d/documentation/jsdoc-toolkit-templates/publish.js
@@ -52,7 +52,10 @@ var g_validJSDOCTypes = {
var g_unknownTypes = { };
var g_numErrors = 0;
var g_o3djsMode = false;
+var g_outputMode;
var g_baseURL;
+var g_topURL;
+var g_templates = [];
/**
* Called automatically by JsDoc Toolkit.
@@ -65,12 +68,14 @@ function publish(symbolSet) {
templatesDir: JSDOC.opt.t,
symbolsDir: '',
prefix: JSDOC.opt.D.prefix,
- o3djs: JSDOC.opt.D.o3djs};
+ mode: JSDOC.opt.D.mode};
publish.conf.srcDir = publish.conf.outDir + 'src/';
publish.conf.htmlDir = JSDOC.opt.D.htmlOutDir;
g_baseURL = JSDOC.opt.D.baseURL;
+ g_topURL = JSDOC.opt.D.topURL;
+ g_outputMode = JSDOC.opt.D.mode;
- if (publish.conf.o3djs) {
+ if (publish.conf.mode == 'o3djs') {
g_o3djsMode = true;
}
@@ -112,7 +117,7 @@ function publish(symbolSet) {
System.exit(1);
}
- // some ustility filters
+ // some utility filters
function hasNoParent($) {return ($.memberOf == '')}
function isaFile($) {return ($.is('FILE'))}
function isaClass($) {return ($.is('CONSTRUCTOR') || $.isNamespace)}
@@ -131,6 +136,7 @@ function publish(symbolSet) {
// get a list of all the classes in the symbolset
var classes = symbols.filter(isaClass).sort(makeSortby('alias'));
+ var filteredClasses = [];
// create each of the class pages
for (var i = 0, l = classes.length; i < l; i++) {
@@ -146,6 +152,9 @@ function publish(symbolSet) {
}
print('Generating docs for: ' + symbol.alias);
+
+ filteredClasses.push(symbol);
+
// Comment these lines in to see what data is available to the templates.
//print('----------------------------------------------------------------');
//dumpObject(symbol, 5);
@@ -178,7 +187,7 @@ function publish(symbolSet) {
output);
}
- var classTree = classTreeTemplate.process(classes);
+ var classTree = classTreeTemplate.process(filteredClasses);
IO.saveFile(publish.conf.outDir, 'classtree.html', classTree);
IO.saveFile(publish.conf.htmlDir, 'classtree.html', classTree);
@@ -186,11 +195,11 @@ function publish(symbolSet) {
IO.saveFile(publish.conf.outDir, 'filelist.html', fileList);
IO.saveFile(publish.conf.htmlDir, 'filelist.html', fileList);
- var annotated = annotatedTemplate.process(classes);
+ var annotated = annotatedTemplate.process(filteredClasses);
IO.saveFile(publish.conf.outDir, 'annotated' + publish.conf.ext, annotated);
IO.saveFile(publish.conf.htmlDir, 'annotated.html', annotated);
- var namespaces = namespacesTemplate.process(classes);
+ var namespaces = namespacesTemplate.process(filteredClasses);
IO.saveFile(publish.conf.outDir, 'namespaces' + publish.conf.ext, namespaces);
IO.saveFile(publish.conf.htmlDir, 'namespaces.html', namespaces);
@@ -234,8 +243,18 @@ function makeSortby(attribute) {
* @return {string} contents of file.
*/
function include(path) {
- var path = publish.conf.templatesDir + path;
- return IO.readFile(path);
+ var template = g_templates[path];
+ if (!template) {
+ try {
+ template = new JSDOC.JsPlate(JSDOC.opt.t + path);
+ } catch (e) {
+ generateError('Could not include: ' + path + '\n' + e);
+ template = '';
+ }
+ g_templates[path] = template;
+ }
+ var output = template.process({});
+ return output;
}
/**
@@ -786,8 +805,71 @@ function getQualifiedName(method) {
}
/**
- * Get the base URL for links.
+ * Gets the base URL for links.
*/
function getBaseURL() {
return g_baseURL;
}
+
+/**
+ * Gets the top URL for links.
+ */
+function getTopURL() {
+ return g_topURL;
+}
+
+/**
+ * Returns the output mode.
+ * @return {string} The output mode.
+ */
+function getOutputMode() {
+ return g_outputMode;
+}
+
+/**
+ * Returns true if we should write constructor docs.
+ * @param {!Symbol} symbol The symbol that might have a constructor.
+ * @return {boolean} true if we should write a constructor.
+ */
+function shouldWriteConstructor(symbol) {
+ return g_outputMode != 'o3d' &&
+ !symbol.isPrivate &&
+ !symbol.isBuiltin() &&
+ !symbol.isNamespace &&
+ symbol.is('CONSTRUCTOR');
+}
+
+/**
+ * Splits a camelCase word into an array of word parts.
+ * @param {string} word camelCase word.
+ * @return {!Array.<string>} The word split into word parts.
+ */
+function splitCamelCase(word) {
+ var spacesAdded = word.replace(/([A-Z])/g, ' $1');
+ return spacesAdded.split(' ');
+}
+
+/**
+ * Breaks a word at max_length with hyphens. Assumes word is camelCase
+ * @param {string} word Word to break.
+ * @param {number} maxLength word will continue to be split until no part is
+ * this longer than this if possible.
+ * @param {string} string to use to join split parts.
+ * @return {string} The word split then joined with joinString.
+ */
+function hyphenateWord(word, maxLength, joinString) {
+ var words = splitCamelCase(word);
+ var hyphenated = '';
+ var newWord = '';
+ for (var ii = 0; ii < words.length; ++ii) {
+ var part = words[ii];
+ var temp = newWord + part;
+ if (temp.length > maxLength) {
+ hyphenated += newWord + joinString;
+ newWord = '';
+ }
+ newWord += part;
+ }
+ hyphenated += newWord;
+ return hyphenated;
+}
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/header.html b/o3d/documentation/jsdoc-toolkit-templates/static/header.html
index e1b67bc..b5d9bd6 100644
--- a/o3d/documentation/jsdoc-toolkit-templates/static/header.html
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/header.html
@@ -8,8 +8,8 @@
[#] <head>
[#] [include "/apis/_common_head_elements.ezt"]
[#] <link href="/css/semantic_headers.css" rel="stylesheet" type="text/css" />
-[#] <link href="../stylesheet.css" rel="stylesheet" type="text/css">
-[#] <link href="../tabs.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">
[#] </head>
[#]
[#] <body class="gc-documentation">
diff --git a/o3d/documentation/stylesheet.css b/o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css
index be09224..be09224 100644
--- a/o3d/documentation/stylesheet.css
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/stylesheet.css
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/tab_b.gif b/o3d/documentation/jsdoc-toolkit-templates/static/tab_b.gif
new file mode 100644
index 0000000..0d62348
--- /dev/null
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/tab_b.gif
Binary files differ
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/tab_l.gif b/o3d/documentation/jsdoc-toolkit-templates/static/tab_l.gif
new file mode 100644
index 0000000..9b1e633
--- /dev/null
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/tab_l.gif
Binary files differ
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/tab_r.gif b/o3d/documentation/jsdoc-toolkit-templates/static/tab_r.gif
new file mode 100644
index 0000000..ce9dd9f
--- /dev/null
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/tab_r.gif
Binary files differ
diff --git a/o3d/documentation/jsdoc-toolkit-templates/static/tabs.css b/o3d/documentation/jsdoc-toolkit-templates/static/tabs.css
new file mode 100644
index 0000000..16b1be0
--- /dev/null
+++ b/o3d/documentation/jsdoc-toolkit-templates/static/tabs.css
@@ -0,0 +1,102 @@
+/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
+
+DIV.tabs
+{
+ float : left;
+ width : 100%;
+ background : url("tab_b.gif") repeat-x bottom;
+ margin-bottom : 4px;
+}
+
+DIV.tabs UL
+{
+ margin : 0px;
+ padding-left : 10px;
+ list-style : none;
+}
+
+DIV.tabs LI, DIV.tabs FORM
+{
+ display : inline;
+ margin : 0px;
+ padding : 0px;
+}
+
+DIV.tabs FORM
+{
+ float : right;
+}
+
+DIV.tabs A
+{
+ float : left;
+ background : url("tab_r.gif") no-repeat right top;
+ border-bottom : 1px solid #84B0C7;
+ font-size : 8px;
+ font-weight : bold;
+ text-decoration : none;
+}
+
+DIV.tabs A:hover
+{
+ background-position: 100% -150px;
+}
+
+DIV.tabs A:link, DIV.tabs A:visited,
+DIV.tabs A:active, DIV.tabs A:hover
+{
+ color: #1A419D;
+}
+
+DIV.tabs SPAN
+{
+ float : left;
+ display : block;
+ background : url("tab_l.gif") no-repeat left top;
+ padding : 5px 9px;
+ white-space : nowrap;
+}
+
+DIV.tabs INPUT
+{
+ float : right;
+ display : inline;
+ font-size : 1em;
+}
+
+DIV.tabs TD
+{
+ font-size : 8px;
+ font-weight : bold;
+ text-decoration : none;
+}
+
+
+
+/* Commented Backslash Hack hides rule from IE5-Mac \*/
+DIV.tabs SPAN {float : none;}
+/* End IE5-Mac hack */
+
+DIV.tabs A:hover SPAN
+{
+ background-position: 0% -150px;
+}
+
+DIV.tabs LI.current A
+{
+ background-position: 100% -150px;
+ border-width : 0px;
+}
+
+DIV.tabs LI.current SPAN
+{
+ background-position: 0% -150px;
+ padding-bottom : 6px;
+}
+
+DIV.navpath
+{
+ background : none;
+ border : none;
+ border-bottom : 1px solid #84B0C7;
+}