-
Notifications
You must be signed in to change notification settings - Fork 146
/
parse.ts
139 lines (133 loc) · 4.62 KB
/
parse.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import DataFactory from './factories/extended-term-factory'
import jsonldParser from './jsonldparser'
// @ts-ignore is this injected?
import { Parser as N3jsParser } from 'n3' // @@ Goal: remove this dependency
import N3Parser from './n3parser'
import { parseRDFaDOM } from './rdfaparser'
import RDFParser from './rdfxmlparser'
import sparqlUpdateParser from './patch-parser'
import * as Util from './utils-js'
import Formula from './formula'
import { ContentType, TurtleContentType, N3ContentType, RDFXMLContentType, XHTMLContentType, HTMLContentType, SPARQLUpdateContentType, SPARQLUpdateSingleMatchContentType, JSONLDContentType, NQuadsContentType, NQuadsAltContentType } from './types'
import { Quad } from './tf-types'
type CallbackFunc = (error: any, kb: Formula | null) => void
/**
* Parse a string and put the result into the graph kb.
* Normal method is sync.
* Unfortunately jsdonld is currently written to need to be called async.
* Hence the mess below with executeCallback.
* @param str - The input string to parse
* @param kb - The store to use
* @param base - The base URI to use
* @param contentType - The MIME content type string for the input - defaults to text/turtle
* @param [callback] - The callback to call when the data has been loaded
*/
export default function parse (
str: string,
kb: Formula,
base: string,
contentType: string | ContentType = 'text/turtle',
callback?: CallbackFunc
) {
contentType = contentType || TurtleContentType
contentType = contentType.split(';')[0] as ContentType
try {
if (contentType === N3ContentType || contentType === TurtleContentType) {
var p = N3Parser(kb, kb, base, base, null, null, '', null)
p.loadBuf(str)
executeCallback()
} else if (contentType === RDFXMLContentType) {
var parser = new RDFParser(kb)
parser.parse(Util.parseXML(str), base, kb.sym(base))
executeCallback()
} else if (contentType === XHTMLContentType) {
parseRDFaDOM(Util.parseXML(str, {contentType: XHTMLContentType}), kb, base)
executeCallback()
} else if (contentType === HTMLContentType) {
parseRDFaDOM(Util.parseXML(str, {contentType: HTMLContentType}), kb, base)
executeCallback()
} else if ((contentType === SPARQLUpdateContentType) || (contentType === SPARQLUpdateSingleMatchContentType)) { // @@ we handle a subset
sparqlUpdateParser(str, kb, base)
executeCallback()
} else if (contentType === JSONLDContentType) {
jsonldParser(str, kb, base, executeCallback)
} else if (contentType === NQuadsContentType ||
contentType === NQuadsAltContentType) {
var n3Parser = new N3jsParser({ factory: DataFactory })
nquadCallback(null, str)
} else if (contentType === undefined) {
throw new Error("contentType is undefined")
} else {
throw new Error("Don't know how to parse " + contentType + ' yet')
}
} catch (e) {
// @ts-ignore
executeErrorCallback(e)
}
(parse as any).handled= {
'text/n3': true,
'text/turtle': true,
'application/rdf+xml': true,
'application/xhtml+xml': true,
'text/html': true,
'application/sparql-update': true,
'application/sparql-update-single-match': true,
'application/ld+json': true,
'application/nquads' : true,
'application/n-quads' : true
}
function executeCallback () {
if (callback) {
callback(null, kb)
} else {
return
}
}
function executeErrorCallback (e: Error): void {
if (
// TODO: Always true, what is the right behavior
contentType !== JSONLDContentType ||
// @ts-ignore always true?
contentType !== NQuadsContentType ||
// @ts-ignore always true?
contentType !== NQuadsAltContentType
) {
if (callback) {
callback(e, kb)
} else {
let e2 = new Error('' + e + ' while trying to parse <' + base + '> as ' + contentType)
//@ts-ignore .cause is not a default error property
e2.cause = e
throw e2
}
}
}
/*
function setJsonLdBase (doc, base) {
if (doc instanceof Array) {
return
}
if (!('@context' in doc)) {
doc['@context'] = {}
}
doc['@context']['@base'] = base
}
*/
function nquadCallback (err?: Error | null, nquads?: string): void {
if (err) {
(callback as CallbackFunc)(err, kb)
}
try {
n3Parser.parse(nquads, tripleCallback)
} catch (err) {
(callback as CallbackFunc)(err, kb)
}
}
function tripleCallback (err: Error, triple: Quad) {
if (triple) {
kb.add(triple.subject, triple.predicate, triple.object, triple.graph)
} else {
(callback as CallbackFunc)(err, kb)
}
}
}