From e6e6617a810641d30f14fc67940296f55a59aeb9 Mon Sep 17 00:00:00 2001 From: cjsha Date: Wed, 7 Aug 2024 11:42:31 -0400 Subject: [PATCH] Update template - change text in md files: onix -> onix1 - dataFrame only shows up once (on nP2eBno055Data operator for example) - remove comment under Misc headers - add table for dataFrames that are enums - fix links in abc -> o -> xyz diagrams - data frames and context task anchor to subheader - external types (bool, mat, etc.) link externally - use different summary and headers under ContextTask for aggregate nodes - Add input's dataFrame table when there is no output dataFrame (like StartAcquisition though this behavior might need to change) --- .../getting-started/initialize_oni_context.md | 2 +- .../getting-started/install_and_download.md | 6 +- articles/getting-started/visualizing_data.md | 2 +- index.md | 7 +- template/ManagedReference.extension.js | 235 ++++++++++++------ template/partials/class.tmpl.partial | 2 + template/partials/diagram.tmpl.partial | 62 ++++- 7 files changed, 227 insertions(+), 89 deletions(-) diff --git a/articles/getting-started/initialize_oni_context.md b/articles/getting-started/initialize_oni_context.md index 84958c9..d47c188 100644 --- a/articles/getting-started/initialize_oni_context.md +++ b/articles/getting-started/initialize_oni_context.md @@ -5,7 +5,7 @@ title: Initialize the ONI Context The [`CreateContext`](xref:OpenEphys.Onix1.CreateContext) operator initializes the acquisition context, and it should be the first node you add to your workflow as it provides access to the hardware device table for all other configuration operators. There are several different ways to find this node and add it to the workflow: -1. From the Bonsai editor, navigate to the toolbox on the left side of the screen and expand the **Source** section. Next, expand the **OpenEphys.Onix** section, and find the `CreateContext` line. The node can then be added by either double-clicking it, or dragging and dropping the node into the workflow. +1. From the Bonsai editor, navigate to the toolbox on the left side of the screen and expand the **Source** section. Next, expand the **OpenEphys.Onix1** section, and find the `CreateContext` line. The node can then be added by either double-clicking it, or dragging and dropping the node into the workflow. ![Search for CreateContext node manually](../../images/bonsai-editor-place-create-context-manually.png){width=700px} diff --git a/articles/getting-started/install_and_download.md b/articles/getting-started/install_and_download.md index 85b2a71..6b9da1c 100644 --- a/articles/getting-started/install_and_download.md +++ b/articles/getting-started/install_and_download.md @@ -3,7 +3,7 @@ uid: InstallationAndDownload title: Installation and Download --- -* To install `OpenEphys.Onix`, first install Bonsai [here](https://bonsai-rx.org/docs/articles/installation.html) +* To install `OpenEphys.Onix1`, first install Bonsai [here](https://bonsai-rx.org/docs/articles/installation.html) * Once Bonsai is installed, open Bonsai and download the necessary packages * Open the Bonsai package manager @@ -15,9 +15,9 @@ title: Installation and Download ![Search for Bonsai.StarterPack and install it](../../images/bonsai-package-manager-starterpack.png){width=650px} - * Change the package source to **All** (1), then follow the same steps (2,3) to search for and install `OpenEphys.Onix` + * Change the package source to **All** (1), then follow the same steps (2,3) to search for and install `OpenEphys.Onix1` - ![Search for OpenEphys.Onix and install it](../../images/bonsai-package-manager-openephys.onix.png){width=650px} + ![Search for OpenEphys.Onix1 and install it](../../images/bonsai-package-manager-openephys.onix.png){width=650px} > [!Warning] > Update this once the package has been published to NuGet diff --git a/articles/getting-started/visualizing_data.md b/articles/getting-started/visualizing_data.md index 2c3271c..09414e8 100644 --- a/articles/getting-started/visualizing_data.md +++ b/articles/getting-started/visualizing_data.md @@ -3,7 +3,7 @@ uid: VisualizingData title: Visualizing Data --- -To visualize data from any `*Data` node, typically the variable that needs to be visualized must first be output from the node. To do this, right-click on any `*Data` node and select the first option; this will be something similar to `Output (OpenEphys.Onix.*DataFrame)`. From the drop-down list, select the corresponding data variable to be visualized. Doing so will create a new node in the workflow. +To visualize data from any `*Data` node, typically the variable that needs to be visualized must first be output from the node. To do this, right-click on any `*Data` node and select the first option; this will be something similar to `Output (OpenEphys.Onix1.*DataFrame)`. From the drop-down list, select the corresponding data variable to be visualized. Doing so will create a new node in the workflow. Select this new node and right-click it, search for the **Select Visualizer** option and choose a visualizer from that drop-down menu. Note that some data types will require a secondary node to be connected directly after it, such as a `RollingGraph` node. If so, this secondary node must be right-clicked and the appropriate visualizer must be selected here. diff --git a/index.md b/index.md index 5c5ac2d..7e08b8f 100644 --- a/index.md +++ b/index.md @@ -1,16 +1,17 @@ --- uid: index -title: OpenEphys.Onix +title: OpenEphys.Onix1 +_disableBreadcrumb: true --- > [!Warning] > These docs are under active development, feel free to contribute by either [raising an issue](https://github.com/bonsai-rx/docs/issues) or following the links saying **Edit this page**. -`OpenEphys.Onix` is a library that can be used in [Bonsai](https://bonsai-rx.org/) to acquire data from ONIX devices, such as the [ONIX PCIe Acquisition System](https://open-ephys.org/onix/oeps-9006). For more details on the ONI specification, check out [this link](https://open-ephys.github.io/ONI/), and to learn more about ONIX devices and their implementation of ONI, click [here](https://open-ephys.github.io/onix-docs/). +`OpenEphys.Onix1` is a library that can be used in [Bonsai](https://bonsai-rx.org/) to acquire data from ONIX devices, such as the [ONIX PCIe Acquisition System](https://open-ephys.org/onix/oeps-9006). For more details on the ONI specification, check out [this link](https://open-ephys.github.io/ONI/), and to learn more about ONIX devices and their implementation of ONI, click [here](https://open-ephys.github.io/onix-docs/). ## Advantages -While data can be acquired using programs other than Bonsai, there are a number of advantages that come from building `OpenEphys.Onix` as a Bonsai library. A major advantage is that it maintains maximal compatibility with open source programs, including [OpenCV](https://opencv.org/), [DeepLabCut](https://www.mackenziemathislab.org/deeplabcut), and many more. +While data can be acquired using programs other than Bonsai, there are a number of advantages that come from building `OpenEphys.Onix1` as a Bonsai library. A major advantage is that it maintains maximal compatibility with open source programs, including [OpenCV](https://opencv.org/), [DeepLabCut](https://www.mackenziemathislab.org/deeplabcut), and many more. Other major advantages include: * Visual interface provided by building on top of Bonsai's foundation diff --git a/template/ManagedReference.extension.js b/template/ManagedReference.extension.js index 2ec754a..c5516c8 100644 --- a/template/ManagedReference.extension.js +++ b/template/ManagedReference.extension.js @@ -11,8 +11,12 @@ function removeBottomMargin(str){ // Strip IObservable and replace 'TSource' with 'Anything' function replaceIObservableAndTSource(str){ - if (str.includes('IObservable')){ - const re = new RegExp('(IObservable<\/a><)'); + if (str.includes('IGroupedObservable')){ + const re = new RegExp(')/g, ''), 'description': removeBottomMargin([ model.__global._shared['~/api/OpenEphys.Onix1.MultiDeviceFactory.yml'].children[i].syntax.parameters[0].description, model.__global._shared['~/api/OpenEphys.Onix1.MultiDeviceFactory.yml'].children[i].syntax.parameters[0].remarks].join(''))}; + input.internal = true; } output = {}; dataFrame = []; @@ -43,45 +52,43 @@ function defineInputsAndOutputs(model){ 'name': model.__global._shared['~/api/OpenEphys.Onix1.MultiDeviceFactory.yml'].children[i].syntax.return.type.name[0].value.replaceAll(/(IObservable<)|(>)/g, ''), 'description': removeBottomMargin([ model.__global._shared['~/api/OpenEphys.Onix1.MultiDeviceFactory.yml'].children[i].syntax.return.description, model.__global._shared['~/api/OpenEphys.Onix1.MultiDeviceFactory.yml'].children[i].syntax.return.remarks].join(''))}; + output.internal = true; outputYml = [ '~/api/', model.__global._shared['~/api/OpenEphys.Onix1.MultiDeviceFactory.yml'].children[i].syntax.return.type.uid.replaceAll(/(\D*{)|(}$)/g, ''), '.yml'].join(''); if (model['__global']['_shared'][outputYml] && model['__global']['_shared'][outputYml]['children'] && (model['__global']['_shared'][outputYml].type === 'class')){ + output.dataFrameDescription = [ + model['__global']['_shared'][outputYml].summary, + model['__global']['_shared'][outputYml].remarks].join(''); const outputYmlChildrenLength = model['__global']['_shared'][outputYml]['children'].length; for (let j = 0; j < outputYmlChildrenLength; j++){ if (model['__global']['_shared'][outputYml]['children'][j].type === 'property'){ potentialEnumYml = '~/api/' + model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.uid + '.yml'; let enumFields = []; if (model['__global']['_shared'][potentialEnumYml] && (model['__global']['_shared'][potentialEnumYml]['type'] === 'enum')){ - enumChildrenLength = model['__global']['_shared'][potentialEnumYml]['children'].length; - for (let k = 0; k < enumChildrenLength; k++){ - if (model['__global']['_shared'][potentialEnumYml]['children'][k].type === 'field'){ - enumFields.push({ - 'field&value': model['__global']['_shared'][potentialEnumYml]['children'][k].syntax.content[0].value, - 'description': removeBottomMargin([model['__global']['_shared'][potentialEnumYml]['children'][k].summary, - model['__global']['_shared'][potentialEnumYml]['children'][k].remarks].join('')) - }); - } - } - } - if (enumFields.length > 0){ - dataFrame.push({ - 'name': model['__global']['_shared'][outputYml]['children'][j].name[0].value, - 'type': model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.specName[0].value, - 'description': removeBottomMargin([ model['__global']['_shared'][outputYml]['children'][j].summary, - model['__global']['_shared'][outputYml]['children'][j].remarks].join('')), - 'enumFields': enumFields, - 'hasEnum': true - }); - } - else { - dataFrame.push({ - 'name': model['__global']['_shared'][outputYml]['children'][j].name[0].value, - 'type': model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.specName[0].value, - 'description': removeBottomMargin([ model['__global']['_shared'][outputYml]['children'][j].summary, - model['__global']['_shared'][outputYml]['children'][j].remarks].join('')), - }); + enumFields = defineEnumFields(model['__global']['_shared'][potentialEnumYml]); } + if (enumFields.length > 0){ + output.dataFrameDescription = [ + model['__global']['_shared'][outputYml].summary, + model['__global']['_shared'][outputYml].remarks].join(''), + dataFrame.push({ + 'name': model['__global']['_shared'][outputYml]['children'][j].name[0].value, + 'type': model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.specName[0].value, + 'description': removeBottomMargin([ model['__global']['_shared'][outputYml]['children'][j].summary, + model['__global']['_shared'][outputYml]['children'][j].remarks].join('')), + 'enumFields': enumFields, + 'hasEnum': true + }); + } + else{ + dataFrame.push({ + 'name': model['__global']['_shared'][outputYml]['children'][j].name[0].value, + 'type': model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.specName[0].value, + 'description': removeBottomMargin([ model['__global']['_shared'][outputYml]['children'][j].summary, + model['__global']['_shared'][outputYml]['children'][j].remarks].join('')) + }); + } } } } @@ -110,7 +117,89 @@ function defineInputsAndOutputs(model){ input = { 'specName': replaceIObservableAndTSource(model.children[i].syntax.parameters[0].type.specName[0].value), 'name': model.children[i].syntax.parameters[0].type.name[0].value.replaceAll(/(IObservable<)|(>)/g, ''), - 'description': removeBottomMargin([model.children[i].syntax.parameters[0].description, model.children[i].syntax.parameters[0].remarks].join(''))}; + 'description': removeBottomMargin([model.children[i].syntax.parameters[0].description, model.children[i].syntax.parameters[0].remarks].join('')) + }; + input.dataFrame = []; + if (model.__global._shared['~/api/OpenEphys.Onix1.' + input.name + '.yml']){ + input.internal = true; + inputYml = [ '~/api/', + model.children[i].syntax.parameters[0].type.uid.replaceAll(/(\D*{)|(}$)/g, ''), + '.yml'].join(''); + if (model['__global']['_shared'][inputYml] && model['__global']['_shared'][inputYml]['children'] && (model['__global']['_shared'][inputYml].type === 'class')){ + input.dataFrameDescription = [ + model['__global']['_shared'][inputYml].summary, + model['__global']['_shared'][inputYml].remarks + ].join(''); + const inputYmlChildrenLength = model['__global']['_shared'][inputYml]['children'].length; + for (let j = 0; j < inputYmlChildrenLength; j++){ + if (model['__global']['_shared'][inputYml]['children'][j] && model['__global']['_shared'][inputYml]['children'][j].type === 'property'){ + let enumFields = []; + if (model['__global']['_shared'][inputYml]['children'][j].syntax.parameters[0]){ + potentialEnumYml = '~/api/' + model['__global']['_shared'][inputYml]['children'][j].syntax.parameters[0].type.uid + '.yml'; + if (model['__global']['_shared'][potentialEnumYml] && (model['__global']['_shared'][potentialEnumYml]['type'] === 'enum')){ + enumFields = defineEnumFields(model['__global']['_shared'][potentialEnumYml]); + } + } + if (enumFields.length > 0){ + input.dataFrame.push({ + 'name': model['__global']['_shared'][inputYml]['children'][j].name[0].value, + 'type': model['__global']['_shared'][inputYml]['children'][j].syntax.return.type.specName[0].value, + 'description': removeBottomMargin([ model['__global']['_shared'][inputYml]['children'][j].summary, + model['__global']['_shared'][inputYml]['children'][j].remarks].join('')), + 'enumFields': enumFields, + 'hasEnum': true + }); + } + else{ + input.dataFrame.push({ + 'name': model['__global']['_shared'][inputYml]['children'][j].name[0].value, + 'type': model['__global']['_shared'][inputYml]['children'][j].syntax.return.type.specName[0].value, + 'description': removeBottomMargin([ model['__global']['_shared'][inputYml]['children'][j].summary, + model['__global']['_shared'][inputYml]['children'][j].remarks].join('')) + }); + } + } + } + } + else if (model['__global']['_shared'][inputYml] && model['__global']['_shared'][inputYml]['children'] && (model['__global']['_shared'][inputYml].type === 'enum')){ + input.internal = true; + input.dataFrameDescription = [ + model['__global']['_shared'][inputYml].summary, + model['__global']['_shared'][inputYml].remarks + ].join(''); + const inputYmlChildrenLength = model['__global']['_shared'][inputYml]['children'].length; + for (let j = 0; j < inputYmlChildrenLength; j++){ + if (model['__global']['_shared'][inputYml]['children'][j].type === 'property'){ + potentialEnumYml = '~/api/' + model['__global']['_shared'][inputYml]['children'][j].syntax.parameters[0].type.uid + '.yml'; + let enumFields = []; + if (model['__global']['_shared'][potentialEnumYml] && (model['__global']['_shared'][potentialEnumYml]['type'] === 'enum')){ + enumFields = defineEnumFields(model['__global']['_shared'][potentialEnumYml]); + } + if (enumFields.length > 0){ + dataFrame.push({ + 'name': model['__global']['_shared'][inputYml]['children'][j].name[0].value, + 'type': model['__global']['_shared'][inputYml]['children'][j].syntax.return.type.specName[0].value, + 'description': removeBottomMargin([ model['__global']['_shared'][inputYml]['children'][j].summary, + model['__global']['_shared'][inputYml]['children'][j].remarks].join('')), + 'enumFields': enumFields, + 'hasEnum': true + }); + } + else{ + dataFrame.push({ + 'name': model['__global']['_shared'][inputYml]['children'][j].name[0].value, + 'type': model['__global']['_shared'][inputYml]['children'][j].syntax.return.type.specName[0].value, + 'description': removeBottomMargin([ model['__global']['_shared'][inputYml]['children'][j].summary, + model['__global']['_shared'][inputYml]['children'][j].remarks].join('')) + }); + } + } + } + } + } + else { + input.external = true; + } } if (model.children[i].syntax.return){ output = { @@ -122,22 +211,17 @@ function defineInputsAndOutputs(model){ model.children[i].syntax.return.type.uid.replaceAll(/(\D*{)|(}$)/g, ''), '.yml'].join(''); if (model['__global']['_shared'][outputYml] && model['__global']['_shared'][outputYml]['children'] && (model['__global']['_shared'][outputYml].type === 'class')){ + output.internal = true; + output.dataFrameDescription = [ + model['__global']['_shared'][outputYml].summary, + model['__global']['_shared'][outputYml].remarks].join(''); const outputYmlChildrenLength = model['__global']['_shared'][outputYml]['children'].length; for (let j = 0; j < outputYmlChildrenLength; j++){ if (model['__global']['_shared'][outputYml]['children'][j].type === 'property'){ potentialEnumYml = '~/api/' + model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.uid + '.yml'; let enumFields = []; if (model['__global']['_shared'][potentialEnumYml] && (model['__global']['_shared'][potentialEnumYml]['type'] === 'enum')){ - enumChildrenLength = model['__global']['_shared'][potentialEnumYml]['children'].length; - for (let k = 0; k < enumChildrenLength; k++){ - if (model['__global']['_shared'][potentialEnumYml]['children'][k].type === 'field'){ - enumFields.push({ - 'field&value': model['__global']['_shared'][potentialEnumYml]['children'][k].syntax.content[0].value, - 'description': removeBottomMargin([model['__global']['_shared'][potentialEnumYml]['children'][k].summary, - model['__global']['_shared'][potentialEnumYml]['children'][k].remarks].join('')) - }); - } - } + enumFields = defineEnumFields(model['__global']['_shared'][potentialEnumYml]); } if (enumFields.length > 0){ dataFrame.push({ @@ -154,13 +238,22 @@ function defineInputsAndOutputs(model){ 'name': model['__global']['_shared'][outputYml]['children'][j].name[0].value, 'type': model['__global']['_shared'][outputYml]['children'][j].syntax.return.type.specName[0].value, 'description': removeBottomMargin([ model['__global']['_shared'][outputYml]['children'][j].summary, - model['__global']['_shared'][outputYml]['children'][j].remarks].join('')), + model['__global']['_shared'][outputYml]['children'][j].remarks].join('')) }); } } } } + if (dataFrame.length === 0 && input.dataFrame && input.dataFrame.length > 0){ + dataFrame = input.dataFrame; + output.useInputDataFrame = true;; + } + else if (!output.internal) { + output.external = true; + } if (model['__global']['_shared'][outputYml] && model['__global']['_shared'][outputYml]['inheritedMembers']){ + output.internal = true; + output.external = false; const inheritedMembersLength = model['__global']['_shared'][outputYml]['inheritedMembers'].length; for (let j = 0; j < inheritedMembersLength; j++){ if (model['__global']['_shared'][outputYml]['inheritedMembers'][j].type === 'property'){ @@ -181,6 +274,19 @@ function defineInputsAndOutputs(model){ } } } + else if (model['__global']['_shared'][outputYml] && model['__global']['_shared'][outputYml]['children'] && (model['__global']['_shared'][outputYml].type === 'enum')){ + output.internal = true; + output.external = false; + output.dataFrameDescription = [ + model['__global']['_shared'][outputYml].summary, + model['__global']['_shared'][outputYml].remarks + ].join(''); + output.enumFields = defineEnumFields(model['__global']['_shared'][outputYml]); + output.isEnum = true; + } + else if (!output.internal){ + output.external = true; + } } if (Object.keys(input).length && Object.keys(dataFrame).length){ operators.push({'description': description, 'input': input, 'output': output, 'dataFrame': dataFrame, 'hasInput': true, 'hasDataFrame': true}); @@ -223,27 +329,23 @@ function defineOperatorType(model){ for (let i = 0; i < inheritanceLength; i++){ if (model.inheritance[i].uid.includes('Bonsai.Source')){ operatorType.source = true; - operatorType.showWorkflow = true; } else if (model.inheritance[i].uid.includes('Bonsai.Sink')){ operatorType.sink = true; - operatorType.showWorkflow = true; } else if (model.inheritance[i].uid.includes('Bonsai.Combinator')){ operatorType.combinator = true; - operatorType.showWorkflow = true; } if (model.inheritance[i].uid.includes('OpenEphys.Onix1.MultiDeviceFactory')){ operatorType.hub = true; - operatorType.showWorkflow = true; } else if (model.inheritance[i].uid.includes('OpenEphys.Onix1.SingleDeviceFactory')){ operatorType.device = true; - operatorType.showWorkflow = true; } } } } + operatorType.showWorkflow = operatorType.source | operatorType.sink | operatorType.combinator; return operatorType; } @@ -262,16 +364,7 @@ function defineSubOperators(model){ let enumFields = []; potentialEnumYml = '~/api/' + model['__global']['_shared'][potentialSubOperatorYml]['children'][j].syntax.return.type.uid + '.yml'; if (model['__global']['_shared'][potentialEnumYml] && (model['__global']['_shared'][potentialEnumYml]['type'] === 'enum')){ - enumChildrenLength = model['__global']['_shared'][potentialEnumYml]['children'].length; - for (let k = 0; k < enumChildrenLength; k++){ - if (model['__global']['_shared'][potentialEnumYml]['children'][k].type === 'field'){ - enumFields.push({ - 'field&value': model['__global']['_shared'][potentialEnumYml]['children'][k].syntax.content[0].value, - 'description': removeBottomMargin( [model['__global']['_shared'][potentialEnumYml]['children'][k].summary, - model['__global']['_shared'][potentialEnumYml]['children'][k].remarks].join('')) - }); - } - } + enumFields = defineEnumFields(model['__global']['_shared'][potentialEnumYml]); } if (enumFields.length > 0){ subProperties.push({'name': model['__global']['_shared'][potentialSubOperatorYml]['children'][j].name[0].value, @@ -295,12 +388,15 @@ function defineSubOperators(model){ 'object': model.children[i].name[0].value, 'type': model.children[i].syntax.return.type.specName[0].value, 'subProperties': subProperties, - 'hasSubProperties': true}); + 'hasSubProperties': true, + 'subOperator': true + }); } else if (model.__global._shared['~/api/' + model.children[i].name[0].value + '.yml']){ subOperators.push({ 'object': model.children[i].name[0].value, 'type': model.children[i].syntax.return.type.specName[0].value, + 'subOperator': true }); } } @@ -320,16 +416,7 @@ function defineProperties(model){ potentialEnumYml = '~/api/' + model['children'][i].syntax.return.type.uid + '.yml'; let enumFields = []; if (model['__global']['_shared'][potentialEnumYml] && (model['__global']['_shared'][potentialEnumYml]['type'] === 'enum')){ - enumChildrenLength = model['__global']['_shared'][potentialEnumYml]['children'].length; - for (let j = 0; j < enumChildrenLength; j++){ - if (model['__global']['_shared'][potentialEnumYml]['children'][j].type === 'field'){ - enumFields.push({ - 'field&value': model['__global']['_shared'][potentialEnumYml]['children'][j].syntax.content[0].value, - 'description': removeBottomMargin([ model['__global']['_shared'][potentialEnumYml]['children'][j].summary, - model['__global']['_shared'][potentialEnumYml]['children'][j].remarks].join('')) - }); - } - } + enumFields = defineEnumFields(model['__global']['_shared'][potentialEnumYml]); } if (enumFields.length > 0){ properties.push({ @@ -414,7 +501,7 @@ const swapElements = (array, index1, index2) => { }; function defineEnumFields(model){ - enumFields = []; + let enumFields = []; if (model.children){ const childrenLength = model.children.length; for (let i = 0; i < childrenLength; i++){ @@ -454,6 +541,9 @@ exports.preTransform = function (model) { if (operatorType.showWorkflow) { model.showWorkflow = operatorType.showWorkflow; } + else { + + } if (operatorType.device) { model.oe.hubOrDevice = 'device'; @@ -505,7 +595,8 @@ exports.preTransform = function (model) { model.oe.subOperators.push({ 'object': 'Misc', 'subProperties': hubProperties, - 'hasSubProperties': true + 'hasSubProperties': true, + 'subOperator': false }) } } diff --git a/template/partials/class.tmpl.partial b/template/partials/class.tmpl.partial index 55533fd..0e25a93 100644 --- a/template/partials/class.tmpl.partial +++ b/template/partials/class.tmpl.partial @@ -50,7 +50,9 @@

{{{object}}}

+{{#subOperator}}
{{{object}}} is a {{{type}}} operator encapsulated by the {{name.0.value}} operator.
+{{/subOperator}} {{#hasSubProperties}} diff --git a/template/partials/diagram.tmpl.partial b/template/partials/diagram.tmpl.partial index 0a55d8e..32f09e4 100644 --- a/template/partials/diagram.tmpl.partial +++ b/template/partials/diagram.tmpl.partial @@ -12,7 +12,8 @@ {{#input}} -
{{{specName}}}
+ {{#internal}}
{{{name}}}
{{/internal}} + {{#external}}
{{{specName}}}
{{/external}} {{{description}}} @@ -38,7 +39,8 @@ right-arrow -
{{{output.specName}}}
+ {{#output.internal}}
{{{output.name}}}
{{/output.internal}} + {{#output.external}}
{{{output.specName}}}
{{/output.external}}
{{{output.description}}}
@@ -47,24 +49,66 @@ -{{#hasDataFrame}} +{{/oe.operators}} -

{{{output.name}}}

+{{#oe.operators.0.hasDataFrame}} +{{^oe.operators.0.output.useInputDataFrame}} + +

{{{oe.operators.0.output.name}}}

+
{{{oe.operators.0.output.dataFrameDescription}}}
+ +{{/oe.operators.0.output.useInputDataFrame}} + +{{#oe.operators.0.output.useInputDataFrame}} + +

{{{oe.operators.input.name}}}

+
{{{oe.operators.0.input.dataFrameDescription}}}
+ +{{/oe.operators.0.output.useInputDataFrame}} - + - {{#dataFrame}} + {{#oe.operators.0.dataFrame}} {{>partials/propertyTables}} - {{/dataFrame}} + {{/oe.operators.0.dataFrame}}
Data Frame MemberData Frame Member Type Description
-{{/hasDataFrame}} +{{/oe.operators.0.hasDataFrame}} + +{{#oe.operators.0.output.isEnum}} + +

{{{oe.operators.0.output.name}}}

+ +
{{{oe.operators.0.output.dataFrameDescription}}}
+ + + + + + + + + {{#oe.operators.0.output.enumFields}} + + + + + {{/oe.operators.0.output.enumFields}} + +
Field & ValueDescription
+ + {{{field&value}}} + + + {{{description}}} +
+ +{{/oe.operators.0.output.isEnum}} -{{/oe.operators}} \ No newline at end of file