Skip to content

Commit 5fc0b63

Browse files
Merge pull request #213 from simonvbrae/feature/rdfstar_writer
Extend writer for RDF* Quads
2 parents 3016dbd + 76b2854 commit 5fc0b63

File tree

2 files changed

+87
-4
lines changed

2 files changed

+87
-4
lines changed

src/N3Writer.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// **N3Writer** writes N3 documents.
22
import namespaces from './IRIs';
33
import { default as N3DataFactory, Term } from './N3DataFactory';
4+
import { isDefaultGraph } from './N3Util';
45

56
const DEFAULTGRAPH = N3DataFactory.defaultGraph();
67

@@ -98,7 +99,7 @@ export default class N3Writer {
9899
// Different subject; write the whole quad
99100
else
100101
this._write((this._subject === null ? '' : '.\n') +
101-
this._encodeIriOrBlank(this._subject = subject) + ' ' +
102+
this._encodeSubject(this._subject = subject) + ' ' +
102103
this._encodePredicate(this._predicate = predicate) + ' ' +
103104
this._encodeObject(object), done);
104105
}
@@ -114,7 +115,7 @@ export default class N3Writer {
114115

115116
// ### `quadToString` serializes a quad as a string
116117
quadToString(subject, predicate, object, graph) {
117-
return this._encodeIriOrBlank(subject) + ' ' +
118+
return this._encodeSubject(subject) + ' ' +
118119
this._encodeIriOrBlank(predicate) + ' ' +
119120
this._encodeObject(object) +
120121
(graph && graph.value ? ' ' + this._encodeIriOrBlank(graph) + ' .\n' : ' .\n');
@@ -127,6 +128,12 @@ export default class N3Writer {
127128
}, this).join('');
128129
}
129130

131+
// ### `_encodeSubject` represents a subject
132+
_encodeSubject(entity) {
133+
return entity.termType === 'Quad' ?
134+
this._encodeQuad(entity) : this._encodeIriOrBlank(entity);
135+
}
136+
130137
// ### `_encodeIriOrBlank` represents an IRI or blank node
131138
_encodeIriOrBlank(entity) {
132139
// A blank node or list is represented as-is
@@ -168,7 +175,23 @@ export default class N3Writer {
168175

169176
// ### `_encodeObject` represents an object
170177
_encodeObject(object) {
171-
return object.termType === 'Literal' ? this._encodeLiteral(object) : this._encodeIriOrBlank(object);
178+
switch (object.termType) {
179+
case 'Quad':
180+
return this._encodeQuad(object);
181+
case 'Literal':
182+
return this._encodeLiteral(object);
183+
default:
184+
return this._encodeIriOrBlank(object);
185+
}
186+
}
187+
188+
// ### `_encodeQuad` encodes an RDF* quad
189+
_encodeQuad({ subject, predicate, object, graph }) {
190+
return `<<${
191+
this._encodeSubject(subject)} ${
192+
this._encodePredicate(predicate)} ${
193+
this._encodeObject(object)}${
194+
isDefaultGraph(graph) ? '' : ` ${this._encodeIriOrBlank(graph)}`}>>`;
172195
}
173196

174197
// ### `_blockedWrite` replaces `_write` after the writer has been closed

test/N3Writer-test.js

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ describe('Writer', function () {
494494
writer.addQuad(new NamedNode('a3'), new NamedNode('b'), new BlankNode('m3'));
495495
writer.end(function (error, output) {
496496
output.should.equal('(<c> <d> <e>) <b> ("c" "d" "e").\n' +
497-
'<a3> <b> _:m3.\n');
497+
'<a3> <b> _:m3.\n');
498498
done(error);
499499
});
500500
});
@@ -569,6 +569,66 @@ describe('Writer', function () {
569569
done();
570570
});
571571
});
572+
573+
it('should serialize a triple with a triple with mixed component types as subject', function () {
574+
var writer = new Writer();
575+
writer.quadToString(new Quad(new BlankNode('b1'), new NamedNode('b'), new Literal('l1')), new NamedNode('b'), new NamedNode('c')).should.equal('<<_:b1 <b> "l">> <b> <c> .\n');
576+
});
577+
578+
it('should serialize a triple with a triple with iris as subject', function () {
579+
var writer = new Writer();
580+
writer.quadToString(new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c')), new NamedNode('b'), new NamedNode('c')).should.equal('<<<a> <b> <c>>> <b> <c> .\n');
581+
});
582+
583+
it('should serialize a triple with a triple with blanknodes as subject', function () {
584+
var writer = new Writer();
585+
writer.quadToString(new Quad(new BlankNode('b1'), new BlankNode('b2'), new BlankNode('b3')), new NamedNode('b'), new NamedNode('c')).should.equal('<<_:b1 _:b2 _:b3>> <b> <c> .\n');
586+
});
587+
588+
it('should serialize a triple with a triple as object', function () {
589+
var writer = new Writer();
590+
writer.quadToString(new NamedNode('a'), new NamedNode('b'), new Quad(new BlankNode('b1'), new NamedNode('b'), new Literal('l1'))).should.equal('<a> <b> <<_:b1 <b> "l">> .\n');
591+
});
592+
593+
it('should serialize a triple with a triple with iris as object', function () {
594+
var writer = new Writer();
595+
writer.quadToString(new NamedNode('a'), new NamedNode('b'), new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c'))).should.equal('<a> <b> <<<a> <b> <c>>> .\n');
596+
});
597+
598+
it('should serialize a triple with a triple with blanknodes as object', function () {
599+
var writer = new Writer();
600+
writer.quadToString(new NamedNode('a'), new NamedNode('b'), new Quad(new BlankNode('b1'), new BlankNode('b2'), new BlankNode('b3'))).should.equal('<a> <b> <<_:b1 _:b2 _:b3>> .\n');
601+
});
602+
603+
it('should serialize a quad with a triple with mixed component types as subject', function () {
604+
var writer = new Writer();
605+
writer.quadToString(new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c')), new NamedNode('b'), new NamedNode('c'), new NamedNode('g')).should.equal('<<<a> <b> <c>>> <b> <c> <g> .\n');
606+
});
607+
608+
it('should serialize a quad with a triple as object', function () {
609+
var writer = new Writer();
610+
writer.quadToString(new NamedNode('a'), new NamedNode('b'), new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c')), new NamedNode('g')).should.equal('<a> <b> <<<a> <b> <c>>> <g> .\n');
611+
});
612+
613+
it('should serialize a quad with a quad as subject', function () {
614+
var writer = new Writer();
615+
writer.quadToString(new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c'), new NamedNode('g')), new NamedNode('b'), new NamedNode('c'), new NamedNode('g')).should.equal('<<<a> <b> <c> <g>>> <b> <c> <g> .\n');
616+
});
617+
618+
it('should serialize a quad with a quad as object', function () {
619+
var writer = new Writer();
620+
writer.quadToString(new NamedNode('a'), new NamedNode('b'), new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c'), new NamedNode('g')), new NamedNode('g')).should.equal('<a> <b> <<<a> <b> <c> <g>>> <g> .\n');
621+
});
622+
623+
it('should serialize a triple with a quad as subject', function () {
624+
var writer = new Writer();
625+
writer.quadToString(new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c'), new NamedNode('g')), new NamedNode('b'), new NamedNode('c')).should.equal('<<<a> <b> <c> <g>>> <b> <c> .\n');
626+
});
627+
628+
it('should serialize a triple with a quad as object', function () {
629+
var writer = new Writer();
630+
writer.quadToString(new NamedNode('a'), new NamedNode('b'), new Quad(new NamedNode('a'), new NamedNode('b'), new NamedNode('c'), new NamedNode('g'))).should.equal('<a> <b> <<<a> <b> <c> <g>>> .\n');
631+
});
572632
});
573633
});
574634

0 commit comments

Comments
 (0)