|
- // Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.
- var common = require('./common.js');
- var classCategory = 'class';
- var namespaceCategory = 'ns';
-
- exports.transform = function (model) {
-
- if (!model) return null;
-
- langs = model.langs;
- handleItem(model, model._gitContribute, model._gitUrlPattern);
- if (model.children) {
- model.children.forEach(function (item) {
- handleItem(item, model._gitContribute, model._gitUrlPattern);
- });
- }
-
- if (model.type) {
- switch (model.type.toLowerCase()) {
- case 'namespace':
- model.isNamespace = true;
- if (model.children) groupChildren(model, namespaceCategory);
- break;
- case 'class':
- case 'interface':
- case 'struct':
- case 'delegate':
- case 'enum':
- model.isClass = true;
- if (model.children) groupChildren(model, classCategory);
- model[getTypePropertyName(model.type)] = true;
- handleNamespace(model);
- break;
- default:
- break;
- }
- }
-
- return model;
- }
-
- exports.getBookmarks = function (model, ignoreChildren) {
- if (!model || !model.type || model.type.toLowerCase() === "namespace") return null;
-
- var bookmarks = {};
-
- if (typeof ignoreChildren == 'undefined' || ignoreChildren === false) {
- if (model.children) {
- model.children.forEach(function (item) {
- bookmarks[item.uid] = common.getHtmlId(item.uid);
- if (item.overload && item.overload.uid) {
- bookmarks[item.overload.uid] = common.getHtmlId(item.overload.uid);
- }
- });
- }
- }
-
- // Reference's first level bookmark should have no anchor
- bookmarks[model.uid] = "";
- return bookmarks;
- }
-
- exports.groupChildren = groupChildren;
- exports.getTypePropertyName = getTypePropertyName;
- exports.getCategory = getCategory;
-
- function groupChildren(model, category) {
- if (!model || !model.type) {
- return;
- }
- var typeChildrenItems = getDefinitions(category);
- var grouped = {};
-
- model.children.forEach(function (c) {
- if (c.isEii) {
- var type = "eii";
- } else {
- var type = c.type.toLowerCase();
- }
- if (!grouped.hasOwnProperty(type)) {
- grouped[type] = [];
- }
- // special handle for field
- if (type === "field" && c.syntax) {
- c.syntax.fieldValue = c.syntax.return;
- c.syntax.return = undefined;
- }
- // special handle for property
- if (type === "property" && c.syntax) {
- c.syntax.propertyValue = c.syntax.return;
- c.syntax.return = undefined;
- }
- // special handle for event
- if (type === "event" && c.syntax) {
- c.syntax.eventType = c.syntax.return;
- c.syntax.return = undefined;
- }
- grouped[type].push(c);
- })
-
- var children = [];
- for (var key in typeChildrenItems) {
- if (typeChildrenItems.hasOwnProperty(key) && grouped.hasOwnProperty(key)) {
- var typeChildrenItem = typeChildrenItems[key];
- var items = grouped[key];
- if (items && items.length > 0) {
- var item = {};
- for (var itemKey in typeChildrenItem) {
- if (typeChildrenItem.hasOwnProperty(itemKey)){
- item[itemKey] = typeChildrenItem[itemKey];
- }
- }
- item.children = items;
- children.push(item);
- }
- }
- }
-
- model.children = children;
- }
-
- function getTypePropertyName(type) {
- if (!type) {
- return undefined;
- }
- var loweredType = type.toLowerCase();
- var definition = getDefinition(loweredType);
- if (definition) {
- return definition.typePropertyName;
- }
-
- return undefined;
- }
-
- function getCategory(type) {
- var classItems = getDefinitions(classCategory);
- if (classItems.hasOwnProperty(type)) {
- return classCategory;
- }
-
- var namespaceItems = getDefinitions(namespaceCategory);
- if (namespaceItems.hasOwnProperty(type)) {
- return namespaceCategory;
- }
- return undefined;
- }
-
- function getDefinition(type) {
- var classItems = getDefinitions(classCategory);
- if (classItems.hasOwnProperty(type)) {
- return classItems[type];
- }
- var namespaceItems = getDefinitions(namespaceCategory);
- if (namespaceItems.hasOwnProperty(type)) {
- return namespaceItems[type];
- }
- return undefined;
- }
-
- function getDefinitions(category) {
- var namespaceItems = {
- "class": { inClass: true, typePropertyName: "inClass", id: "classes" },
- "struct": { inStruct: true, typePropertyName: "inStruct", id: "structs" },
- "interface": { inInterface: true, typePropertyName: "inInterface", id: "interfaces" },
- "enum": { inEnum: true, typePropertyName: "inEnum", id: "enums" },
- "delegate": { inDelegate: true, typePropertyName: "inDelegate", id: "delegates" }
- };
- var classItems = {
- "constructor": { inConstructor: true, typePropertyName: "inConstructor", id: "constructors" },
- "field": { inField: true, typePropertyName: "inField", id: "fields" },
- "property": { inProperty: true, typePropertyName: "inProperty", id: "properties" },
- "method": { inMethod: true, typePropertyName: "inMethod", id: "methods" },
- "event": { inEvent: true, typePropertyName: "inEvent", id: "events" },
- "operator": { inOperator: true, typePropertyName: "inOperator", id: "operators" },
- "eii": { inEii: true, typePropertyName: "inEii", id: "eii" }
- };
- if (category === 'class') {
- return classItems;
- }
- if (category === 'ns') {
- return namespaceItems;
- }
- console.err("category '" + category + "' is not valid.");
- return undefined;
- }
-
- // reserve "namespace" of string for backward compatibility
- // will replace "namespace" with "namespaceExpanded" of object
- function handleNamespace(model) {
- model.namespaceExpanded = model.namespace;
- if (model.namespaceExpanded) {
- model.namespace = model.namespaceExpanded.uid;
- }
- }
-
- function handleItem(vm, gitContribute, gitUrlPattern) {
- // get contribution information
- vm.docurl = common.getImproveTheDocHref(vm, gitContribute, gitUrlPattern);
- vm.sourceurl = common.getViewSourceHref(vm, null, gitUrlPattern);
-
- // set to null incase mustache looks up
- vm.summary = vm.summary || null;
- vm.remarks = vm.remarks || null;
- vm.conceptual = vm.conceptual || null;
- vm.syntax = vm.syntax || null;
- vm.implements = vm.implements || null;
- vm.example = vm.example || null;
- common.processSeeAlso(vm);
-
- // id is used as default template's bookmark
- vm.id = common.getHtmlId(vm.uid);
- if (vm.overload && vm.overload.uid) {
- vm.overload.id = common.getHtmlId(vm.overload.uid);
- }
-
- if (vm.supported_platforms) {
- vm.supported_platforms = transformDictionaryToArray(vm.supported_platforms);
- }
-
- if (vm.requirements) {
- var type = vm.type.toLowerCase();
- if (type == "method") {
- vm.requirements_method = transformDictionaryToArray(vm.requirements);
- } else {
- vm.requirements = transformDictionaryToArray(vm.requirements);
- }
- }
-
- if (vm && langs) {
- if (shouldHideTitleType(vm)) {
- vm.hideTitleType = true;
- } else {
- vm.hideTitleType = false;
- }
-
- if (shouldHideSubtitle(vm)) {
- vm.hideSubtitle = true;
- } else {
- vm.hideSubtitle = false;
- }
- }
-
- function shouldHideTitleType(vm) {
- var type = vm.type.toLowerCase();
- return ((type === 'namespace' && langs.length == 1 && (langs[0] === 'objectivec' || langs[0] === 'java' || langs[0] === 'c'))
- || ((type === 'class' || type === 'enum') && langs.length == 1 && langs[0] === 'c'));
- }
-
- function shouldHideSubtitle(vm) {
- var type = vm.type.toLowerCase();
- return (type === 'class' || type === 'namespace') && langs.length == 1 && langs[0] === 'c';
- }
-
- function transformDictionaryToArray(dic) {
- var array = [];
- for(var key in dic) {
- if (dic.hasOwnProperty(key)) {
- array.push({"name": key, "value": dic[key]})
- }
- }
-
- return array;
- }
- }
|