@faubulous/mentor-rdf-serializers 1.4.6 → 1.4.7

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/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Mentor RDF Serializers
2
2
 
3
+ [![License: LGPL-2.1](https://img.shields.io/badge/License-LGPL--2.1-blue.svg)](https://opensource.org/licenses/LGPL-2.1)
4
+ [![codecov](https://codecov.io/gh/faubulous/mentor-rdf-serializers/graph/badge.svg)](https://codecov.io/gh/faubulous/mentor-rdf-serializers)
3
5
  [![npm version](https://img.shields.io/npm/v/@faubulous/mentor-rdf-serializers.svg)](https://www.npmjs.com/package/@faubulous/mentor-rdf-serializers)
4
6
  [![npm downloads](https://img.shields.io/npm/dm/@faubulous/mentor-rdf-parsers.svg)](https://www.npmjs.com/package/@faubulous/mentor-rdf-parsers)
5
- [![License: LGPL-2.1](https://img.shields.io/badge/License-LGPL--2.1-blue.svg)](https://opensource.org/licenses/LGPL-2.1)
6
7
  [![TypeScript](https://img.shields.io/badge/TypeScript-5-blue.svg)](https://www.typescriptlang.org/)
7
8
  [![RDF 1.2](https://img.shields.io/badge/RDF-1.2-green.svg)](https://www.w3.org/TR/rdf12-concepts/)
8
9
 
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "sparql",
16
16
  "typescript"
17
17
  ],
18
- "version": "1.4.6",
18
+ "version": "1.4.7",
19
19
  "private": false,
20
20
  "author": {
21
21
  "name": "Sebastian Faubel"
@@ -55,20 +55,20 @@
55
55
  "prepublishOnly": "npm run build"
56
56
  },
57
57
  "dependencies": {
58
- "@faubulous/mentor-rdf-parsers": "^1.7.1",
58
+ "@faubulous/mentor-rdf-parsers": "^1.4.0",
59
59
  "@rdfjs/data-model": "^2.1.0"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@rdfjs/types": "^2.0.1",
63
63
  "@types/rdfjs__data-model": "^2.0.9",
64
64
  "@vitest/coverage-v8": "^4.0.18",
65
- "chevrotain": "^11.2.0",
65
+ "chevrotain": "^12.0.0",
66
66
  "typescript": "^5.9.3",
67
67
  "vitest": "^4.0.18"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "@faubulous/mentor-rdf-parsers": "^1.4.0",
71
- "chevrotain": "^11.0.3"
71
+ "chevrotain": "^12.0.0"
72
72
  },
73
73
  "peerDependenciesMeta": {
74
74
  "@faubulous/mentor-rdf-parsers": {
@@ -1,131 +0,0 @@
1
- import { QuadSortingStrategy, QuadComparator } from "./quad-sorting-strategy";
2
- /**
3
- * Configuration options for serializers.
4
- */
5
- export interface SerializerOptions {
6
- /**
7
- * The base IRI for relative IRI resolution.
8
- */
9
- baseIri?: string;
10
- /**
11
- * Prefix mappings for compact IRI serialization.
12
- * Maps prefix names to namespace IRIs.
13
- */
14
- prefixes?: Record<string, string>;
15
- /**
16
- * Indentation string (default: ' ' for 2 spaces).
17
- */
18
- indent?: string;
19
- /**
20
- * Line ending string (default: '\n').
21
- */
22
- lineEnd?: string;
23
- /**
24
- * Whether to use pretty printing with indentation and line breaks.
25
- * Default: true
26
- */
27
- prettyPrint?: boolean;
28
- /**
29
- * Sorting option for quads.
30
- */
31
- sort?: SortingOption;
32
- /**
33
- * Whether to group statements by subject (Turtle/TriG style).
34
- * Default: true for Turtle/TriG, false for N-Triples/N-Quads
35
- */
36
- groupBySubject?: boolean;
37
- /**
38
- * Whether to use the 'a' shorthand for rdf:type.
39
- * Default: true for Turtle/TriG/N3, false for N-Triples/N-Quads
40
- */
41
- useRdfTypeShorthand?: boolean;
42
- /**
43
- * Maximum line width before wrapping (0 = no wrapping).
44
- * Default: 0
45
- */
46
- maxLineWidth?: number;
47
- /**
48
- * Whether to align predicates in columns.
49
- * Default: false
50
- */
51
- alignPredicates?: boolean;
52
- /**
53
- * Whether to align objects in columns (requires alignPredicates).
54
- * Default: false
55
- */
56
- alignObjects?: boolean;
57
- /**
58
- * Blank node formatting style.
59
- * Default: 'auto'
60
- */
61
- blankNodeStyle?: BlankNodeStyle;
62
- /**
63
- * Object list formatting style.
64
- * Default: 'auto'
65
- */
66
- objectListStyle?: ObjectListStyle;
67
- /**
68
- * Predicate list formatting style.
69
- * Default: 'first-same-line'
70
- */
71
- predicateListStyle?: PredicateListStyle;
72
- /**
73
- * Whether to insert blank lines between subjects.
74
- * Default: true
75
- */
76
- blankLinesBetweenSubjects?: boolean;
77
- /**
78
- * Whether to use lowercase `@prefix` and `@base` (Turtle style).
79
- * When false, uses uppercase `PREFIX` and `BASE` (SPARQL style).
80
- * Default: false (SPARQL style)
81
- */
82
- lowercaseDirectives?: boolean;
83
- /**
84
- * Whether to emit `PREFIX`/`BASE` directives in serializer output.
85
- * Default: true.
86
- */
87
- emitDirectives?: boolean;
88
- /**
89
- * Custom blank node ID generator.
90
- * If provided, this function will be called to generate IDs for new blank nodes.
91
- */
92
- blankNodeIdGenerator?: (counter: number) => string;
93
- /**
94
- * Whether to serialize single-use blank nodes as local property lists
95
- * (`[ ... ]`) when pretty printing.
96
- *
97
- * This applies only when `prettyPrint` is `true`.
98
- * Default: true
99
- */
100
- inlineSingleUseBlankNodes?: boolean;
101
- }
102
- /**
103
- * Types of sorting methods for serializers.
104
- */
105
- export type SortingOption = boolean | QuadSortingStrategy | QuadComparator;
106
- /**
107
- * Blank node formatting style.
108
- * - 'labeled': Always use labeled syntax `_:b0`
109
- * - 'inline': Use inline property list syntax `[ prop value ]` where possible
110
- * - 'auto': Use inline for anonymous blank nodes, labeled for referenced ones
111
- */
112
- export type BlankNodeStyle = 'labeled' | 'inline' | 'auto';
113
- /**
114
- * Object list formatting style.
115
- * - 'single-line': Objects on same line separated by commas
116
- * - 'multi-line': Each object on its own line
117
- * - 'auto': Single-line if fits within maxLineWidth, else multi-line
118
- */
119
- export type ObjectListStyle = 'single-line' | 'multi-line' | 'auto';
120
- /**
121
- * Predicate list formatting style.
122
- * - 'single-line': All predicates on same line (compact)
123
- * - 'multi-line': Each predicate on its own line
124
- * - 'first-same-line': First predicate on subject line, rest indented
125
- */
126
- export type PredicateListStyle = 'single-line' | 'multi-line' | 'first-same-line';
127
- /**
128
- * Default serializer options.
129
- */
130
- export declare const DEFAULT_OPTIONS: Required<SerializerOptions>;
131
- //# sourceMappingURL=serializer-options.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializer-options.d.ts","sourceRoot":"","sources":["../src/serializer-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IAExC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAEnD;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,mBAAmB,GAAG,cAAc,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAElF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,iBAAiB,CAoBvD,CAAC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Default serializer options.
3
- */
4
- export const DEFAULT_OPTIONS = {
5
- alignObjects: false,
6
- alignPredicates: false,
7
- baseIri: '',
8
- blankLinesBetweenSubjects: true,
9
- blankNodeStyle: 'auto',
10
- emitDirectives: true,
11
- groupBySubject: true,
12
- indent: ' ',
13
- lineEnd: '\n',
14
- lowercaseDirectives: false,
15
- maxLineWidth: 0,
16
- objectListStyle: 'auto',
17
- predicateListStyle: 'first-same-line',
18
- prefixes: {},
19
- prettyPrint: true,
20
- sort: false,
21
- useRdfTypeShorthand: true,
22
- blankNodeIdGenerator: (counter) => `b${counter}`,
23
- inlineSingleUseBlankNodes: true,
24
- };
25
- //# sourceMappingURL=serializer-options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializer-options.js","sourceRoot":"","sources":["../src/serializer-options.ts"],"names":[],"mappings":"AAsJA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgC;IACxD,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,OAAO,EAAE,EAAE;IACX,yBAAyB,EAAE,IAAI;IAC/B,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,mBAAmB,EAAE,KAAK;IAC1B,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,iBAAiB;IACrC,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE,IAAI;IACjB,IAAI,EAAE,KAAK;IACX,mBAAmB,EAAE,IAAI;IACzB,oBAAoB,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE;IACxD,yBAAyB,EAAE,IAAI;CAClC,CAAC"}
@@ -1,46 +0,0 @@
1
- import { QuadSortingStrategy } from "./quad-sorting-strategy";
2
- /**
3
- * Options for {@link StatementSerializer.serialize}.
4
- */
5
- export interface StatementSerializerOptions {
6
- /**
7
- * Prefix mappings for compacting IRIs and emitting prefix declarations.
8
- */
9
- prefixes?: Record<string, string>;
10
- /**
11
- * Base IRI for the document. When set, a `BASE` / `@base` declaration
12
- * is emitted at the top of the output.
13
- */
14
- baseIri?: string;
15
- /**
16
- * Line ending string (default: `'\n'`).
17
- */
18
- lineEnd?: string;
19
- /**
20
- * Whether to insert blank lines between subject blocks (default: `true`).
21
- */
22
- blankLinesBetweenSubjects?: boolean;
23
- /**
24
- * The sorting strategy to use for reordering statements.
25
- */
26
- sortingStrategy?: QuadSortingStrategy;
27
- /**
28
- * When `true`, skip the sort stage even if `sortingStrategy` is specified. Use this
29
- * when the caller has already sorted the contexts and wants to avoid the O(n log n)
30
- * overhead. Default: `false`.
31
- */
32
- assumeSorted?: boolean;
33
- /**
34
- * Use lowercase directives (`@prefix` / `@base`) instead of uppercase
35
- * (`PREFIX` / `BASE`). Default: `false`.
36
- */
37
- lowercaseDirectives?: boolean;
38
- /**
39
- * Whether to serialize single-use blank nodes as local property lists
40
- * (`[ ... ]`) when pretty printing.
41
- *
42
- * Default: `true`.
43
- */
44
- inlineSingleUseBlankNodes?: boolean;
45
- }
46
- //# sourceMappingURL=statement-serializer-options.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-serializer-options.d.ts","sourceRoot":"","sources":["../src/statement-serializer-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;OAEG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;IAEtC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=statement-serializer-options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-serializer-options.js","sourceRoot":"","sources":["../src/statement-serializer-options.ts"],"names":[],"mappings":""}
@@ -1,68 +0,0 @@
1
- import { Quad } from '@rdfjs/types';
2
- import { QuadContext } from '@faubulous/mentor-rdf-parsers';
3
- import { IQuadSerializer } from './quad-serializer.interface';
4
- import { SortingOption } from './serializer-options';
5
- import { StatementSerializerOptions } from './statement-serializer-options';
6
- /**
7
- * Serializes {@link QuadContext | statement contexts} to a complete
8
- * document string, preserving source comments and emitting prefix/base
9
- * declarations automatically.
10
- */
11
- export declare class StatementSerializer {
12
- private readonly serializer;
13
- /**
14
- * Shared synthetic token for contexts created from external quads.
15
- */
16
- private readonly syntheticToken;
17
- /**
18
- * Creates a new `StatementSerializer`.
19
- *
20
- * @param serializer The underlying format-specific serializer used to
21
- * render individual quads (e.g. `TurtleSerializer`).
22
- */
23
- constructor(serializer: IQuadSerializer);
24
- /**
25
- * Merges externally created quads into an existing set of statement
26
- * contexts. New quads receive empty comment arrays so they serialize
27
- * cleanly between existing statements.
28
- *
29
- * @param contexts Existing statement contexts (from the parser).
30
- * @param newQuads Additional quads to add.
31
- * @returns A new array containing both the original and new contexts.
32
- */
33
- addStatements(contexts: QuadContext[], newQuads: Quad[]): QuadContext[];
34
- /**
35
- * Sorts statement contexts using the provided sorting option.
36
- * Comments travel with their quads so that each comment block stays
37
- * associated with the correct statement after reordering.
38
- *
39
- * @param contexts The statement contexts to sort.
40
- * @param sort Sorting option (see {@link SortOption}).
41
- * @returns A new sorted array.
42
- */
43
- sort(contexts: QuadContext[], sort: SortingOption): QuadContext[];
44
- /**
45
- * Serializes statement contexts to a complete document string.
46
- *
47
- * The output includes:
48
- * - `BASE` / `@base` declaration (when `baseIri` is set)
49
- * - `PREFIX` / `@prefix` declarations (when `prefixes` is provided)
50
- * - A blank line separating declarations from statements
51
- * - Pretty-printed subject blocks with predicate-object grouping
52
- * - Sorted and comment-decorated statements
53
- *
54
- * @param contexts The (optionally pre-sorted / pre-merged) statement contexts.
55
- * @param options Serialization options.
56
- * @returns The complete serialized document string.
57
- */
58
- serialize(contexts: QuadContext[], options?: StatementSerializerOptions): string;
59
- /**
60
- * Splits serializer output into subject blocks using blank-line separators.
61
- */
62
- private splitSubjectBlocks;
63
- /**
64
- * Appends a trailing comment to the final logical line of a block.
65
- */
66
- private appendTrailingComment;
67
- }
68
- //# sourceMappingURL=statement-serializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-serializer.d.ts","sourceRoot":"","sources":["../src/statement-serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,WAAW,EAAU,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAqB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAI5E;;;;GAIG;AACH,qBAAa,mBAAmB;IAsBhB,OAAO,CAAC,QAAQ,CAAC,UAAU;IArBvC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAU7B;IAEF;;;;;OAKG;gBAC0B,UAAU,EAAE,eAAe;IAExD;;;;;;;;OAQG;IACH,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE;IAsBvE;;;;;;;;OAQG;IACH,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,WAAW,EAAE;IAIjE;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAI,MAAM;IAqHjF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAWhC"}
@@ -1,204 +0,0 @@
1
- import { QuadSorter } from './quad-sorter';
2
- /**
3
- * Serializes {@link QuadContext | statement contexts} to a complete
4
- * document string, preserving source comments and emitting prefix/base
5
- * declarations automatically.
6
- */
7
- export class StatementSerializer {
8
- serializer;
9
- /**
10
- * Shared synthetic token for contexts created from external quads.
11
- */
12
- syntheticToken = {
13
- image: '',
14
- startOffset: Infinity,
15
- endOffset: Infinity,
16
- startLine: Infinity,
17
- endLine: Infinity,
18
- startColumn: Infinity,
19
- endColumn: Infinity,
20
- tokenType: { name: 'SYNTHETIC' },
21
- tokenTypeIdx: -1,
22
- };
23
- /**
24
- * Creates a new `StatementSerializer`.
25
- *
26
- * @param serializer The underlying format-specific serializer used to
27
- * render individual quads (e.g. `TurtleSerializer`).
28
- */
29
- constructor(serializer) {
30
- this.serializer = serializer;
31
- }
32
- /**
33
- * Merges externally created quads into an existing set of statement
34
- * contexts. New quads receive empty comment arrays so they serialize
35
- * cleanly between existing statements.
36
- *
37
- * @param contexts Existing statement contexts (from the parser).
38
- * @param newQuads Additional quads to add.
39
- * @returns A new array containing both the original and new contexts.
40
- */
41
- addStatements(contexts, newQuads) {
42
- const result = newQuads.map(q => ({
43
- termType: q.termType,
44
- subject: q.subject,
45
- subjectToken: this.syntheticToken,
46
- predicate: q.predicate,
47
- predicateToken: this.syntheticToken,
48
- object: q.object,
49
- objectToken: this.syntheticToken,
50
- graph: q.graph,
51
- leadingComments: [],
52
- trailingComment: undefined,
53
- value: '',
54
- equals: q.equals
55
- }));
56
- return [
57
- ...contexts,
58
- ...result
59
- ];
60
- }
61
- /**
62
- * Sorts statement contexts using the provided sorting option.
63
- * Comments travel with their quads so that each comment block stays
64
- * associated with the correct statement after reordering.
65
- *
66
- * @param contexts The statement contexts to sort.
67
- * @param sort Sorting option (see {@link SortOption}).
68
- * @returns A new sorted array.
69
- */
70
- sort(contexts, sort) {
71
- return QuadSorter.sort(contexts, sort);
72
- }
73
- /**
74
- * Serializes statement contexts to a complete document string.
75
- *
76
- * The output includes:
77
- * - `BASE` / `@base` declaration (when `baseIri` is set)
78
- * - `PREFIX` / `@prefix` declarations (when `prefixes` is provided)
79
- * - A blank line separating declarations from statements
80
- * - Pretty-printed subject blocks with predicate-object grouping
81
- * - Sorted and comment-decorated statements
82
- *
83
- * @param contexts The (optionally pre-sorted / pre-merged) statement contexts.
84
- * @param options Serialization options.
85
- * @returns The complete serialized document string.
86
- */
87
- serialize(contexts, options) {
88
- const prefixes = options?.prefixes ?? {};
89
- const baseIri = options?.baseIri ?? '';
90
- const lineEnd = options?.lineEnd ?? '\n';
91
- const blankLines = options?.blankLinesBetweenSubjects ?? true;
92
- const sortingStrategy = options?.sortingStrategy ?? false;
93
- const assumeSorted = options?.assumeSorted ?? false;
94
- const lowercaseDirectives = options?.lowercaseDirectives ?? false;
95
- const inlineSingleUseBlankNodes = options?.inlineSingleUseBlankNodes ?? true;
96
- // Sort if requested and not already sorted.
97
- const sortedContexts = (sortingStrategy && !assumeSorted) ? this.sort(contexts, sortingStrategy) : contexts;
98
- const parts = [];
99
- if (baseIri) {
100
- const keyword = lowercaseDirectives ? '@base' : 'BASE';
101
- const terminator = lowercaseDirectives ? ' .' : '';
102
- parts.push(`${keyword} <${baseIri}>${terminator}`);
103
- }
104
- for (const [prefix, namespace] of Object.entries(prefixes)) {
105
- const keyword = lowercaseDirectives ? '@prefix' : 'PREFIX';
106
- const terminator = lowercaseDirectives ? ' .' : '';
107
- parts.push(`${keyword} ${prefix}: <${namespace}>${terminator}`);
108
- }
109
- // Blank line after declarations.
110
- if (parts.length > 0) {
111
- parts.push('');
112
- }
113
- const serializerOpts = {
114
- prefixes,
115
- baseIri: baseIri || undefined,
116
- lowercaseDirectives,
117
- lineEnd,
118
- emitDirectives: false,
119
- inlineSingleUseBlankNodes,
120
- };
121
- // Group contexts by subject for pretty-printed output with
122
- // predicate-object lists (e.g. Turtle's ";" syntax).
123
- const subjectGroups = new Map();
124
- for (const ctx of sortedContexts) {
125
- const key = ctx.subject.value;
126
- if (!subjectGroups.has(key)) {
127
- subjectGroups.set(key, []);
128
- }
129
- subjectGroups.get(key).push(ctx);
130
- }
131
- const groupEntries = Array.from(subjectGroups.entries());
132
- // Fast path: render all quads in one serializer call and split by
133
- // subject-block separators. This avoids repeated serializer setup.
134
- const batchedBody = this.serializer.serialize(sortedContexts, {
135
- ...serializerOpts,
136
- blankLinesBetweenSubjects: true,
137
- });
138
- const batchedBlocks = this.splitSubjectBlocks(batchedBody, lineEnd);
139
- const canUseBatchedBlocks = batchedBlocks.length === groupEntries.length;
140
- for (let groupIndex = 0; groupIndex < groupEntries.length; groupIndex++) {
141
- const [_subjectKey, groupContexts] = groupEntries[groupIndex];
142
- // Blank line between subject blocks.
143
- if (groupIndex > 0 && blankLines) {
144
- parts.push('');
145
- }
146
- // Collect comments from all contexts in this subject group.
147
- // Leading comments are emitted before the subject block.
148
- // Trailing comments on non-last quads are also emitted as
149
- // leading comments since they cannot be placed inline within
150
- // a grouped subject block.
151
- for (let i = 0; i < groupContexts.length; i++) {
152
- const ctx = groupContexts[i];
153
- if (ctx.leadingComments) {
154
- for (const comment of ctx.leadingComments) {
155
- parts.push(comment.image);
156
- }
157
- }
158
- if (i < groupContexts.length - 1 && ctx.trailingComment) {
159
- parts.push(ctx.trailingComment.image);
160
- }
161
- }
162
- // Serialize the subject block using the underlying serializer,
163
- // which handles predicate-object grouping and pretty-printing.
164
- let body;
165
- if (canUseBatchedBlocks) {
166
- body = batchedBlocks[groupIndex];
167
- }
168
- else {
169
- body = this.serializer.serialize(groupContexts, serializerOpts);
170
- }
171
- // Append trailing comment from the last context in the group.
172
- const lastCtx = groupContexts[groupContexts.length - 1];
173
- if (lastCtx.trailingComment) {
174
- parts.push(this.appendTrailingComment(body, lineEnd, lastCtx.trailingComment.image));
175
- }
176
- else {
177
- parts.push(body);
178
- }
179
- }
180
- return parts.join(lineEnd);
181
- }
182
- /**
183
- * Splits serializer output into subject blocks using blank-line separators.
184
- */
185
- splitSubjectBlocks(body, lineEnd) {
186
- if (!body) {
187
- return [];
188
- }
189
- const blocks = body.split(`${lineEnd}${lineEnd}`);
190
- return blocks.filter(block => block.trim() !== '');
191
- }
192
- /**
193
- * Appends a trailing comment to the final logical line of a block.
194
- */
195
- appendTrailingComment(body, lineEnd, commentImage) {
196
- const lastBreak = body.lastIndexOf(lineEnd);
197
- if (lastBreak === -1) {
198
- return `${body} ${commentImage}`;
199
- }
200
- const lineStart = lastBreak + lineEnd.length;
201
- return body.slice(0, lineStart) + body.slice(lineStart) + ' ' + commentImage;
202
- }
203
- }
204
- //# sourceMappingURL=statement-serializer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-serializer.js","sourceRoot":"","sources":["../src/statement-serializer.ts"],"names":[],"mappings":"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"}