| /* --COPYRIGHT--,EPL |
| * Copyright (c) 2008 Texas Instruments and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Texas Instruments - initial implementation |
| * |
| * --/COPYRIGHT--*/ |
| |
| /* |
| * ======== Toc.xs ======== |
| */ |
| |
| var Gbl = xdc.loadCapsule('Gbl.xs'); |
| var Out = xdc.loadCapsule('Out.xs'); |
| var Pag = xdc.loadCapsule('Pag.xs'); |
| |
| var tocPkgs = []; |
| var tocPkgNames = []; |
| |
| function PL( s ) { Gbl.outstr().println(s); } |
| |
| /* |
| * ======== genToc ======== |
| */ |
| function genToc(outdir) |
| { |
| print('Generating table of contents ...'); |
| |
| var pkgdirs = []; |
| Gbl.findDocXmlDirs(java.io.File(outdir), pkgdirs); |
| |
| _getTocPkgs(pkgdirs); |
| |
| /* our xml toc */ |
| Gbl.outstr(new Out.Stream(outdir + '/toc.xml')); |
| _genPageTop(); |
| var gtree = _bldGroups(); |
| _genAllPkgs(); |
| _genAllModules(); |
| _genGroups(gtree, ""); |
| _genPageSuf(); |
| Gbl.outstr().close(); |
| |
| /* our html toc */ |
| _htmlToc(outdir); |
| |
| /* eclipse toc */ |
| Gbl.outstr(new Out.Stream(outdir + '/eclipse_toc.xml')); |
| _genPageTop(); |
| for each (var pName in tocPkgNames) { |
| _genPkgTopic(pName, pName); |
| _genPkg(pName); |
| PL('</topic>'); |
| } |
| _genPageSuf(); |
| Gbl.outstr().close(); |
| |
| /* all-packages */ |
| _genAllPkgsPage(outdir); |
| |
| /* release memory */ |
| tocPkgs = null; |
| tocPkgNames = null; |
| } |
| |
| /* |
| * ======== _htmlToc ======== |
| */ |
| function _htmlToc(outdir) |
| { |
| var gtree = _bldGroups(); |
| Gbl.outstr(new Out.Stream(outdir + '/toc.html')); |
| |
| /* page top */ |
| PL('<html>'); |
| PL('<head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type">'); |
| PL('<title>XDC Packages</title>'); |
| PL('<link href="toc.css" type="text/css" rel="stylesheet">'); |
| PL('<script src="toc.js" type="text/javascript" language="javascript"></script>'); |
| PL('</head>'); |
| PL('<body onmousedown="return false;">'); |
| PL('<ul class="open">'); |
| |
| _htmlAllPackages(); |
| _htmlAllModules(); |
| _htmlGenGroups(gtree, ""); |
| |
| /* suffix */ |
| PL('</ul></body></html>'); |
| Gbl.outstr().close(); |
| } |
| |
| /* |
| * ======== _htmlAllModules ======== |
| */ |
| function _htmlAllModules() |
| { |
| /* Get all units and sort by name */ |
| var units = []; |
| for each (var pName in tocPkgNames) { |
| var pkg = tocPkgs[pName]; |
| for (var i = 0; i < pkg.units.length; i++) { |
| pkg.units[i].qual = pName; |
| units.push(pkg.units[i]); |
| } |
| } |
| units.sort(_objNameCompare); |
| |
| /* output the units one by one */ |
| PL('<li onclick="toggle(this)" class="closed"><span onclick="cancel(event)" class="noclick">all modules</span><ul onclick="cancel(event)">'); |
| |
| var srcImg; |
| var i = 0; |
| while (i < units.length - 1) { |
| |
| if (units[i + 1].name == units[i].name) { |
| var j = i + 1; |
| var uSame = [units[i], units[j]]; |
| while (j < units.length - 1) { |
| if (units[j + 1].name == units[j].name) { |
| uSame.push(units[++j]); |
| } |
| else { |
| ++j; |
| break; |
| } |
| } |
| |
| /* find shortest pkg name */ |
| var minIndex = 0; |
| for (var k = 1; k < uSame.length; k++) { |
| if (uSame[k].qual.length < uSame[k - 1].qual.length) { |
| minIndex = k; |
| } |
| } |
| uSame.sort(_objQualCompare); |
| |
| PL('<li onclick="toggle(this)" class="closed"><img class="toc-img" src="modules.gif"><span onclick="cancel(event)" class="noclick">' + units[i].name + |
| '</span><ul onclick="cancel(event)">'); |
| for (k = 0; k < uSame.length; k++) { |
| srcImg = _srcImg(uSame[k].title); |
| PL('<li class="leaf"><img class="toc-img" src="' + srcImg + '"><a title="' + uSame[k].title + |
| '" target="body" href="' + uSame[k].href + '" onclick="cancel(event)"><span class="toc-id">' + uSame[k].qual + '</span></a></li>'); |
| } |
| PL('</ul></li>'); |
| i = j; |
| continue; |
| } |
| else { |
| srcImg = _srcImg(units[i].title); |
| PL('<li class="leaf"><img class="toc-img" src="' + srcImg + '"><a title="' + units[i].title + |
| '" target="body" href="' + units[i].href + '" onclick="cancel(event)"><span class="toc-id">' + units[i].name + '</span></a></li>'); |
| } |
| ++i; |
| } |
| if (i == units.length - 1) { |
| srcImg = _srcImg(units[i].title); |
| PL('<li class="leaf"><img class="toc-img" src="' + srcImg + '"><a title="' + units[i].title + |
| '" target="body" href="' + units[i].href + '" onclick="cancel(event)"><span class="toc-id">' + units[i].name + '</span></a></li>'); |
| } |
| PL('</ul></li>'); |
| } |
| |
| /* |
| * ======== _htmlAllPackages ======== |
| */ |
| function _htmlAllPackages() |
| { |
| PL('<li onclick="toggle(this)" class="closed"><a title="" target="body" href="all-packages.html" onclick="cancel(event)"><span class="toc-pkgs">all packages</span></a>'); |
| PL('<ul onclick="cancel(event)">'); |
| |
| for each (var pName in tocPkgNames) { |
| var pre = pName.replace(/\./g, '/') + '/'; |
| var href = pre + 'package.html'; |
| var title = 'package ' + pName; |
| |
| if (tocPkgs[pName].units.length > 0) { |
| PL('<li onclick="toggle(this)" class="closed"><img class="toc-img" src="package.gif"><a title="' + title + |
| '" target="body" href="' + href + '" onclick="cancel(event)"><span class="toc-id">' + pName + '</span></a><ul onclick="cancel(event)">'); |
| _htmlGenUnits(tocPkgs[pName]); |
| PL('</ul></li>'); |
| } |
| else { |
| PL('<li class="leaf"><img class="toc-img" src="package.gif"><a title="' + title + |
| '" target="body" href="' + href + '" onclick="cancel(event)"><span class="toc-id">' + pName + '</span></a></li>'); |
| } |
| } |
| PL('</ul></li>'); |
| } |
| |
| /* |
| * ======== _htmlGenGroups ======== |
| */ |
| function _htmlGenGroups(gtree, pre) |
| { |
| if (gtree.length) { |
| gtree.sort(); |
| for (var i = 0; i < gtree.length; i++) { |
| var elem = gtree[i]; |
| if (elem in gtree) { |
| var qelem = pre ? (pre + '.' + elem) : elem; |
| var isPkg = tocPkgs[qelem] ? true : false; |
| var closeTags = true; |
| if (isPkg) { |
| var pkgPre = qelem.replace(/\./g, '/') + '/'; |
| var title = 'package ' + qelem; |
| var href = pkgPre + 'package.html'; |
| if (tocPkgs[qelem].units.length > 0 || _hasSubPkgs(qelem)) { |
| PL('<li onclick="toggle(this)" class="closed"><img class="toc-img" src="package.gif"><a title="' + title + |
| '" target="body" href="' + href + '" onclick="cancel(event)"><span class="toc-id">' + elem + '</span></a><ul onclick="cancel(event)">'); |
| } |
| else { |
| PL('<li class="leaf"><img class="toc-img" src="package.gif"><a title="' + title + |
| '" target="body" href="' + href + '" onclick="cancel(event)"><span class="toc-id">' + elem + '</span></a></li>'); |
| closeTags = false; |
| } |
| } |
| else { |
| PL('<li onclick="toggle(this)" class="closed"><img class="toc-img" src="packages.gif"><span onclick="cancel(event)" class="noclick">' + |
| elem + '</span><ul onclick="cancel(event)">'); |
| } |
| _htmlGenGroups(gtree[elem], qelem); |
| if (isPkg) { |
| _htmlGenPkg(qelem); |
| } |
| if (closeTags) { |
| PL('</ul></li>'); |
| } |
| } |
| } |
| } |
| } |
| |
| /* |
| * ======== _htmlGenPkg ======== |
| */ |
| function _htmlGenPkg(pname) |
| { |
| var pkg = tocPkgs[pname]; |
| if (pkg.units.length) { |
| _htmlGenUnits(pkg); |
| } |
| } |
| |
| /* |
| * ======== _htmlGenUnits ======== |
| */ |
| function _htmlGenUnits(pkg) |
| { |
| for (var i = 0; i < pkg.units.length; i++) { |
| var unit = pkg.units[i]; |
| var srcImg = _srcImg(unit.title); |
| PL('<li class="leaf"><img class="toc-img" src="' + srcImg + '"><a title="' + unit.title + |
| '" target="body" href="' + unit.href + '" onclick="cancel(event)"><span class="toc-id">' + unit.name + '</span></a></li>'); |
| } |
| } |
| |
| /* |
| * ======== _hasSubPkgs ======== |
| */ |
| function _hasSubPkgs(pname) |
| { |
| var found = false; |
| for (var i = 0; i < tocPkgNames.length; i++) { |
| if (tocPkgNames[i].indexOf(pname + '.') == 0) { |
| found = true; |
| break; |
| } |
| } |
| return (found); |
| } |
| |
| /* |
| * ======== _srcImg ======== |
| */ |
| function _srcImg(title) |
| { |
| var srcImg = ''; |
| if (title.search('metaonly module') != -1) { |
| srcImg = 'mod-red.gif'; |
| } |
| else if (title.search('module') != -1) { |
| srcImg = 'mod-blue.gif'; |
| } |
| else if (title.search('metaonly interface') != -1) { |
| srcImg = 'int-red.gif'; |
| } |
| else if (title.search('interface') != -1) { |
| srcImg = 'int-blue.gif'; |
| } |
| return (srcImg); |
| } |
| |
| /* |
| * ======== _bldGroups ======== |
| */ |
| function _bldGroups() |
| { |
| var grpTree = []; |
| |
| for each (var pkg in tocPkgs) { |
| var pnarr = pkg.name.split('.'); |
| var gtree = grpTree; |
| for (var j = 0; j < pnarr.length; j++) { |
| var elem = pnarr[j]; |
| if (elem in gtree) { |
| gtree = gtree[elem]; |
| } |
| else { |
| gtree.push(elem); |
| gtree = gtree[elem] = []; |
| } |
| } |
| } |
| return grpTree; |
| } |
| |
| /* |
| * ======== _genAllPkgs ======== |
| */ |
| function _genAllPkgs() |
| { |
| PL('<topic class="toc-pkgs" label="all packages" href="all-packages.html">'); |
| for each (var pName in tocPkgNames) { |
| _genPkgTopic(pName, pName); |
| _genUnits(tocPkgs[pName]); |
| PL('</topic>'); |
| } |
| PL('</topic>'); |
| } |
| |
| /* |
| * ======== _genAllModules ======== |
| */ |
| function _genAllModules() |
| { |
| /* Get all units and sort by name */ |
| var units = []; |
| for each (var pName in tocPkgNames) { |
| var pkg = tocPkgs[pName]; |
| for (var i = 0; i < pkg.units.length; i++) { |
| pkg.units[i].qual = pName; |
| units.push(pkg.units[i]); |
| } |
| } |
| units.sort(_objNameCompare); |
| |
| /* output the units one by one */ |
| PL('<topic class="toc-allmodules" label="all modules">'); |
| var i = 0; |
| while (i < units.length - 1) { |
| |
| if (units[i + 1].name == units[i].name) { |
| var j = i + 1; |
| var uSame = [units[i], units[j]]; |
| while (j < units.length - 1) { |
| if (units[j + 1].name == units[j].name) { |
| uSame.push(units[++j]); |
| } |
| else { |
| ++j; |
| break; |
| } |
| } |
| |
| /* find shortest pkg name */ |
| var minIndex = 0; |
| for (var k = 1; k < uSame.length; k++) { |
| if (uSame[k].qual.length < uSame[k - 1].qual.length) { |
| minIndex = k; |
| } |
| } |
| uSame.sort(_objQualCompare); |
| |
| PL('<topic class="toc-modules" label="' + units[i].name + '">'); |
| for (k = 0; k < uSame.length; k++) { |
| PL('<topic class="toc-id" label="' + uSame[k].qual + '" href="' + uSame[k].href + '" title="' + uSame[k].title + '">'); |
| PL('</topic>'); |
| } |
| PL('</topic>'); |
| i = j; |
| continue; |
| } |
| else { |
| PL('<topic class="toc-id" label="' + units[i].name + '" href="' + units[i].href + '" title="' + units[i].title + '">'); |
| PL('</topic>'); |
| } |
| ++i; |
| } |
| if (i == units.length - 1) { |
| PL('<topic class="toc-id" label="' + units[i].name + '" href="' + units[i].href + '" title="' + units[i].title + '">'); |
| PL('</topic>'); |
| } |
| PL('</topic>'); |
| } |
| |
| /* |
| * ======== _qualCompare ======== |
| */ |
| function _qualCompare(unitArr, qual) |
| { |
| var str = '^' + qual.replace(/\./g, '\.') + '\.'; |
| var r = RegExp(str); |
| var allMatch = true; |
| for (var i = 0; i < unitArr.length; i++) { |
| if (!unitArr[i].qual.match(r)) { |
| allMatch = false; |
| break; |
| } |
| } |
| return (allMatch); |
| } |
| |
| /* |
| * ======== _genAllPkgsPage ======== |
| */ |
| function _genAllPkgsPage(outdir) |
| { |
| Gbl.outstr(new Out.Stream(outdir + '/all-packages.html')); |
| Gbl.root('./'); |
| Gbl.pkgNode(null); |
| Pag.genPrefix("All Packages"); |
| Pag.genHdr(new XML('<group name="all packages"/>'), null, null, null, null); |
| Pag.genSynTabBeg('xdocSynX'); |
| |
| for (var i = 0; i < tocPkgNames.length; i++) { |
| var pName = tocPkgNames[i]; |
| var link = Gbl.sprintf("<a class='xdocSynGo' href='$1/package.html' title='$2'>$3;</a>", |
| pName.replace(/\./g, '/'), |
| pName, |
| Gbl.span('xdoc-id', pName) |
| ); |
| Gbl.genRowC(Gbl.sprintf('$1 $2', Gbl.span('xdoc-kw1', 'package'), link)); |
| PL(Gbl.sprintf("<div class='xdocSynSum'>// $1</div>", Gbl.decode(tocPkgs[pName].summary))); |
| } |
| |
| Pag.genSynTabEnd(); |
| Pag.genSuffix(); |
| Gbl.outstr().close(); |
| } |
| |
| /* |
| * ======== _genDecls ======== |
| */ |
| function _genDecls(unit) |
| { |
| for (var i = 0; i < unit.decls.length; i++) { |
| |
| var decl = unit.decls[i]; |
| PL('<topic class="toc-id" label="' + decl.name + '" href="' + decl.href + '" title="' + decl.title + '"/>'); |
| } |
| } |
| |
| /* |
| * ======== _genGroups ======== |
| */ |
| function _genGroups(gtree, pre) |
| { |
| if (gtree.length) { |
| gtree.sort(); |
| for (var i = 0; i < gtree.length; i++) { |
| var elem = gtree[i]; |
| if (elem in gtree) { |
| var qelem = pre ? (pre + '.' + elem) : elem; |
| var isPkg = tocPkgs[qelem] ? true : false; |
| if (isPkg) { |
| _genPkgTopic(qelem, elem); |
| } |
| else { |
| PL('<topic class="toc-id" label="' + elem + '">'); |
| } |
| _genGroups(gtree[elem], qelem); |
| if (isPkg) { |
| _genPkg(qelem); |
| } |
| PL('</topic>'); |
| } |
| } |
| } |
| } |
| |
| /* |
| * ======== _genPageSuf ======== |
| */ |
| function _genPageSuf() |
| { |
| PL('</toc>'); |
| } |
| |
| /* |
| * ======== _genPageTop ======== |
| */ |
| function _genPageTop() |
| { |
| |
| PL('<?xml version="1.0"?>'); |
| PL('<?xml-stylesheet type="text/xsl" href="toc.xsl"?>'); |
| PL('<toc label="XDC Packages" topic="packages.html">'); |
| } |
| |
| /* |
| * ======== _genPkg ======== |
| */ |
| function _genPkg(pname) |
| { |
| var pkg = tocPkgs[pname]; |
| if (pkg.units.length) { |
| _genUnits(pkg); |
| } |
| } |
| |
| /* |
| * ======== _genPkgTopic ======== |
| */ |
| function _genPkgTopic(pname, label) |
| { |
| var pre = pname.replace(/\./g, '/') + '/'; |
| PL('<topic class="toc-id" label="' + label + '" href="' + pre + 'package.html" title="package ' + pname + '">'); |
| } |
| |
| /* |
| * ======== _genUnits ======== |
| */ |
| function _genUnits(pkg) |
| { |
| for (var i = 0; i < pkg.units.length; i++) { |
| |
| var unit = pkg.units[i]; |
| |
| PL('<topic class="toc-id" label="' + unit.name + '" href="' + unit.href + '" title="' + unit.title + '">'); |
| /* |
| if (unit.decls.length) { |
| _genDecls(unit); |
| } |
| */ |
| PL('</topic>'); |
| } |
| } |
| |
| /* |
| * ======== _getTocPkgs ======== |
| * |
| * Return a package name-keyed hash of packages in pkgdirs |
| * |
| */ |
| function _getTocPkgs(pkgdirs) |
| { |
| tocPkgs = []; |
| tocPkgNames = []; |
| var pkgNode; |
| for each (var d in pkgdirs) { |
| pkgNode = xdc.loadXML(d + '/package/package.doc.xml'); |
| if (pkgNode.@nodoc == '1') { |
| pkgNode = null; |
| continue; |
| } |
| var units = _getTocUnits(pkgNode); |
| var pkg = {}; |
| pkg.name = '' + pkgNode.@name; |
| pkg.summary = '' + pkgNode.@summary; |
| pkg.units = units; |
| tocPkgNames.push(pkg.name); |
| tocPkgs[pkg.name] = pkg; |
| pkgNode = null; |
| } |
| tocPkgNames.sort(); |
| } |
| |
| /* |
| * ======== _getTocUnits ======== |
| */ |
| function _getTocUnits(pNode) |
| { |
| var unitArr = []; |
| |
| var name = '' + pNode.@name; |
| var pre = name.replace(/\./g, '/') + '/'; |
| for each (var uNode in pNode.unit) { |
| if (uNode.@nodoc == '1') { |
| continue; |
| } |
| var unit = {}; |
| unit.name = '' + uNode.@name; |
| unit.href = pre + unit.name + '.html'; |
| unit.title = _mkTitle(uNode, pNode); |
| /* |
| unit.decls = []; |
| for each (var gNode in uNode.group) { |
| for each(var dNode in gNode.decl) { |
| if (dNode.@external == '0' || dNode.@spacer == '1' || dNode.@nodoc == '1') { |
| continue; |
| } |
| var decl = {}; |
| decl.name = '' + dNode.@name; |
| decl.href = pre + uNode.@name + '.html#' + |
| dNode.@anchor; |
| decl.title = _mkTitle(dNode, uNode); |
| unit.decls.push(decl); |
| } |
| } |
| unit.decls.sort(_objNameCompare); |
| */ |
| unitArr.push(unit); |
| } |
| unitArr.sort(_objNameCompare); |
| return (unitArr); |
| } |
| |
| /* |
| * ======== _mkTitle ======== |
| */ |
| function _mkTitle(node, scope) |
| { |
| var title = ''; |
| if (node.@metaonly == '1') { |
| title += 'metaonly '; |
| } |
| if (node.@kind != 'fxn') { |
| title += node.@kind + ' '; |
| } |
| title += scope.@name + '.' + node.@name; |
| if (node.@kind == 'fxn') { |
| title += '( )'; |
| } |
| return title; |
| } |
| |
| /* |
| * ======== _objNameCompare ======== |
| * |
| * Compare function for sorting names of units and decls |
| * |
| */ |
| function _objNameCompare(obj1, obj2) |
| { |
| var name1 = obj1.name.toUpperCase(); |
| var name2 = obj2.name.toUpperCase(); |
| if (name1 < name2) { |
| return (-1); |
| } |
| if (name1 > name2) { |
| return (1); |
| } |
| else { |
| /* if equal, put upper case first */ |
| var ch1 = obj1.name.substr(0, 1); |
| var ch2 = obj2.name.substr(0, 1); |
| if (ch1.toUpperCase() == ch2) { |
| return (1); |
| } |
| if (ch2.toUpperCase() == ch1) { |
| return (-1); |
| } |
| } |
| return (0); |
| } |
| |
| /* |
| * ======== _objQualCompare ======== |
| * |
| */ |
| function _objQualCompare(obj1, obj2) |
| { |
| var qual1 = obj1.qual.toUpperCase(); |
| var qual2 = obj2.qual.toUpperCase(); |
| if (qual1 < qual2) { |
| return (-1); |
| } |
| if (qual1 > qual2) { |
| return (1); |
| } |
| else { |
| /* if equal, put upper case first */ |
| var ch1 = obj1.qual.substr(0, 1); |
| var ch2 = obj2.qual.substr(0, 1); |
| if (ch1.toUpperCase() == ch2) { |
| return (1); |
| } |
| if (ch2.toUpperCase() == ch1) { |
| return (-1); |
| } |
| } |
| return (0); |
| } |
| |
| |
| /* |
| * ======== inToc ======== |
| */ |
| function inToc(pname) |
| { |
| return (pname in tocPkgs); |
| } |
| |
| /* |
| * ======== getFirstPkg ======== |
| */ |
| function getFirstPkg() |
| { |
| if (tocPkgNames.length) { |
| return (tocPkgNames[0]); |
| } |
| else { |
| return (''); |
| } |
| } |