11import { useFileDialog } from '@vueuse/core' ;
22import { readFileContentToStringRef } from '@/utility/readFileContent' ;
33import { RdfMediaType } from '@/components/panels/rdf/rdfEnums' ;
4+ import { useSettings } from '@/settings/useSettings' ;
45import type { Ref } from 'vue' ;
5- import * as N3 from 'n3' ;
6- import * as jsonld from 'jsonld' ;
6+ import * as $rdf from 'rdflib' ;
7+
8+ const settings = useSettings ( ) ;
79
810export function requestUploadFileToRef ( resultString : Ref < string > ) : void {
911 const { open, onChange, reset} = useFileDialog ( {
@@ -24,37 +26,62 @@ export function requestUploadFileToRef(resultString: Ref<string>): void {
2426/**
2527 * Converts Turtle format RDF data to JSON-LD.
2628 * @param turtleString - The input string in Turtle format
27- * @returns Promise resolving to a compacted JSON-LD object
29+ * @returns Promise resolving to a JSON-LD object
2830 */
2931export async function turtleToJsonLD ( turtleString : string ) : Promise < any > {
30- const { quads, prefixes} = await parseTurtle ( turtleString ) ;
31- const nquads = await serializeToNQuads ( quads ) ;
32- const expanded = await jsonld . fromRDF ( nquads , { format : RdfMediaType . NQuads } ) ;
33- const context = buildContext ( prefixes ) ;
34- return Object . keys ( context ) . length > 0 ? jsonld . compact ( expanded , context ) : expanded ;
32+ const store = await parseTurtle ( turtleString ) ;
33+ const serialized = serialize ( store , RdfMediaType . JsonLd ) ;
34+ const parsed = typeof serialized === 'string' ? JSON . parse ( serialized ) : serialized ;
35+ return ensureGraphWrapper ( parsed ) ;
3536}
3637
37- function parseTurtle ( turtleString : string ) : Promise < { quads : N3 . Quad [ ] ; prefixes : N3 . Prefixes } > {
38+ function parseTurtle ( turtleString : string ) : Promise < $rdf . IndexedFormula > {
3839 return new Promise ( ( resolve , reject ) => {
39- const quads : N3 . Quad [ ] = [ ] ;
40- new N3 . Parser ( ) . parse ( turtleString , ( error , quad , prefixes ) => {
41- if ( error ) reject ( error ) ;
42- else if ( quad ) quads . push ( quad ) ;
43- else resolve ( { quads, prefixes : prefixes ?? { } } ) ;
44- } ) ;
40+ const store = $rdf . graph ( ) ;
41+
42+ $rdf . parse (
43+ turtleString ,
44+ store as $rdf . Formula ,
45+ settings . value . rdf . baseUri ,
46+ RdfMediaType . Turtle ,
47+ error => {
48+ if ( error ) {
49+ reject ( error ) ;
50+ return ;
51+ }
52+ resolve ( store ) ;
53+ }
54+ ) ;
4555 } ) ;
4656}
4757
48- function serializeToNQuads ( quads : N3 . Quad [ ] ) : Promise < string > {
49- return new Promise ( ( resolve , reject ) => {
50- const writer = new N3 . Writer ( { format : 'N-Quads' } ) ;
51- quads . forEach ( q => writer . addQuad ( q ) ) ;
52- writer . end ( ( error , result ) => ( error ? reject ( error ) : resolve ( result ) ) ) ;
53- } ) ;
58+ function serialize ( store : $rdf . IndexedFormula , format : string ) : string {
59+ const serialized = $rdf . serialize (
60+ null ,
61+ store as $rdf . Formula ,
62+ settings . value . rdf . baseUri ,
63+ format
64+ ) ;
65+ if ( ! serialized ) {
66+ throw new Error ( 'Failed to serialize Turtle data to JSON-LD.' ) ;
67+ }
68+ return serialized ;
5469}
5570
56- function buildContext ( prefixes : N3 . Prefixes ) : Record < string , N3 . NamedNode < string > > {
57- return Object . fromEntries (
58- Object . entries ( prefixes ) . filter ( ( [ prefix ] ) => Boolean ( prefix ) )
59- ) as Record < string , N3 . NamedNode < string > > ;
71+ function ensureGraphWrapper ( data : any ) : any {
72+ if ( ! data || typeof data !== 'object' || Array . isArray ( data ) ) {
73+ return data ;
74+ }
75+
76+ if ( '@graph' in data ) {
77+ return data ;
78+ }
79+
80+ const { '@context' : context , ...rest } = data ;
81+ const hasRootData = Object . keys ( rest ) . length > 0 ;
82+
83+ return {
84+ ...( context !== undefined ? { '@context' : context } : { } ) ,
85+ '@graph' : hasRootData ? [ rest ] : [ ] ,
86+ } ;
6087}
0 commit comments