@oml/markdown 0.10.0 → 0.12.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-execution.d.ts +16 -0
- package/out/md/md-executor.d.ts +1 -0
- package/out/md/md-executor.js +219 -35
- package/out/md/md-executor.js.map +1 -1
- package/out/renderers/chart-renderer.js +72 -4
- package/out/renderers/chart-renderer.js.map +1 -1
- package/out/renderers/diagram-renderer.js +896 -245
- package/out/renderers/diagram-renderer.js.map +1 -1
- package/out/renderers/graph-renderer.js +452 -18
- package/out/renderers/graph-renderer.js.map +1 -1
- package/out/renderers/matrix-renderer.d.ts +0 -2
- package/out/renderers/matrix-renderer.js +45 -40
- package/out/renderers/matrix-renderer.js.map +1 -1
- package/out/renderers/renderer.d.ts +4 -1
- package/out/renderers/renderer.js +98 -0
- package/out/renderers/renderer.js.map +1 -1
- package/out/renderers/table-renderer.d.ts +12 -2
- package/out/renderers/table-renderer.js +126 -39
- package/out/renderers/table-renderer.js.map +1 -1
- package/out/renderers/types.d.ts +16 -0
- package/out/renderers/wikilink-utils.d.ts +1 -0
- package/out/renderers/wikilink-utils.js +60 -32
- package/out/renderers/wikilink-utils.js.map +1 -1
- package/out/static/browser-runtime.bundle.js +8011 -1292
- package/out/static/browser-runtime.bundle.js.map +4 -4
- package/out/static/browser-runtime.js +15 -2
- package/out/static/browser-runtime.js.map +1 -1
- package/package.json +2 -2
- package/src/md/md-execution.ts +20 -0
- package/src/md/md-executor.ts +268 -40
- package/src/renderers/chart-renderer.ts +93 -2
- package/src/renderers/diagram-renderer.ts +964 -253
- package/src/renderers/graph-renderer.ts +512 -12
- package/src/renderers/matrix-renderer.ts +57 -44
- package/src/renderers/renderer.ts +105 -1
- package/src/renderers/table-renderer.ts +190 -41
- package/src/renderers/types.ts +20 -0
- package/src/renderers/wikilink-utils.ts +66 -31
- package/src/static/browser-runtime.ts +20 -2
- package/src/static/markdown-webview.css +44 -15
|
@@ -93,7 +93,6 @@ function applyWikilinks(scope, wikilinkIndex, iriAliasIndex, linkingEnabled) {
|
|
|
93
93
|
const span = document.createElement('span');
|
|
94
94
|
span.className = 'wikilink';
|
|
95
95
|
span.setAttribute('iri', iri);
|
|
96
|
-
span.title = iri;
|
|
97
96
|
span.textContent = label;
|
|
98
97
|
link.replaceWith(span);
|
|
99
98
|
continue;
|
|
@@ -106,7 +105,6 @@ function applyWikilinks(scope, wikilinkIndex, iriAliasIndex, linkingEnabled) {
|
|
|
106
105
|
const span = document.createElement('span');
|
|
107
106
|
span.className = 'wikilink';
|
|
108
107
|
span.setAttribute('iri', iri);
|
|
109
|
-
span.title = iri;
|
|
110
108
|
span.textContent = label;
|
|
111
109
|
link.replaceWith(span);
|
|
112
110
|
}
|
|
@@ -148,6 +146,20 @@ function setupDownloadHandler() {
|
|
|
148
146
|
URL.revokeObjectURL(objectUrl);
|
|
149
147
|
});
|
|
150
148
|
}
|
|
149
|
+
function setupIriNavigationHandler(wikilinkIndex, iriAliasIndex, linkingEnabled) {
|
|
150
|
+
window.addEventListener('md-navigate-iri', (event) => {
|
|
151
|
+
const detail = event.detail;
|
|
152
|
+
const iri = typeof detail?.iri === 'string' ? detail.iri.trim() : '';
|
|
153
|
+
if (!iri || !linkingEnabled) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const href = resolveWikiHref(iri, wikilinkIndex, iriAliasIndex);
|
|
157
|
+
if (!href) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
window.location.assign(href);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
151
163
|
function getMdKindFromCodeElement(code) {
|
|
152
164
|
for (const className of Array.from(code.classList)) {
|
|
153
165
|
if (!className.startsWith('language-')) {
|
|
@@ -182,6 +194,7 @@ async function applyExecutionResults() {
|
|
|
182
194
|
applyWikilinks(document, wikilinkIndex, iriAliasIndex, linkingEnabled);
|
|
183
195
|
// Re-apply wikilinks for dynamic renderer re-renders (tables, filters, paging, etc.).
|
|
184
196
|
installWikilinkObserver(wikilinkIndex, iriAliasIndex, linkingEnabled);
|
|
197
|
+
setupIriNavigationHandler(wikilinkIndex, iriAliasIndex, linkingEnabled);
|
|
185
198
|
const manifest = parseJsonNode('oml-md-block-manifest', []);
|
|
186
199
|
if (!Array.isArray(manifest) || manifest.length === 0) {
|
|
187
200
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-runtime.js","sourceRoot":"","sources":["../../src/static/browser-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"browser-runtime.js","sourceRoot":"","sources":["../../src/static/browser-runtime.ts"],"names":[],"mappings":"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"}
|
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.12.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.12.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-execution.ts
CHANGED
|
@@ -31,9 +31,29 @@ export interface MdExecuteBlocksParams {
|
|
|
31
31
|
|
|
32
32
|
export type MdExecutionStatus = 'ok' | 'error' | 'unimplemented';
|
|
33
33
|
|
|
34
|
+
export type MdTableCellValueKind = 'iri' | 'literal' | 'bnode' | 'unknown';
|
|
35
|
+
|
|
36
|
+
export interface MdTableCellValue {
|
|
37
|
+
kind: MdTableCellValueKind;
|
|
38
|
+
value: string;
|
|
39
|
+
datatype?: string;
|
|
40
|
+
language?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type MdTableCellKind = 'iri' | 'literal' | 'bnode' | 'unknown';
|
|
44
|
+
|
|
45
|
+
export interface MdTableCell {
|
|
46
|
+
kind: MdTableCellKind;
|
|
47
|
+
value: string;
|
|
48
|
+
values: MdTableCellValue[];
|
|
49
|
+
datatype?: string;
|
|
50
|
+
language?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
34
53
|
export interface MdTablePayload {
|
|
35
54
|
columns: string[];
|
|
36
55
|
rows: string[][];
|
|
56
|
+
rowsTyped?: MdTableCell[][];
|
|
37
57
|
}
|
|
38
58
|
|
|
39
59
|
export interface MdBlockExecutionResult {
|
package/src/md/md-executor.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
2
|
|
|
3
|
-
import { deriveSelectQueryFromShape, type OwlConstructResult, type OwlQueryResult } from '@oml/owl';
|
|
3
|
+
import { deriveSelectQueryFromShape, type OwlConstructResult, type OwlQueryResult, type OwlQueryTerm } from '@oml/owl';
|
|
4
4
|
import type { Term } from '@rdfjs/types';
|
|
5
5
|
import { displayLabelFromIri } from '../renderers/renderer.js';
|
|
6
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
MdBlockExecutionResult,
|
|
8
|
+
MdExecuteBlocksParams,
|
|
9
|
+
MdExecuteBlocksResult,
|
|
10
|
+
MdTableCell,
|
|
11
|
+
MdTableCellValue
|
|
12
|
+
} from './md-execution.js';
|
|
7
13
|
|
|
8
14
|
export interface MarkdownExecutionBackend {
|
|
9
15
|
ensureContext(modelUri: string): Promise<void>;
|
|
@@ -11,6 +17,7 @@ export interface MarkdownExecutionBackend {
|
|
|
11
17
|
countContextQuads?: (modelUri: string) => Promise<number>;
|
|
12
18
|
query(modelUri: string, sparql: string): Promise<OwlQueryResult>;
|
|
13
19
|
construct(modelUri: string, sparql: string): Promise<OwlConstructResult>;
|
|
20
|
+
isKnownOntologyIriNamespace?: (ontologyIri: string) => boolean;
|
|
14
21
|
}
|
|
15
22
|
|
|
16
23
|
export class MarkdownExecutor {
|
|
@@ -94,6 +101,7 @@ export class MarkdownExecutor {
|
|
|
94
101
|
}
|
|
95
102
|
|
|
96
103
|
const columns = extractSelectVariables(sparql);
|
|
104
|
+
const groupConcatAliases = extractGroupConcatAliases(sparql);
|
|
97
105
|
const columnSet = new Set<string>(columns);
|
|
98
106
|
for (const row of queryResult.rows) {
|
|
99
107
|
for (const key of row.keys()) {
|
|
@@ -105,8 +113,11 @@ export class MarkdownExecutor {
|
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
115
|
|
|
108
|
-
const
|
|
109
|
-
|
|
116
|
+
const rowsTyped = queryResult.rows.map((row) => columns.map((column) =>
|
|
117
|
+
selectTermToCell(row.get(column), groupConcatAliases.get(column), this.backend.isKnownOntologyIriNamespace)
|
|
118
|
+
));
|
|
119
|
+
const rows = rowsTyped.map((row) => row.map((cell) => tableCellToDisplayValue(cell)));
|
|
120
|
+
return okTable(blockId, 'matrix', columns, rows, rowsTyped);
|
|
110
121
|
}
|
|
111
122
|
|
|
112
123
|
private async executeTableBlock(
|
|
@@ -140,6 +151,7 @@ export class MarkdownExecutor {
|
|
|
140
151
|
const variableColumns = kind === 'table-editor'
|
|
141
152
|
? derivedQuery?.columnVariables.slice() ?? []
|
|
142
153
|
: extractSelectVariables(sparql);
|
|
154
|
+
const groupConcatAliases = extractGroupConcatAliases(sparql);
|
|
143
155
|
const labelByVariable = kind === 'table-editor'
|
|
144
156
|
? (derivedQuery?.columnLabels ?? new Map<string, string>())
|
|
145
157
|
: new Map<string, string>();
|
|
@@ -159,9 +171,12 @@ export class MarkdownExecutor {
|
|
|
159
171
|
}
|
|
160
172
|
}
|
|
161
173
|
|
|
162
|
-
const
|
|
174
|
+
const rowsTyped = queryResult.rows.map((row) => columns.map((column) =>
|
|
175
|
+
selectTermToCell(row.get(column), groupConcatAliases.get(column), this.backend.isKnownOntologyIriNamespace)
|
|
176
|
+
));
|
|
177
|
+
const rows = rowsTyped.map((row) => row.map((cell) => tableCellToDisplayValue(cell)));
|
|
163
178
|
const displayColumns = columns.map((column) => labelByVariable.get(column) ?? column);
|
|
164
|
-
return okTable(blockId, kind, displayColumns, rows);
|
|
179
|
+
return okTable(blockId, kind, displayColumns, rows, rowsTyped);
|
|
165
180
|
}
|
|
166
181
|
|
|
167
182
|
private async executeGraphBlock(
|
|
@@ -219,35 +234,45 @@ export class MarkdownExecutor {
|
|
|
219
234
|
const containmentNames = extractContainmentPropertyNames(options);
|
|
220
235
|
const focusOrder: string[] = [];
|
|
221
236
|
const focusSet = new Set<string>();
|
|
222
|
-
const
|
|
237
|
+
const focusCellByKey = new Map<string, MdTableCell>();
|
|
238
|
+
const valuesByFocus = new Map<string, Map<string, MdTableCellValue[]>>();
|
|
223
239
|
const predicateToColumn = new Map<string, string>();
|
|
224
240
|
const usedColumns = new Set<string>(['focus']);
|
|
225
241
|
const columnOrder: string[] = [];
|
|
226
242
|
const columnLabelByVariable = new Map<string, string>([['focus', 'focus']]);
|
|
227
243
|
|
|
228
|
-
const addFocus = (
|
|
229
|
-
|
|
244
|
+
const addFocus = (focusCell: MdTableCell): void => {
|
|
245
|
+
const key = treeFocusKey(focusCell);
|
|
246
|
+
if (focusSet.has(key)) {
|
|
230
247
|
return;
|
|
231
248
|
}
|
|
232
|
-
focusSet.add(
|
|
233
|
-
focusOrder.push(
|
|
234
|
-
|
|
249
|
+
focusSet.add(key);
|
|
250
|
+
focusOrder.push(key);
|
|
251
|
+
focusCellByKey.set(key, focusCell);
|
|
252
|
+
valuesByFocus.set(key, new Map<string, MdTableCellValue[]>());
|
|
235
253
|
};
|
|
236
|
-
const addCellValue = (focus: string, column: string,
|
|
254
|
+
const addCellValue = (focus: string, column: string, valueCell: MdTableCell): void => {
|
|
237
255
|
const byColumn = valuesByFocus.get(focus);
|
|
238
256
|
if (!byColumn) {
|
|
239
257
|
return;
|
|
240
258
|
}
|
|
241
259
|
const values = byColumn.get(column) ?? [];
|
|
242
|
-
|
|
260
|
+
const existing = new Set(values.map((value) => `${value.kind}\u0000${value.value}`));
|
|
261
|
+
for (const value of valueCell.values) {
|
|
262
|
+
const key = `${value.kind}\u0000${value.value}`;
|
|
263
|
+
if (existing.has(key)) {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
existing.add(key);
|
|
243
267
|
values.push(value);
|
|
244
|
-
byColumn.set(column, values);
|
|
245
268
|
}
|
|
269
|
+
byColumn.set(column, values);
|
|
246
270
|
};
|
|
247
271
|
|
|
248
272
|
for (const quad of constructResult.quads) {
|
|
249
|
-
const
|
|
250
|
-
|
|
273
|
+
const focusCell = termToTableCell(quad.subject as Term);
|
|
274
|
+
const focus = treeFocusKey(focusCell);
|
|
275
|
+
addFocus(focusCell);
|
|
251
276
|
|
|
252
277
|
const predicateIri = quad.predicate.value;
|
|
253
278
|
let column = predicateToColumn.get(predicateIri);
|
|
@@ -260,13 +285,13 @@ export class MarkdownExecutor {
|
|
|
260
285
|
columnLabelByVariable.set(column, localName(predicateIri) || column);
|
|
261
286
|
}
|
|
262
287
|
|
|
263
|
-
const
|
|
264
|
-
addCellValue(focus, column,
|
|
288
|
+
const objectCell = termToTableCell(quad.object as Term);
|
|
289
|
+
addCellValue(focus, column, objectCell);
|
|
265
290
|
|
|
266
291
|
if (containmentNames.size > 0
|
|
267
292
|
&& (quad.object.termType === 'NamedNode' || quad.object.termType === 'BlankNode')
|
|
268
293
|
&& containmentNames.has(normalizePropertyIdentifier(predicateIri))) {
|
|
269
|
-
addFocus(
|
|
294
|
+
addFocus(objectCell);
|
|
270
295
|
}
|
|
271
296
|
}
|
|
272
297
|
|
|
@@ -277,16 +302,25 @@ export class MarkdownExecutor {
|
|
|
277
302
|
|
|
278
303
|
const columns = ['focus', ...columnOrder];
|
|
279
304
|
const displayColumns = columns.map((column) => columnLabelByVariable.get(column) ?? column);
|
|
280
|
-
const
|
|
281
|
-
const byColumn = valuesByFocus.get(focus) ?? new Map<string,
|
|
282
|
-
return columns.map((column) => {
|
|
305
|
+
const rowsTyped: MdTableCell[][] = focusOrder.map((focus) => {
|
|
306
|
+
const byColumn = valuesByFocus.get(focus) ?? new Map<string, MdTableCellValue[]>();
|
|
307
|
+
return columns.map((column): MdTableCell => {
|
|
283
308
|
if (column === 'focus') {
|
|
284
|
-
return focus;
|
|
309
|
+
return focusCellByKey.get(focus) ?? unknownCell(focus);
|
|
310
|
+
}
|
|
311
|
+
const values = byColumn.get(column) ?? [];
|
|
312
|
+
if (values.length === 0) {
|
|
313
|
+
return unknownCell('');
|
|
285
314
|
}
|
|
286
|
-
|
|
315
|
+
const kind = values.every((value) => value.kind === 'iri')
|
|
316
|
+
? 'iri'
|
|
317
|
+
: (values.every((value) => value.kind === 'bnode') ? 'bnode' : 'literal');
|
|
318
|
+
const value = values.map((entry) => entry.kind === 'bnode' ? `_:${entry.value}` : entry.value).join(', ');
|
|
319
|
+
return { kind, value, values, datatype: undefined, language: undefined };
|
|
287
320
|
});
|
|
288
321
|
});
|
|
289
|
-
|
|
322
|
+
const rows = rowsTyped.map((row) => row.map((cell) => cell.kind === 'bnode' ? `_:${cell.value}` : cell.value));
|
|
323
|
+
return okTable(blockId, 'tree', displayColumns, rows, rowsTyped);
|
|
290
324
|
}
|
|
291
325
|
|
|
292
326
|
private async executeTextBlock(
|
|
@@ -311,6 +345,7 @@ export class MarkdownExecutor {
|
|
|
311
345
|
}
|
|
312
346
|
|
|
313
347
|
const columns = [firstVariable];
|
|
348
|
+
const groupConcatAliases = extractGroupConcatAliases(sparql);
|
|
314
349
|
const columnSet = new Set<string>(columns);
|
|
315
350
|
for (const row of queryResult.rows) {
|
|
316
351
|
for (const key of row.keys()) {
|
|
@@ -321,8 +356,11 @@ export class MarkdownExecutor {
|
|
|
321
356
|
columns.push(key);
|
|
322
357
|
}
|
|
323
358
|
}
|
|
324
|
-
const
|
|
325
|
-
|
|
359
|
+
const rowsTyped = queryResult.rows.map((row) => columns.map((column) =>
|
|
360
|
+
selectTermToCell(row.get(column), groupConcatAliases.get(column), this.backend.isKnownOntologyIriNamespace)
|
|
361
|
+
));
|
|
362
|
+
const rows = rowsTyped.map((row) => row.map((cell) => tableCellToDisplayValue(cell)));
|
|
363
|
+
return okTable(blockId, 'text', columns, rows, rowsTyped);
|
|
326
364
|
}
|
|
327
365
|
|
|
328
366
|
private async executeListBlock(
|
|
@@ -347,6 +385,7 @@ export class MarkdownExecutor {
|
|
|
347
385
|
}
|
|
348
386
|
|
|
349
387
|
const columns = [firstVariable];
|
|
388
|
+
const groupConcatAliases = extractGroupConcatAliases(sparql);
|
|
350
389
|
const columnSet = new Set<string>(columns);
|
|
351
390
|
for (const row of queryResult.rows) {
|
|
352
391
|
for (const key of row.keys()) {
|
|
@@ -357,8 +396,11 @@ export class MarkdownExecutor {
|
|
|
357
396
|
columns.push(key);
|
|
358
397
|
}
|
|
359
398
|
}
|
|
360
|
-
const
|
|
361
|
-
|
|
399
|
+
const rowsTyped = queryResult.rows.map((row) => columns.map((column) =>
|
|
400
|
+
selectTermToCell(row.get(column), groupConcatAliases.get(column), this.backend.isKnownOntologyIriNamespace)
|
|
401
|
+
));
|
|
402
|
+
const rows = rowsTyped.map((row) => row.map((cell) => tableCellToDisplayValue(cell)));
|
|
403
|
+
return okTable(blockId, 'list', columns, rows, rowsTyped);
|
|
362
404
|
}
|
|
363
405
|
}
|
|
364
406
|
|
|
@@ -383,13 +425,19 @@ function queryFailed(blockId: string, kind: MdBlockExecutionResult['kind'], mess
|
|
|
383
425
|
};
|
|
384
426
|
}
|
|
385
427
|
|
|
386
|
-
function okTable(
|
|
428
|
+
function okTable(
|
|
429
|
+
blockId: string,
|
|
430
|
+
kind: MdBlockExecutionResult['kind'],
|
|
431
|
+
columns: string[],
|
|
432
|
+
rows: string[][],
|
|
433
|
+
rowsTyped?: MdTableCell[][]
|
|
434
|
+
): MdBlockExecutionResult {
|
|
387
435
|
return {
|
|
388
436
|
blockId,
|
|
389
437
|
kind,
|
|
390
438
|
status: 'ok',
|
|
391
439
|
format: 'table',
|
|
392
|
-
payload: { columns, rows },
|
|
440
|
+
payload: { columns, rows, rowsTyped },
|
|
393
441
|
};
|
|
394
442
|
}
|
|
395
443
|
|
|
@@ -403,13 +451,31 @@ function constructRowsResult(
|
|
|
403
451
|
kind,
|
|
404
452
|
['subject', 'predicate', 'object'],
|
|
405
453
|
constructResult.quads.map((quad) => [
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
454
|
+
termToRawCellValue(quad.subject as Term),
|
|
455
|
+
termToRawCellValue(quad.predicate as Term),
|
|
456
|
+
termToRawCellValue(quad.object as Term),
|
|
457
|
+
]),
|
|
458
|
+
constructResult.quads.map((quad) => [
|
|
459
|
+
termToTableCell(quad.subject as Term),
|
|
460
|
+
termToTableCell(quad.predicate as Term),
|
|
461
|
+
termToTableCell(quad.object as Term),
|
|
409
462
|
]),
|
|
410
463
|
);
|
|
411
464
|
}
|
|
412
465
|
|
|
466
|
+
function termToRawCellValue(term: Term): string {
|
|
467
|
+
if (term.termType === 'NamedNode') {
|
|
468
|
+
return term.value;
|
|
469
|
+
}
|
|
470
|
+
if (term.termType === 'BlankNode') {
|
|
471
|
+
return `_:${term.value}`;
|
|
472
|
+
}
|
|
473
|
+
if (term.termType === 'Literal') {
|
|
474
|
+
return term.value;
|
|
475
|
+
}
|
|
476
|
+
return String((term as { value?: unknown }).value ?? '');
|
|
477
|
+
}
|
|
478
|
+
|
|
413
479
|
function extractSelectVariables(sparql: string): string[] {
|
|
414
480
|
const match = /select\s+(?:distinct\s+|reduced\s+)?([\s\S]*?)\bwhere\b/i.exec(sparql);
|
|
415
481
|
if (!match) {
|
|
@@ -547,17 +613,179 @@ function normalizePropertyIdentifier(raw: string): string {
|
|
|
547
613
|
return localName(trimmed).trim().toLowerCase();
|
|
548
614
|
}
|
|
549
615
|
|
|
550
|
-
function
|
|
616
|
+
function termToTableCell(term: Term): MdTableCell {
|
|
551
617
|
if (term.termType === 'NamedNode') {
|
|
552
|
-
return
|
|
618
|
+
return {
|
|
619
|
+
kind: 'iri',
|
|
620
|
+
value: term.value,
|
|
621
|
+
values: [{ kind: 'iri', value: term.value }]
|
|
622
|
+
};
|
|
553
623
|
}
|
|
554
624
|
if (term.termType === 'BlankNode') {
|
|
555
|
-
return
|
|
625
|
+
return {
|
|
626
|
+
kind: 'bnode',
|
|
627
|
+
value: term.value,
|
|
628
|
+
values: [{ kind: 'bnode', value: term.value }]
|
|
629
|
+
};
|
|
556
630
|
}
|
|
557
631
|
if (term.termType === 'Literal') {
|
|
558
|
-
return
|
|
632
|
+
return {
|
|
633
|
+
kind: 'literal',
|
|
634
|
+
value: term.value,
|
|
635
|
+
values: [{ kind: 'literal', value: term.value, datatype: term.datatype?.value, language: term.language }],
|
|
636
|
+
datatype: term.datatype?.value,
|
|
637
|
+
language: term.language
|
|
638
|
+
};
|
|
559
639
|
}
|
|
560
|
-
|
|
640
|
+
const value = String((term as { value?: unknown }).value ?? '');
|
|
641
|
+
return {
|
|
642
|
+
kind: 'unknown',
|
|
643
|
+
value,
|
|
644
|
+
values: [{ kind: 'unknown', value }]
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
function treeFocusKey(cell: MdTableCell): string {
|
|
649
|
+
if (cell.kind === 'bnode') {
|
|
650
|
+
return `_:${cell.value}`;
|
|
651
|
+
}
|
|
652
|
+
return cell.value;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
function unknownCell(value: string): MdTableCell {
|
|
656
|
+
return {
|
|
657
|
+
kind: 'unknown',
|
|
658
|
+
value,
|
|
659
|
+
values: [{ kind: 'unknown', value }]
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
function selectTermToCell(
|
|
664
|
+
term: OwlQueryTerm | undefined,
|
|
665
|
+
groupConcatSeparator: string | undefined,
|
|
666
|
+
isKnownOntologyIriNamespace?: (ontologyIri: string) => boolean
|
|
667
|
+
): MdTableCell {
|
|
668
|
+
if (!term) {
|
|
669
|
+
return { kind: 'unknown', value: '', values: [{ kind: 'unknown', value: '' }] };
|
|
670
|
+
}
|
|
671
|
+
if (term.termType === 'NamedNode') {
|
|
672
|
+
return {
|
|
673
|
+
kind: 'iri',
|
|
674
|
+
value: term.value,
|
|
675
|
+
values: [{ kind: 'iri', value: term.value }]
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
if (term.termType === 'BlankNode') {
|
|
679
|
+
return {
|
|
680
|
+
kind: 'bnode',
|
|
681
|
+
value: term.value,
|
|
682
|
+
values: [{ kind: 'bnode', value: term.value }]
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
if (term.termType === 'Literal' && groupConcatSeparator !== undefined) {
|
|
686
|
+
const groupedValues = parseGroupConcatValues(term.value, groupConcatSeparator);
|
|
687
|
+
const values = groupedValues.map((value) =>
|
|
688
|
+
classifyGroupedValue(value, isKnownOntologyIriNamespace, term.datatype, term.language)
|
|
689
|
+
);
|
|
690
|
+
const kind = values.every((value) => value.kind === 'iri') ? 'iri' : 'literal';
|
|
691
|
+
return { kind, value: term.value, values, datatype: term.datatype, language: term.language };
|
|
692
|
+
}
|
|
693
|
+
return {
|
|
694
|
+
kind: 'literal',
|
|
695
|
+
value: term.value,
|
|
696
|
+
values: [{ kind: 'literal', value: term.value, datatype: term.datatype, language: term.language }],
|
|
697
|
+
datatype: term.datatype,
|
|
698
|
+
language: term.language
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
function tableCellToDisplayValue(cell: MdTableCell): string {
|
|
703
|
+
if (!Array.isArray(cell.values) || cell.values.length === 0) {
|
|
704
|
+
return cell.kind === 'bnode' ? `_:${cell.value}` : cell.value;
|
|
705
|
+
}
|
|
706
|
+
if (typeof cell.value === 'string' && cell.value.length > 0) {
|
|
707
|
+
return cell.kind === 'bnode' ? `_:${cell.value}` : cell.value;
|
|
708
|
+
}
|
|
709
|
+
return cell.values.map((entry) => entry.kind === 'bnode' ? `_:${entry.value}` : entry.value).join(' ');
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
function extractGroupConcatAliases(sparql: string): Map<string, string> {
|
|
713
|
+
const aliases = new Map<string, string>();
|
|
714
|
+
const match = /select\s+(?:distinct\s+|reduced\s+)?([\s\S]*?)\bwhere\b/i.exec(sparql);
|
|
715
|
+
if (!match) {
|
|
716
|
+
return aliases;
|
|
717
|
+
}
|
|
718
|
+
for (const term of splitTopLevelProjectionTerms(match[1])) {
|
|
719
|
+
if (!/\bgroup_concat\s*\(/i.test(term)) {
|
|
720
|
+
continue;
|
|
721
|
+
}
|
|
722
|
+
const alias = /\bas\s+\?([A-Za-z_][A-Za-z0-9_-]*)\b/i.exec(term);
|
|
723
|
+
if (!alias?.[1]) {
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
const separatorMatch = /\bseparator\s*=\s*["']([^"']*)["']/i.exec(term);
|
|
727
|
+
aliases.set(alias[1], separatorMatch?.[1] ?? ' ');
|
|
728
|
+
}
|
|
729
|
+
return aliases;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
function parseGroupConcatValues(raw: string, separator: string): string[] {
|
|
733
|
+
if (separator.length === 0) {
|
|
734
|
+
const trimmed = raw.trim();
|
|
735
|
+
return trimmed ? [trimmed] : [];
|
|
736
|
+
}
|
|
737
|
+
const values = raw
|
|
738
|
+
.split(separator)
|
|
739
|
+
.map((entry) => entry.trim())
|
|
740
|
+
.filter((entry) => entry.length > 0);
|
|
741
|
+
return values;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
function classifyGroupedValue(
|
|
745
|
+
value: string,
|
|
746
|
+
isKnownOntologyIriNamespace: ((ontologyIri: string) => boolean) | undefined,
|
|
747
|
+
datatype?: string,
|
|
748
|
+
language?: string
|
|
749
|
+
): MdTableCellValue {
|
|
750
|
+
if (value.startsWith('_:')) {
|
|
751
|
+
return { kind: 'bnode', value: value.slice(2) };
|
|
752
|
+
}
|
|
753
|
+
if (!isAbsoluteIri(value)) {
|
|
754
|
+
return { kind: 'literal', value, datatype, language };
|
|
755
|
+
}
|
|
756
|
+
if (!isKnownOntologyIriNamespace) {
|
|
757
|
+
return { kind: 'iri', value };
|
|
758
|
+
}
|
|
759
|
+
const key = ontologyLookupKeyFromIri(value);
|
|
760
|
+
if (!key || !isKnownOntologyIriNamespace(key)) {
|
|
761
|
+
return { kind: 'literal', value, datatype, language };
|
|
762
|
+
}
|
|
763
|
+
return { kind: 'iri', value };
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
function isAbsoluteIri(value: string): boolean {
|
|
767
|
+
return /^[A-Za-z][A-Za-z0-9+.-]*:[^\s]+$/.test(value);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
function ontologyLookupKeyFromIri(value: string): string | undefined {
|
|
771
|
+
const iri = String(value ?? '').trim().replace(/^<|>$/g, '');
|
|
772
|
+
if (!iri || !isAbsoluteIri(iri)) {
|
|
773
|
+
return undefined;
|
|
774
|
+
}
|
|
775
|
+
const hashIndex = iri.indexOf('#');
|
|
776
|
+
if (hashIndex >= 0) {
|
|
777
|
+
return normalizeOntologyLookupKey(iri.slice(0, hashIndex + 1));
|
|
778
|
+
}
|
|
779
|
+
const schemeIndex = iri.indexOf('://');
|
|
780
|
+
const slashIndex = iri.lastIndexOf('/');
|
|
781
|
+
if (slashIndex > schemeIndex + 2) {
|
|
782
|
+
return normalizeOntologyLookupKey(iri.slice(0, slashIndex + 1));
|
|
783
|
+
}
|
|
784
|
+
return normalizeOntologyLookupKey(iri);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
function normalizeOntologyLookupKey(value: string): string {
|
|
788
|
+
return value.trim().replace(/^<|>$/g, '').replace(/[\/#]+$/, '');
|
|
561
789
|
}
|
|
562
790
|
|
|
563
791
|
function normalizeSparqlVariableName(raw: string): string {
|