rdflib 2.2.10 → 2.2.12-5f141ca2
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/.babelrc +0 -0
- package/README.md +1 -0
- package/changes.txt +0 -0
- package/dist/rdflib.min.js +62 -0
- package/dist/rdflib.min.js.map +1 -0
- package/esm/blank-node.js +137 -0
- package/esm/class-order.js +12 -0
- package/esm/collection.js +173 -0
- package/esm/convert.js +61 -0
- package/esm/default-graph.js +57 -0
- package/esm/empty.js +46 -0
- package/esm/factories/canonical-data-factory.js +204 -0
- package/esm/factories/extended-term-factory.js +55 -0
- package/esm/factories/factory-types.js +18 -0
- package/esm/factories/rdflib-data-factory.js +55 -0
- package/esm/fetcher.js +2180 -0
- package/esm/formula.js +987 -0
- package/esm/index.js +64 -0
- package/esm/jsonldparser.js +122 -0
- package/esm/jsonparser.js +60 -0
- package/esm/literal.js +236 -0
- package/esm/log.js +13 -0
- package/esm/n3parser.js +1854 -0
- package/esm/named-node.js +154 -0
- package/esm/namespace.js +17 -0
- package/esm/node-internal.js +151 -0
- package/esm/node.js +46 -0
- package/esm/parse.js +138 -0
- package/esm/patch-parser.js +110 -0
- package/esm/query-to-sparql.js +83 -0
- package/esm/query.js +620 -0
- package/esm/rdfaparser.js +1197 -0
- package/esm/rdfxmlparser.js +588 -0
- package/esm/serialize.js +95 -0
- package/esm/serializer.js +1162 -0
- package/esm/sparql-to-query.js +566 -0
- package/esm/statement.js +128 -0
- package/esm/store.js +1306 -0
- package/esm/tf-types.js +1 -0
- package/esm/types.js +25 -0
- package/esm/update-manager.js +1252 -0
- package/esm/updates-via.js +197 -0
- package/esm/uri.js +245 -0
- package/esm/utils/default-graph-uri.js +4 -0
- package/esm/utils/termValue.js +8 -0
- package/esm/utils/terms.js +72 -0
- package/esm/utils-js.js +348 -0
- package/esm/utils.js +103 -0
- package/esm/variable.js +101 -0
- package/esm/xsd-internal.js +10 -0
- package/esm/xsd.js +15 -0
- package/lib/blank-node.d.ts +44 -0
- package/lib/blank-node.js +0 -0
- package/lib/class-order.d.ts +7 -0
- package/lib/class-order.js +0 -0
- package/lib/collection.d.ts +65 -0
- package/lib/collection.js +0 -0
- package/lib/convert.d.ts +2 -0
- package/lib/convert.js +0 -0
- package/lib/default-graph.d.ts +13 -0
- package/lib/default-graph.js +0 -0
- package/lib/empty.d.ts +11 -0
- package/lib/empty.js +0 -0
- package/lib/factories/canonical-data-factory.d.ts +6 -0
- package/lib/factories/canonical-data-factory.js +0 -0
- package/lib/factories/extended-term-factory.d.ts +13 -0
- package/lib/factories/extended-term-factory.js +0 -0
- package/lib/factories/factory-types.d.ts +67 -0
- package/lib/factories/factory-types.js +0 -0
- package/lib/factories/rdflib-data-factory.d.ts +4 -0
- package/lib/factories/rdflib-data-factory.js +0 -0
- package/lib/fetcher.d.ts +443 -0
- package/lib/fetcher.js +3 -2
- package/lib/formula.d.ts +327 -0
- package/lib/formula.js +0 -0
- package/lib/index.d.ts +40 -0
- package/lib/index.js +0 -0
- package/lib/jsonldparser.d.ts +13 -0
- package/lib/jsonldparser.js +0 -0
- package/lib/jsonparser.d.ts +4 -0
- package/lib/jsonparser.js +0 -0
- package/lib/literal.d.ts +67 -0
- package/lib/literal.js +0 -0
- package/lib/log.d.ts +15 -0
- package/lib/log.js +0 -0
- package/lib/n3parser.d.ts +62 -0
- package/lib/n3parser.js +1334 -1289
- package/lib/named-node.d.ts +44 -0
- package/lib/named-node.js +0 -0
- package/lib/namespace.d.ts +7 -0
- package/lib/namespace.js +0 -0
- package/lib/node-internal.d.ts +63 -0
- package/lib/node-internal.js +0 -0
- package/lib/node.d.ts +2 -0
- package/lib/node.js +0 -0
- package/lib/parse.d.ts +16 -0
- package/lib/parse.js +0 -0
- package/lib/patch-parser.d.ts +3 -0
- package/lib/patch-parser.js +0 -0
- package/lib/query-to-sparql.d.ts +1 -0
- package/lib/query-to-sparql.js +0 -0
- package/lib/query.d.ts +27 -0
- package/lib/query.js +0 -0
- package/lib/rdfaparser.d.ts +78 -0
- package/lib/rdfaparser.js +0 -0
- package/lib/rdfxmlparser.d.ts +60 -0
- package/lib/rdfxmlparser.js +430 -413
- package/lib/serialize.d.ts +23 -0
- package/lib/serialize.js +1 -1
- package/lib/serializer.d.ts +54 -0
- package/lib/serializer.js +851 -824
- package/lib/sparql-to-query.d.ts +6 -0
- package/lib/sparql-to-query.js +0 -0
- package/lib/statement.d.ts +55 -0
- package/lib/statement.js +0 -0
- package/lib/store.d.ts +302 -0
- package/lib/store.js +0 -0
- package/lib/tf-types.d.ts +151 -0
- package/lib/tf-types.js +0 -0
- package/lib/types.d.ts +68 -0
- package/lib/types.js +0 -0
- package/lib/update-manager.d.ts +198 -0
- package/lib/update-manager.js +0 -0
- package/lib/updates-via.d.ts +26 -0
- package/lib/updates-via.js +0 -0
- package/lib/uri.d.ts +33 -0
- package/lib/uri.js +0 -0
- package/lib/utils/default-graph-uri.d.ts +3 -0
- package/lib/utils/default-graph-uri.js +0 -0
- package/lib/utils/termValue.d.ts +3 -0
- package/lib/utils/termValue.js +0 -0
- package/lib/utils/terms.d.ts +33 -0
- package/lib/utils/terms.js +0 -0
- package/lib/utils-js.d.ts +50 -0
- package/lib/utils-js.js +0 -0
- package/lib/utils.d.ts +20 -0
- package/lib/utils.js +0 -0
- package/lib/variable.d.ts +29 -0
- package/lib/variable.js +0 -0
- package/lib/xsd-internal.d.ts +11 -0
- package/lib/xsd-internal.js +0 -0
- package/lib/xsd.d.ts +19 -0
- package/lib/xsd.js +8 -14
- package/package.json +3 -3
- package/src/blank-node.ts +0 -0
- package/src/class-order.ts +0 -0
- package/src/collection.ts +0 -0
- package/src/convert.js +0 -0
- package/src/default-graph.ts +0 -0
- package/src/empty.ts +0 -0
- package/src/factories/canonical-data-factory.ts +0 -0
- package/src/factories/extended-term-factory.ts +0 -0
- package/src/factories/factory-types.ts +0 -0
- package/src/factories/rdflib-data-factory.ts +0 -0
- package/src/fetcher.ts +6 -3
- package/src/formula.ts +0 -0
- package/src/index.ts +0 -0
- package/src/jsonldparser.js +0 -0
- package/src/jsonparser.js +0 -0
- package/src/literal.ts +0 -0
- package/src/log.js +0 -0
- package/src/n3parser.js +1114 -1110
- package/src/named-node.ts +0 -0
- package/src/namespace.ts +0 -0
- package/src/node-internal.ts +0 -0
- package/src/node.ts +0 -0
- package/src/parse.ts +0 -0
- package/src/patch-parser.js +0 -0
- package/src/query-to-sparql.js +0 -0
- package/src/query.js +0 -0
- package/src/rdfaparser.js +0 -0
- package/src/rdfxmlparser.js +22 -21
- package/src/serialize.ts +3 -3
- package/src/serializer.js +74 -62
- package/src/sparql-to-query.js +0 -0
- package/src/statement.ts +0 -0
- package/src/store.ts +0 -0
- package/src/tf-types.ts +0 -0
- package/src/types.ts +0 -0
- package/src/update-manager.ts +0 -0
- package/src/updates-via.js +0 -0
- package/src/uri.ts +0 -0
- package/src/utils/default-graph-uri.ts +0 -0
- package/src/utils/termValue.ts +0 -0
- package/src/utils/terms.ts +0 -0
- package/src/utils-js.js +0 -0
- package/src/utils.ts +0 -0
- package/src/variable.ts +0 -0
- package/src/xsd-internal.js +0 -0
- package/src/xsd.js +16 -14
package/lib/serializer.js
CHANGED
|
@@ -7,7 +7,14 @@ var _typeof = require("@babel/runtime/helpers/typeof");
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
10
|
-
exports.
|
|
10
|
+
exports.Serializer = void 0;
|
|
11
|
+
exports.default = createSerializer;
|
|
12
|
+
|
|
13
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
14
|
+
|
|
15
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
16
|
+
|
|
17
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
18
|
|
|
12
19
|
var _namedNode = _interopRequireDefault(require("./named-node"));
|
|
13
20
|
|
|
@@ -34,8 +41,20 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
34
41
|
** This is or was https://github.com/linkeddata/rdflib.js/blob/main/src/serializer.js
|
|
35
42
|
** Licence: MIT
|
|
36
43
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
function createSerializer(store) {
|
|
45
|
+
return new Serializer(store);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
;
|
|
49
|
+
|
|
50
|
+
var Serializer = /*#__PURE__*/function () {
|
|
51
|
+
function Serializer(store) {
|
|
52
|
+
(0, _classCallCheck2.default)(this, Serializer);
|
|
53
|
+
(0, _defineProperty2.default)(this, "_notQNameChars", '\t\r\n !"#$%&\'()*.,+/;<=>?@[\\]^`{|}~');
|
|
54
|
+
(0, _defineProperty2.default)(this, "_notNameChars", this._notQNameChars + ':');
|
|
55
|
+
(0, _defineProperty2.default)(this, "validPrefix", new RegExp(/^[a-zA-Z][a-zA-Z0-9]*$/));
|
|
56
|
+
(0, _defineProperty2.default)(this, "forbidden1", new RegExp(/[\\"\b\f\r\v\t\n\u0080-\uffff]/gm));
|
|
57
|
+
(0, _defineProperty2.default)(this, "forbidden3", new RegExp(/[\\"\b\f\r\v\u0080-\uffff]/gm));
|
|
39
58
|
this.flags = '';
|
|
40
59
|
this.base = null;
|
|
41
60
|
this.prefixes = []; // suggested prefixes
|
|
@@ -67,1092 +86,1100 @@ var _default = function () {
|
|
|
67
86
|
this.store = store;
|
|
68
87
|
this.rdfFactory = store.rdfFactory || _canonicalDataFactory.default;
|
|
69
88
|
this.xsd = (0, _xsd.createXSD)(this.rdfFactory);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
__Serializer.prototype.setBase = function (base) {
|
|
73
|
-
this.base = base;
|
|
74
|
-
return this;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
__Serializer.prototype.setFlags = function (flags) {
|
|
78
|
-
this.flags = flags || '';
|
|
79
|
-
return this;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
__Serializer.prototype.toStr = function (x) {
|
|
83
|
-
var s = x.toNT();
|
|
89
|
+
}
|
|
84
90
|
|
|
85
|
-
|
|
86
|
-
|
|
91
|
+
(0, _createClass2.default)(Serializer, [{
|
|
92
|
+
key: "setBase",
|
|
93
|
+
value: function setBase(base) {
|
|
94
|
+
this.base = base;
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
}, {
|
|
98
|
+
key: "setFlags",
|
|
99
|
+
value: function setFlags(flags) {
|
|
100
|
+
this.flags = flags || '';
|
|
101
|
+
return this;
|
|
87
102
|
}
|
|
103
|
+
}, {
|
|
104
|
+
key: "toStr",
|
|
105
|
+
value: function toStr(x) {
|
|
106
|
+
var s = x.toNT();
|
|
88
107
|
|
|
89
|
-
|
|
90
|
-
|
|
108
|
+
if (x.termType === 'Graph') {
|
|
109
|
+
this.formulas[s] = x; // remember as reverse does not work
|
|
110
|
+
}
|
|
91
111
|
|
|
92
|
-
|
|
93
|
-
if (s[0] === '{') {
|
|
94
|
-
var x = this.formulas[s];
|
|
95
|
-
if (!x) console.log('No formula object for ' + s);
|
|
96
|
-
return x;
|
|
112
|
+
return s;
|
|
97
113
|
}
|
|
114
|
+
}, {
|
|
115
|
+
key: "fromStr",
|
|
116
|
+
value: function fromStr(s) {
|
|
117
|
+
if (s[0] === '{') {
|
|
118
|
+
var x = this.formulas[s];
|
|
119
|
+
if (!x) console.log('No formula object for ' + s);
|
|
120
|
+
return x;
|
|
121
|
+
}
|
|
98
122
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
return this.store.fromNT(s);
|
|
124
|
+
}
|
|
125
|
+
/* Accumulate Namespaces
|
|
126
|
+
**
|
|
127
|
+
** These are only hints. If two overlap, only one gets used
|
|
128
|
+
** There is therefore no guarantee in general.
|
|
129
|
+
*/
|
|
107
130
|
|
|
108
|
-
|
|
109
|
-
|
|
131
|
+
}, {
|
|
132
|
+
key: "suggestPrefix",
|
|
133
|
+
value: function suggestPrefix(prefix, uri) {
|
|
134
|
+
if (prefix.slice(0, 7) === 'default') return; // Try to weed these out
|
|
110
135
|
|
|
111
|
-
|
|
136
|
+
if (prefix.slice(0, 2) === 'ns') return; // From others inferior algos
|
|
112
137
|
|
|
113
|
-
|
|
138
|
+
if (!prefix || !uri) return; // empty strings not suitable
|
|
114
139
|
|
|
115
|
-
|
|
140
|
+
if (prefix in this.namespaces || uri in this.prefixes) return; // already used
|
|
116
141
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
142
|
+
this.prefixes[uri] = prefix;
|
|
143
|
+
this.namespaces[prefix] = uri;
|
|
144
|
+
} // Takes a namespace -> prefix map
|
|
120
145
|
|
|
146
|
+
}, {
|
|
147
|
+
key: "suggestNamespaces",
|
|
148
|
+
value: function suggestNamespaces(namespaces) {
|
|
149
|
+
for (var px in namespaces) {
|
|
150
|
+
this.suggestPrefix(px, namespaces[px]);
|
|
151
|
+
}
|
|
121
152
|
|
|
122
|
-
|
|
123
|
-
for (var px in namespaces) {
|
|
124
|
-
this.suggestPrefix(px, namespaces[px]);
|
|
153
|
+
return this;
|
|
125
154
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
throw new Error('Serializer integity error 1: ' + p + ', ' + this.namespaces[p] + ', ' + this.prefixes[this.namespaces[p]] + '!');
|
|
155
|
+
}, {
|
|
156
|
+
key: "checkIntegrity",
|
|
157
|
+
value: function checkIntegrity() {
|
|
158
|
+
var p, ns;
|
|
159
|
+
|
|
160
|
+
for (p in this.namespaces) {
|
|
161
|
+
if (this.prefixes[this.namespaces[p]] !== p) {
|
|
162
|
+
throw new Error('Serializer integity error 1: ' + p + ', ' + this.namespaces[p] + ', ' + this.prefixes[this.namespaces[p]] + '!');
|
|
163
|
+
}
|
|
136
164
|
}
|
|
137
|
-
}
|
|
138
165
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
166
|
+
for (ns in this.prefixes) {
|
|
167
|
+
if (this.namespaces[this.prefixes[ns]] !== ns) {
|
|
168
|
+
throw new Error('Serializer integity error 2: ' + ns + ', ' + this.prefixs[ns] + ', ' + this.namespaces[this.prefixes[ns]] + '!');
|
|
169
|
+
}
|
|
142
170
|
}
|
|
143
|
-
}
|
|
144
|
-
}; // Make up an unused prefix for a random namespace
|
|
171
|
+
} // Make up an unused prefix for a random namespace
|
|
145
172
|
|
|
173
|
+
}, {
|
|
174
|
+
key: "makeUpPrefix",
|
|
175
|
+
value: function makeUpPrefix(uri) {
|
|
176
|
+
var p = uri;
|
|
146
177
|
|
|
147
|
-
|
|
148
|
-
|
|
178
|
+
function canUseMethod(pp) {
|
|
179
|
+
if (!this.validPrefix.test(pp)) return false; // bad format
|
|
149
180
|
|
|
150
|
-
|
|
151
|
-
if (!__Serializer.prototype.validPrefix.test(pp)) return false; // bad format
|
|
181
|
+
if (pp === 'ns') return false; // boring
|
|
152
182
|
|
|
153
|
-
|
|
183
|
+
if (pp in this.namespaces) return false; // already used
|
|
154
184
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
return pp;
|
|
160
|
-
}
|
|
185
|
+
this.prefixes[uri] = pp;
|
|
186
|
+
this.namespaces[pp] = uri;
|
|
187
|
+
return pp;
|
|
188
|
+
}
|
|
161
189
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
190
|
+
var canUse = canUseMethod.bind(this);
|
|
191
|
+
if ('#/'.indexOf(p[p.length - 1]) >= 0) p = p.slice(0, -1);
|
|
192
|
+
var slash = p.lastIndexOf('/');
|
|
193
|
+
if (slash >= 0) p = p.slice(slash + 1);
|
|
194
|
+
var i = 0;
|
|
167
195
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
196
|
+
while (i < p.length) {
|
|
197
|
+
if (this.prefixchars.indexOf(p[i])) {
|
|
198
|
+
i++;
|
|
199
|
+
} else {
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
173
202
|
}
|
|
174
|
-
}
|
|
175
203
|
|
|
176
|
-
|
|
177
|
-
|
|
204
|
+
p = p.slice(0, i);
|
|
205
|
+
if (p.length < 6 && canUse(p)) return p; // exact is best
|
|
178
206
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
207
|
+
if (canUse(p.slice(0, 3))) return p.slice(0, 3);
|
|
208
|
+
if (canUse(p.slice(0, 2))) return p.slice(0, 2);
|
|
209
|
+
if (canUse(p.slice(0, 4))) return p.slice(0, 4);
|
|
210
|
+
if (canUse(p.slice(0, 1))) return p.slice(0, 1);
|
|
211
|
+
if (canUse(p.slice(0, 5))) return p.slice(0, 5);
|
|
184
212
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
213
|
+
if (!this.validPrefix.test(p)) {
|
|
214
|
+
p = 'n'; // Otherwise the loop below may never termimnate
|
|
215
|
+
}
|
|
188
216
|
|
|
189
|
-
|
|
190
|
-
|
|
217
|
+
for (var j = 0;; j++) {
|
|
218
|
+
if (canUse(p.slice(0, 3) + j)) return p.slice(0, 3) + j;
|
|
219
|
+
}
|
|
191
220
|
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
for (var i = 0; i < sts.length; i++) {
|
|
207
|
-
var st = sts[i];
|
|
221
|
+
}, {
|
|
222
|
+
key: "rootSubjects",
|
|
223
|
+
value: function rootSubjects(sts) {
|
|
224
|
+
var incoming = {};
|
|
225
|
+
var subjects = {};
|
|
226
|
+
var allBnodes = {};
|
|
227
|
+
/* This scan is to find out which nodes will have to be the roots of trees
|
|
228
|
+
** in the serialized form. This will be any symbols, and any bnodes
|
|
229
|
+
** which hve more or less than one incoming arc, and any bnodes which have
|
|
230
|
+
** one incoming arc but it is an uninterrupted loop of such nodes back to itself.
|
|
231
|
+
** This should be kept linear time with repect to the number of statements.
|
|
232
|
+
** Note it does not use any indexing of the store.
|
|
233
|
+
*/
|
|
208
234
|
|
|
209
|
-
var
|
|
210
|
-
|
|
211
|
-
incoming[x].push(st.subject); // List of things which will cause this to be printed
|
|
212
|
-
};
|
|
235
|
+
for (var i = 0; i < sts.length; i++) {
|
|
236
|
+
var st = sts[i];
|
|
213
237
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
238
|
+
var checkMentions = function checkMentions(x) {
|
|
239
|
+
if (!incoming.hasOwnProperty(x)) incoming[x] = [];
|
|
240
|
+
incoming[x].push(st.subject); // List of things which will cause this to be printed
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
var st2 = [st.subject, st.predicate, st.object];
|
|
244
|
+
st2.map(function (y) {
|
|
245
|
+
if (y.termType === 'BlankNode') {
|
|
246
|
+
allBnodes[y.toNT()] = true;
|
|
247
|
+
} else if (y.termType === 'Collection') {
|
|
248
|
+
y.elements.forEach(function (z) {
|
|
249
|
+
checkMentions(z); // bnodes in collections important
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
checkMentions(sts[i].object);
|
|
254
|
+
var ss = subjects[this.toStr(st.subject)]; // Statements with this as subject
|
|
226
255
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
256
|
+
if (!ss) ss = [];
|
|
257
|
+
ss.push(st);
|
|
258
|
+
subjects[this.toStr(st.subject)] = ss; // Make hash. @@ too slow for formula?
|
|
259
|
+
}
|
|
231
260
|
|
|
232
|
-
|
|
261
|
+
var roots = [];
|
|
233
262
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
263
|
+
for (var xNT in subjects) {
|
|
264
|
+
if (!subjects.hasOwnProperty(xNT)) continue;
|
|
265
|
+
var y = this.fromStr(xNT);
|
|
237
266
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
267
|
+
if (y.termType !== 'BlankNode' || !incoming[y] || incoming[y].length !== 1) {
|
|
268
|
+
roots.push(y);
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
241
271
|
}
|
|
242
|
-
}
|
|
243
272
|
|
|
244
|
-
|
|
245
|
-
|
|
273
|
+
this.incoming = incoming; // Keep for serializing @@ Bug for nested formulas
|
|
274
|
+
// Now do the scan using existing roots
|
|
246
275
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
for (var k = 0; k < roots.length; k++) {
|
|
250
|
-
rootsHash[roots[k].toNT()] = true;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
'roots': roots,
|
|
255
|
-
'subjects': subjects,
|
|
256
|
-
'rootsHash': rootsHash,
|
|
257
|
-
'incoming': incoming
|
|
258
|
-
};
|
|
259
|
-
}; // //////////////////////////////////////////////////////
|
|
276
|
+
var rootsHash = {};
|
|
260
277
|
|
|
278
|
+
for (var k = 0; k < roots.length; k++) {
|
|
279
|
+
rootsHash[roots[k].toNT()] = true;
|
|
280
|
+
}
|
|
261
281
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
282
|
+
return {
|
|
283
|
+
'roots': roots,
|
|
284
|
+
'subjects': subjects,
|
|
285
|
+
'rootsHash': rootsHash,
|
|
286
|
+
'incoming': incoming
|
|
287
|
+
};
|
|
288
|
+
} // //////////////////////////////////////////////////////
|
|
265
289
|
|
|
266
|
-
|
|
267
|
-
|
|
290
|
+
}, {
|
|
291
|
+
key: "toN3",
|
|
292
|
+
value: function toN3(f) {
|
|
293
|
+
return this.statementsToN3(f.statements);
|
|
294
|
+
}
|
|
295
|
+
}, {
|
|
296
|
+
key: "explicitURI",
|
|
297
|
+
value: function explicitURI(uri) {
|
|
298
|
+
if (this.flags.indexOf('r') < 0 && this.base) {
|
|
299
|
+
uri = Uri.refTo(this.base, uri);
|
|
300
|
+
} else if (this.flags.indexOf('u') >= 0) {
|
|
301
|
+
// Unicode encoding NTriples style
|
|
302
|
+
uri = backslashUify(uri);
|
|
303
|
+
} else {
|
|
304
|
+
uri = hexify(uri);
|
|
305
|
+
}
|
|
268
306
|
|
|
269
|
-
|
|
270
|
-
if (this.flags.indexOf('r') < 0 && this.base) {
|
|
271
|
-
uri = Uri.refTo(this.base, uri);
|
|
272
|
-
} else if (this.flags.indexOf('u') >= 0) {
|
|
273
|
-
// Unicode encoding NTriples style
|
|
274
|
-
uri = backslashUify(uri);
|
|
275
|
-
} else {
|
|
276
|
-
uri = hexify(uri);
|
|
307
|
+
return '<' + uri + '>';
|
|
277
308
|
}
|
|
309
|
+
}, {
|
|
310
|
+
key: "statementsToNTriples",
|
|
311
|
+
value: function statementsToNTriples(sts) {
|
|
312
|
+
var sorted = sts.slice();
|
|
313
|
+
sorted.sort();
|
|
314
|
+
var str = '';
|
|
315
|
+
var rdfns = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
316
|
+
var self = this;
|
|
317
|
+
var kb = this.store;
|
|
318
|
+
var factory = this.rdfFactory;
|
|
319
|
+
|
|
320
|
+
var termToNT = function termToNT(x) {
|
|
321
|
+
if (x.termType !== 'Collection') {
|
|
322
|
+
return self.atomicTermToN3(x);
|
|
323
|
+
}
|
|
278
324
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
__Serializer.prototype.statementsToNTriples = function (sts) {
|
|
283
|
-
var sorted = sts.slice();
|
|
284
|
-
sorted.sort();
|
|
285
|
-
var str = '';
|
|
286
|
-
var rdfns = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
287
|
-
var self = this;
|
|
288
|
-
var kb = this.store;
|
|
289
|
-
var factory = this.rdfFactory;
|
|
290
|
-
|
|
291
|
-
var termToNT = function termToNT(x) {
|
|
292
|
-
if (x.termType !== 'Collection') {
|
|
293
|
-
return self.atomicTermToN3(x);
|
|
294
|
-
}
|
|
325
|
+
var list = x.elements;
|
|
326
|
+
var rest = kb.sym(rdfns + 'nill');
|
|
295
327
|
|
|
296
|
-
|
|
297
|
-
|
|
328
|
+
for (var i = list.length - 1; i >= 0; i--) {
|
|
329
|
+
var bnode = factory.blankNode();
|
|
330
|
+
str += termToNT(bnode) + ' ' + termToNT(kb.sym(rdfns + 'first')) + ' ' + termToNT(list[i]) + '.\n';
|
|
331
|
+
str += termToNT(bnode) + ' ' + termToNT(kb.sym(rdfns + 'rest')) + ' ' + termToNT(rest) + '.\n';
|
|
332
|
+
rest = bnode;
|
|
333
|
+
}
|
|
298
334
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
str += termToNT(bnode) + ' ' + termToNT(kb.sym(rdfns + 'first')) + ' ' + termToNT(list[i]) + '.\n';
|
|
302
|
-
str += termToNT(bnode) + ' ' + termToNT(kb.sym(rdfns + 'rest')) + ' ' + termToNT(rest) + '.\n';
|
|
303
|
-
rest = bnode;
|
|
304
|
-
}
|
|
335
|
+
return self.atomicTermToN3(rest);
|
|
336
|
+
};
|
|
305
337
|
|
|
306
|
-
|
|
307
|
-
|
|
338
|
+
for (var i = 0; i < sorted.length; i++) {
|
|
339
|
+
var st = sorted[i];
|
|
340
|
+
var s = '';
|
|
341
|
+
s += termToNT(st.subject) + ' ';
|
|
342
|
+
s += termToNT(st.predicate) + ' ';
|
|
343
|
+
s += termToNT(st.object) + ' ';
|
|
308
344
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
s += termToNT(st.predicate) + ' ';
|
|
314
|
-
s += termToNT(st.object) + ' ';
|
|
345
|
+
if (this.flags.indexOf('q') >= 0) {
|
|
346
|
+
// Do quads not nrtiples
|
|
347
|
+
s += termToNT(st.why) + ' ';
|
|
348
|
+
}
|
|
315
349
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
s += termToNT(st.why) + ' ';
|
|
350
|
+
s += '.\n';
|
|
351
|
+
str += s;
|
|
319
352
|
}
|
|
320
353
|
|
|
321
|
-
|
|
322
|
-
str += s;
|
|
354
|
+
return str;
|
|
323
355
|
}
|
|
356
|
+
}, {
|
|
357
|
+
key: "statementsToN3",
|
|
358
|
+
value: function statementsToN3(sts) {
|
|
359
|
+
var indent = 4;
|
|
360
|
+
var width = 80;
|
|
361
|
+
var kb = this.store; // A URI Map alows us to put the type statemnts at the top.
|
|
362
|
+
|
|
363
|
+
var uriMap = {
|
|
364
|
+
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'aaa:00'
|
|
365
|
+
};
|
|
324
366
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
var indent = 4;
|
|
330
|
-
var width = 80;
|
|
331
|
-
var kb = this.store; // A URI Map alows us to put the type statemnts at the top.
|
|
332
|
-
|
|
333
|
-
var uriMap = {
|
|
334
|
-
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'aaa:00'
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
var SPO = function SPO(x, y) {
|
|
338
|
-
// Do limited canonicalization of bnodes
|
|
339
|
-
return Util.heavyCompareSPO(x, y, kb, uriMap);
|
|
340
|
-
};
|
|
367
|
+
var SPO = function SPO(x, y) {
|
|
368
|
+
// Do limited canonicalization of bnodes
|
|
369
|
+
return Util.heavyCompareSPO(x, y, kb, uriMap);
|
|
370
|
+
};
|
|
341
371
|
|
|
342
|
-
|
|
372
|
+
sts.sort(SPO);
|
|
343
373
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
374
|
+
if (this.base && !this.defaultNamespace) {
|
|
375
|
+
this.defaultNamespace = this.base + '#';
|
|
376
|
+
}
|
|
347
377
|
|
|
348
|
-
|
|
378
|
+
var predMap = {};
|
|
349
379
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
380
|
+
if (this.flags.indexOf('s') < 0) {
|
|
381
|
+
predMap['http://www.w3.org/2002/07/owl#sameAs'] = '=';
|
|
382
|
+
}
|
|
353
383
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
384
|
+
if (this.flags.indexOf('t') < 0) {
|
|
385
|
+
predMap['http://www.w3.org/1999/02/22-rdf-syntax-ns#type'] = 'a';
|
|
386
|
+
}
|
|
357
387
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
388
|
+
if (this.flags.indexOf('i') < 0) {
|
|
389
|
+
predMap['http://www.w3.org/2000/10/swap/log#implies'] = '=>';
|
|
390
|
+
} // //////////////////////// Arrange the bits of text
|
|
361
391
|
|
|
362
392
|
|
|
363
|
-
|
|
364
|
-
|
|
393
|
+
var spaces = function spaces(n) {
|
|
394
|
+
var s = '';
|
|
365
395
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
396
|
+
for (var i = 0; i < n; i++) {
|
|
397
|
+
s += ' ';
|
|
398
|
+
}
|
|
369
399
|
|
|
370
|
-
|
|
371
|
-
|
|
400
|
+
return s;
|
|
401
|
+
};
|
|
372
402
|
|
|
373
|
-
|
|
374
|
-
|
|
403
|
+
var treeToLine = function treeToLine(tree) {
|
|
404
|
+
var str = '';
|
|
375
405
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
406
|
+
for (var i = 0; i < tree.length; i++) {
|
|
407
|
+
var branch = tree[i];
|
|
408
|
+
var s2 = typeof branch === 'string' ? branch : treeToLine(branch); // Note the space before the dot in case statement ends 123. which is in fact allowed but be conservative.
|
|
379
409
|
|
|
380
|
-
|
|
381
|
-
|
|
410
|
+
if (i !== 0) {
|
|
411
|
+
var ch = str.slice(-1) || ' ';
|
|
382
412
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
413
|
+
if (s2 === ',' || s2 === ';') {// no gap
|
|
414
|
+
} else if (s2 === '.' && !'0123456789.'.includes(ch)) {// no gap except after number
|
|
415
|
+
// no gap
|
|
416
|
+
} else {
|
|
417
|
+
str += ' '; // separate from previous token
|
|
418
|
+
}
|
|
388
419
|
}
|
|
389
|
-
}
|
|
390
420
|
|
|
391
|
-
|
|
392
|
-
|
|
421
|
+
str += s2;
|
|
422
|
+
}
|
|
393
423
|
|
|
394
|
-
|
|
395
|
-
|
|
424
|
+
return str;
|
|
425
|
+
}; // Convert a nested tree of lists and strings to a string
|
|
396
426
|
|
|
397
427
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
428
|
+
var treeToString = function treeToString(tree, level) {
|
|
429
|
+
var str = '';
|
|
430
|
+
var lastLength = 100000;
|
|
431
|
+
if (level === undefined) level = -1;
|
|
402
432
|
|
|
403
|
-
|
|
404
|
-
|
|
433
|
+
for (var i = 0; i < tree.length; i++) {
|
|
434
|
+
var branch = tree[i];
|
|
405
435
|
|
|
406
|
-
|
|
407
|
-
|
|
436
|
+
if (typeof branch !== 'string') {
|
|
437
|
+
var substr = treeToString(branch, level + 1);
|
|
408
438
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
439
|
+
if (substr.length < 10 * (width - indent * level) && substr.indexOf('"""') < 0) {
|
|
440
|
+
// Don't mess up multiline strings
|
|
441
|
+
var line = treeToLine(branch);
|
|
412
442
|
|
|
413
|
-
|
|
414
|
-
|
|
443
|
+
if (line.length < width - indent * level) {
|
|
444
|
+
branch = line; // Note! treat as string below
|
|
415
445
|
|
|
416
|
-
|
|
446
|
+
substr = '';
|
|
447
|
+
}
|
|
417
448
|
}
|
|
418
|
-
}
|
|
419
449
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
450
|
+
if (substr) lastLength = 10000;
|
|
451
|
+
str += substr;
|
|
452
|
+
}
|
|
423
453
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
454
|
+
if (typeof branch === 'string') {
|
|
455
|
+
if (branch.length === 1 && str.slice(-1) === '\n') {
|
|
456
|
+
if (',.;'.indexOf(branch) >= 0) {
|
|
457
|
+
str = str.slice(0, -1) + branch + '\n'; // slip punct'n on end
|
|
428
458
|
|
|
429
|
-
|
|
430
|
-
|
|
459
|
+
lastLength += 1;
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
431
462
|
}
|
|
432
|
-
}
|
|
433
463
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
464
|
+
if (lastLength < indent * level + 4 || // if new line not necessary
|
|
465
|
+
lastLength + branch.length + 1 < width && ';.'.indexOf(str[str.length - 2]) < 0) {
|
|
466
|
+
// or the string fits on last line
|
|
467
|
+
str = str.slice(0, -1) + ' ' + branch + '\n'; // then continue on this line
|
|
438
468
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
469
|
+
lastLength += branch.length + 1;
|
|
470
|
+
} else {
|
|
471
|
+
var _line = spaces(indent * level) + branch;
|
|
442
472
|
|
|
443
|
-
|
|
444
|
-
|
|
473
|
+
str += _line + '\n';
|
|
474
|
+
lastLength = _line.length;
|
|
445
475
|
|
|
446
|
-
|
|
447
|
-
|
|
476
|
+
if (level < 0) {
|
|
477
|
+
str += '\n'; // extra blank line
|
|
448
478
|
|
|
449
|
-
|
|
479
|
+
lastLength = 100000; // don't touch
|
|
480
|
+
}
|
|
450
481
|
}
|
|
451
482
|
}
|
|
452
483
|
}
|
|
453
|
-
}
|
|
454
484
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
485
|
+
return str;
|
|
486
|
+
}; // //////////////////////////////////////////// Structure for N3
|
|
487
|
+
// Convert a set of statements into a nested tree of lists and strings
|
|
458
488
|
|
|
459
489
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
490
|
+
function statementListToTreeMethod(statements) {
|
|
491
|
+
var stats = this.rootSubjects(statements);
|
|
492
|
+
var roots = stats.roots;
|
|
493
|
+
var results = [];
|
|
464
494
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
495
|
+
for (var i = 0; i < roots.length; i++) {
|
|
496
|
+
var root = roots[i];
|
|
497
|
+
results.push(subjectTree(root, stats));
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return results;
|
|
468
501
|
}
|
|
469
502
|
|
|
470
|
-
|
|
471
|
-
}
|
|
503
|
+
var statementListToTree = statementListToTreeMethod.bind(this); // The tree for a subject
|
|
472
504
|
|
|
473
|
-
|
|
505
|
+
function subjectTree(subject, stats) {
|
|
506
|
+
if (subject.termType === 'BlankNode' && !stats.incoming[subject]) {
|
|
507
|
+
return objectTree(subject, stats, true).concat(['.']); // Anonymous bnode subject
|
|
508
|
+
}
|
|
474
509
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
return objectTree(subject, stats, true).concat(['.']); // Anonymous bnode subject
|
|
478
|
-
}
|
|
510
|
+
return [termToN3(subject, stats)].concat([propertyTree(subject, stats)]).concat(['.']);
|
|
511
|
+
} // The property tree for a single subject or anonymous node
|
|
479
512
|
|
|
480
|
-
return [termToN3(subject, stats)].concat([propertyTree(subject, stats)]).concat(['.']);
|
|
481
|
-
} // The property tree for a single subject or anonymous node
|
|
482
513
|
|
|
514
|
+
function propertyTreeMethod(subject, stats) {
|
|
515
|
+
var results = [];
|
|
516
|
+
var lastPred = null;
|
|
517
|
+
var sts = stats.subjects[this.toStr(subject)] || []; // relevant statements
|
|
483
518
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
var sts = stats.subjects[this.toStr(subject)] || []; // relevant statements
|
|
519
|
+
if (typeof sts === 'undefined') {
|
|
520
|
+
throw new Error('Cant find statements for ' + subject);
|
|
521
|
+
}
|
|
488
522
|
|
|
489
|
-
|
|
490
|
-
throw new Error('Cant find statements for ' + subject);
|
|
491
|
-
}
|
|
523
|
+
var objects = [];
|
|
492
524
|
|
|
493
|
-
|
|
525
|
+
for (var i = 0; i < sts.length; i++) {
|
|
526
|
+
var st = sts[i];
|
|
494
527
|
|
|
495
|
-
|
|
496
|
-
|
|
528
|
+
if (st.predicate.uri === lastPred) {
|
|
529
|
+
objects.push(',');
|
|
530
|
+
} else {
|
|
531
|
+
if (lastPred) {
|
|
532
|
+
results = results.concat([objects]).concat([';']);
|
|
533
|
+
objects = [];
|
|
534
|
+
}
|
|
497
535
|
|
|
498
|
-
|
|
499
|
-
objects.push(',');
|
|
500
|
-
} else {
|
|
501
|
-
if (lastPred) {
|
|
502
|
-
results = results.concat([objects]).concat([';']);
|
|
503
|
-
objects = [];
|
|
536
|
+
results.push(predMap[st.predicate.uri] ? predMap[st.predicate.uri] : termToN3(st.predicate, stats));
|
|
504
537
|
}
|
|
505
538
|
|
|
506
|
-
|
|
539
|
+
lastPred = st.predicate.uri;
|
|
540
|
+
objects.push(objectTree(st.object, stats));
|
|
507
541
|
}
|
|
508
542
|
|
|
509
|
-
|
|
510
|
-
|
|
543
|
+
results = results.concat([objects]);
|
|
544
|
+
return results;
|
|
511
545
|
}
|
|
512
546
|
|
|
513
|
-
|
|
514
|
-
return results;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
var propertyTree = propertyTreeMethod.bind(this);
|
|
547
|
+
var propertyTree = propertyTreeMethod.bind(this);
|
|
518
548
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
549
|
+
function objectTreeMethod(obj, stats, force) {
|
|
550
|
+
if (obj.termType === 'BlankNode' && (force || stats.rootsHash[obj.toNT()] === undefined)) {
|
|
551
|
+
// if not a root
|
|
552
|
+
if (stats.subjects[this.toStr(obj)]) {
|
|
553
|
+
return ['[', propertyTree(obj, stats), ']'];
|
|
554
|
+
} else {
|
|
555
|
+
return '[]';
|
|
556
|
+
}
|
|
526
557
|
}
|
|
558
|
+
|
|
559
|
+
return termToN3(obj, stats);
|
|
527
560
|
}
|
|
528
561
|
|
|
529
|
-
|
|
530
|
-
}
|
|
562
|
+
var objectTree = objectTreeMethod.bind(this);
|
|
531
563
|
|
|
532
|
-
|
|
564
|
+
function termToN3Method(expr, stats) {
|
|
565
|
+
//
|
|
566
|
+
var i, res;
|
|
533
567
|
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
568
|
+
switch (expr.termType) {
|
|
569
|
+
case 'Graph':
|
|
570
|
+
res = ['{'];
|
|
571
|
+
res = res.concat(statementListToTree(expr.statements));
|
|
572
|
+
return res.concat(['}']);
|
|
537
573
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
res = ['{'];
|
|
541
|
-
res = res.concat(statementListToTree(expr.statements));
|
|
542
|
-
return res.concat(['}']);
|
|
543
|
-
|
|
544
|
-
case 'Collection':
|
|
545
|
-
res = ['('];
|
|
574
|
+
case 'Collection':
|
|
575
|
+
res = ['('];
|
|
546
576
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
577
|
+
for (i = 0; i < expr.elements.length; i++) {
|
|
578
|
+
res.push([objectTree(expr.elements[i], stats)]);
|
|
579
|
+
}
|
|
550
580
|
|
|
551
|
-
|
|
552
|
-
|
|
581
|
+
res.push(')');
|
|
582
|
+
return res;
|
|
553
583
|
|
|
554
|
-
|
|
555
|
-
|
|
584
|
+
default:
|
|
585
|
+
return this.atomicTermToN3(expr);
|
|
586
|
+
}
|
|
556
587
|
}
|
|
557
|
-
}
|
|
558
588
|
|
|
559
|
-
|
|
560
|
-
|
|
589
|
+
Serializer.prototype.termToN3 = termToN3;
|
|
590
|
+
var termToN3 = termToN3Method.bind(this);
|
|
561
591
|
|
|
562
|
-
|
|
563
|
-
|
|
592
|
+
function prefixDirectivesMethod() {
|
|
593
|
+
var str = '';
|
|
564
594
|
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
for (var ns in this.prefixes) {
|
|
570
|
-
if (!this.prefixes.hasOwnProperty(ns)) continue;
|
|
571
|
-
if (!this.namespacesUsed[ns]) continue;
|
|
572
|
-
str += '@prefix ' + this.prefixes[ns] + ': ' + this.explicitURI(ns) + '.\n';
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
return str + '\n';
|
|
576
|
-
}
|
|
595
|
+
if (this.defaultNamespace) {
|
|
596
|
+
str += '@prefix : ' + this.explicitURI(this.defaultNamespace) + '.\n';
|
|
597
|
+
}
|
|
577
598
|
|
|
578
|
-
|
|
599
|
+
for (var ns in this.prefixes) {
|
|
600
|
+
if (!this.prefixes.hasOwnProperty(ns)) continue;
|
|
601
|
+
if (!this.namespacesUsed[ns]) continue;
|
|
602
|
+
str += '@prefix ' + this.prefixes[ns] + ': ' + this.explicitURI(ns) + '.\n';
|
|
603
|
+
}
|
|
579
604
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
}; // //////////////////////////////////////////// Atomic Terms
|
|
583
|
-
// Deal with term level things and nesting with no bnode structure
|
|
605
|
+
return str + '\n';
|
|
606
|
+
}
|
|
584
607
|
|
|
608
|
+
var prefixDirectives = prefixDirectivesMethod.bind(this); // Body of statementsToN3:
|
|
585
609
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
return expr.toNT();
|
|
610
|
+
var tree = statementListToTree(sts);
|
|
611
|
+
return prefixDirectives() + treeToString(tree);
|
|
612
|
+
} // //////////////////////////////////////////// Atomic Terms
|
|
613
|
+
// Deal with term level things and nesting with no bnode structure
|
|
591
614
|
|
|
592
|
-
|
|
593
|
-
|
|
615
|
+
}, {
|
|
616
|
+
key: "atomicTermToN3",
|
|
617
|
+
value: function atomicTermToN3(expr, stats) {
|
|
618
|
+
switch (expr.termType) {
|
|
619
|
+
case 'BlankNode':
|
|
620
|
+
case 'Variable':
|
|
621
|
+
return expr.toNT();
|
|
594
622
|
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
} // var val = expr.value.toString() // should be a string already
|
|
623
|
+
case 'Literal':
|
|
624
|
+
var val = expr.value;
|
|
598
625
|
|
|
626
|
+
if (typeof val !== 'string') {
|
|
627
|
+
throw new TypeError('Value of RDF literal node must be a string');
|
|
628
|
+
} // var val = expr.value.toString() // should be a string already
|
|
599
629
|
|
|
600
|
-
if (expr.datatype && this.flags.indexOf('x') < 0) {
|
|
601
|
-
// Supress native numbers
|
|
602
|
-
switch (expr.datatype.uri) {
|
|
603
|
-
case 'http://www.w3.org/2001/XMLSchema#integer':
|
|
604
|
-
return val;
|
|
605
630
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
631
|
+
if (expr.datatype && this.flags.indexOf('x') < 0) {
|
|
632
|
+
// Supress native numbers
|
|
633
|
+
switch (expr.datatype.uri) {
|
|
634
|
+
case 'http://www.w3.org/2001/XMLSchema#integer':
|
|
635
|
+
return val;
|
|
610
636
|
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
var eNotation = val.toLowerCase().indexOf('e') > 0;
|
|
615
|
-
if (val.indexOf('.') < 0 && !eNotation) val += '.0';
|
|
616
|
-
if (!eNotation) val += 'e0';
|
|
637
|
+
case 'http://www.w3.org/2001/XMLSchema#decimal':
|
|
638
|
+
// In urtle must have dot
|
|
639
|
+
if (val.indexOf('.') < 0) val += '.0';
|
|
617
640
|
return val;
|
|
618
|
-
}
|
|
619
641
|
|
|
620
|
-
|
|
621
|
-
|
|
642
|
+
case 'http://www.w3.org/2001/XMLSchema#double':
|
|
643
|
+
{
|
|
644
|
+
// Must force use of 'e'
|
|
645
|
+
var eNotation = val.toLowerCase().indexOf('e') > 0;
|
|
646
|
+
if (val.indexOf('.') < 0 && !eNotation) val += '.0';
|
|
647
|
+
if (!eNotation) val += 'e0';
|
|
648
|
+
return val;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
case 'http://www.w3.org/2001/XMLSchema#boolean':
|
|
652
|
+
return expr.value === '1' ? 'true' : 'false';
|
|
653
|
+
}
|
|
622
654
|
}
|
|
623
|
-
}
|
|
624
655
|
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
if (expr.language) {
|
|
628
|
-
str += '@' + expr.language;
|
|
629
|
-
} else if (!expr.datatype.equals(this.xsd.string)) {
|
|
630
|
-
str += '^^' + this.atomicTermToN3(expr.datatype, stats);
|
|
631
|
-
}
|
|
656
|
+
var str = this.stringToN3(expr.value);
|
|
632
657
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
658
|
+
if (expr.language) {
|
|
659
|
+
str += '@' + expr.language;
|
|
660
|
+
} else if (!expr.datatype.equals(this.xsd.string)) {
|
|
661
|
+
str += '^^' + this.atomicTermToN3(expr.datatype, stats);
|
|
662
|
+
}
|
|
637
663
|
|
|
638
|
-
|
|
639
|
-
throw new Error('Internal: atomicTermToN3 cannot handle ' + expr + ' of termType: ' + expr.termType);
|
|
640
|
-
}
|
|
641
|
-
}; // stringToN3: String escaping for N3
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
__Serializer.prototype.validPrefix = new RegExp(/^[a-zA-Z][a-zA-Z0-9]*$/);
|
|
645
|
-
__Serializer.prototype.forbidden1 = new RegExp(/[\\"\b\f\r\v\t\n\u0080-\uffff]/gm);
|
|
646
|
-
__Serializer.prototype.forbidden3 = new RegExp(/[\\"\b\f\r\v\u0080-\uffff]/gm);
|
|
647
|
-
|
|
648
|
-
__Serializer.prototype.stringToN3 = function stringToN3(str, flags) {
|
|
649
|
-
if (!flags) flags = 'e';
|
|
650
|
-
var res = '';
|
|
651
|
-
var i, j, k;
|
|
652
|
-
var delim;
|
|
653
|
-
var forbidden;
|
|
654
|
-
|
|
655
|
-
if (str.length > 20 && // Long enough to make sense
|
|
656
|
-
str.slice(-1) !== '"' && // corner case'
|
|
657
|
-
flags.indexOf('n') < 0 && ( // Force single line
|
|
658
|
-
str.indexOf('\n') > 0 || str.indexOf('"') > 0)) {
|
|
659
|
-
delim = '"""';
|
|
660
|
-
forbidden = __Serializer.prototype.forbidden3;
|
|
661
|
-
} else {
|
|
662
|
-
delim = '"';
|
|
663
|
-
forbidden = __Serializer.prototype.forbidden1;
|
|
664
|
-
}
|
|
664
|
+
return str;
|
|
665
665
|
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
var m = forbidden.exec(str.slice(i));
|
|
669
|
-
if (m == null) break;
|
|
670
|
-
j = i + forbidden.lastIndex - 1;
|
|
671
|
-
res += str.slice(i, j);
|
|
672
|
-
var ch = str[j];
|
|
666
|
+
case 'NamedNode':
|
|
667
|
+
return this.symbolToN3(expr);
|
|
673
668
|
|
|
674
|
-
|
|
675
|
-
|
|
669
|
+
default:
|
|
670
|
+
throw new Error('Internal: atomicTermToN3 cannot handle ' + expr + ' of termType: ' + expr.termType);
|
|
671
|
+
}
|
|
672
|
+
} // stringToN3: String escaping for N3
|
|
673
|
+
|
|
674
|
+
}, {
|
|
675
|
+
key: "stringToN3",
|
|
676
|
+
value: function stringToN3(str, flags) {
|
|
677
|
+
if (!flags) flags = 'e';
|
|
678
|
+
var res = '';
|
|
679
|
+
var i, j, k;
|
|
680
|
+
var delim;
|
|
681
|
+
var forbidden;
|
|
682
|
+
|
|
683
|
+
if (str.length > 20 && // Long enough to make sense
|
|
684
|
+
str.slice(-1) !== '"' && // corner case'
|
|
685
|
+
flags.indexOf('n') < 0 && ( // Force single line
|
|
686
|
+
str.indexOf('\n') > 0 || str.indexOf('"') > 0)) {
|
|
687
|
+
delim = '"""';
|
|
688
|
+
forbidden = this.forbidden3;
|
|
676
689
|
} else {
|
|
677
|
-
|
|
690
|
+
delim = '"';
|
|
691
|
+
forbidden = this.forbidden1;
|
|
692
|
+
}
|
|
678
693
|
|
|
679
|
-
|
|
680
|
-
|
|
694
|
+
for (i = 0; i < str.length;) {
|
|
695
|
+
forbidden.lastIndex = 0;
|
|
696
|
+
var m = forbidden.exec(str.slice(i));
|
|
697
|
+
if (m == null) break;
|
|
698
|
+
j = i + forbidden.lastIndex - 1;
|
|
699
|
+
res += str.slice(i, j);
|
|
700
|
+
var ch = str[j];
|
|
701
|
+
|
|
702
|
+
if (ch === '"' && delim === '"""' && str.slice(j, j + 3) !== '"""') {
|
|
703
|
+
res += ch;
|
|
681
704
|
} else {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
705
|
+
k = '\b\f\r\t\v\n\\"'.indexOf(ch); // No escaping of bell (7)?
|
|
706
|
+
|
|
707
|
+
if (k >= 0) {
|
|
708
|
+
res += '\\' + 'bfrtvn\\"'[k];
|
|
685
709
|
} else {
|
|
686
|
-
|
|
687
|
-
|
|
710
|
+
if (flags.indexOf('e') >= 0) {
|
|
711
|
+
// Unicode escaping in strings not unix style
|
|
712
|
+
res += "\\u" + ('000' + ch.charCodeAt(0).toString(16).toLowerCase()).slice(-4);
|
|
713
|
+
} else {
|
|
714
|
+
// no 'e' flag
|
|
715
|
+
res += ch;
|
|
716
|
+
}
|
|
688
717
|
}
|
|
689
718
|
}
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
i = j + 1;
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
return delim + res + str.slice(i) + delim;
|
|
696
|
-
}; // A single symbol, either in <> or namespace notation
|
|
697
719
|
|
|
720
|
+
i = j + 1;
|
|
721
|
+
}
|
|
698
722
|
|
|
699
|
-
|
|
700
|
-
//
|
|
701
|
-
var uri = x.uri;
|
|
702
|
-
var j = uri.indexOf('#');
|
|
723
|
+
return delim + res + str.slice(i) + delim;
|
|
724
|
+
} // A single symbol, either in <> or namespace notation
|
|
703
725
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
var canSplit = true;
|
|
726
|
+
}, {
|
|
727
|
+
key: "symbolToN3",
|
|
728
|
+
value: function symbolToN3(x) {
|
|
729
|
+
// c.f. symbolString() in notation3.py
|
|
730
|
+
var uri = x.uri;
|
|
731
|
+
var j = uri.indexOf('#');
|
|
711
732
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
canSplit = false;
|
|
715
|
-
break;
|
|
716
|
-
}
|
|
733
|
+
if (j < 0 && this.flags.indexOf('/') < 0) {
|
|
734
|
+
j = uri.lastIndexOf('/');
|
|
717
735
|
}
|
|
718
|
-
/*
|
|
719
|
-
if (uri.slice(0, j + 1) === this.base + '#') { // base-relative
|
|
720
|
-
if (canSplit) {
|
|
721
|
-
return ':' + uri.slice(j + 1) // assume deafult ns is local
|
|
722
|
-
} else {
|
|
723
|
-
return '<#' + uri.slice(j + 1) + '>'
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
*/
|
|
727
736
|
|
|
737
|
+
if (j >= 0 && this.flags.indexOf('p') < 0 && ( // Can split at namespace but only if http[s]: URI or file: or ws[s] (why not others?)
|
|
738
|
+
uri.indexOf('http') === 0 || uri.indexOf('ws') === 0 || uri.indexOf('file') === 0)) {
|
|
739
|
+
var canSplit = true;
|
|
728
740
|
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
if (this.defaultNamespace && this.defaultNamespace === namesp && this.flags.indexOf('d') < 0) {
|
|
734
|
-
// d -> suppress default
|
|
735
|
-
if (this.flags.indexOf('k') >= 0 && this.keyords.indexOf(localid) < 0) {
|
|
736
|
-
return localid;
|
|
741
|
+
for (var k = j + 1; k < uri.length; k++) {
|
|
742
|
+
if (this._notNameChars.indexOf(uri[k]) >= 0) {
|
|
743
|
+
canSplit = false;
|
|
744
|
+
break;
|
|
737
745
|
}
|
|
746
|
+
}
|
|
747
|
+
/*
|
|
748
|
+
if (uri.slice(0, j + 1) === this.base + '#') { // base-relative
|
|
749
|
+
if (canSplit) {
|
|
750
|
+
return ':' + uri.slice(j + 1) // assume deafult ns is local
|
|
751
|
+
} else {
|
|
752
|
+
return '<#' + uri.slice(j + 1) + '>'
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
*/
|
|
738
756
|
|
|
739
|
-
return ':' + localid;
|
|
740
|
-
} // this.checkIntegrity() // @@@ Remove when not testing
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
var prefix = this.prefixes[namesp];
|
|
744
|
-
if (!prefix) prefix = this.makeUpPrefix(namesp);
|
|
745
|
-
|
|
746
|
-
if (prefix) {
|
|
747
|
-
this.namespacesUsed[namesp] = true;
|
|
748
|
-
return prefix + ':' + localid;
|
|
749
|
-
} // Fall though if can't do qname
|
|
750
757
|
|
|
751
|
-
|
|
752
|
-
|
|
758
|
+
if (canSplit) {
|
|
759
|
+
var localid = uri.slice(j + 1);
|
|
760
|
+
var namesp = uri.slice(0, j + 1);
|
|
753
761
|
|
|
754
|
-
|
|
755
|
-
|
|
762
|
+
if (this.defaultNamespace && this.defaultNamespace === namesp && this.flags.indexOf('d') < 0) {
|
|
763
|
+
// d -> suppress default
|
|
764
|
+
if (this.flags.indexOf('k') >= 0 && this.keyords.indexOf(localid) < 0) {
|
|
765
|
+
return localid;
|
|
766
|
+
}
|
|
756
767
|
|
|
768
|
+
return ':' + localid;
|
|
769
|
+
} // this.checkIntegrity() // @@@ Remove when not testing
|
|
757
770
|
|
|
758
|
-
function hexify(str) {
|
|
759
|
-
// also used in parser
|
|
760
|
-
return encodeURI(str);
|
|
761
|
-
}
|
|
762
771
|
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
var k;
|
|
772
|
+
var prefix = this.prefixes[namesp];
|
|
773
|
+
if (!prefix) prefix = this.makeUpPrefix(namesp);
|
|
766
774
|
|
|
767
|
-
|
|
768
|
-
|
|
775
|
+
if (prefix) {
|
|
776
|
+
this.namespacesUsed[namesp] = true;
|
|
777
|
+
return prefix + ':' + localid;
|
|
778
|
+
} // Fall though if can't do qname
|
|
769
779
|
|
|
770
|
-
|
|
771
|
-
res += "\\U" + ('00000000' + k.toString(16)).slice(-8); // convert to upper?
|
|
772
|
-
} else if (k > 126) {
|
|
773
|
-
res += "\\u" + ('0000' + k.toString(16)).slice(-4);
|
|
774
|
-
} else {
|
|
775
|
-
res += str[i];
|
|
780
|
+
}
|
|
776
781
|
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
return res;
|
|
780
|
-
} // /////////////////////////// Quad store serialization
|
|
781
|
-
// @para. write - a function taking a single string to be output
|
|
782
|
-
//
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
__Serializer.prototype.writeStore = function (write) {
|
|
786
|
-
var kb = this.store;
|
|
787
|
-
var fetcher = kb.fetcher;
|
|
788
|
-
var session = fetcher && fetcher.appNode; // The core data
|
|
789
782
|
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
var
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
783
|
+
return this.explicitURI(uri);
|
|
784
|
+
} // /////////////////////////// Quad store serialization
|
|
785
|
+
// @para. write - a function taking a single string to be output
|
|
786
|
+
//
|
|
787
|
+
|
|
788
|
+
}, {
|
|
789
|
+
key: "writeStore",
|
|
790
|
+
value: function writeStore(write) {
|
|
791
|
+
var kb = this.store;
|
|
792
|
+
var fetcher = kb.fetcher;
|
|
793
|
+
var session = fetcher && fetcher.appNode; // The core data
|
|
794
|
+
|
|
795
|
+
var sources = this.store.index[3];
|
|
796
|
+
|
|
797
|
+
for (var s in sources) {
|
|
798
|
+
// -> assume we can use -> as short for log:semantics
|
|
799
|
+
var source = kb.fromNT(s);
|
|
800
|
+
if (session && source.equals(session)) continue;
|
|
801
|
+
write('\n' + this.atomicTermToN3(source) + ' ' + this.atomicTermToN3(kb.sym('http://www.w3.org/2000/10/swap/log#semantics')) + ' { ' + this.statementsToN3(kb.statementsMatching(undefined, undefined, undefined, source)) + ' }.\n');
|
|
802
|
+
} // The metadata from HTTP interactions:
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
kb.statementsMatching(undefined, kb.sym('http://www.w3.org/2007/ont/link#requestedURI')).map(function (st) {
|
|
806
|
+
write('\n<' + st.object.value + '> log:metadata {\n');
|
|
807
|
+
var sts = kb.statementsMatching(undefined, undefined, undefined, st.subject);
|
|
808
|
+
write(this.statementsToN3(this.statementsToN3(sts)));
|
|
809
|
+
write('}.\n');
|
|
810
|
+
}); // Inferences we have made ourselves not attributable to anyone else
|
|
811
|
+
|
|
812
|
+
var metaSources = [];
|
|
813
|
+
if (session) metaSources.push(session);
|
|
814
|
+
var metadata = [];
|
|
815
|
+
metaSources.map(function (source) {
|
|
816
|
+
metadata = metadata.concat(kb.statementsMatching(undefined, undefined, undefined, source));
|
|
817
|
+
});
|
|
818
|
+
write(this.statementsToN3(metadata));
|
|
819
|
+
} // ////////////////////////////////////////////// XML serialization
|
|
806
820
|
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
write(this.statementsToN3(metadata));
|
|
814
|
-
}; // ////////////////////////////////////////////// XML serialization
|
|
821
|
+
}, {
|
|
822
|
+
key: "statementsToXML",
|
|
823
|
+
value: function statementsToXML(sts) {
|
|
824
|
+
var indent = 4;
|
|
825
|
+
var width = 80;
|
|
826
|
+
var namespaceCounts = []; // which have been used
|
|
815
827
|
|
|
828
|
+
namespaceCounts['http://www.w3.org/1999/02/22-rdf-syntax-ns#'] = true;
|
|
829
|
+
var liPrefix = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_'; // prefix for ordered list items
|
|
830
|
+
// //////////////////////// Arrange the bits of XML text
|
|
816
831
|
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
var width = 80;
|
|
820
|
-
var namespaceCounts = []; // which have been used
|
|
832
|
+
var spaces = function spaces(n) {
|
|
833
|
+
var s = '';
|
|
821
834
|
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
835
|
+
for (var i = 0; i < n; i++) {
|
|
836
|
+
s += ' ';
|
|
837
|
+
}
|
|
825
838
|
|
|
826
|
-
|
|
827
|
-
|
|
839
|
+
return s;
|
|
840
|
+
};
|
|
828
841
|
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
}
|
|
842
|
+
var XMLtreeToLine = function XMLtreeToLine(tree) {
|
|
843
|
+
var str = '';
|
|
832
844
|
|
|
833
|
-
|
|
834
|
-
|
|
845
|
+
for (var i = 0; i < tree.length; i++) {
|
|
846
|
+
var branch = tree[i];
|
|
847
|
+
var s2 = typeof branch === 'string' ? branch : XMLtreeToLine(branch);
|
|
848
|
+
str += s2;
|
|
849
|
+
}
|
|
835
850
|
|
|
836
|
-
|
|
837
|
-
|
|
851
|
+
return str;
|
|
852
|
+
}; // Convert a nested tree of lists and strings to a string
|
|
838
853
|
|
|
839
|
-
for (var i = 0; i < tree.length; i++) {
|
|
840
|
-
var branch = tree[i];
|
|
841
|
-
var s2 = typeof branch === 'string' ? branch : XMLtreeToLine(branch);
|
|
842
|
-
str += s2;
|
|
843
|
-
}
|
|
844
854
|
|
|
845
|
-
|
|
846
|
-
|
|
855
|
+
var XMLtreeToString = function XMLtreeToString(tree, level) {
|
|
856
|
+
var str = '';
|
|
857
|
+
var line;
|
|
858
|
+
var lastLength = 100000;
|
|
859
|
+
if (!level) level = 0;
|
|
847
860
|
|
|
861
|
+
for (var i = 0; i < tree.length; i++) {
|
|
862
|
+
var branch = tree[i];
|
|
848
863
|
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
var line;
|
|
852
|
-
var lastLength = 100000;
|
|
853
|
-
if (!level) level = 0;
|
|
864
|
+
if (typeof branch !== 'string') {
|
|
865
|
+
var substr = XMLtreeToString(branch, level + 1);
|
|
854
866
|
|
|
855
|
-
|
|
856
|
-
|
|
867
|
+
if (substr.length < 10 * (width - indent * level) && substr.indexOf('"""') < 0) {
|
|
868
|
+
// Don't mess up multiline strings
|
|
869
|
+
line = XMLtreeToLine(branch);
|
|
857
870
|
|
|
858
|
-
|
|
859
|
-
|
|
871
|
+
if (line.length < width - indent * level) {
|
|
872
|
+
branch = ' ' + line; // @@ Hack: treat as string below
|
|
860
873
|
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
874
|
+
substr = '';
|
|
875
|
+
}
|
|
876
|
+
}
|
|
864
877
|
|
|
865
|
-
if (
|
|
866
|
-
|
|
878
|
+
if (substr) lastLength = 10000;
|
|
879
|
+
str += substr;
|
|
880
|
+
}
|
|
867
881
|
|
|
868
|
-
|
|
882
|
+
if (typeof branch === 'string') {
|
|
883
|
+
if (lastLength < indent * level + 4) {
|
|
884
|
+
// continue
|
|
885
|
+
str = str.slice(0, -1) + ' ' + branch + '\n';
|
|
886
|
+
lastLength += branch.length + 1;
|
|
887
|
+
} else {
|
|
888
|
+
line = spaces(indent * level) + branch;
|
|
889
|
+
str += line + '\n';
|
|
890
|
+
lastLength = line.length;
|
|
869
891
|
}
|
|
892
|
+
} else {// not string
|
|
870
893
|
}
|
|
871
|
-
|
|
872
|
-
if (substr) lastLength = 10000;
|
|
873
|
-
str += substr;
|
|
874
894
|
}
|
|
875
895
|
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
// continue
|
|
879
|
-
str = str.slice(0, -1) + ' ' + branch + '\n';
|
|
880
|
-
lastLength += branch.length + 1;
|
|
881
|
-
} else {
|
|
882
|
-
line = spaces(indent * level) + branch;
|
|
883
|
-
str += line + '\n';
|
|
884
|
-
lastLength = line.length;
|
|
885
|
-
}
|
|
886
|
-
} else {// not string
|
|
887
|
-
}
|
|
888
|
-
}
|
|
896
|
+
return str;
|
|
897
|
+
};
|
|
889
898
|
|
|
890
|
-
|
|
891
|
-
|
|
899
|
+
function statementListToXMLTreeMethod(statements) {
|
|
900
|
+
this.suggestPrefix('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
|
|
901
|
+
var stats = this.rootSubjects(statements);
|
|
902
|
+
var roots = stats.roots;
|
|
903
|
+
var results = [];
|
|
892
904
|
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
var results = [];
|
|
905
|
+
for (var i = 0; i < roots.length; i++) {
|
|
906
|
+
var root = roots[i];
|
|
907
|
+
results.push(subjectXMLTree(root, stats));
|
|
908
|
+
}
|
|
898
909
|
|
|
899
|
-
|
|
900
|
-
var root = roots[i];
|
|
901
|
-
results.push(subjectXMLTree(root, stats));
|
|
910
|
+
return results;
|
|
902
911
|
}
|
|
903
912
|
|
|
904
|
-
|
|
905
|
-
}
|
|
913
|
+
var statementListToXMLTree = statementListToXMLTreeMethod.bind(this);
|
|
906
914
|
|
|
907
|
-
|
|
915
|
+
function escapeForXML(str) {
|
|
916
|
+
if (typeof str === 'undefined') return '@@@undefined@@@@';
|
|
917
|
+
return str.replace(/[&<"]/g, function (m) {
|
|
918
|
+
switch (m[0]) {
|
|
919
|
+
case '&':
|
|
920
|
+
return '&';
|
|
908
921
|
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
return str.replace(/[&<"]/g, function (m) {
|
|
912
|
-
switch (m[0]) {
|
|
913
|
-
case '&':
|
|
914
|
-
return '&';
|
|
922
|
+
case '<':
|
|
923
|
+
return '<';
|
|
915
924
|
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
}
|
|
923
|
-
});
|
|
924
|
-
}
|
|
925
|
+
case '"':
|
|
926
|
+
return '"';
|
|
927
|
+
// '
|
|
928
|
+
}
|
|
929
|
+
});
|
|
930
|
+
}
|
|
925
931
|
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
932
|
+
function relURIMethod(term) {
|
|
933
|
+
return escapeForXML(this.base ? Util.uri.refTo(this.base, term.uri) : term.uri);
|
|
934
|
+
}
|
|
929
935
|
|
|
930
|
-
|
|
936
|
+
var relURI = relURIMethod.bind(this); // The tree for a subject
|
|
931
937
|
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
938
|
+
function subjectXMLTreeMethod(subject, stats) {
|
|
939
|
+
var results = [];
|
|
940
|
+
var type, t, st, pred;
|
|
941
|
+
var sts = stats.subjects[this.toStr(subject)]; // relevant statements
|
|
936
942
|
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
943
|
+
if (typeof sts === 'undefined') {
|
|
944
|
+
// empty bnode
|
|
945
|
+
return propertyXMLTree(subject, stats);
|
|
946
|
+
} // Sort only on the predicate, leave the order at object
|
|
947
|
+
// level undisturbed. This leaves multilingual content in
|
|
948
|
+
// the order of entry (for partner literals), which helps
|
|
949
|
+
// readability.
|
|
950
|
+
//
|
|
951
|
+
// For the predicate sort, we attempt to split the uri
|
|
952
|
+
// as a hint to the sequence
|
|
947
953
|
|
|
948
954
|
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
955
|
+
sts.sort(function (a, b) {
|
|
956
|
+
var ap = a.predicate.uri;
|
|
957
|
+
var bp = b.predicate.uri;
|
|
952
958
|
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
959
|
+
if (ap.substring(0, liPrefix.length) === liPrefix || bp.substring(0, liPrefix.length) === liPrefix) {
|
|
960
|
+
// we're only interested in sorting list items
|
|
961
|
+
return ap.localeCompare(bp);
|
|
962
|
+
}
|
|
957
963
|
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
964
|
+
var as = ap.substring(liPrefix.length);
|
|
965
|
+
var bs = bp.substring(liPrefix.length);
|
|
966
|
+
var an = parseInt(as, 10);
|
|
967
|
+
var bn = parseInt(bs, 10);
|
|
962
968
|
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
969
|
+
if (isNaN(an) || isNaN(bn) || an !== as || bn !== bs) {
|
|
970
|
+
// we only care about integers
|
|
971
|
+
return ap.localeCompare(bp);
|
|
972
|
+
}
|
|
967
973
|
|
|
968
|
-
|
|
969
|
-
|
|
974
|
+
return an - bn;
|
|
975
|
+
});
|
|
970
976
|
|
|
971
|
-
|
|
972
|
-
|
|
977
|
+
for (var i = 0; i < sts.length; i++) {
|
|
978
|
+
st = sts[i]; // look for a type
|
|
973
979
|
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
980
|
+
if (st.predicate.uri === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' && !type && st.object.termType === 'NamedNode') {
|
|
981
|
+
type = st.object;
|
|
982
|
+
continue; // don't include it as a child element
|
|
983
|
+
} // see whether predicate can be replaced with "li"
|
|
978
984
|
|
|
979
985
|
|
|
980
|
-
|
|
986
|
+
pred = st.predicate;
|
|
981
987
|
|
|
982
|
-
|
|
983
|
-
|
|
988
|
+
if (pred.uri.substr(0, liPrefix.length) === liPrefix) {
|
|
989
|
+
var number = pred.uri.substr(liPrefix.length); // make sure these are actually numeric list items
|
|
984
990
|
|
|
985
|
-
|
|
991
|
+
var intNumber = parseInt(number, 10);
|
|
986
992
|
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
993
|
+
if (number === intNumber.toString()) {
|
|
994
|
+
// was numeric; don't need to worry about ordering since we've already
|
|
995
|
+
// sorted the statements
|
|
996
|
+
pred = this.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#li');
|
|
997
|
+
}
|
|
991
998
|
}
|
|
992
|
-
}
|
|
993
999
|
|
|
994
|
-
|
|
1000
|
+
t = qname(pred);
|
|
995
1001
|
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1002
|
+
switch (st.object.termType) {
|
|
1003
|
+
case 'BlankNode':
|
|
1004
|
+
if (stats.incoming[st.object].length === 1) {
|
|
1005
|
+
// there should always be something in the incoming array for a bnode
|
|
1006
|
+
results = results.concat(['<' + t + ' rdf:parseType="Resource">', subjectXMLTree(st.object, stats), '</' + t + '>']);
|
|
1007
|
+
} else {
|
|
1008
|
+
results = results.concat(['<' + t + ' rdf:nodeID="' + st.object.toNT().slice(2) + '"/>']);
|
|
1009
|
+
}
|
|
1004
1010
|
|
|
1005
|
-
|
|
1011
|
+
break;
|
|
1006
1012
|
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1013
|
+
case 'NamedNode':
|
|
1014
|
+
results = results.concat(['<' + t + ' rdf:resource="' + relURI(st.object) + '"/>']);
|
|
1015
|
+
break;
|
|
1010
1016
|
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1017
|
+
case 'Literal':
|
|
1018
|
+
results = results.concat(['<' + t + (st.object.datatype.equals(this.xsd.string) ? '' : ' rdf:datatype="' + escapeForXML(st.object.datatype.uri) + '"') + (st.object.language ? ' xml:lang="' + st.object.language + '"' : '') + '>' + escapeForXML(st.object.value) + '</' + t + '>']);
|
|
1019
|
+
break;
|
|
1014
1020
|
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1021
|
+
case 'Collection':
|
|
1022
|
+
results = results.concat(['<' + t + ' rdf:parseType="Collection">', collectionXMLTree(st.object, stats), '</' + t + '>']);
|
|
1023
|
+
break;
|
|
1018
1024
|
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1025
|
+
default:
|
|
1026
|
+
throw new Error("Can't serialize object of type " + st.object.termType + ' into XML');
|
|
1027
|
+
} // switch
|
|
1022
1028
|
|
|
1023
|
-
|
|
1029
|
+
}
|
|
1024
1030
|
|
|
1025
|
-
|
|
1026
|
-
|
|
1031
|
+
var tag = type ? qname(type) : 'rdf:Description';
|
|
1032
|
+
var attrs = '';
|
|
1027
1033
|
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1034
|
+
if (subject.termType === 'BlankNode') {
|
|
1035
|
+
if (!stats.incoming[subject] || stats.incoming[subject].length !== 1) {
|
|
1036
|
+
// not an anonymous bnode
|
|
1037
|
+
attrs = ' rdf:nodeID="' + subject.toNT().slice(2) + '"';
|
|
1038
|
+
}
|
|
1039
|
+
} else {
|
|
1040
|
+
attrs = ' rdf:about="' + relURI(subject) + '"';
|
|
1032
1041
|
}
|
|
1033
|
-
|
|
1034
|
-
|
|
1042
|
+
|
|
1043
|
+
return ['<' + tag + attrs + '>'].concat([results]).concat(['</' + tag + '>']);
|
|
1035
1044
|
}
|
|
1036
1045
|
|
|
1037
|
-
|
|
1038
|
-
}
|
|
1046
|
+
var subjectXMLTree = subjectXMLTreeMethod.bind(this);
|
|
1039
1047
|
|
|
1040
|
-
|
|
1048
|
+
function collectionXMLTree(subject, stats) {
|
|
1049
|
+
var res = [];
|
|
1041
1050
|
|
|
1042
|
-
|
|
1043
|
-
|
|
1051
|
+
for (var i = 0; i < subject.elements.length; i++) {
|
|
1052
|
+
res.push(subjectXMLTree(subject.elements[i], stats));
|
|
1053
|
+
}
|
|
1044
1054
|
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
}
|
|
1055
|
+
return res;
|
|
1056
|
+
} // The property tree for a single subject or anonymos node
|
|
1048
1057
|
|
|
1049
|
-
return res;
|
|
1050
|
-
} // The property tree for a single subject or anonymos node
|
|
1051
1058
|
|
|
1059
|
+
function propertyXMLTreeMethod(subject, stats) {
|
|
1060
|
+
var results = [];
|
|
1061
|
+
var sts = stats.subjects[this.toStr(subject)]; // relevant statements
|
|
1052
1062
|
|
|
1053
|
-
|
|
1054
|
-
var results = [];
|
|
1055
|
-
var sts = stats.subjects[this.toStr(subject)]; // relevant statements
|
|
1063
|
+
if (!sts) return results; // No relevant statements
|
|
1056
1064
|
|
|
1057
|
-
|
|
1065
|
+
sts.sort();
|
|
1058
1066
|
|
|
1059
|
-
|
|
1067
|
+
for (var i = 0; i < sts.length; i++) {
|
|
1068
|
+
var st = sts[i];
|
|
1060
1069
|
|
|
1061
|
-
|
|
1062
|
-
|
|
1070
|
+
switch (st.object.termType) {
|
|
1071
|
+
case 'BlankNode':
|
|
1072
|
+
if (stats.rootsHash[st.object.toNT()]) {
|
|
1073
|
+
// This bnode has been done as a root -- no content here @@ what bout first time
|
|
1074
|
+
results = results.concat(['<' + qname(st.predicate) + ' rdf:nodeID="' + st.object.toNT().slice(2) + '">', '</' + qname(st.predicate) + '>']);
|
|
1075
|
+
} else {
|
|
1076
|
+
results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Resource">', propertyXMLTree(st.object, stats), '</' + qname(st.predicate) + '>']);
|
|
1077
|
+
}
|
|
1063
1078
|
|
|
1064
|
-
|
|
1065
|
-
case 'BlankNode':
|
|
1066
|
-
if (stats.rootsHash[st.object.toNT()]) {
|
|
1067
|
-
// This bnode has been done as a root -- no content here @@ what bout first time
|
|
1068
|
-
results = results.concat(['<' + qname(st.predicate) + ' rdf:nodeID="' + st.object.toNT().slice(2) + '">', '</' + qname(st.predicate) + '>']);
|
|
1069
|
-
} else {
|
|
1070
|
-
results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Resource">', propertyXMLTree(st.object, stats), '</' + qname(st.predicate) + '>']);
|
|
1071
|
-
}
|
|
1079
|
+
break;
|
|
1072
1080
|
|
|
1073
|
-
|
|
1081
|
+
case 'NamedNode':
|
|
1082
|
+
results = results.concat(['<' + qname(st.predicate) + ' rdf:resource="' + relURI(st.object) + '"/>']);
|
|
1083
|
+
break;
|
|
1074
1084
|
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1085
|
+
case 'Literal':
|
|
1086
|
+
results = results.concat(['<' + qname(st.predicate) + (st.object.datatype.equals(this.xsd.string) ? '' : ' rdf:datatype="' + escapeForXML(st.object.datatype.value) + '"') + (st.object.language ? ' xml:lang="' + st.object.language + '"' : '') + '>' + escapeForXML(st.object.value) + '</' + qname(st.predicate) + '>']);
|
|
1087
|
+
break;
|
|
1078
1088
|
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1089
|
+
case 'Collection':
|
|
1090
|
+
results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Collection">', collectionXMLTree(st.object, stats), '</' + qname(st.predicate) + '>']);
|
|
1091
|
+
break;
|
|
1082
1092
|
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1093
|
+
default:
|
|
1094
|
+
throw new Error("Can't serialize object of type " + st.object.termType + ' into XML');
|
|
1095
|
+
} // switch
|
|
1086
1096
|
|
|
1087
|
-
|
|
1088
|
-
throw new Error("Can't serialize object of type " + st.object.termType + ' into XML');
|
|
1089
|
-
} // switch
|
|
1097
|
+
}
|
|
1090
1098
|
|
|
1099
|
+
return results;
|
|
1091
1100
|
}
|
|
1092
1101
|
|
|
1093
|
-
|
|
1094
|
-
}
|
|
1102
|
+
var propertyXMLTree = propertyXMLTreeMethod.bind(this);
|
|
1095
1103
|
|
|
1096
|
-
|
|
1104
|
+
function qnameMethod(term) {
|
|
1105
|
+
var uri = term.uri;
|
|
1106
|
+
var j = uri.indexOf('#');
|
|
1097
1107
|
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1108
|
+
if (j < 0 && this.flags.indexOf('/') < 0) {
|
|
1109
|
+
j = uri.lastIndexOf('/');
|
|
1110
|
+
}
|
|
1101
1111
|
|
|
1102
|
-
|
|
1103
|
-
j = uri.lastIndexOf('/');
|
|
1104
|
-
}
|
|
1112
|
+
if (j < 0) throw new Error('Cannot make qname out of <' + uri + '>');
|
|
1105
1113
|
|
|
1106
|
-
|
|
1114
|
+
for (var k = j + 1; k < uri.length; k++) {
|
|
1115
|
+
if (this._notNameChars.indexOf(uri[k]) >= 0) {
|
|
1116
|
+
throw new Error('Invalid character "' + uri[k] + '" cannot be in XML qname for URI: ' + uri);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1107
1119
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1120
|
+
var localid = uri.slice(j + 1);
|
|
1121
|
+
var namesp = uri.slice(0, j + 1);
|
|
1122
|
+
|
|
1123
|
+
if (this.defaultNamespace && this.defaultNamespace === namesp && this.flags.indexOf('d') < 0) {
|
|
1124
|
+
// d -> suppress default
|
|
1125
|
+
return localid;
|
|
1111
1126
|
}
|
|
1127
|
+
|
|
1128
|
+
var prefix = this.prefixes[namesp];
|
|
1129
|
+
if (!prefix) prefix = this.makeUpPrefix(namesp);
|
|
1130
|
+
namespaceCounts[namesp] = true;
|
|
1131
|
+
return prefix + ':' + localid;
|
|
1112
1132
|
}
|
|
1113
1133
|
|
|
1114
|
-
var
|
|
1115
|
-
var namesp = uri.slice(0, j + 1);
|
|
1134
|
+
var qname = qnameMethod.bind(this); // Body of toXML:
|
|
1116
1135
|
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1136
|
+
var tree = statementListToXMLTree(sts);
|
|
1137
|
+
var str = '<rdf:RDF';
|
|
1138
|
+
|
|
1139
|
+
if (this.defaultNamespace) {
|
|
1140
|
+
str += ' xmlns="' + escapeForXML(this.defaultNamespace) + '"';
|
|
1120
1141
|
}
|
|
1121
1142
|
|
|
1122
|
-
var
|
|
1123
|
-
|
|
1124
|
-
namespaceCounts[namesp] = true;
|
|
1125
|
-
return prefix + ':' + localid;
|
|
1126
|
-
}
|
|
1143
|
+
for (var ns in namespaceCounts) {
|
|
1144
|
+
if (!namespaceCounts.hasOwnProperty(ns)) continue; // Rel uris in xml ns is not strictly allowed in the XMLNS spec but needed in practice often
|
|
1127
1145
|
|
|
1128
|
-
|
|
1146
|
+
var ns2 = this.base && this.flags.includes('z') ? Util.uri.refTo(this.base, ns) : ns;
|
|
1147
|
+
str += '\n xmlns:' + this.prefixes[ns] + '="' + escapeForXML(ns2) + '"';
|
|
1148
|
+
}
|
|
1129
1149
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1150
|
+
str += '>';
|
|
1151
|
+
var tree2 = [str, tree, '</rdf:RDF>']; // @@ namespace declrations
|
|
1132
1152
|
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
}
|
|
1153
|
+
return XMLtreeToString(tree2, -1);
|
|
1154
|
+
} // End @@ body
|
|
1136
1155
|
|
|
1137
|
-
|
|
1138
|
-
|
|
1156
|
+
}]);
|
|
1157
|
+
return Serializer;
|
|
1158
|
+
}(); // String escaping utilities
|
|
1139
1159
|
|
|
1140
|
-
var ns2 = this.base && this.flags.includes('z') ? Util.uri.refTo(this.base, ns) : ns;
|
|
1141
|
-
str += '\n xmlns:' + this.prefixes[ns] + '="' + escapeForXML(ns2) + '"';
|
|
1142
|
-
}
|
|
1143
1160
|
|
|
1144
|
-
|
|
1145
|
-
var tree2 = [str, tree, '</rdf:RDF>']; // @@ namespace declrations
|
|
1161
|
+
exports.Serializer = Serializer;
|
|
1146
1162
|
|
|
1147
|
-
|
|
1148
|
-
|
|
1163
|
+
function hexify(str) {
|
|
1164
|
+
// also used in parser
|
|
1165
|
+
return encodeURI(str);
|
|
1166
|
+
}
|
|
1149
1167
|
|
|
1168
|
+
function backslashUify(str) {
|
|
1169
|
+
var res = '';
|
|
1170
|
+
var k;
|
|
1150
1171
|
|
|
1151
|
-
var
|
|
1152
|
-
|
|
1153
|
-
};
|
|
1172
|
+
for (var i = 0; i < str.length; i++) {
|
|
1173
|
+
k = str.charCodeAt(i);
|
|
1154
1174
|
|
|
1155
|
-
|
|
1156
|
-
|
|
1175
|
+
if (k > 65535) {
|
|
1176
|
+
res += "\\U" + ('00000000' + k.toString(16)).slice(-8); // convert to upper?
|
|
1177
|
+
} else if (k > 126) {
|
|
1178
|
+
res += "\\u" + ('0000' + k.toString(16)).slice(-4);
|
|
1179
|
+
} else {
|
|
1180
|
+
res += str[i];
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1157
1183
|
|
|
1158
|
-
|
|
1184
|
+
return res;
|
|
1185
|
+
}
|