From e3fd76d4e5beb8596be651b41be730f62cfdc9d0 Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Mon, 3 Apr 2023 10:49:04 -0400
Subject: Make URI writing stricter by default

---
 src/serdi.c  |  2 +-
 src/writer.c | 17 ++++++++++-------
 2 files changed, 11 insertions(+), 8 deletions(-)

(limited to 'src')

diff --git a/src/serdi.c b/src/serdi.c
index 97e9bc22..d82198ad 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -89,7 +89,7 @@ print_usage(const char* const name, const bool error)
     "  -b           Write output in blocks for performance.\n"
     "  -c PREFIX    Chop PREFIX from matching blank node IDs.\n"
     "  -e           Eat input one character at a time.\n"
-    "  -f           Keep full URIs in input (don't qualify).\n"
+    "  -f           Fast and loose URI pass-through.\n"
     "  -h           Display this help and exit.\n"
     "  -i SYNTAX    Input syntax: turtle/ntriples/trig/nquads.\n"
     "  -l           Lax (non-strict) parsing.\n"
diff --git a/src/writer.c b/src/writer.c
index fcd0e1dc..8fdca6f9 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -677,19 +677,22 @@ write_curie(SerdWriter* const        writer,
   SerdChunk  suffix = {NULL, 0};
   SerdStatus st     = SERD_SUCCESS;
 
-  switch (writer->syntax) {
-  case SERD_NTRIPLES:
-  case SERD_NQUADS:
+  // In fast-and-loose Turtle/TriG mode CURIEs are simply passed through
+  const bool fast =
+    !(writer->style & (SERD_STYLE_CURIED | SERD_STYLE_RESOLVED));
+
+  if (!supports_abbrev(writer) || !fast) {
     if ((st = serd_env_expand(writer->env, node, &prefix, &suffix))) {
       return w_err(writer, st, "undefined namespace prefix '%s'\n", node->buf);
     }
+  }
+
+  if (!supports_abbrev(writer)) {
     TRY(st, esink("<", 1, writer));
     write_uri(writer, prefix.buf, prefix.len);
     write_uri(writer, suffix.buf, suffix.len);
     TRY(st, esink(">", 1, writer));
-    break;
-  case SERD_TURTLE:
-  case SERD_TRIG:
+  } else {
     if (is_inline_start(writer, field, flags)) {
       ++writer->indent;
       TRY(st, write_sep(writer, SEP_ANON_BEGIN));
@@ -702,7 +705,7 @@ write_curie(SerdWriter* const        writer,
     }
   }
 
-  return SERD_SUCCESS;
+  return st;
 }
 
 SERD_NODISCARD static SerdStatus
-- 
cgit v1.2.1