// Turtle literal + IRI escaping helpers, shared by all mjs emitters. // Centralizes the escape rules so changes don't drift between emitters. const STRING_ESCAPES = { '\\': '\\\\', '"': '\\"', '\n': '\\n', '\r': '\\r', '\t': '\\t', }; export function ttlLit(s) { if (s == null) return '""'; const escaped = String(s).replace(/[\\\"\n\r\t]/g, (ch) => STRING_ESCAPES[ch] ?? ch); return `"${escaped}"`; } export function ttlPrefixed(qname) { const colonIdx = qname.indexOf(':'); if (colonIdx < 0) return qname; const local = qname.slice(colonIdx + 1); const escaped = local.replace(/([/])/g, '\\$1'); return `${qname.slice(0, colonIdx + 1)}${escaped}`; } const IRI_FORBIDDEN = /[<>"{}|^`\\- ]/; export function assertValidIri(iri, context = 'IRI') { if (typeof iri !== 'string') { throw new Error(`${context}: expected string, got ${typeof iri}`); } if (IRI_FORBIDDEN.test(iri)) { throw new Error(`${context}: IRI contains forbidden characters: ${JSON.stringify(iri)}`); } return iri; } export function ttlIri(iri) { return `<${assertValidIri(iri)}>`; }