writeTerm method
- RdfTerm term, {
- required IriRole iriRole,
- required IriCompactionResult compactedIris,
- required Map<
BlankNodeTerm, String> blankNodeLabels,
Convert RDF terms to Turtle syntax string representation
Implementation
String writeTerm(RdfTerm term,
{required IriRole iriRole,
required IriCompactionResult compactedIris,
required Map<BlankNodeTerm, String> blankNodeLabels}) {
switch (term) {
case IriTerm _:
// Check if the predicate is a known prefix
final compacted = compactedIris.compactIri(term, iriRole);
switch (compacted) {
case PrefixedIri prefixed:
return prefixed.colonSeparated;
case FullIri(iri: var iri):
// If we have a full IRI without a prefix
return '<$iri>';
case RelativeIri(relative: var relativeIri):
return '<$relativeIri>';
case SpecialIri(iri: var iri):
if (term == Rdf.type) {
return 'a';
}
throw ArgumentError(
'Unexpected special IRI: $iri. It should have been treated before',
);
}
case BlankNodeTerm blankNode:
// Use the pre-generated label for this blank node
var label = blankNodeLabels[blankNode];
if (label == null) {
// This shouldn't happen if all blank nodes were collected correctly
_log.warning(
'No label generated for blank node, using fallback label',
);
label = 'b${identityHashCode(blankNode)}';
blankNodeLabels[blankNode] = label;
}
return '_:$label';
case LiteralTerm literal:
// Special cases for native Turtle literal representations
if (literal.datatype == _integerDatatype) {
return literal.value;
}
if (literal.datatype == _decimalDatatype) {
return literal.value;
}
if (literal.datatype == _booleanDatatype) {
return literal.value;
}
var escapedLiteralValue = _escapeTurtleString(literal.value);
if (literal.language != null) {
return '"$escapedLiteralValue"@${literal.language}';
}
if (literal.datatype != _stringDatatype) {
return '"$escapedLiteralValue"^^${writeTerm(literal.datatype, iriRole: IriRole.datatype, compactedIris: compactedIris, blankNodeLabels: blankNodeLabels)}';
}
return '"$escapedLiteralValue"';
}
}