@oml/markdown 0.14.17 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/md/md-frontmatter.d.ts +1 -1
- package/out/md/md-frontmatter.js +6 -11
- package/out/md/md-frontmatter.js.map +1 -1
- package/out/md/md-runtime.js +11 -7
- package/out/md/md-runtime.js.map +1 -1
- package/out/md/md-types.d.ts +2 -2
- package/out/template/binder.js +156 -32
- package/out/template/binder.js.map +1 -1
- package/out/template/compose.d.ts +1 -2
- package/out/template/compose.js +7 -41
- package/out/template/compose.js.map +1 -1
- package/out/template/definition.js +0 -11
- package/out/template/definition.js.map +1 -1
- package/out/template/types.d.ts +0 -2
- package/package.json +2 -2
- package/src/md/md-frontmatter.ts +6 -11
- package/src/md/md-runtime.ts +12 -7
- package/src/md/md-types.ts +2 -2
- package/src/static/markdown-webview.css +7 -0
- package/src/template/binder.ts +165 -35
- package/src/template/compose.ts +8 -45
- package/src/template/definition.ts +0 -12
- package/src/template/types.ts +0 -9
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { MarkdownFrontMatter } from './md-types.js';
|
|
2
2
|
export declare function stripLeadingFrontMatter(markdown: string): string;
|
|
3
3
|
export declare function extractLeadingFrontMatter(markdown: string): MarkdownFrontMatter | undefined;
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function extractOntology(frontMatterRaw: string): string | undefined;
|
package/out/md/md-frontmatter.js
CHANGED
|
@@ -18,7 +18,7 @@ export function extractLeadingFrontMatter(markdown) {
|
|
|
18
18
|
const yamlData = parseYamlMap(yamlBody);
|
|
19
19
|
return {
|
|
20
20
|
raw: yamlMatch[1],
|
|
21
|
-
|
|
21
|
+
ontology: extractOntologyFromData(yamlData) ?? extractOntology(yamlMatch[1]),
|
|
22
22
|
data: yamlData,
|
|
23
23
|
};
|
|
24
24
|
}
|
|
@@ -26,28 +26,23 @@ export function extractLeadingFrontMatter(markdown) {
|
|
|
26
26
|
if (tomlMatch) {
|
|
27
27
|
return {
|
|
28
28
|
raw: tomlMatch[1],
|
|
29
|
-
|
|
29
|
+
ontology: extractOntology(tomlMatch[1])
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
return undefined;
|
|
33
33
|
}
|
|
34
|
-
export function
|
|
35
|
-
const match = /^
|
|
36
|
-
?? /^ontology\s*:\s*(.+)$/m.exec(frontMatterRaw);
|
|
34
|
+
export function extractOntology(frontMatterRaw) {
|
|
35
|
+
const match = /^ontology\s*:\s*(.+)$/m.exec(frontMatterRaw);
|
|
37
36
|
if (!match) {
|
|
38
37
|
return undefined;
|
|
39
38
|
}
|
|
40
39
|
return match[1].trim().replace(/^['"]|['"]$/g, '');
|
|
41
40
|
}
|
|
42
|
-
function
|
|
41
|
+
function extractOntologyFromData(data) {
|
|
43
42
|
if (!data) {
|
|
44
43
|
return undefined;
|
|
45
44
|
}
|
|
46
|
-
const value = typeof data.
|
|
47
|
-
? data.ontologyIri
|
|
48
|
-
: typeof data.ontology === 'string'
|
|
49
|
-
? data.ontology
|
|
50
|
-
: undefined;
|
|
45
|
+
const value = typeof data.ontology === 'string' ? data.ontology : undefined;
|
|
51
46
|
return typeof value === 'string' ? value : undefined;
|
|
52
47
|
}
|
|
53
48
|
//# sourceMappingURL=md-frontmatter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"md-frontmatter.js","sourceRoot":"","sources":["../../src/md/md-frontmatter.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,oDAAoD,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxF,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;aACxB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO;YACH,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YACjB,
|
|
1
|
+
{"version":3,"file":"md-frontmatter.js","sourceRoot":"","sources":["../../src/md/md-frontmatter.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,oDAAoD,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxF,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;aACxB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO;YACH,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YACjB,QAAQ,EAAE,uBAAuB,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5E,IAAI,EAAE,QAAQ;SACjB,CAAC;IACN,CAAC;IACD,MAAM,SAAS,GAAG,0DAA0D,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9F,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO;YACH,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YACjB,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SAC1C,CAAC;IACN,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,cAAsB;IAClD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAyC;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC"}
|
package/out/md/md-runtime.js
CHANGED
|
@@ -3,6 +3,7 @@ import MarkdownIt from 'markdown-it';
|
|
|
3
3
|
import { displayLabelFromIri } from '../renderers/renderer.js';
|
|
4
4
|
import { extractLeadingFrontMatter, stripLeadingFrontMatter } from './md-frontmatter.js';
|
|
5
5
|
import { parseYamlMap } from './md-yaml.js';
|
|
6
|
+
import { interpolateTemplateBody } from '../template/engine.js';
|
|
6
7
|
export class MarkdownPreviewRuntime {
|
|
7
8
|
constructor(handlers) {
|
|
8
9
|
this.handlers = handlers;
|
|
@@ -16,14 +17,17 @@ export class MarkdownPreviewRuntime {
|
|
|
16
17
|
prepare(markdown) {
|
|
17
18
|
const frontMatter = extractLeadingFrontMatter(markdown);
|
|
18
19
|
const stripped = stripLeadingFrontMatter(markdown);
|
|
19
|
-
const
|
|
20
|
+
const body = frontMatter?.data && Object.keys(frontMatter.data).length > 0
|
|
21
|
+
? interpolateTemplateBody(stripped, frontMatter.data)
|
|
22
|
+
: stripped;
|
|
23
|
+
const codeBlocks = this.parseCodeBlocks(body);
|
|
20
24
|
const executableBlocks = this.resolveExecutableBlocks(codeBlocks);
|
|
21
|
-
const renderedHtml = this.renderer.render(
|
|
25
|
+
const renderedHtml = this.renderer.render(body);
|
|
22
26
|
return {
|
|
23
|
-
markdown:
|
|
27
|
+
markdown: body,
|
|
24
28
|
renderedHtml,
|
|
25
29
|
frontMatter,
|
|
26
|
-
|
|
30
|
+
ontology: frontMatter?.ontology,
|
|
27
31
|
codeBlocks,
|
|
28
32
|
executableBlocks
|
|
29
33
|
};
|
|
@@ -41,7 +45,7 @@ export class MarkdownPreviewRuntime {
|
|
|
41
45
|
const lineEnd = token.map?.[1] ?? lineStart;
|
|
42
46
|
const parsed = parseBlockOptions(token.content);
|
|
43
47
|
blocks.push({
|
|
44
|
-
id: buildBlockId(
|
|
48
|
+
id: buildBlockId(language, parsed.content),
|
|
45
49
|
language,
|
|
46
50
|
meta,
|
|
47
51
|
content: parsed.content,
|
|
@@ -128,8 +132,8 @@ function parseMeta(info) {
|
|
|
128
132
|
}
|
|
129
133
|
return trimmed.slice(index + 1).trim() || undefined;
|
|
130
134
|
}
|
|
131
|
-
function buildBlockId(
|
|
132
|
-
return `block-${
|
|
135
|
+
function buildBlockId(language, content) {
|
|
136
|
+
return `block-${language}-${hash32(`${language}|${content}`)}`;
|
|
133
137
|
}
|
|
134
138
|
function hash32(input) {
|
|
135
139
|
let hash = 2166136261;
|
package/out/md/md-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"md-runtime.js","sourceRoot":"","sources":["../../src/md/md-runtime.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"md-runtime.js","sourceRoot":"","sources":["../../src/md/md-runtime.ts"],"names":[],"mappings":"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"}
|
package/out/md/md-types.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface ParsedCodeBlock {
|
|
|
9
9
|
}
|
|
10
10
|
export interface MarkdownFrontMatter {
|
|
11
11
|
raw: string;
|
|
12
|
-
|
|
12
|
+
ontology?: string;
|
|
13
13
|
data?: Record<string, unknown>;
|
|
14
14
|
}
|
|
15
15
|
export interface PreparedCodeBlock {
|
|
@@ -20,7 +20,7 @@ export interface PreparedMarkdownDocument {
|
|
|
20
20
|
markdown: string;
|
|
21
21
|
renderedHtml: string;
|
|
22
22
|
frontMatter?: MarkdownFrontMatter;
|
|
23
|
-
|
|
23
|
+
ontology?: string;
|
|
24
24
|
codeBlocks: ParsedCodeBlock[];
|
|
25
25
|
executableBlocks: PreparedCodeBlock[];
|
|
26
26
|
}
|
package/out/template/binder.js
CHANGED
|
@@ -6,51 +6,175 @@ export function bindTemplateParameters(template, context, explicitArgs = {}) {
|
|
|
6
6
|
for (const parameter of parameters) {
|
|
7
7
|
const explicit = explicitArgs[parameter.id];
|
|
8
8
|
if (explicit !== undefined) {
|
|
9
|
-
values[parameter.id] = explicit;
|
|
9
|
+
values[parameter.id] = coerceParameterValue(parameter, explicit);
|
|
10
10
|
continue;
|
|
11
11
|
}
|
|
12
|
-
const
|
|
13
|
-
if (
|
|
14
|
-
values[parameter.id] =
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
if (parameter.defaultValue !== undefined) {
|
|
18
|
-
values[parameter.id] = parameter.defaultValue;
|
|
12
|
+
const defaultValue = resolveTemplateDefaultValue(parameter.defaultValue, context);
|
|
13
|
+
if (defaultValue !== undefined) {
|
|
14
|
+
values[parameter.id] = coerceParameterValue(parameter, defaultValue);
|
|
19
15
|
continue;
|
|
20
16
|
}
|
|
21
17
|
if (parameter.required) {
|
|
22
18
|
missingRequired.push(parameter.id);
|
|
19
|
+
continue;
|
|
23
20
|
}
|
|
21
|
+
values[parameter.id] = naturalDefaultValue(parameter.type);
|
|
24
22
|
}
|
|
25
23
|
return { values, missingRequired };
|
|
26
24
|
}
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
case 'context.member':
|
|
30
|
-
return context.focus?.memberIri;
|
|
31
|
-
case 'context.ontology':
|
|
32
|
-
return context.model?.ontologyIri;
|
|
33
|
-
case 'context.modelUri':
|
|
34
|
-
return context.model?.modelUri;
|
|
35
|
-
case 'context.selection[*]':
|
|
36
|
-
return context.selection?.iris ?? [];
|
|
37
|
-
default:
|
|
38
|
-
return resolveSelectionIndexedBinding(parameter.from, context);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function resolveSelectionIndexedBinding(source, context) {
|
|
42
|
-
if (!source || !source.startsWith('context.selection[')) {
|
|
25
|
+
function resolveTemplateDefaultValue(value, context) {
|
|
26
|
+
if (value === undefined) {
|
|
43
27
|
return undefined;
|
|
44
28
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return undefined;
|
|
29
|
+
if (typeof value !== 'string') {
|
|
30
|
+
return value;
|
|
48
31
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
32
|
+
return interpolateContextExpression(value, context);
|
|
33
|
+
}
|
|
34
|
+
function interpolateContextExpression(source, context) {
|
|
35
|
+
let unresolved = false;
|
|
36
|
+
const output = source.replace(/\$\{context\.([^}]+)\}/g, (_match, token) => {
|
|
37
|
+
const resolved = resolveContextToken(token.trim(), context);
|
|
38
|
+
if (resolved === undefined) {
|
|
39
|
+
unresolved = true;
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
return resolved;
|
|
43
|
+
});
|
|
44
|
+
return unresolved ? undefined : output;
|
|
45
|
+
}
|
|
46
|
+
function resolveContextToken(token, context) {
|
|
47
|
+
const indexedSelection = /^selection\[(\d+)]$/.exec(token);
|
|
48
|
+
if (indexedSelection) {
|
|
49
|
+
const index = Number.parseInt(indexedSelection[1] ?? '', 10);
|
|
50
|
+
if (!Number.isFinite(index) || index < 0) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const selection = context.selection?.iris ?? [];
|
|
54
|
+
const value = selection[index];
|
|
55
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
56
|
+
}
|
|
57
|
+
const key = token;
|
|
58
|
+
const vars = context.vars ?? {};
|
|
59
|
+
const direct = vars[key];
|
|
60
|
+
if (typeof direct === 'string') {
|
|
61
|
+
return direct;
|
|
62
|
+
}
|
|
63
|
+
if (typeof direct === 'number' || typeof direct === 'boolean') {
|
|
64
|
+
return String(direct);
|
|
65
|
+
}
|
|
66
|
+
if (key === 'ontology') {
|
|
67
|
+
return context.model?.ontologyIri?.trim() || undefined;
|
|
68
|
+
}
|
|
69
|
+
if (key === 'member') {
|
|
70
|
+
return context.focus?.memberIri?.trim() || undefined;
|
|
71
|
+
}
|
|
72
|
+
if (key === 'selection') {
|
|
73
|
+
const selection = context.selection?.iris ?? [];
|
|
74
|
+
return selection.join(', ');
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
function coerceParameterValue(parameter, value) {
|
|
79
|
+
switch (parameter.type) {
|
|
80
|
+
case 'string':
|
|
81
|
+
case 'iri':
|
|
82
|
+
return coerceString(parameter, value);
|
|
83
|
+
case 'number':
|
|
84
|
+
return coerceNumber(parameter, value);
|
|
85
|
+
case 'boolean':
|
|
86
|
+
return coerceBoolean(parameter, value);
|
|
87
|
+
case 'iri[]':
|
|
88
|
+
return coerceIriArray(parameter, value);
|
|
89
|
+
case 'json':
|
|
90
|
+
return coerceJson(parameter, value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function coerceString(parameter, value) {
|
|
94
|
+
if (typeof value === 'string') {
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
98
|
+
return String(value);
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`Template parameter '${parameter.id}' must be a string.`);
|
|
101
|
+
}
|
|
102
|
+
function coerceNumber(parameter, value) {
|
|
103
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
if (typeof value === 'string') {
|
|
107
|
+
const parsed = Number(value.trim());
|
|
108
|
+
if (Number.isFinite(parsed)) {
|
|
109
|
+
return parsed;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`Template parameter '${parameter.id}' must be a number.`);
|
|
113
|
+
}
|
|
114
|
+
function coerceBoolean(parameter, value) {
|
|
115
|
+
if (typeof value === 'boolean') {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
if (typeof value === 'string') {
|
|
119
|
+
const normalized = value.trim().toLowerCase();
|
|
120
|
+
if (normalized === 'true') {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (normalized === 'false') {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
throw new Error(`Template parameter '${parameter.id}' must be a boolean.`);
|
|
128
|
+
}
|
|
129
|
+
function coerceIriArray(parameter, value) {
|
|
130
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === 'string')) {
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
if (typeof value === 'string') {
|
|
134
|
+
const normalized = value.trim();
|
|
135
|
+
if (!normalized) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
return normalized.split(',').map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
139
|
+
}
|
|
140
|
+
throw new Error(`Template parameter '${parameter.id}' must be an array of strings.`);
|
|
141
|
+
}
|
|
142
|
+
function coerceJson(parameter, value) {
|
|
143
|
+
if (value === null || typeof value === 'object') {
|
|
144
|
+
return value;
|
|
145
|
+
}
|
|
146
|
+
if (typeof value === 'string') {
|
|
147
|
+
try {
|
|
148
|
+
const parsed = JSON.parse(value);
|
|
149
|
+
if (parsed === null
|
|
150
|
+
|| typeof parsed === 'string'
|
|
151
|
+
|| typeof parsed === 'number'
|
|
152
|
+
|| typeof parsed === 'boolean'
|
|
153
|
+
|| (Array.isArray(parsed) && parsed.every((entry) => typeof entry === 'string'))
|
|
154
|
+
|| (typeof parsed === 'object' && parsed !== null)) {
|
|
155
|
+
return parsed;
|
|
156
|
+
}
|
|
157
|
+
throw new Error('unsupported-json');
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw new Error(`Template parameter '${parameter.id}' must be valid JSON.`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
throw new Error(`Template parameter '${parameter.id}' must be JSON.`);
|
|
164
|
+
}
|
|
165
|
+
function naturalDefaultValue(type) {
|
|
166
|
+
switch (type) {
|
|
167
|
+
case 'number':
|
|
168
|
+
return 0;
|
|
169
|
+
case 'boolean':
|
|
170
|
+
return false;
|
|
171
|
+
case 'iri[]':
|
|
172
|
+
return [];
|
|
173
|
+
case 'json':
|
|
174
|
+
return {};
|
|
175
|
+
case 'string':
|
|
176
|
+
case 'iri':
|
|
177
|
+
return '';
|
|
52
178
|
}
|
|
53
|
-
const iris = context.selection?.iris ?? [];
|
|
54
|
-
return iris[index];
|
|
55
179
|
}
|
|
56
180
|
//# sourceMappingURL=binder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binder.js","sourceRoot":"","sources":["../../src/template/binder.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAIrD,MAAM,UAAU,sBAAsB,CAClC,QAA4B,EAC5B,OAAkC,EAClC,eAAwD,EAAE;IAE1D,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;IAC7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"binder.js","sourceRoot":"","sources":["../../src/template/binder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TemplateValue } from './types.js';
|
|
2
2
|
export interface TemplateComposeDirective {
|
|
3
3
|
id: string;
|
|
4
4
|
args: Record<string, TemplateValue>;
|
|
5
|
-
bind: Record<string, TemplateBindingSource>;
|
|
6
5
|
}
|
|
7
6
|
export declare function parseTemplateComposeDirective(source: string): TemplateComposeDirective | undefined;
|
package/out/template/compose.js
CHANGED
|
@@ -2,37 +2,26 @@
|
|
|
2
2
|
import { parse } from 'yaml';
|
|
3
3
|
export function parseTemplateComposeDirective(source) {
|
|
4
4
|
const normalized = source.replace(/^\uFEFF/, '');
|
|
5
|
-
const
|
|
6
|
-
if (!frontMatterMatch) {
|
|
7
|
-
return undefined;
|
|
8
|
-
}
|
|
9
|
-
const trailing = frontMatterMatch[2] ?? '';
|
|
10
|
-
if (trailing.trim().length > 0) {
|
|
11
|
-
return undefined;
|
|
12
|
-
}
|
|
13
|
-
const yamlBody = frontMatterMatch[1]
|
|
14
|
-
.replace(/^---[ \t]*\r?\n/, '')
|
|
15
|
-
.replace(/\r?\n---[ \t]*$/, '');
|
|
16
|
-
const parsed = parse(yamlBody);
|
|
5
|
+
const parsed = parse(normalized);
|
|
17
6
|
if (!isRecord(parsed)) {
|
|
18
7
|
return undefined;
|
|
19
8
|
}
|
|
20
|
-
const id = normalizeString(parsed.
|
|
9
|
+
const id = normalizeString(parsed.template);
|
|
21
10
|
if (!id) {
|
|
22
11
|
return undefined;
|
|
23
12
|
}
|
|
24
|
-
const args = parseArgs(parsed
|
|
25
|
-
|
|
26
|
-
return { id, args, bind };
|
|
13
|
+
const args = parseArgs(parsed, ['template']);
|
|
14
|
+
return { id, args };
|
|
27
15
|
}
|
|
28
|
-
function parseArgs(value) {
|
|
16
|
+
function parseArgs(value, excludedKeys = []) {
|
|
29
17
|
if (!isRecord(value)) {
|
|
30
18
|
return {};
|
|
31
19
|
}
|
|
20
|
+
const excluded = new Set(excludedKeys);
|
|
32
21
|
const args = {};
|
|
33
22
|
for (const [key, raw] of Object.entries(value)) {
|
|
34
23
|
const normalizedKey = normalizeString(key);
|
|
35
|
-
if (!normalizedKey) {
|
|
24
|
+
if (!normalizedKey || excluded.has(normalizedKey)) {
|
|
36
25
|
continue;
|
|
37
26
|
}
|
|
38
27
|
const converted = toTemplateValue(raw);
|
|
@@ -42,21 +31,6 @@ function parseArgs(value) {
|
|
|
42
31
|
}
|
|
43
32
|
return args;
|
|
44
33
|
}
|
|
45
|
-
function parseBind(value) {
|
|
46
|
-
if (!isRecord(value)) {
|
|
47
|
-
return {};
|
|
48
|
-
}
|
|
49
|
-
const bind = {};
|
|
50
|
-
for (const [key, raw] of Object.entries(value)) {
|
|
51
|
-
const normalizedKey = normalizeString(key);
|
|
52
|
-
const source = normalizeString(raw);
|
|
53
|
-
if (!normalizedKey || !source || !isTemplateBindingSource(source)) {
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
bind[normalizedKey] = source;
|
|
57
|
-
}
|
|
58
|
-
return bind;
|
|
59
|
-
}
|
|
60
34
|
function toTemplateValue(value) {
|
|
61
35
|
if (value === null) {
|
|
62
36
|
return null;
|
|
@@ -72,14 +46,6 @@ function toTemplateValue(value) {
|
|
|
72
46
|
}
|
|
73
47
|
return undefined;
|
|
74
48
|
}
|
|
75
|
-
function isTemplateBindingSource(value) {
|
|
76
|
-
return value === 'context.member'
|
|
77
|
-
|| value === 'context.ontology'
|
|
78
|
-
|| value === 'context.modelUri'
|
|
79
|
-
|| value === 'context.selection[*]'
|
|
80
|
-
|| value === 'user'
|
|
81
|
-
|| /^context\.selection\[\d+]$/.test(value);
|
|
82
|
-
}
|
|
83
49
|
function normalizeString(value) {
|
|
84
50
|
if (typeof value !== 'string') {
|
|
85
51
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/template/compose.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/template/compose.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAQ7B,MAAM,UAAU,6BAA6B,CAAC,MAAc;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,eAAyB,EAAE;IAC1D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,IAAI,GAAkC,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAChD,SAAS;QACb,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QACpC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QACvF,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -105,8 +105,6 @@ function parseTemplateParameters(raw) {
|
|
|
105
105
|
continue;
|
|
106
106
|
}
|
|
107
107
|
const required = typeof entry.required === 'boolean' ? entry.required : undefined;
|
|
108
|
-
const fromValue = typeof entry.from === 'string' ? entry.from.trim() : '';
|
|
109
|
-
const from = isSupportedBindingSource(fromValue) ? fromValue : undefined;
|
|
110
108
|
const description = typeof entry.description === 'string' && entry.description.trim().length > 0
|
|
111
109
|
? entry.description.trim()
|
|
112
110
|
: undefined;
|
|
@@ -114,7 +112,6 @@ function parseTemplateParameters(raw) {
|
|
|
114
112
|
id,
|
|
115
113
|
type,
|
|
116
114
|
required,
|
|
117
|
-
from,
|
|
118
115
|
defaultValue: toTemplateValue(entry.defaultValue),
|
|
119
116
|
description,
|
|
120
117
|
});
|
|
@@ -129,14 +126,6 @@ function isSupportedParameterType(value) {
|
|
|
129
126
|
|| value === 'iri[]'
|
|
130
127
|
|| value === 'json';
|
|
131
128
|
}
|
|
132
|
-
function isSupportedBindingSource(value) {
|
|
133
|
-
return value === 'context.member'
|
|
134
|
-
|| value === 'context.ontology'
|
|
135
|
-
|| value === 'context.modelUri'
|
|
136
|
-
|| value === 'context.selection[*]'
|
|
137
|
-
|| /^context\.selection\[\d+]$/.test(value)
|
|
138
|
-
|| value === 'user';
|
|
139
|
-
}
|
|
140
129
|
function toTemplateValue(value) {
|
|
141
130
|
if (value === null) {
|
|
142
131
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/template/definition.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/template/definition.ts"],"names":[],"mappings":"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"}
|
package/out/template/types.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
export type TemplateValue = string | number | boolean | null | string[] | Record<string, unknown>;
|
|
2
2
|
export type TemplateParameterType = 'iri' | 'string' | 'number' | 'boolean' | 'iri[]' | 'json';
|
|
3
|
-
export type TemplateBindingSource = 'context.member' | 'context.ontology' | 'context.modelUri' | `context.selection[${number}]` | 'context.selection[*]' | 'user';
|
|
4
3
|
export interface TemplateParameterDefinition {
|
|
5
4
|
id: string;
|
|
6
5
|
type: TemplateParameterType;
|
|
7
6
|
required?: boolean;
|
|
8
|
-
from?: TemplateBindingSource;
|
|
9
7
|
defaultValue?: TemplateValue;
|
|
10
8
|
description?: string;
|
|
11
9
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oml/markdown",
|
|
3
3
|
"description": "Markdown runtime and execution contracts for OML",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.15.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=20.10.0",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@antv/x6": "^3.1.6",
|
|
58
58
|
"@dagrejs/dagre": "^2.0.4",
|
|
59
|
-
"@oml/owl": "0.
|
|
59
|
+
"@oml/owl": "0.15.0",
|
|
60
60
|
"chart.js": "^4.4.0",
|
|
61
61
|
"markdown-it": "^14.1.1",
|
|
62
62
|
"reflect-metadata": "^0.2.2",
|
package/src/md/md-frontmatter.ts
CHANGED
|
@@ -22,7 +22,7 @@ export function extractLeadingFrontMatter(markdown: string): MarkdownFrontMatter
|
|
|
22
22
|
const yamlData = parseYamlMap(yamlBody);
|
|
23
23
|
return {
|
|
24
24
|
raw: yamlMatch[1],
|
|
25
|
-
|
|
25
|
+
ontology: extractOntologyFromData(yamlData) ?? extractOntology(yamlMatch[1]),
|
|
26
26
|
data: yamlData,
|
|
27
27
|
};
|
|
28
28
|
}
|
|
@@ -30,29 +30,24 @@ export function extractLeadingFrontMatter(markdown: string): MarkdownFrontMatter
|
|
|
30
30
|
if (tomlMatch) {
|
|
31
31
|
return {
|
|
32
32
|
raw: tomlMatch[1],
|
|
33
|
-
|
|
33
|
+
ontology: extractOntology(tomlMatch[1])
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
return undefined;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
export function
|
|
40
|
-
const match = /^
|
|
41
|
-
?? /^ontology\s*:\s*(.+)$/m.exec(frontMatterRaw);
|
|
39
|
+
export function extractOntology(frontMatterRaw: string): string | undefined {
|
|
40
|
+
const match = /^ontology\s*:\s*(.+)$/m.exec(frontMatterRaw);
|
|
42
41
|
if (!match) {
|
|
43
42
|
return undefined;
|
|
44
43
|
}
|
|
45
44
|
return match[1].trim().replace(/^['"]|['"]$/g, '');
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
function
|
|
47
|
+
function extractOntologyFromData(data: Record<string, unknown> | undefined): string | undefined {
|
|
49
48
|
if (!data) {
|
|
50
49
|
return undefined;
|
|
51
50
|
}
|
|
52
|
-
const value = typeof data.
|
|
53
|
-
? data.ontologyIri
|
|
54
|
-
: typeof data.ontology === 'string'
|
|
55
|
-
? data.ontology
|
|
56
|
-
: undefined;
|
|
51
|
+
const value = typeof data.ontology === 'string' ? data.ontology : undefined;
|
|
57
52
|
return typeof value === 'string' ? value : undefined;
|
|
58
53
|
}
|
package/src/md/md-runtime.ts
CHANGED
|
@@ -7,6 +7,8 @@ import { extractLeadingFrontMatter, stripLeadingFrontMatter } from './md-frontma
|
|
|
7
7
|
import { MarkdownHandlerRegistry } from './md-registry.js';
|
|
8
8
|
import { parseYamlMap } from './md-yaml.js';
|
|
9
9
|
import type { ParsedCodeBlock, PreparedCodeBlock, PreparedMarkdownDocument } from './md-types.js';
|
|
10
|
+
import { interpolateTemplateBody } from '../template/engine.js';
|
|
11
|
+
import type { TemplateValue } from '../template/types.js';
|
|
10
12
|
|
|
11
13
|
export class MarkdownPreviewRuntime {
|
|
12
14
|
private readonly renderer: MarkdownIt;
|
|
@@ -23,15 +25,18 @@ export class MarkdownPreviewRuntime {
|
|
|
23
25
|
prepare(markdown: string): PreparedMarkdownDocument {
|
|
24
26
|
const frontMatter = extractLeadingFrontMatter(markdown);
|
|
25
27
|
const stripped = stripLeadingFrontMatter(markdown);
|
|
26
|
-
const
|
|
28
|
+
const body = frontMatter?.data && Object.keys(frontMatter.data).length > 0
|
|
29
|
+
? interpolateTemplateBody(stripped, frontMatter.data as Record<string, TemplateValue>)
|
|
30
|
+
: stripped;
|
|
31
|
+
const codeBlocks = this.parseCodeBlocks(body);
|
|
27
32
|
const executableBlocks = this.resolveExecutableBlocks(codeBlocks);
|
|
28
|
-
const renderedHtml = this.renderer.render(
|
|
33
|
+
const renderedHtml = this.renderer.render(body);
|
|
29
34
|
|
|
30
35
|
return {
|
|
31
|
-
markdown:
|
|
36
|
+
markdown: body,
|
|
32
37
|
renderedHtml,
|
|
33
38
|
frontMatter,
|
|
34
|
-
|
|
39
|
+
ontology: frontMatter?.ontology,
|
|
35
40
|
codeBlocks,
|
|
36
41
|
executableBlocks
|
|
37
42
|
};
|
|
@@ -51,7 +56,7 @@ export class MarkdownPreviewRuntime {
|
|
|
51
56
|
const lineEnd = token.map?.[1] ?? lineStart;
|
|
52
57
|
const parsed = parseBlockOptions(token.content);
|
|
53
58
|
blocks.push({
|
|
54
|
-
id: buildBlockId(
|
|
59
|
+
id: buildBlockId(language, parsed.content),
|
|
55
60
|
language,
|
|
56
61
|
meta,
|
|
57
62
|
content: parsed.content,
|
|
@@ -151,8 +156,8 @@ function parseMeta(info: string): string | undefined {
|
|
|
151
156
|
return trimmed.slice(index + 1).trim() || undefined;
|
|
152
157
|
}
|
|
153
158
|
|
|
154
|
-
function buildBlockId(
|
|
155
|
-
return `block-${
|
|
159
|
+
function buildBlockId(language: string, content: string): string {
|
|
160
|
+
return `block-${language}-${hash32(`${language}|${content}`)}`;
|
|
156
161
|
}
|
|
157
162
|
|
|
158
163
|
function hash32(input: string): string {
|
package/src/md/md-types.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface ParsedCodeBlock {
|
|
|
12
12
|
|
|
13
13
|
export interface MarkdownFrontMatter {
|
|
14
14
|
raw: string;
|
|
15
|
-
|
|
15
|
+
ontology?: string;
|
|
16
16
|
data?: Record<string, unknown>;
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -25,7 +25,7 @@ export interface PreparedMarkdownDocument {
|
|
|
25
25
|
markdown: string;
|
|
26
26
|
renderedHtml: string;
|
|
27
27
|
frontMatter?: MarkdownFrontMatter;
|
|
28
|
-
|
|
28
|
+
ontology?: string;
|
|
29
29
|
codeBlocks: ParsedCodeBlock[];
|
|
30
30
|
executableBlocks: PreparedCodeBlock[];
|
|
31
31
|
}
|
|
@@ -726,6 +726,8 @@ pre {
|
|
|
726
726
|
align-items: center;
|
|
727
727
|
gap: 0.5rem;
|
|
728
728
|
margin-left: auto;
|
|
729
|
+
font-family: var(--vscode-font-family, var(--markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", system-ui, "Ubuntu", "Droid Sans", sans-serif));
|
|
730
|
+
font-size: 0.85rem;
|
|
729
731
|
}
|
|
730
732
|
|
|
731
733
|
.oml-md-result .table-pagination {
|
|
@@ -745,6 +747,7 @@ pre {
|
|
|
745
747
|
background: transparent;
|
|
746
748
|
color: var(--vscode-foreground);
|
|
747
749
|
cursor: pointer;
|
|
750
|
+
font-family: inherit;
|
|
748
751
|
font-size: 1rem;
|
|
749
752
|
font-weight: 600;
|
|
750
753
|
line-height: 1;
|
|
@@ -764,6 +767,10 @@ pre {
|
|
|
764
767
|
.oml-md-result .table-page-label {
|
|
765
768
|
min-width: 36px;
|
|
766
769
|
text-align: center;
|
|
770
|
+
font-family: inherit;
|
|
771
|
+
font-size: inherit;
|
|
772
|
+
font-weight: 400;
|
|
773
|
+
line-height: 1.2;
|
|
767
774
|
}
|
|
768
775
|
|
|
769
776
|
.oml-md-result .graph-canvas-root {
|
package/src/template/binder.ts
CHANGED
|
@@ -13,58 +13,188 @@ export function bindTemplateParameters(
|
|
|
13
13
|
for (const parameter of parameters) {
|
|
14
14
|
const explicit = explicitArgs[parameter.id];
|
|
15
15
|
if (explicit !== undefined) {
|
|
16
|
-
values[parameter.id] = explicit;
|
|
16
|
+
values[parameter.id] = coerceParameterValue(parameter, explicit);
|
|
17
17
|
continue;
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
21
|
-
values[parameter.id] =
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
if (parameter.defaultValue !== undefined) {
|
|
25
|
-
values[parameter.id] = parameter.defaultValue;
|
|
19
|
+
const defaultValue = resolveTemplateDefaultValue(parameter.defaultValue, context);
|
|
20
|
+
if (defaultValue !== undefined) {
|
|
21
|
+
values[parameter.id] = coerceParameterValue(parameter, defaultValue);
|
|
26
22
|
continue;
|
|
27
23
|
}
|
|
28
24
|
if (parameter.required) {
|
|
29
25
|
missingRequired.push(parameter.id);
|
|
26
|
+
continue;
|
|
30
27
|
}
|
|
28
|
+
values[parameter.id] = naturalDefaultValue(parameter.type);
|
|
31
29
|
}
|
|
32
30
|
return { values, missingRequired };
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
function
|
|
36
|
-
|
|
33
|
+
function resolveTemplateDefaultValue(
|
|
34
|
+
value: TemplateValue | undefined,
|
|
37
35
|
context: TemplateInvocationContext
|
|
38
36
|
): TemplateValue | undefined {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
case 'context.modelUri':
|
|
45
|
-
return context.model?.modelUri;
|
|
46
|
-
case 'context.selection[*]':
|
|
47
|
-
return context.selection?.iris ?? [];
|
|
48
|
-
default:
|
|
49
|
-
return resolveSelectionIndexedBinding(parameter.from, context);
|
|
37
|
+
if (value === undefined) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (typeof value !== 'string') {
|
|
41
|
+
return value;
|
|
50
42
|
}
|
|
43
|
+
return interpolateContextExpression(value, context);
|
|
51
44
|
}
|
|
52
45
|
|
|
53
|
-
function
|
|
54
|
-
|
|
55
|
-
context:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
46
|
+
function interpolateContextExpression(source: string, context: TemplateInvocationContext): string | undefined {
|
|
47
|
+
let unresolved = false;
|
|
48
|
+
const output = source.replace(/\$\{context\.([^}]+)\}/g, (_match, token: string) => {
|
|
49
|
+
const resolved = resolveContextToken(token.trim(), context);
|
|
50
|
+
if (resolved === undefined) {
|
|
51
|
+
unresolved = true;
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
return resolved;
|
|
55
|
+
});
|
|
56
|
+
return unresolved ? undefined : output;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function resolveContextToken(token: string, context: TemplateInvocationContext): string | undefined {
|
|
60
|
+
const indexedSelection = /^selection\[(\d+)]$/.exec(token);
|
|
61
|
+
if (indexedSelection) {
|
|
62
|
+
const index = Number.parseInt(indexedSelection[1] ?? '', 10);
|
|
63
|
+
if (!Number.isFinite(index) || index < 0) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const selection = context.selection?.iris ?? [];
|
|
67
|
+
const value = selection[index];
|
|
68
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
59
69
|
}
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
const key = token;
|
|
71
|
+
const vars = context.vars ?? {};
|
|
72
|
+
const direct = vars[key];
|
|
73
|
+
if (typeof direct === 'string') {
|
|
74
|
+
return direct;
|
|
63
75
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
if (typeof direct === 'number' || typeof direct === 'boolean') {
|
|
77
|
+
return String(direct);
|
|
78
|
+
}
|
|
79
|
+
if (key === 'ontology') {
|
|
80
|
+
return context.model?.ontologyIri?.trim() || undefined;
|
|
81
|
+
}
|
|
82
|
+
if (key === 'member') {
|
|
83
|
+
return context.focus?.memberIri?.trim() || undefined;
|
|
84
|
+
}
|
|
85
|
+
if (key === 'selection') {
|
|
86
|
+
const selection = context.selection?.iris ?? [];
|
|
87
|
+
return selection.join(', ');
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function coerceParameterValue(parameter: TemplateParameterDefinition, value: TemplateValue): TemplateValue {
|
|
93
|
+
switch (parameter.type) {
|
|
94
|
+
case 'string':
|
|
95
|
+
case 'iri':
|
|
96
|
+
return coerceString(parameter, value);
|
|
97
|
+
case 'number':
|
|
98
|
+
return coerceNumber(parameter, value);
|
|
99
|
+
case 'boolean':
|
|
100
|
+
return coerceBoolean(parameter, value);
|
|
101
|
+
case 'iri[]':
|
|
102
|
+
return coerceIriArray(parameter, value);
|
|
103
|
+
case 'json':
|
|
104
|
+
return coerceJson(parameter, value);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function coerceString(parameter: TemplateParameterDefinition, value: TemplateValue): string {
|
|
109
|
+
if (typeof value === 'string') {
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
113
|
+
return String(value);
|
|
114
|
+
}
|
|
115
|
+
throw new Error(`Template parameter '${parameter.id}' must be a string.`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function coerceNumber(parameter: TemplateParameterDefinition, value: TemplateValue): number {
|
|
119
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
if (typeof value === 'string') {
|
|
123
|
+
const parsed = Number(value.trim());
|
|
124
|
+
if (Number.isFinite(parsed)) {
|
|
125
|
+
return parsed;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
throw new Error(`Template parameter '${parameter.id}' must be a number.`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function coerceBoolean(parameter: TemplateParameterDefinition, value: TemplateValue): boolean {
|
|
132
|
+
if (typeof value === 'boolean') {
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
if (typeof value === 'string') {
|
|
136
|
+
const normalized = value.trim().toLowerCase();
|
|
137
|
+
if (normalized === 'true') {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
if (normalized === 'false') {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
throw new Error(`Template parameter '${parameter.id}' must be a boolean.`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function coerceIriArray(parameter: TemplateParameterDefinition, value: TemplateValue): string[] {
|
|
148
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === 'string')) {
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
if (typeof value === 'string') {
|
|
152
|
+
const normalized = value.trim();
|
|
153
|
+
if (!normalized) {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
return normalized.split(',').map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
157
|
+
}
|
|
158
|
+
throw new Error(`Template parameter '${parameter.id}' must be an array of strings.`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function coerceJson(parameter: TemplateParameterDefinition, value: TemplateValue): TemplateValue {
|
|
162
|
+
if (value === null || typeof value === 'object') {
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
if (typeof value === 'string') {
|
|
166
|
+
try {
|
|
167
|
+
const parsed = JSON.parse(value) as unknown;
|
|
168
|
+
if (
|
|
169
|
+
parsed === null
|
|
170
|
+
|| typeof parsed === 'string'
|
|
171
|
+
|| typeof parsed === 'number'
|
|
172
|
+
|| typeof parsed === 'boolean'
|
|
173
|
+
|| (Array.isArray(parsed) && parsed.every((entry) => typeof entry === 'string'))
|
|
174
|
+
|| (typeof parsed === 'object' && parsed !== null)
|
|
175
|
+
) {
|
|
176
|
+
return parsed as TemplateValue;
|
|
177
|
+
}
|
|
178
|
+
throw new Error('unsupported-json');
|
|
179
|
+
} catch {
|
|
180
|
+
throw new Error(`Template parameter '${parameter.id}' must be valid JSON.`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
throw new Error(`Template parameter '${parameter.id}' must be JSON.`);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function naturalDefaultValue(type: TemplateParameterDefinition['type']): TemplateValue {
|
|
187
|
+
switch (type) {
|
|
188
|
+
case 'number':
|
|
189
|
+
return 0;
|
|
190
|
+
case 'boolean':
|
|
191
|
+
return false;
|
|
192
|
+
case 'iri[]':
|
|
193
|
+
return [];
|
|
194
|
+
case 'json':
|
|
195
|
+
return {};
|
|
196
|
+
case 'string':
|
|
197
|
+
case 'iri':
|
|
198
|
+
return '';
|
|
67
199
|
}
|
|
68
|
-
const iris = context.selection?.iris ?? [];
|
|
69
|
-
return iris[index];
|
|
70
200
|
}
|
package/src/template/compose.ts
CHANGED
|
@@ -1,48 +1,36 @@
|
|
|
1
1
|
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
2
|
|
|
3
3
|
import { parse } from 'yaml';
|
|
4
|
-
import type {
|
|
4
|
+
import type { TemplateValue } from './types.js';
|
|
5
5
|
|
|
6
6
|
export interface TemplateComposeDirective {
|
|
7
7
|
id: string;
|
|
8
8
|
args: Record<string, TemplateValue>;
|
|
9
|
-
bind: Record<string, TemplateBindingSource>;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
export function parseTemplateComposeDirective(source: string): TemplateComposeDirective | undefined {
|
|
13
12
|
const normalized = source.replace(/^\uFEFF/, '');
|
|
14
|
-
const
|
|
15
|
-
if (!frontMatterMatch) {
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
const trailing = frontMatterMatch[2] ?? '';
|
|
19
|
-
if (trailing.trim().length > 0) {
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
const yamlBody = frontMatterMatch[1]
|
|
23
|
-
.replace(/^---[ \t]*\r?\n/, '')
|
|
24
|
-
.replace(/\r?\n---[ \t]*$/, '');
|
|
25
|
-
const parsed = parse(yamlBody);
|
|
13
|
+
const parsed = parse(normalized);
|
|
26
14
|
if (!isRecord(parsed)) {
|
|
27
15
|
return undefined;
|
|
28
16
|
}
|
|
29
|
-
const id = normalizeString(parsed.
|
|
17
|
+
const id = normalizeString(parsed.template);
|
|
30
18
|
if (!id) {
|
|
31
19
|
return undefined;
|
|
32
20
|
}
|
|
33
|
-
const args = parseArgs(parsed
|
|
34
|
-
|
|
35
|
-
return { id, args, bind };
|
|
21
|
+
const args = parseArgs(parsed, ['template']);
|
|
22
|
+
return { id, args };
|
|
36
23
|
}
|
|
37
24
|
|
|
38
|
-
function parseArgs(value: unknown): Record<string, TemplateValue> {
|
|
25
|
+
function parseArgs(value: unknown, excludedKeys: string[] = []): Record<string, TemplateValue> {
|
|
39
26
|
if (!isRecord(value)) {
|
|
40
27
|
return {};
|
|
41
28
|
}
|
|
29
|
+
const excluded = new Set(excludedKeys);
|
|
42
30
|
const args: Record<string, TemplateValue> = {};
|
|
43
31
|
for (const [key, raw] of Object.entries(value)) {
|
|
44
32
|
const normalizedKey = normalizeString(key);
|
|
45
|
-
if (!normalizedKey) {
|
|
33
|
+
if (!normalizedKey || excluded.has(normalizedKey)) {
|
|
46
34
|
continue;
|
|
47
35
|
}
|
|
48
36
|
const converted = toTemplateValue(raw);
|
|
@@ -53,22 +41,6 @@ function parseArgs(value: unknown): Record<string, TemplateValue> {
|
|
|
53
41
|
return args;
|
|
54
42
|
}
|
|
55
43
|
|
|
56
|
-
function parseBind(value: unknown): Record<string, TemplateBindingSource> {
|
|
57
|
-
if (!isRecord(value)) {
|
|
58
|
-
return {};
|
|
59
|
-
}
|
|
60
|
-
const bind: Record<string, TemplateBindingSource> = {};
|
|
61
|
-
for (const [key, raw] of Object.entries(value)) {
|
|
62
|
-
const normalizedKey = normalizeString(key);
|
|
63
|
-
const source = normalizeString(raw);
|
|
64
|
-
if (!normalizedKey || !source || !isTemplateBindingSource(source)) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
bind[normalizedKey] = source;
|
|
68
|
-
}
|
|
69
|
-
return bind;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
44
|
function toTemplateValue(value: unknown): TemplateValue | undefined {
|
|
73
45
|
if (value === null) {
|
|
74
46
|
return null;
|
|
@@ -85,15 +57,6 @@ function toTemplateValue(value: unknown): TemplateValue | undefined {
|
|
|
85
57
|
return undefined;
|
|
86
58
|
}
|
|
87
59
|
|
|
88
|
-
function isTemplateBindingSource(value: string): value is TemplateBindingSource {
|
|
89
|
-
return value === 'context.member'
|
|
90
|
-
|| value === 'context.ontology'
|
|
91
|
-
|| value === 'context.modelUri'
|
|
92
|
-
|| value === 'context.selection[*]'
|
|
93
|
-
|| value === 'user'
|
|
94
|
-
|| /^context\.selection\[\d+]$/.test(value);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
60
|
function normalizeString(value: unknown): string | undefined {
|
|
98
61
|
if (typeof value !== 'string') {
|
|
99
62
|
return undefined;
|
|
@@ -117,8 +117,6 @@ function parseTemplateParameters(raw: unknown): TemplateParameterDefinition[] {
|
|
|
117
117
|
continue;
|
|
118
118
|
}
|
|
119
119
|
const required = typeof entry.required === 'boolean' ? entry.required : undefined;
|
|
120
|
-
const fromValue = typeof entry.from === 'string' ? entry.from.trim() : '';
|
|
121
|
-
const from = isSupportedBindingSource(fromValue) ? fromValue : undefined;
|
|
122
120
|
const description = typeof entry.description === 'string' && entry.description.trim().length > 0
|
|
123
121
|
? entry.description.trim()
|
|
124
122
|
: undefined;
|
|
@@ -126,7 +124,6 @@ function parseTemplateParameters(raw: unknown): TemplateParameterDefinition[] {
|
|
|
126
124
|
id,
|
|
127
125
|
type,
|
|
128
126
|
required,
|
|
129
|
-
from,
|
|
130
127
|
defaultValue: toTemplateValue(entry.defaultValue),
|
|
131
128
|
description,
|
|
132
129
|
});
|
|
@@ -143,15 +140,6 @@ function isSupportedParameterType(value: string): value is TemplateParameterDefi
|
|
|
143
140
|
|| value === 'json';
|
|
144
141
|
}
|
|
145
142
|
|
|
146
|
-
function isSupportedBindingSource(value: string): value is NonNullable<TemplateParameterDefinition['from']> {
|
|
147
|
-
return value === 'context.member'
|
|
148
|
-
|| value === 'context.ontology'
|
|
149
|
-
|| value === 'context.modelUri'
|
|
150
|
-
|| value === 'context.selection[*]'
|
|
151
|
-
|| /^context\.selection\[\d+]$/.test(value)
|
|
152
|
-
|| value === 'user';
|
|
153
|
-
}
|
|
154
|
-
|
|
155
143
|
function toTemplateValue(value: unknown): TemplateValue | undefined {
|
|
156
144
|
if (value === null) {
|
|
157
145
|
return null;
|
package/src/template/types.ts
CHANGED
|
@@ -10,19 +10,10 @@ export type TemplateParameterType =
|
|
|
10
10
|
| 'iri[]'
|
|
11
11
|
| 'json';
|
|
12
12
|
|
|
13
|
-
export type TemplateBindingSource =
|
|
14
|
-
| 'context.member'
|
|
15
|
-
| 'context.ontology'
|
|
16
|
-
| 'context.modelUri'
|
|
17
|
-
| `context.selection[${number}]`
|
|
18
|
-
| 'context.selection[*]'
|
|
19
|
-
| 'user';
|
|
20
|
-
|
|
21
13
|
export interface TemplateParameterDefinition {
|
|
22
14
|
id: string;
|
|
23
15
|
type: TemplateParameterType;
|
|
24
16
|
required?: boolean;
|
|
25
|
-
from?: TemplateBindingSource;
|
|
26
17
|
defaultValue?: TemplateValue;
|
|
27
18
|
description?: string;
|
|
28
19
|
}
|