9b114ea

Escape string sequences when generating nquads and turtle documents.

nquads/fromrdf.scm

1919
  #:use-module (ice-9 match)
2020
  #:use-module (ice-9 textual-ports)
2121
  #:use-module (iri iri)
22-
  #:use-module (turtle parser)
22+
  #:use-module (srfi srfi-1)
2323
  #:use-module (srfi srfi-9)
2424
  #:use-module (rdf rdf)
2525
  #:export (rdf->nquads))
2626
27+
(define (nquads-escape str)
28+
  "Escape a string for writing it to an nquads document."
29+
  (list->string (append-map (lambda (c)
30+
                              (match c
31+
                                (#\\ (list #\\ #\\))
32+
                                (#\" (list #\\ #\"))
33+
                                (#\newline (list #\\ #\n))
34+
                                (#\return (list #\\ #\r))
35+
                                (#\tab (list #\\ #\t))
36+
                                (#\backspace (list #\\ #\b))
37+
                                (_ (list c))))
38+
                            (string->list str))))
39+
2740
(define (node->nquads node)
2841
  (cond
2942
    ((blank-node? node)

3144
    ((rdf-datatype? node)
3245
     (string-append "<" (car (rdf-datatype-iris node)) ">"))
3346
    ((rdf-literal? node)
34-
     (string-append "\"" (rdf-literal-lexical-form node) "\""
47+
     (string-append "\"" (nquads-escape (rdf-literal-lexical-form node)) "\""
3548
                    (if (rdf-literal-langtag node)
3649
                        (string-append "@" (rdf-literal-langtag node))
3750
                        (let ((type (rdf-literal-type node)))

turtle/fromrdf.scm

1919
  #:use-module (ice-9 match)
2020
  #:use-module (ice-9 textual-ports)
2121
  #:use-module (iri iri)
22-
  #:use-module (turtle parser)
22+
  #:use-module (srfi srfi-1)
2323
  #:use-module (srfi srfi-9)
2424
  #:use-module (rdf rdf)
2525
  #:export (rdf->turtle))
2626
27+
(define (turtle-escape str)
28+
  "Escape a string for writing it to a turtle document."
29+
  (list->string (append-map (lambda (c)
30+
                              (match c
31+
                                (#\\ (list #\\ #\\))
32+
                                (#\" (list #\\ #\"))
33+
                                (#\newline (list #\\ #\n))
34+
                                (#\return (list #\\ #\r))
35+
                                (#\tab (list #\\ #\t))
36+
                                (#\backspace (list #\\ #\b))
37+
                                (_ (list c))))
38+
                            (string->list str))))
39+
2740
(define (node->turtle node)
2841
  (cond
2942
    ((blank-node? node)

3144
    ((rdf-datatype? node)
3245
     (string-append "<" (car (rdf-datatype-iris node)) ">"))
3346
    ((rdf-literal? node)
34-
     (string-append "\"" (rdf-literal-lexical-form node) "\""
47+
     (string-append "\"" (turtle-escape (rdf-literal-lexical-form node)) "\""
3548
                    (if (rdf-literal-langtag node)
3649
                        (string-append "@" (rdf-literal-langtag node))
3750
                        (let ((type (rdf-literal-type node)))