|
|
- // 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
-
- handleItem(model, model._gitContribute, model._gitUrlPattern);
- if (model.children) {
- normalizeChildren(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 'package':
- case 'class':
- case 'interface':
- case 'struct':
- case 'delegate':
- model.isClass = true;
- if (model.children) groupChildren(model, classCategory);
- model[getTypePropertyName(model.type)] = true;
- break;
- case 'enum':
- model.isEnum = true;
- if (model.children) groupChildren(model, classCategory);
- model[getTypePropertyName(model.type)] = true;
- 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) {
- normalizeChildren(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;
- }
-
- function handleItem(vm, gitContribute, gitUrlPattern) {
- // get contribution information
- vm.docurl = common.getImproveTheDocHref(vm, gitContribute, gitUrlPattern);
- vm.sourceurl = common.getViewSourceHref(vm, gitContribute, 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);
- }
-
- // concatenate multiple types with `|`
- if (vm.syntax) {
- var syntax = vm.syntax;
- if (syntax.parameters) {
- syntax.parameters = syntax.parameters.map(function (p) {
- return joinType(p);
- })
- syntax.parameters = groupParameters(syntax.parameters);
- }
- if (syntax.return) {
- syntax.return = joinType(syntax.return);
- }
- }
- }
-
- function joinType(parameter) {
- // change type in syntax from array to string
- var joinTypeProperty = function (type, key) {
- if (!type || !type[0] || !type[0][key]) return null;
- var value = type.map(function (t) {
- return t[key][0].value;
- }).join(' | ');
- return [{
- lang: type[0][key][0].lang,
- value: value
- }];
- };
- if (parameter.type) {
- parameter.type = {
- name: joinTypeProperty(parameter.type, "name"),
- nameWithType: joinTypeProperty(parameter.type, "nameWithType"),
- fullName: joinTypeProperty(parameter.type, "fullName"),
- specName: joinTypeProperty(parameter.type, "specName")
- }
- }
- return parameter;
- }
-
- function groupParameters(parameters) {
- // group parameter with properties
- if (!parameters || parameters.length == 0) return parameters;
- var groupedParameters = [];
- var stack = [];
- for (var i = 0; i < parameters.length; i++) {
- var parameter = parameters[i];
- parameter.properties = null;
- var prefixLength = 0;
- while (stack.length > 0) {
- var top = stack.pop();
- var prefix = top.id + '.';
- if (parameter.id.indexOf(prefix) == 0) {
- prefixLength = prefix.length;
- if (!top.parameter.properties) {
- top.parameter.properties = [];
- }
- top.parameter.properties.push(parameter);
- stack.push(top);
- break;
- }
- if (stack.length == 0) {
- groupedParameters.push(top.parameter);
- }
- }
- stack.push({ id: parameter.id, parameter: parameter });
- parameter.id = parameter.id.substring(prefixLength);
- }
- while (stack.length > 0) {
- top = stack.pop();
- }
- groupedParameters.push(top.parameter);
- return groupedParameters;
- }
-
- function groupChildren(model, category, typeChildrenItems) {
- if (!model || !model.type) {
- return;
- }
- if (!typeChildrenItems) {
- var typeChildrenItems = getDefinitions(category);
- }
- var grouped = {};
-
- normalizeChildren(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" },
- "package": { inDelegate: true, typePropertyName: "inPackage", id: "packages" }
- };
- 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" },
- "function": { inFunction: true, typePropertyName: "inFunction", id: "functions"},
- "member": { inMember: true, typePropertyName: "inMember", id: "members"}
- };
- if (category === 'class') {
- return classItems;
- }
- if (category === 'ns') {
- return namespaceItems;
- }
- console.err("category '" + category + "' is not valid.");
- return undefined;
- }
-
- function normalizeChildren(children) {
- if (children[0] && children[0].lang && children[0].value) {
- return children[0].value;
- }
- return children;
- }
|