diff --git a/cases/0-hello-world/src/index.heta b/cases/0-hello-world/src/index.heta index a5de3841..a98c3c46 100644 --- a/cases/0-hello-world/src/index.heta +++ b/cases/0-hello-world/src/index.heta @@ -100,3 +100,6 @@ graph #export { format: Dot, filepath: graph }; +summary0 #export { + format: Summary +}; \ No newline at end of file diff --git a/src/browser.js b/src/browser.js index 52e77051..33695132 100644 --- a/src/browser.js +++ b/src/browser.js @@ -23,6 +23,7 @@ global.compiledTemplates = { 'heta-code.heta.njk': nunjucksEnv.getTemplate('heta-code.heta.njk'), 'dbsolve-model.slv.njk': nunjucksEnv.getTemplate('dbsolve-model.slv.njk'), 'dot.dot.njk': nunjucksEnv.getTemplate('dot.dot.njk'), + 'summary.md.njk': nunjucksEnv.getTemplate('summary.md.njk'), 'julia-model.jl.njk': nunjucksEnv.getTemplate('julia-model.jl.njk'), 'julia-run.jl.njk': nunjucksEnv.getTemplate('julia-run.jl.njk'), 'matlab-model.m.njk': nunjucksEnv.getTemplate('matlab-model.m.njk'), @@ -58,6 +59,7 @@ Container._exportClasses = { Matlab: require('./matlab-export'), Julia: require('./julia-export'), Dot: require('./dot-export'), + Summary: require('./summary-export'), }; module.exports = { diff --git a/src/index.js b/src/index.js index e437c3ee..6c81be71 100644 --- a/src/index.js +++ b/src/index.js @@ -12,6 +12,7 @@ global.compiledTemplates = { 'heta-code.heta.njk': nunjucksEnv.getTemplate('heta-code.heta.njk'), 'dbsolve-model.slv.njk': nunjucksEnv.getTemplate('dbsolve-model.slv.njk'), 'dot.dot.njk': nunjucksEnv.getTemplate('dot.dot.njk'), + 'summary.md.njk': nunjucksEnv.getTemplate('summary.md.njk'), 'julia-model.jl.njk': nunjucksEnv.getTemplate('julia-model.jl.njk'), 'julia-run.jl.njk': nunjucksEnv.getTemplate('julia-run.jl.njk'), 'matlab-model.m.njk': nunjucksEnv.getTemplate('matlab-model.m.njk'), @@ -47,6 +48,7 @@ Container._exportClasses = { Matlab: require('./matlab-export'), Julia: require('./julia-export'), Dot: require('./dot-export'), + Summary: require('./summary-export'), }; module.exports = { diff --git a/src/nunjucks-env.js b/src/nunjucks-env.js index b5c9bd26..1cc05f47 100644 --- a/src/nunjucks-env.js +++ b/src/nunjucks-env.js @@ -6,10 +6,10 @@ module.exports = function(env) { // add Filteers for Environment env.addFilter('filter2', function(arr, path, value) { - return arr.filter((x) => _get(x, path)===value); + return [...arr].filter((x) => _get(x, path)===value); }); env.addFilter('exclude2', function(arr, path, value) { - return arr.filter((x) => _get(x, path)!==value); + return [...arr].filter((x) => _get(x, path)!==value); }); env.addFilter('getReactants', function(effectors) { return effectors diff --git a/src/summary-export/index.js b/src/summary-export/index.js new file mode 100644 index 00000000..ed47e40d --- /dev/null +++ b/src/summary-export/index.js @@ -0,0 +1,56 @@ +/* global compiledTemplates */ +const { AbstractExport } = require('../abstract-export'); +const { ajv } = require('../utils'); +require('./namespace'); + +const schema = { + type: 'object', + properties: { + } +}; + +class SummaryExport extends AbstractExport { + constructor(q = {}, isCore = false) { + super(q, isCore); + + // check arguments here + let logger = this._container.logger; + let valid = SummaryExport.isValid(q, logger); + if (!valid) { this.errored = true; return; } + } + get className(){ + return 'SummaryExport'; + } + get format(){ + return 'Summary'; + } + get defaultFilepath() { + return 'summary'; + } + makeText() { + let logger = this._container.logger; + let selectedNamespaces = this.selectedNamespaces(); + + let image = { + unitDefStorage: this._container.unitDefStorage, + functionDefStorage: this._container.functionDefStorage, + selectedNamespaces: selectedNamespaces, + namespaceStorage: this._container.namespaceStorage + }; + let content = this.getDotCode(image); + + return [{ + content: content, + pathSuffix: '/platform.md', + type: 'text' + }]; + } + getDotCode(image = {}) { + return compiledTemplates['summary.md.njk'].render(image); + } + static get validate() { + return ajv.compile(schema); + } +} + +module.exports = SummaryExport; diff --git a/src/summary-export/namespace.js b/src/summary-export/namespace.js new file mode 100644 index 00000000..e69de29b diff --git a/src/templates/summary.md.njk b/src/templates/summary.md.njk new file mode 100644 index 00000000..b2e7bb0e --- /dev/null +++ b/src/templates/summary.md.njk @@ -0,0 +1,74 @@ +# Summary for platform + +## #defineFunction elements + +Total count: {{ functionDefStorage | length }} + +### Core + +{% for key, value in functionDefStorage | filter2('1.isCore', true) %}{{ value.id }}, {% endfor %} + +### User-defined + +{% set userFunctionDef = functionDefStorage | exclude2('1.isCore', true) %} +{{- '-' if not userFunctionDef.length }} +{%- for key, value in userFunctionDef %}{{ value.id }}, {% endfor %} + +## #defineUnit elements + +Total count: {{ unitDefStorage | length }} + +### Core + +{% for key, value in unitDefStorage | filter2('1.isCore', true) %}{{ value.id }}, {% endfor %} + +### User-defined + +{% set userUnitDef = unitDefStorage | exclude2('1.isCore', true) %} +{{- '-' if not userUnitDef.length }} +{%- for key, value in userUnitDef %}{{ value.id }}, {% endfor %} + +## #setNS elements + +Totalcount: {{ namespaceStorage | length }} + +{% for key, value in namespaceStorage %}{{ key }}, {% endfor %} + +{% for name, ns in selectedNamespaces %} +## "{{ name }}" namespace ({{ 'abstract' if ns.isAbstract else 'concrete' }}) + +Total count: {{ ns.size }} + +## @TimeScale + +{% for key, value in ns | filter2('1.className', 'TimeScale') %}{{ key }}, {% endfor %} + +## @Const + +{% for key, value in ns | filter2('1.className', 'Const') %}{{ key }}, {% endfor %} + +## @Record + +{% for key, value in ns | filter2('1.className', 'Record') %}{{ key }}, {% endfor %} + +## @Process + +{% for key, value in ns | filter2('1.className', 'Process') %}{{ key }}, {% endfor %} + +## @Compartment + +{% for key, value in ns | filter2('1.className', 'Compartment') %}{{ key }}, {% endfor %} + +## @Species + +{% for key, value in ns | filter2('1.className', 'Species') %}{{ key }}, {% endfor %} + +## @Reaction + +{% for key, value in ns | filter2('1.className', 'Reaction') %}{{ key }}, {% endfor %} + +## @TimeSwitcher + +{% for key, value in ns | filter2('1.className', 'TimeSwitcher') %}{{ key }}, {% endfor %} +{# CSwitcher, DSwitcher, StopSwitcher, Dose, Page, #} +{% endfor %} diff --git a/src/webpack.js b/src/webpack.js index c9ad0efd..80d64d2b 100644 --- a/src/webpack.js +++ b/src/webpack.js @@ -28,6 +28,7 @@ global.compiledTemplates = { 'heta-code.heta.njk': require('./templates/heta-code.heta.njk'), 'dbsolve-model.slv.njk': require('./templates/dbsolve-model.slv.njk'), 'dot.dot.njk': require('./templates/dot.dot.njk'), + 'summary.md.njk': require('summary.md.njk'), 'julia-model.jl.njk': require('./templates/julia-model.jl.njk'), 'julia-run.jl.njk': require('./templates/julia-run.jl.njk'), 'matlab-model.m.njk': require('./templates/matlab-model.m.njk'), @@ -63,6 +64,7 @@ Container._exportClasses = { Matlab: require('./matlab-export'), Julia: require('./julia-export'), Dot: require('./dot-export'), + Summary: require('./summary-export'), }; module.exports = {