comparison src/layout/json_ld_quads.ts @ 106:2468f2227d22

make src/layout/ and src/render/ separation
author drewp@bigasterisk.com
date Sun, 13 Mar 2022 22:00:30 -0700
parents src/json_ld_quads.ts@77aa2e9234ed
children 5a1a79f54779
comparison
equal deleted inserted replaced
105:4bb8c7775c83 106:2468f2227d22
1 import * as jsonld from "jsonld";
2 import { JsonLd, JsonLdArray } from "jsonld/jsonld-spec";
3 import { Quad, NamedNode, DataFactory } from "n3";
4 const { literal, quad, namedNode } = DataFactory;
5
6 // const { rdf } = ns;
7 const rdf = { type: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" };
8
9 function parseObjNode(obj: any) {
10 if (obj["@id"]) {
11 return namedNode(obj["@id"]);
12 } else {
13 if (obj["@value"] === undefined) {
14 throw new Error("no @id or @value");
15 }
16 return literal(obj["@value"], obj["@language"] || obj["@type"]);
17 }
18 }
19
20 function parsePred(
21 onQuad: (q: Quad) => void,
22 graphNode: NamedNode,
23 subjNode: NamedNode,
24 predKey: string,
25 subjGroup: any
26 ) {
27 let predNode: NamedNode;
28 if (predKey === "@type") {
29 subjGroup["@type"].forEach((aType: string) => {
30 onQuad(quad(subjNode, namedNode(rdf.type), namedNode(aType), graphNode));
31 });
32 return;
33 }
34 predNode = namedNode(predKey);
35 subjGroup[predKey].forEach(function(obj: any) {
36 const objNode = parseObjNode(obj);
37 onQuad(quad(subjNode, predNode, objNode, graphNode));
38 });
39 }
40 function parseSubj(
41 onQuad: (q: Quad) => void,
42 graphNode: NamedNode,
43 subjGroup: { [predOrId: string]: any }
44 ) {
45 const subjNode = namedNode(subjGroup["@id"]);
46 for (let predKey in subjGroup) {
47 if (predKey === "@id") {
48 continue;
49 }
50 parsePred(onQuad, graphNode, subjNode, predKey, subjGroup);
51 }
52 }
53 function parseGraph(onQuad: (q: Quad) => void, g: JsonLd) {
54 var graph = (g as { "@id": string })["@id"];
55 var graphNode = namedNode(graph);
56 (g as { "@graph": JsonLdArray })["@graph"].forEach(subj => {
57 parseSubj(onQuad, graphNode, subj);
58 });
59 }
60
61 export async function eachJsonLdQuad(
62 jsonLdObj: object,
63 onQuad: (q: Quad) => void
64 ) {
65 const expanded = await jsonld.expand(jsonLdObj);
66 (expanded as JsonLdArray).forEach((g: JsonLd) => parseGraph(onQuad, g));
67 }