@kgdiff/formats 0.0.0-stage → 0.1.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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -2
  3. package/dist/detect.d.ts +47 -0
  4. package/dist/detect.d.ts.map +1 -0
  5. package/dist/detect.js +425 -0
  6. package/dist/detect.js.map +1 -0
  7. package/dist/index.d.ts +203 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +114 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/iri.d.ts +13 -0
  12. package/dist/iri.d.ts.map +1 -0
  13. package/dist/iri.js +91 -0
  14. package/dist/iri.js.map +1 -0
  15. package/dist/json.d.ts +30 -0
  16. package/dist/json.d.ts.map +1 -0
  17. package/dist/json.js +749 -0
  18. package/dist/json.js.map +1 -0
  19. package/dist/jsonld.d.ts +16 -0
  20. package/dist/jsonld.d.ts.map +1 -0
  21. package/dist/jsonld.js +1249 -0
  22. package/dist/jsonld.js.map +1 -0
  23. package/dist/obo.d.ts +25 -0
  24. package/dist/obo.d.ts.map +1 -0
  25. package/dist/obo.js +478 -0
  26. package/dist/obo.js.map +1 -0
  27. package/dist/prefixes.d.ts +49 -0
  28. package/dist/prefixes.d.ts.map +1 -0
  29. package/dist/prefixes.js +177 -0
  30. package/dist/prefixes.js.map +1 -0
  31. package/dist/rdf.d.ts +46 -0
  32. package/dist/rdf.d.ts.map +1 -0
  33. package/dist/rdf.js +1047 -0
  34. package/dist/rdf.js.map +1 -0
  35. package/dist/rdfxml.d.ts +8 -0
  36. package/dist/rdfxml.d.ts.map +1 -0
  37. package/dist/rdfxml.js +529 -0
  38. package/dist/rdfxml.js.map +1 -0
  39. package/dist/shared.d.ts +117 -0
  40. package/dist/shared.d.ts.map +1 -0
  41. package/dist/shared.js +355 -0
  42. package/dist/shared.js.map +1 -0
  43. package/dist/xml.d.ts +50 -0
  44. package/dist/xml.d.ts.map +1 -0
  45. package/dist/xml.js +508 -0
  46. package/dist/xml.js.map +1 -0
  47. package/package.json +55 -3
  48. package/src/detect.ts +435 -0
  49. package/src/index.ts +296 -0
  50. package/src/iri.ts +86 -0
  51. package/src/json.ts +835 -0
  52. package/src/jsonld.ts +1376 -0
  53. package/src/obo.ts +557 -0
  54. package/src/prefixes.ts +195 -0
  55. package/src/rdf.ts +1181 -0
  56. package/src/rdfxml.ts +633 -0
  57. package/src/shared.ts +408 -0
  58. package/src/xml.ts +550 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 iiwish and kgdiff contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,69 @@
1
- # Temporary Holding Version
1
+ # @kgdiff/formats
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Parsers that turn real-world graph files into [`@kgdiff/core`](../core) graphs: RDF (Turtle,
4
+ N-Triples, N-Quads, TriG, RDF/XML, JSON-LD), OBO 1.4 and the common JSON graph shapes (kgdiff,
5
+ d3 / NetworkX node-link, Cytoscape.js, AntV G6 v5, graphology, vis-network). Synchronous and
6
+ deterministic, with no file-system or network access: you pass text, so it works the same in
7
+ browsers and Node.
8
+
9
+ ## Install
10
+
11
+ ```sh
12
+ pnpm add @kgdiff/formats @kgdiff/core
13
+ ```
14
+
15
+ ESM only. Node.js ≥ 22 or any evergreen browser.
16
+
17
+ ## Quick start
18
+
19
+ ```ts
20
+ import { diff, formatHunk } from '@kgdiff/core';
21
+ import { parseGraph } from '@kgdiff/formats';
22
+
23
+ const v1 = `
24
+ @prefix ex: <https://example.org/> .
25
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
26
+ ex:Organization rdfs:label "Organization"@en .
27
+ ex:Company rdfs:subClassOf ex:Organization ; rdfs:label "Company"@en .
28
+ `;
29
+ const v2 = `
30
+ @prefix ex: <https://example.org/> .
31
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
32
+ ex:Organization rdfs:label "Organisation"@en .
33
+ ex:Company rdfs:subClassOf ex:Organization ; rdfs:label "Company"@en .
34
+ ex:Startup rdfs:subClassOf ex:Company ; rdfs:label "Startup"@en .
35
+ `;
36
+
37
+ const before = parseGraph(v1, { filename: 'v1.ttl' });
38
+ const after = parseGraph(v2, { filename: 'v2.ttl' });
39
+ before.format; // 'turtle': detected from the file name and the content
40
+ before.graph.nodes.map((node) => node.label); // ['Company', 'Organization']
41
+ before.warnings; // recoverable oddities (merged named graphs, unsupported OBO stanzas, …)
42
+
43
+ const result = diff(before.graph, after.graph);
44
+ for (const hunk of result.hunks) console.log(formatHunk(hunk, result).title);
45
+ // Renamed “Organization” → “Organisation”
46
+ // Added “Startup” and 1 relation
47
+ ```
48
+
49
+ In Node, read files first: `parseGraph(await readFile('v1.ttl', 'utf8'), { filename: 'v1.ttl' })`.
50
+
51
+ - `format` defaults to `'auto'`. Pass `'turtle'`, `'ntriples'`, `'nquads'`, `'trig'`, `'rdfxml'`,
52
+ `'jsonld'`, `'obo'` or `'json'` to skip detection; `detectFormat(text, filename)` tells you what
53
+ `auto` would pick.
54
+ - Syntax errors throw a `KgdiffError` with code `invalid-input` and the line number.
55
+ - JSON-LD contexts must be inline unless you pass a synchronous `jsonld.documentLoader`; nothing is
56
+ ever fetched, and RDF/XML never loads external entities.
57
+ - Formats it recognises but does not read (OWL/XML, OWL functional and Manchester syntax, GraphML,
58
+ GEXF) throw an `invalid-input` error that says how to convert them.
59
+ - The same graph in different serializations diffs as identical.
60
+
61
+ ## Learn more
62
+
63
+ - [Mapping conventions](../../docs/architecture.md#formats-mapping-conventions): ids, labels,
64
+ types, blank nodes, OWL restrictions and statement annotations.
65
+ - [CLI](../../docs/cli.md): diff graph files from the terminal without writing code.
66
+
67
+ ## License
68
+
69
+ [MIT](../../LICENSE)
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Format detection: file extension first, then content sniffing.
3
+ */
4
+ import type { KgdiffError } from '@kgdiff/core';
5
+ import type { FormatId } from './index.js';
6
+ /** File extensions understood by `detectFormat` (matched case-insensitively, longest first). */
7
+ export declare const FORMAT_EXTENSIONS: Readonly<Record<FormatId, readonly string[]>>;
8
+ /** Format implied by a file name or URL, or `undefined` for unknown extensions. */
9
+ export declare function formatFromFilename(filename: string): FormatId | undefined;
10
+ /** See `detectFormat` in index.ts. */
11
+ export declare function detect(text: string, filename: string | undefined): FormatId;
12
+ /**
13
+ * Sniffs the format from content alone. Throws for recognisably unsupported formats; returns
14
+ * `fallback` (when given) for empty and unrecognisable text instead of guessing or failing.
15
+ */
16
+ export declare function sniffFormat(text: string, filename?: string, fallback?: FormatId): FormatId;
17
+ /** Formats that are recognised but not read, with how to convert them. */
18
+ declare const CONVERSION_HINTS: {
19
+ readonly 'OWL/XML': "Convert it to RDF/XML or Turtle first (e.g. `robot convert --input onto.owx --output onto.owl`).";
20
+ readonly 'OWL Functional Syntax': "Convert it to RDF/XML or Turtle first (e.g. `robot convert --input onto.owx --output onto.owl`).";
21
+ readonly 'OWL Manchester Syntax': "Convert it to RDF/XML or Turtle first (e.g. `robot convert --input onto.owx --output onto.owl`).";
22
+ readonly GraphML: "Export it as JSON first (e.g. NetworkX node-link data or Cytoscape.js JSON).";
23
+ readonly GEXF: "Export it as JSON first (e.g. NetworkX node-link data or Cytoscape.js JSON).";
24
+ readonly XML: 'kgdiff reads RDF/XML (an rdf:RDF root element, or a node element with rdf:about); other XML vocabularies are not graph formats it knows.';
25
+ };
26
+ export type UnsupportedFormat = keyof typeof CONVERSION_HINTS;
27
+ /** `KgdiffError('invalid-input')` naming a recognised but unsupported format and a way out. */
28
+ export declare function unsupportedFormat(kind: UnsupportedFormat, filename?: string, root?: string): KgdiffError;
29
+ /** What format detection needs to know about a root element. */
30
+ export interface XmlRootInfo {
31
+ readonly local: string;
32
+ /** Namespace URI, when known. */
33
+ readonly uri: string | undefined;
34
+ /** Whether it has attributes in the RDF namespace (`rdf:about`, …). */
35
+ readonly rdfAttributes: boolean;
36
+ /** Whether it declares the RDF namespace (OWL/XML often does, without using it). */
37
+ readonly rdfNamespace: boolean;
38
+ }
39
+ /**
40
+ * RDF/XML (an `rdf:RDF` root, or a node element using the RDF namespace) or the unsupported
41
+ * XML format a root element belongs to (`XML` when it is none of the known ones).
42
+ */
43
+ export declare function classifyXmlRoot(root: XmlRootInfo): 'rdfxml' | UnsupportedFormat;
44
+ /** Whether a parsed JSON value is a JSON-LD document (by its top-level keys). */
45
+ export declare function isJsonLd(data: unknown): boolean;
46
+ export {};
47
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,gGAAgG;AAChG,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC,CAS3E,CAAC;AAYF,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAWzE;AAED,sCAAsC;AACtC,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAU3E;AAOD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CA6C1F;AAQD,0EAA0E;AAC1E,QAAA,MAAM,gBAAgB;aACpB,SAAS;aACT,uBAAuB;aACvB,uBAAuB;aACvB,OAAO;aACP,IAAI;aACJ,GAAG,EAAE,0IAA0I;CACvI,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAE9D,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,WAAW,CAMb;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,oFAAoF;IACpF,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,iBAAiB,CAS/E;AAkGD,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQ/C"}
package/dist/detect.js ADDED
@@ -0,0 +1,425 @@
1
+ import { RDF_NS } from './prefixes.js';
2
+ import { invalidInput, stripBom } from './shared.js';
3
+ /** File extensions understood by `detectFormat` (matched case-insensitively, longest first). */
4
+ export const FORMAT_EXTENSIONS = {
5
+ json: ['.json', '.kgdiff.json'],
6
+ jsonld: ['.jsonld'],
7
+ turtle: ['.ttl', '.turtle'],
8
+ ntriples: ['.nt'],
9
+ nquads: ['.nq'],
10
+ trig: ['.trig'],
11
+ rdfxml: ['.rdf', '.owl'],
12
+ obo: ['.obo'],
13
+ };
14
+ /**
15
+ * Extensions several syntaxes share: Protégé saves Turtle, OWL/XML or Functional Syntax as
16
+ * `.owl` too. For these the content decides; the extension's format is only the fallback.
17
+ */
18
+ const SHARED_EXTENSIONS = ['.owl'];
19
+ const FORMATS = Object.keys(FORMAT_EXTENSIONS);
20
+ const cleanName = (filename) => filename.replace(/[?#].*$/, '').toLowerCase();
21
+ /** Format implied by a file name or URL, or `undefined` for unknown extensions. */
22
+ export function formatFromFilename(filename) {
23
+ const name = cleanName(filename);
24
+ let best;
25
+ for (const format of FORMATS) {
26
+ for (const extension of FORMAT_EXTENSIONS[format]) {
27
+ if (name.endsWith(extension) && (!best || extension.length > best.length)) {
28
+ best = { format, length: extension.length };
29
+ }
30
+ }
31
+ }
32
+ return best?.format;
33
+ }
34
+ /** See `detectFormat` in index.ts. */
35
+ export function detect(text, filename) {
36
+ const named = filename === undefined ? undefined : formatFromFilename(filename);
37
+ if (named === undefined)
38
+ return sniffFormat(text, filename);
39
+ const name = cleanName(filename ?? '');
40
+ if (SHARED_EXTENSIONS.some((extension) => name.endsWith(extension))) {
41
+ return sniffFormat(text, filename, named);
42
+ }
43
+ // `.json` holds every JSON dialect, JSON-LD included.
44
+ if (named === 'json' && isJsonLdHead(stripBom(text.slice(0, SNIFF_WINDOW))))
45
+ return 'jsonld';
46
+ return named;
47
+ }
48
+ /** How many leading characters content sniffing looks at (line-based checks). */
49
+ const SNIFF_WINDOW = 64 * 1024;
50
+ /** How many statement lines decide between N-Triples / N-Quads and Turtle. */
51
+ const SNIFF_LINES = 32;
52
+ /**
53
+ * Sniffs the format from content alone. Throws for recognisably unsupported formats; returns
54
+ * `fallback` (when given) for empty and unrecognisable text instead of guessing or failing.
55
+ */
56
+ export function sniffFormat(text, filename, fallback) {
57
+ const head = stripBom(text.slice(0, SNIFF_WINDOW));
58
+ const start = skipWhitespaceAndComments(head);
59
+ // Empty (or comment-only): an empty RDF graph.
60
+ if (start >= head.length)
61
+ return fallback ?? 'turtle';
62
+ const first = head[start];
63
+ if (/^format-version:/m.test(head) || /^\[(?:Term|Typedef|Instance)\][ \t]*\r?$/m.test(head)) {
64
+ return 'obo';
65
+ }
66
+ if (first === '{' || (first === '[' && looksLikeJsonArray(head, start))) {
67
+ return isJsonLdHead(head) ? 'jsonld' : 'json';
68
+ }
69
+ if (first === '<' && looksLikeXml(head, start)) {
70
+ const root = sniffXmlRoot(head, start);
71
+ if (root !== undefined) {
72
+ const kind = classifyXmlRoot(root);
73
+ if (kind === 'rdfxml')
74
+ return 'rdfxml';
75
+ throw unsupportedFormat(kind, filename, root.qname);
76
+ }
77
+ if (head.includes(RDF_NS))
78
+ return 'rdfxml';
79
+ }
80
+ if (/^[ \t]*(?:Prefix|Ontology)\(/m.test(head)) {
81
+ throw unsupportedFormat('OWL Functional Syntax', filename);
82
+ }
83
+ if (/^[ \t]*(?:Prefix|Ontology):[ \t]/m.test(head)) {
84
+ throw unsupportedFormat('OWL Manchester Syntax', filename);
85
+ }
86
+ const hasDirectives = /^[ \t]*(?:@prefix|@base|PREFIX[ \t]|BASE[ \t])/im.test(head);
87
+ if (!hasDirectives) {
88
+ // A truncated window may end mid-line: leave that line out of the sample.
89
+ const complete = text.length > SNIFF_WINDOW ? head.slice(0, head.lastIndexOf('\n') + 1) : head;
90
+ const lineFormat = sniffLineFormat(complete);
91
+ if (lineFormat)
92
+ return lineFormat;
93
+ }
94
+ if (hasDirectives || looksLikeTurtle(head.slice(start))) {
95
+ return hasGraphBlock(stripBom(text)) ? 'trig' : 'turtle';
96
+ }
97
+ if (fallback !== undefined)
98
+ return fallback;
99
+ throw invalidInput(`Could not detect the format of ${filename ? `"${filename}"` : 'the input'}. ` +
100
+ `Pass \`format\` explicitly (${FORMATS.join(', ')}).`, filename ? { filename } : {});
101
+ }
102
+ // ─── Unsupported formats ────────────────────────────────────────────────────
103
+ const TO_RDF = 'Convert it to RDF/XML or Turtle first (e.g. `robot convert --input onto.owx --output onto.owl`).';
104
+ const TO_JSON = 'Export it as JSON first (e.g. NetworkX node-link data or Cytoscape.js JSON).';
105
+ /** Formats that are recognised but not read, with how to convert them. */
106
+ const CONVERSION_HINTS = {
107
+ 'OWL/XML': TO_RDF,
108
+ 'OWL Functional Syntax': TO_RDF,
109
+ 'OWL Manchester Syntax': TO_RDF,
110
+ GraphML: TO_JSON,
111
+ GEXF: TO_JSON,
112
+ XML: 'kgdiff reads RDF/XML (an rdf:RDF root element, or a node element with rdf:about); other XML vocabularies are not graph formats it knows.',
113
+ };
114
+ /** `KgdiffError('invalid-input')` naming a recognised but unsupported format and a way out. */
115
+ export function unsupportedFormat(kind, filename, root) {
116
+ const what = kind === 'XML' ? `XML with root element <${root ?? '?'}>` : kind;
117
+ return invalidInput(`${what} is not supported${filename ? ` ("${filename}")` : ''}. ${CONVERSION_HINTS[kind]}`, filename ? { filename } : {});
118
+ }
119
+ /**
120
+ * RDF/XML (an `rdf:RDF` root, or a node element using the RDF namespace) or the unsupported
121
+ * XML format a root element belongs to (`XML` when it is none of the known ones).
122
+ */
123
+ export function classifyXmlRoot(root) {
124
+ const local = root.local;
125
+ if (local === 'RDF')
126
+ return 'rdfxml';
127
+ // OWL/XML: <Ontology xmlns="http://www.w3.org/2002/07/owl#" ontologyIRI="…">; an RDF/XML
128
+ // document rooted at an owl:Ontology node element uses rdf:about.
129
+ if (local === 'Ontology' && !root.rdfAttributes)
130
+ return 'OWL/XML';
131
+ if (local.toLowerCase() === 'graphml')
132
+ return 'GraphML';
133
+ if (local.toLowerCase() === 'gexf')
134
+ return 'GEXF';
135
+ return root.rdfAttributes || root.rdfNamespace ? 'rdfxml' : 'XML';
136
+ }
137
+ /**
138
+ * Markup rather than a Turtle IRI: a declaration, comment or DOCTYPE, or a start tag with
139
+ * attributes, self-closing or closed later (`<a> <b> <c> .` stays Turtle).
140
+ */
141
+ function looksLikeXml(head, start) {
142
+ const tag = /^<(?:([?!])|([A-Za-z_][\w.-]*(?::[A-Za-z_][\w.-]*)?)(\s+[A-Za-z_][\w.:-]*\s*=|\s*\/?>))/.exec(head.slice(start, start + 1024));
143
+ if (!tag)
144
+ return false;
145
+ if (tag[1] !== undefined)
146
+ return true;
147
+ const [, , name = '', after = ''] = tag;
148
+ return after.includes('=') || after.endsWith('/>') || head.includes(`</${name}`);
149
+ }
150
+ /** The root element of an XML head: prolog skipped, its own namespace declarations read. */
151
+ function sniffXmlRoot(head, start) {
152
+ let i = start;
153
+ for (;;) {
154
+ i = skipXmlSpace(head, i);
155
+ let end;
156
+ if (head.startsWith('<?', i))
157
+ end = afterOrMinus(head, '?>', i);
158
+ else if (head.startsWith('<!--', i))
159
+ end = afterOrMinus(head, '-->', i);
160
+ else if (head.startsWith('<!DOCTYPE', i))
161
+ end = afterDoctype(head, i);
162
+ else
163
+ break;
164
+ if (end < 0)
165
+ return undefined;
166
+ i = end;
167
+ }
168
+ const tag = /^<([^\s/>]+)((?:[^>"']|"[^"]*"|'[^']*')*)/.exec(head.slice(i));
169
+ if (!tag)
170
+ return undefined;
171
+ const qname = tag[1] ?? '';
172
+ const namespaces = new Map();
173
+ const prefixes = [];
174
+ for (const [, name = '', double, single] of (tag[2] ?? '').matchAll(/([^\s=]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g)) {
175
+ const value = double ?? single ?? '';
176
+ if (name === 'xmlns')
177
+ namespaces.set('', value);
178
+ else if (name.startsWith('xmlns:'))
179
+ namespaces.set(name.slice(6), value);
180
+ else if (name.includes(':'))
181
+ prefixes.push(name.slice(0, name.indexOf(':')));
182
+ }
183
+ const colon = qname.indexOf(':');
184
+ const local = colon < 0 ? qname : qname.slice(colon + 1);
185
+ const uri = namespaces.get(colon < 0 ? '' : qname.slice(0, colon));
186
+ const rdfAttributes = prefixes.some((prefix) => namespaces.get(prefix) === RDF_NS || prefix === 'rdf');
187
+ const rdfNamespace = [...namespaces.values()].includes(RDF_NS);
188
+ return { qname, local, uri, rdfAttributes, rdfNamespace };
189
+ }
190
+ function skipXmlSpace(text, from) {
191
+ let i = from;
192
+ while (i < text.length && ' \t\n\r'.includes(text[i] ?? ''))
193
+ i++;
194
+ return i;
195
+ }
196
+ function afterOrMinus(text, terminator, from) {
197
+ const end = text.indexOf(terminator, from);
198
+ return end < 0 ? -1 : end + terminator.length;
199
+ }
200
+ /** End of `<!DOCTYPE … [ … ]>`, or -1 when it does not end inside `text`. */
201
+ function afterDoctype(text, from) {
202
+ let inSubset = false;
203
+ for (let i = from + 9; i < text.length; i++) {
204
+ const c = text[i];
205
+ if (c === '"' || c === "'") {
206
+ const close = text.indexOf(c, i + 1);
207
+ if (close < 0)
208
+ return -1;
209
+ i = close;
210
+ }
211
+ else if (c === '[')
212
+ inSubset = true;
213
+ else if (c === ']')
214
+ inSubset = false;
215
+ else if (c === '>' && !inSubset)
216
+ return i + 1;
217
+ }
218
+ return -1;
219
+ }
220
+ // ─── JSON-LD ────────────────────────────────────────────────────────────────
221
+ /** Top-level keys that make a JSON document JSON-LD. */
222
+ const JSON_LD_KEYS = new Set([
223
+ '@context',
224
+ '@graph',
225
+ '@id',
226
+ '@type',
227
+ '@reverse',
228
+ '@included',
229
+ '@set',
230
+ '@list',
231
+ '@value',
232
+ ]);
233
+ /** Whether a parsed JSON value is a JSON-LD document (by its top-level keys). */
234
+ export function isJsonLd(data) {
235
+ const object = Array.isArray(data) ? data[0] : data;
236
+ return (typeof object === 'object' &&
237
+ object !== null &&
238
+ !Array.isArray(object) &&
239
+ Object.keys(object).some((key) => JSON_LD_KEYS.has(key)));
240
+ }
241
+ /**
242
+ * `isJsonLd` on the head of a document: the keys of the top-level object (or of the first
243
+ * object of a top-level array) that start inside the sniff window.
244
+ */
245
+ function isJsonLdHead(head) {
246
+ let i = skipXmlSpace(head, 0);
247
+ if (head[i] === '[')
248
+ i = skipXmlSpace(head, i + 1);
249
+ if (head[i] !== '{')
250
+ return false;
251
+ i++;
252
+ for (;;) {
253
+ i = skipXmlSpace(head, i);
254
+ if (head[i] !== '"')
255
+ return false;
256
+ const keyEnd = endOfJsonString(head, i);
257
+ if (keyEnd < 0)
258
+ return false;
259
+ const key = head.slice(i + 1, keyEnd - 1);
260
+ if (JSON_LD_KEYS.has(key))
261
+ return true;
262
+ i = skipXmlSpace(head, keyEnd);
263
+ if (head[i] !== ':')
264
+ return false;
265
+ i = endOfJsonValue(head, skipXmlSpace(head, i + 1));
266
+ if (i < 0)
267
+ return false;
268
+ i = skipXmlSpace(head, i);
269
+ if (head[i] !== ',')
270
+ return false;
271
+ i++;
272
+ }
273
+ }
274
+ /** Index after the JSON string starting at `start`, or -1. */
275
+ function endOfJsonString(text, start) {
276
+ for (let i = start + 1; i < text.length; i++) {
277
+ const c = text[i];
278
+ if (c === '\\')
279
+ i++;
280
+ else if (c === '"')
281
+ return i + 1;
282
+ }
283
+ return -1;
284
+ }
285
+ /** Index after the JSON value starting at `start` (nested values skipped), or -1. */
286
+ function endOfJsonValue(text, start) {
287
+ let depth = 0;
288
+ for (let i = start; i < text.length; i++) {
289
+ const c = text[i];
290
+ if (c === '"') {
291
+ i = endOfJsonString(text, i) - 1;
292
+ if (i < 0)
293
+ return -1;
294
+ if (depth === 0)
295
+ return i + 1;
296
+ }
297
+ else if (c === '{' || c === '[')
298
+ depth++;
299
+ else if (c === '}' || c === ']') {
300
+ depth--;
301
+ if (depth === 0)
302
+ return i + 1;
303
+ if (depth < 0)
304
+ return -1;
305
+ }
306
+ else if (depth === 0 && (c === ',' || c === ' ' || c === '\n' || c === '\r' || c === '\t')) {
307
+ return i;
308
+ }
309
+ }
310
+ return -1;
311
+ }
312
+ // ─── Text formats ───────────────────────────────────────────────────────────
313
+ function skipWhitespaceAndComments(text) {
314
+ let i = 0;
315
+ while (i < text.length) {
316
+ const c = text[i];
317
+ if (c === ' ' || c === '\t' || c === '\n' || c === '\r')
318
+ i++;
319
+ else if (c === '#') {
320
+ const end = text.indexOf('\n', i);
321
+ i = end < 0 ? text.length : end + 1;
322
+ }
323
+ else
324
+ break;
325
+ }
326
+ return i;
327
+ }
328
+ /** `[` opens JSON when followed by a JSON value; in Turtle it opens a blank node. */
329
+ function looksLikeJsonArray(text, start) {
330
+ const rest = text.slice(start + 1).trimStart();
331
+ const next = rest[0];
332
+ if (next === undefined)
333
+ return true;
334
+ if (next === ']')
335
+ return rest.slice(1).trim() === '' || /^\]\s*[,\]]/.test(rest);
336
+ return /[{["\d-]/.test(next);
337
+ }
338
+ /** Subject-like first token: an IRI, a blank node, a collection or a prefixed name. */
339
+ function looksLikeTurtle(text) {
340
+ return /^(?:<[^\s<>]*>|_:|\[|\(|[A-Za-z][\w.-]*:|:)/.test(text);
341
+ }
342
+ const NT_TERM = /[ \t]*(?:<[^<>"\s]*>|_:[^\s.<>"]+(?:\.[^\s.<>"]+)*|"(?:[^"\\\n]|\\.)*"(?:@[A-Za-z]+(?:-[A-Za-z0-9]+)*(?:--[a-z]+)?|\^\^<[^<>"\s]*>)?)/y;
343
+ /**
344
+ * N-Triples / N-Quads are line-based: every statement is 3 or 4 terms and a dot. Returns
345
+ * `nquads` when any sampled line has a graph term, `ntriples` when all have 3, and `undefined`
346
+ * when a sampled line is not in line format (so it is Turtle or TriG).
347
+ */
348
+ function sniffLineFormat(text) {
349
+ let sampled = 0;
350
+ let quads = false;
351
+ for (const rawLine of text.split('\n')) {
352
+ const line = rawLine.trim();
353
+ if (line === '' || line.startsWith('#'))
354
+ continue;
355
+ const terms = countLineTerms(line);
356
+ if (terms !== 3 && terms !== 4)
357
+ return undefined;
358
+ if (terms === 4)
359
+ quads = true;
360
+ if (++sampled >= SNIFF_LINES)
361
+ break;
362
+ }
363
+ if (sampled === 0)
364
+ return undefined;
365
+ return quads ? 'nquads' : 'ntriples';
366
+ }
367
+ function countLineTerms(line) {
368
+ let position = 0;
369
+ let terms = 0;
370
+ for (;;) {
371
+ NT_TERM.lastIndex = position;
372
+ const match = NT_TERM.exec(line);
373
+ if (!match)
374
+ break;
375
+ position = NT_TERM.lastIndex;
376
+ terms++;
377
+ }
378
+ const rest = line.slice(position).trim();
379
+ return /^\.\s*(?:#.*)?$/.test(rest) ? terms : -1;
380
+ }
381
+ /** TriG: a `{` outside IRIs, strings and comments (`{|` is RDF 1.2 annotation syntax). */
382
+ function hasGraphBlock(text) {
383
+ const n = text.length;
384
+ let i = 0;
385
+ while (i < n) {
386
+ const c = text[i];
387
+ if (c === '#') {
388
+ const end = text.indexOf('\n', i);
389
+ i = end < 0 ? n : end + 1;
390
+ }
391
+ else if (c === '<' && text[i + 1] !== '<') {
392
+ const end = text.indexOf('>', i + 1);
393
+ i = end < 0 ? n : end + 1;
394
+ }
395
+ else if (c === '"' || c === "'") {
396
+ i = skipString(text, i, c);
397
+ }
398
+ else if (c === '{') {
399
+ if (text[i + 1] !== '|')
400
+ return true;
401
+ i += 2;
402
+ }
403
+ else
404
+ i++;
405
+ }
406
+ return false;
407
+ }
408
+ function skipString(text, start, quote) {
409
+ const long = text.startsWith(quote.repeat(3), start);
410
+ const close = long ? quote.repeat(3) : quote;
411
+ let i = start + close.length;
412
+ while (i < text.length) {
413
+ const c = text[i];
414
+ if (c === '\\')
415
+ i += 2;
416
+ else if (text.startsWith(close, i))
417
+ return i + close.length;
418
+ else if (!long && c === '\n')
419
+ return i + 1;
420
+ else
421
+ i++;
422
+ }
423
+ return text.length;
424
+ }
425
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}