mozzoni/docs/gnatdoc.js

989 lines
30 KiB
JavaScript

/**
* A namespace that contains all the information generated by the compiler. See
* the documentation of the fields below.
*
* @constructor
*/
function GNATdoc() {}
/**
* Possible kinds for entities
* @enum {string}
*/
GNATdoc.EntityKind = {
CODE: 'code',
PARAGRAPH: 'paragraph',
UL: 'ul',
LI: 'li',
SPAN: 'span',
IMAGE: 'image',
HTML: 'html'
};
/**
* The data for main page
* @typedef {{project:string, timestamp:string}}
*/
GNATdoc.Index;
/**
* The data that describes an entity
* @typedef {{line: {number:Number},
* column: {number:Number},
* href: string,
* text: string,
* cssClass: string,
* kind: GNATdoc.EntityKind,
* children: Array.<GNATdoc.Entity>}}
*/
GNATdoc.Entity;
/**
* ???
* @type {{label:string, summary:string, entities:Array.<GNATdoc.Entity>, description:string}}
*/
GNATdoc.Documentation;
/**
* ???
* @type {Array}
*/
GNATdoc.DocumentationIndex = [];
/**
* ???
* @type {Array}
*/
GNATdoc.EntitiesCategoriesIndex = [];
/**
* ???
* @type {Array}
*/
GNATdoc.EntitiesCategory = [];
/**
* ???
* @type {Array}
*/
GNATdoc.InheritanceIndex = [];
/**
* ???
* @type {Array}
*/
GNATdoc.SourceFile = [];
/**
* ???
* @type {Array}
*/
GNATdoc.SourceFileIndex = [];
/**
* Creates HTML element and sets its 'className' property.
*
* @param {String} tagName The tag name of created element
* @param {String} cssClass Name of CSS class
*/
function createElementAndSetClass(tagName, cssClass) {
var element = document.createElement(tagName);
if (cssClass !== undefined) {
element.className = cssClass;
}
return element;
}
/**
* ???
*
* @param {Element} root The element to which we add the documentation.
* @param {Array.<GNATdoc.Entity>} data The data to convert.
*/
function buildText(root, data) {
/** @type {Element} */
var element;
for (var index = 0; index < data.length; index++) {
switch (data[index].kind) {
case GNATdoc.EntityKind.CODE:
element = document.createElement('table');
element.className = 'code';
element.cellPadding = 0;
element.cellSpacing = 0;
var code = document.createElement('tbody');
for (var lineIndex = 0;
lineIndex < data[index].children.length;
lineIndex++)
{
var line = data[index].children[lineIndex];
var row = document.createElement('tr');
var cell = document.createElement('th');
cell.id = 'L' + line.number.toString();
cell.appendChild(document.createTextNode(line.number));
row.appendChild(cell);
cell = document.createElement('td');
buildText(cell, line.children);
row.appendChild(cell);
code.appendChild(row);
}
element.appendChild(code);
break;
case GNATdoc.EntityKind.PARAGRAPH:
element = createElementAndSetClass('p', data[index].cssClass);
buildText(element, data[index].children);
break;
case GNATdoc.EntityKind.UL:
element = createElementAndSetClass('ul', data[index].cssClass);
buildText(element, data[index].children);
break;
case GNATdoc.EntityKind.LI:
element = createElementAndSetClass('li', data[index].cssClass);
buildText(element, data[index].children);
break;
case GNATdoc.EntityKind.SPAN:
element = document.createElement('span');
if (data[index].href !== undefined) {
var a = document.createElement('a');
var isAbsoluteURL = new RegExp('^(?:[a-z]+:)?//', 'i');
// When URL is absolute use it as is, otherwise apply
// correction to point to expected location.
a.href =
isAbsoluteURL.test(data[index].href) ?
data[index].href :
'../' + data[index].href;
a.appendChild(document.createTextNode(data[index].text));
element.appendChild(a);
} else {
element.appendChild(
document.createTextNode(data[index].text));
}
if (data[index].cssClass !== undefined) {
element.className = data[index].cssClass;
}
break;
case GNATdoc.EntityKind.IMAGE:
element = document.createElement('img');
element.src = data[index].src;
break;
case GNATdoc.EntityKind.HTML:
element = document.createElement('span');
element.innerHTML = data[index].html;
break;
}
root.appendChild(element);
}
}
/**
* ???
*/
function buildInstantiationInformation(pane, entity) {
// Display instantiation information
if (entity.instantiation !== undefined) {
var paragraph = document.createElement('p');
paragraph.appendChild(
document.createTextNode('Instantiation of '));
var href = document.createElement('a');
href.href = '../' + entity.instantiation.docHref;
href.target = 'contentView';
href.appendChild(
document.createTextNode(entity.instantiation.label));
paragraph.appendChild(href);
pane.appendChild(paragraph);
}
}
/**
* ???
*/
function buildDocumentationPage() {
var pane = document.getElementById('body');
/* Build 'Summary' section */
var header = document.createElement('h1');
var text = document.createTextNode(GNATdoc.Documentation.label);
if (GNATdoc.Documentation.qualifier != '') {
text.appendData(' ');
text.appendData(GNATdoc.Documentation.qualifier);
}
header.appendChild(text);
pane.appendChild(header);
buildText(pane, GNATdoc.Documentation.summary);
var a = document.createElement('a');
a.href = '#Description';
text = document.createTextNode('More...');
a.appendChild(text);
pane.appendChild(a);
/* Build 'Entities' section */
header = document.createElement('h2');
text = document.createTextNode('Entities');
header.appendChild(text);
pane.appendChild(header);
for (var index = 0; index < GNATdoc.Documentation.entities.length; index++)
{
var entity_set = GNATdoc.Documentation.entities[index];
header = document.createElement('h3');
text = document.createTextNode(entity_set.label);
header.appendChild(text);
pane.appendChild(header);
var table = document.createElement('table');
table.className = 'entities';
table.cellPadding = 0;
table.cellSpacing = 0;
var tbody = document.createElement('tbody');
for (var eindex = 0; eindex < entity_set.entities.length; eindex++) {
var entity = entity_set.entities[eindex];
var row = document.createElement('tr');
var cell = document.createElement('td');
var href = document.createElement('a');
if (entity.href !== undefined) {
href.href = entity.href;
} else {
href.href = '#L' + entity.line.toString() +
'C' + entity.column.toString();
}
href.appendChild(document.createTextNode(entity.label));
cell.appendChild(href);
if (entity.qualifier !== '')
{
cell.appendChild(
document.createTextNode(' ' + entity.qualifier));
}
row.appendChild(cell);
cell = document.createElement('td');
buildText(cell, entity.summary);
row.appendChild(cell);
tbody.appendChild(row);
}
table.appendChild(tbody);
pane.appendChild(table);
}
/* Build 'Description' section */
header = document.createElement('h2');
header.id = 'Description';
text = document.createTextNode('Description');
header.appendChild(text);
pane.appendChild(header);
buildText(pane, GNATdoc.Documentation.description);
// Display renaming information
if (GNATdoc.Documentation.renaming !== undefined) {
var paragraph = document.createElement('p');
paragraph.appendChild(
document.createTextNode('Renaming of '));
href = document.createElement('a');
href.href = '../' + GNATdoc.Documentation.renaming.docHref;
href.target = 'contentView';
href.appendChild(
document.createTextNode(GNATdoc.Documentation.renaming.label));
paragraph.appendChild(href);
pane.appendChild(paragraph);
}
buildInstantiationInformation(pane, GNATdoc.Documentation);
/* Build entities description sections */
for (var index = 0; index < GNATdoc.Documentation.entities.length; index++)
{
var entity_set = GNATdoc.Documentation.entities[index];
for (var eindex = 0; eindex < entity_set.entities.length; eindex++) {
var list = null;
var entity = entity_set.entities[eindex];
var titleText;
if (entity.href === undefined) {
titleText = entity.label;
if (entity.qualifier !== '')
titleText += ' ' + entity.qualifier;
header = document.createElement('h3');
header.id = 'L' + entity.line.toString() +
'C' + entity.column.toString();
header.appendChild(document.createTextNode(titleText));
if (entity.src !== undefined) {
var sup = document.createElement('sup');
sup.className = 'srcHref';
href = document.createElement('a');
href.href = '../' + entity.src +
'#L' + entity.line.toString();
href.appendChild(document.createTextNode(' [source]'));
sup.appendChild(href);
header.appendChild(sup);
}
pane.appendChild(header);
buildText(pane, entity.description);
if (entity.inherits !== undefined) {
var paragraph = document.createElement('p');
paragraph.appendChild(document.createTextNode('Inherits '));
for (var iindex = 0;
iindex < entity.inherits.length;
iindex++)
{
if (iindex != 0) {
paragraph.appendChild(document.createTextNode(', '));
}
if (entity.inherits[iindex].docHref === undefined) {
paragraph.appendChild(
document.createTextNode(
entity.inherits[iindex].label));
} else {
href = document.createElement('a');
href.href = '../' + entity.inherits[iindex].docHref;
href.target = 'contentView';
href.appendChild(
document.createTextNode(
entity.inherits[iindex].label));
paragraph.appendChild(href);
}
}
pane.appendChild(paragraph);
}
if (entity.inherited !== undefined) {
var paragraph = document.createElement('p');
paragraph.appendChild(
document.createTextNode('Inherited by '));
for (var iindex = 0;
iindex < entity.inherited.length;
iindex++)
{
if (iindex != 0) {
paragraph.appendChild(document.createTextNode(', '));
}
href = document.createElement('a');
href.href = '../' + entity.inherited[iindex].docHref;
href.target = 'contentView';
href.appendChild(
document.createTextNode(
entity.inherited[iindex].label));
paragraph.appendChild(href);
}
pane.appendChild(paragraph);
}
// Display instantiation information
buildInstantiationInformation(pane, entity);
if (entity.generic_parameters !== undefined) {
list = document.createElement('dl');
for (var pindex = 0;
pindex < entity.generic_parameters.length;
pindex++)
{
var parameter = entity.generic_parameters[pindex];
var term = document.createElement('dt');
term.id = 'L' + parameter.line.toString() +
'C' + parameter.column.toString();
term.appendChild(
document.createTextNode(parameter.label));
var description = document.createElement('dd');
buildText(description, parameter.description);
list.appendChild(term);
list.appendChild(description);
}
}
if (entity.parameters !== undefined) {
list = list || document.createElement('dl');
for (var pindex = 0;
pindex < entity.parameters.length;
pindex++)
{
var parameter = entity.parameters[pindex];
var term = document.createElement('dt');
term.id = 'L' + parameter.line.toString() +
'C' + parameter.column.toString();
term.appendChild(
document.createTextNode(parameter.label));
term.appendChild(
document.createTextNode(' of type '));
if (parameter.type.docHref !== undefined)
{
href = document.createElement('a');
href.href = '../' + parameter.type.docHref;
href.target = 'contentView';
} else {
href = document.createElement('span');
}
href.appendChild(
document.createTextNode(parameter.type.label));
term.appendChild(href);
var description = document.createElement('dd');
buildText(description, parameter.description);
list.appendChild(term);
list.appendChild(description);
}
}
if (entity.returns !== undefined) {
list = list || document.createElement('dl');
var term = document.createElement('dt');
term.appendChild(document.createTextNode('Return value'));
if (entity.returns.type !== undefined) {
term.appendChild(document.createTextNode(' of type '));
if (entity.returns.type.docHref !== undefined)
{
href = document.createElement('a');
href.href = '../' + entity.returns.type.docHref;
href.target = 'contentView';
} else {
href = document.createElement('span');
}
href.appendChild(
document.createTextNode(entity.returns.type.label));
term.appendChild(href);
}
var description = document.createElement('dd');
buildText(description, entity.returns.description);
list.appendChild(term);
list.appendChild(description);
}
if (entity.exceptions !== undefined) {
list = list || document.createElement('dl');
var term = document.createElement('dt');
term.appendChild(document.createTextNode('Exceptions'));
var description = document.createElement('dd');
buildText(description, entity.exceptions.description);
list.appendChild(term);
list.appendChild(description);
}
if (entity.fields !== undefined) {
list = document.createElement('dl');
for (var findex = 0;
findex < entity.fields.length;
findex++)
{
var field = entity.fields[findex];
var term = document.createElement('dt');
term.id = 'L' + field.line.toString() +
'C' + field.column.toString();
term.appendChild(
document.createTextNode(field.label));
term.appendChild(
document.createTextNode(' of type '));
if (field.type.docHref !== undefined)
{
href = document.createElement('a');
href.href = '../' + field.type.docHref;
href.target = 'contentView';
} else {
href = document.createElement('span');
}
href.appendChild(
document.createTextNode(field.type.label));
term.appendChild(href);
var description = document.createElement('dd');
buildText(description, field.description);
list.appendChild(term);
list.appendChild(description);
}
}
// For enumeration types generate description of each
// enumeration literal.
if (entity.literals !== undefined) {
list = document.createElement('dl');
for (var lindex = 0;
lindex < entity.literals.length;
lindex++)
{
var literal = entity.literals[lindex];
var term = document.createElement('dt');
term.id = 'L' + literal.line.toString() +
'C' + literal.column.toString();
term.appendChild(
document.createTextNode(literal.label));
var description = document.createElement('dd');
buildText(description, literal.description);
list.appendChild(term);
list.appendChild(description);
}
}
if (list != null) {
pane.appendChild(list);
}
}
}
}
}
/**
* ???
* @param {Object} entries ???.
*/
function buildPackagesIndexList(entries) {
var list = document.createElement('ul');
for (var index = 0; index < entries.length; index++)
{
var entry = entries[index];
var item = document.createElement('li');
var href = document.createElement('a');
if (entry.items == undefined) {
href.href = entry.file;
href.target = 'contentView';
text = document.createTextNode(entry.label);
if (entry.qualifier != '') {
text.appendData(' ');
text.appendData(entry.qualifier);
}
href.appendChild(text);
item.appendChild(href);
list.appendChild(item);
} else {
href.href = 'blank.html';
href.target = 'contentView';
href.appendChild(document.createTextNode(entry.label));
item.appendChild(href);
item.appendChild(buildPackagesIndexList(entry.items));
list.appendChild(item);
}
}
return list;
}
/**
* ???
* @param {Object} toc ???.
*/
function buildPackagesIndex(toc) {
var list = buildPackagesIndexList(GNATdoc.DocumentationIndex);
list.style.display = 'none';
list.id = 'packagesAndClasses';
toc.appendChild(list);
}
/**
* ???
* @param {Object} toc ???.
*/
function buildEntitiesCategoriesIndex(toc) {
var list = document.createElement('ul');
for (var idx = 0; idx < GNATdoc.EntitiesCategoriesIndex.length; idx++) {
var item = document.createElement('li');
var href = document.createElement('a');
var entry = GNATdoc.EntitiesCategoriesIndex[idx];
href.href = entry.href;
href.target = 'contentView';
href.appendChild(document.createTextNode(entry.label));
item.appendChild(href);
list.appendChild(item);
}
toc.appendChild(list);
list.style.display = 'none';
list.id = 'entities';
}
/**
* ???
* @param {Object} toc ???.
*/
function buildSourcesIndex(toc) {
var list = document.createElement('ul');
for (var idx = 0; idx < GNATdoc.SourceFileIndex.length; idx++) {
var source = GNATdoc.SourceFileIndex[idx];
var item = document.createElement('li');
var href = document.createElement('a');
text = document.createTextNode(source.label);
href.href = source.srcHref;
href.target = 'contentView';
href.appendChild(text);
item.appendChild(href);
list.appendChild(item);
}
toc.appendChild(list);
list.style.display = 'none';
list.id = 'sources';
}
/**
* ???
*/
function buildEntitiesCategoryPage() {
var header = document.createElement('h1');
var character = '';
var list = document.createElement('dl');
var page = document.getElementById('body');
header.appendChild(document.createTextNode(GNATdoc.EntitiesCategory.label));
page.appendChild(header);
for (var idx = 0; idx < GNATdoc.EntitiesCategory.entities.length; idx++) {
var item;
var entity = GNATdoc.EntitiesCategory.entities[idx];
if (character == '' || character != entity.label[0].toUpperCase()) {
character = entity.label[0].toUpperCase();
item = document.createElement('dt');
item.appendChild(document.createTextNode(character));
list.appendChild(item);
}
item = document.createElement('dd');
var href = document.createElement('a');
href.href = '../' + entity.docHref;
href.appendChild(document.createTextNode(entity.label));
item.appendChild(href);
item.appendChild(document.createTextNode(' from '));
if (entity.srcHref !== undefined) {
href = document.createElement('a');
href.href = '../' + entity.srcHref;
} else {
href = document.createElement('span');
}
var text = document.createTextNode(entity.declared);
if (entity.declared_qualifier != '') {
text.appendData(' ');
text.appendData(entity.declared_qualifier);
}
href.appendChild(text);
item.appendChild(href);
list.appendChild(item);
}
page.appendChild(list);
}
/**
* ???
* @param {Object} page ???.
*/
function buildInheritanceIndex(page) {
function build(list, entities) {
for (var index = 0; index < entities.length; index++) {
var item = document.createElement('li');
var href = document.createElement('a');
href.href = entities[index].docHref;
href.appendChild(document.createTextNode(entities[index].label));
item.appendChild(href);
if (entities[index].inherited !== undefined) {
var sublist = document.createElement('ul');
build(sublist, entities[index].inherited);
item.appendChild(sublist);
}
list.appendChild(item);
}
}
var list = document.createElement('ul');
build(list, GNATdoc.InheritanceIndex);
page.appendChild(list);
}
/**
* ???
*/
function displaySource() {
var pane = document.getElementById('body');
var header = document.createElement('h1');
header.appendChild(document.createTextNode(GNATdoc.SourceFile.label));
pane.appendChild(header);
buildText(pane, [GNATdoc.SourceFile]);
}
/**
* ???
*/
function onDocumentationLoad() {
buildDocumentationPage();
// Scroll view to requested element.
var url = document.URL;
var index = url.indexOf('#');
if (index >= 0) {
var id = url.slice(index + 1, url.length);
var element = document.getElementById(id);
if (element) {
element.scrollIntoView();
}
}
}
/**
* Hides TOC and deselect all items of its menu.
*/
function hideTOC() {
var items = document.getElementById('tocView').children;
for (var index = 0; index < items.length; index++)
{
items[index].style.display = 'none';
}
items = document.getElementById('tocMenu').children[0].children;
for (var index = 0; index < items.length; index++)
{
items[index].className = '';
}
}
/**
* ???
*/
function displayPackagesAndClasses() {
hideTOC();
document.getElementById('contentView').src = 'blank.html';
document.getElementById('packagesAndClasses').style.display = 'block';
document.getElementById('packagesAndClassesMenu').className = 'current';
}
/**
* Displays list of entities' categories
*/
function displayEntities() {
hideTOC();
document.getElementById('contentView').src = 'blank.html';
document.getElementById('entities').style.display = 'block';
document.getElementById('entitiesMenu').className = 'current';
}
/**
* Displays inheritance tree of tagged types and classes
*/
function displayInheritance() {
hideTOC();
document.getElementById('contentView').src = 'inheritance_index.html';
document.getElementById('inheritanceMenu').className = 'current';
}
/**
* Displays list of source files
*/
function displaySources() {
hideTOC();
document.getElementById('contentView').src = 'blank.html';
document.getElementById('sources').style.display = 'block';
document.getElementById('sourcesMenu').className = 'current';
}
/**
* ???
*/
function onLoad() {
var toc = document.getElementById('tocView');
var menu = document.getElementById('tocMenu');
/* Build generic project informtion pane */
document.getElementById('projectName').appendChild(
document.createTextNode(GNATdoc.Index.project));
document.getElementById('documentationTimestamp').appendChild(
document.createTextNode(GNATdoc.Index.timestamp));
/* Build main menu */
var ul = document.createElement('ul');
var li = document.createElement('li');
var a = document.createElement('a');
a.appendChild(document.createTextNode('Packages and Classes'));
a.href = 'javascript:displayPackagesAndClasses();';
li.appendChild(a);
li.id = 'packagesAndClassesMenu';
ul.appendChild(li);
li = document.createElement('li');
a = document.createElement('a');
a.appendChild(document.createTextNode('Entities Index'));
a.href = 'javascript:displayEntities();';
li.appendChild(a);
li.id = 'entitiesMenu';
ul.appendChild(li);
li = document.createElement('li');
a = document.createElement('a');
a.appendChild(document.createTextNode('Inheritance Tree'));
a.href = 'javascript:displayInheritance();';
li.appendChild(a);
li.id = 'inheritanceMenu';
ul.appendChild(li);
li = document.createElement('li');
a = document.createElement('a');
a.appendChild(document.createTextNode('Source Files'));
a.href = 'javascript:displaySources();';
li.appendChild(a);
li.id = 'sourcesMenu';
ul.appendChild(li);
menu.appendChild(ul);
/* Build page content */
buildPackagesIndex(toc);
buildEntitiesCategoriesIndex(toc);
var header = document.createElement('h1');
var href = document.createElement('a');
href.href = 'inheritance_index.html';
href.target = 'contentView';
href.appendChild(document.createTextNode('Inheritance Tree'));
header.appendChild(href);
toc.appendChild(header);
buildSourcesIndex(toc);
/* Display list of packages and classes */
displayPackagesAndClasses();
}
/**
* ???
*/
function onSourceFileLoad() {
displaySource();
/* Scroll view to requested element. */
var url = document.URL;
var index = url.indexOf('#');
if (index >= 0) {
var id = url.slice(index + 1, url.length);
var element = document.getElementById(id);
if (element) {
element.scrollIntoView();
element.classList.add('target');
}
}
}
/**
* ???
*/
function onInheritanceLoad() {
var page = document.getElementById('body');
buildInheritanceIndex(page);
}
/**
* ???
*/
function onEntitiesCategoryLoad() {
buildEntitiesCategoryPage();
}