writeTerm method

String writeTerm(
  1. RdfTerm term, {
  2. required IriRole iriRole,
  3. required IriCompactionResult compactedIris,
  4. 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"';
  }
}