guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 02/03: Texinfo serialization: add braces when needed


From: Andy Wingo
Subject: [Guile-commits] 02/03: Texinfo serialization: add braces when needed
Date: Tue, 11 Oct 2016 21:03:20 +0000 (UTC)

wingo pushed a commit to branch master
in repository guile.

commit 06e4091c9c05942413cb55b7d9ffef6f83f876f3
Author: Andy Wingo <address@hidden>
Date:   Tue Oct 11 22:08:03 2016 +0200

    Texinfo serialization: add braces when needed
    
    * module/texinfo/serialize.scm (include, empty-command, inline-text):
      (inline-args, inline-text-args, eol-text-args, eol-text, eol-args)
      (environ, table-environ, paragraph, item, entry, fragment, serialize)
      (stexi->texi): Pass extra rest? parameter around to indicate arguments
      that can take any number of subforms without being surrounded by
      braces.
      (embrace, serialize-text-args): Surround non-rest arguments with
      braces.
    * test-suite/tests/texinfo.serialize.test: Add tests.
---
 module/texinfo/serialize.scm            |   79 +++++++++++++++++++------------
 test-suite/tests/texinfo.serialize.test |    9 +++-
 2 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/module/texinfo/serialize.scm b/module/texinfo/serialize.scm
index f3840c4..05d3fac 100644
--- a/module/texinfo/serialize.scm
+++ b/module/texinfo/serialize.scm
@@ -28,6 +28,7 @@
   #:use-module (texinfo)
   #:use-module (texinfo string-utils)
   #:use-module (sxml transform)
+  #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-13)
   #:export (stexi->texi))
@@ -61,17 +62,17 @@
 ;; Why? Well, because syntax-case defines `include', and carps about its
 ;; wrong usage below...
 (eval-when (expand load eval)
-  (define (include exp lp command type formals args accum)
+  (define (include exp lp command type formals rest? args accum)
     (list* "\n"
            (list-intersperse
             args
             " ")
            " " command "@" accum)))
 
-(define (empty-command exp lp command type formals args accum)
+(define (empty-command exp lp command type formals rest? args accum)
   (list* " " command "@" accum))
 
-(define (inline-text exp lp command type formals args accum)
+(define (inline-text exp lp command type formals rest? args accum)
   (if (not (string=? command "*braces*")) ;; fixme :(
       (list* "}"
              (append-map (lambda (x) (lp x '())) (reverse (cdr exp)))
@@ -80,7 +81,7 @@
              (append-map (lambda (x) (lp x '())) (reverse (cdr exp)))
              "@{" accum)))
 
-(define (inline-args exp lp command type formals args accum)
+(define (inline-args exp lp command type formals rest? args accum)
   (list* "}"
          (if (not args) ""
              (list-intersperse
@@ -98,7 +99,7 @@
               ","))
          "{" command "@" accum))
 
-(define (inline-text-args exp lp command type formals args accum)
+(define (inline-text-args exp lp command type formals rest? args accum)
   (list* "}"
          (if (not args) ""
              (apply
@@ -112,30 +113,49 @@
                '(","))))
          "{" command "@" accum))
 
-(define (serialize-text-args lp formals args)
-  (apply
-   append
-   (list-intersperse
-    (map (lambda (arg) (append-map (lambda (x) (lp x '())) arg))
-         (map
-          reverse
-          (drop-while
-           not (map (lambda (x) (assq-ref args x))
-                    (reverse formals)))))
-    '(" "))))
+(define (embrace x)
+  (define (needs-embrace? x)
+    (define (has-space? x)
+      (and (string? x)
+           (string-index x char-set:whitespace)))
+    (or (null? x) (or-map has-space? x)))
+  (if (needs-embrace? x)
+      (append '("}") x '("{"))
+      x))
 
-(define (eol-text-args exp lp command type formals args accum)
+(define (serialize-text-args lp formals rest? args)
+  (define (serialize-arg formal rest?)
+    (let ((val (assq-ref args formal)))
+      (if val
+          (let ((out (append-map (lambda (x) (lp x '()))
+                                 (reverse val))))
+            (if rest?
+                out
+                (embrace out)))
+          #f)))
+  (define (serialize-args rformals rest?)
+    (match rformals
+      (() '())
+      ((formal . rformals)
+       (cons (serialize-arg formal rest?)
+             (serialize-args rformals #f)))))
+  (apply append
+         (list-intersperse
+          (filter identity (serialize-args (reverse formals) rest?))
+          '(" "))))
+
+(define (eol-text-args exp lp command type formals rest? args accum)
   (list* "\n"
-         (serialize-text-args lp formals args)
+         (serialize-text-args lp formals rest? args)
          " " command "@" accum))
 
-(define (eol-text exp lp command type formals args accum)
+(define (eol-text exp lp command type formals rest? args accum)
   (list* "\n"
          (append-map (lambda (x) (lp x '()))
                      (reverse (if args (cddr exp) (cdr exp))))
          " " command "@" accum))
 
-(define (eol-args exp lp command type formals args accum)
+(define (eol-args exp lp command type formals rest? args accum)
   (list* "\n"
          (list-intersperse
           (apply append
@@ -145,7 +165,7 @@
           ", ")
          " " command "@" accum))
 
-(define (environ exp lp command type formals args accum)
+(define (environ exp lp command type formals rest? args accum)
   (case (car exp)
     ((texinfo)
      (list* "@bye\n"
@@ -169,10 +189,10 @@
                   body
                   (cons "\n" body)))
             "\n"
-            (serialize-text-args lp formals args)
+            (serialize-text-args lp formals rest? args)
             " " command "@" accum))))
 
-(define (table-environ exp lp command type formals args accum)
+(define (table-environ exp lp command type formals rest? args accum)
   (list* "\n\n" command "@end "
          (append-map (lambda (x) (lp x '()))
                      (reverse (if args (cddr exp) (cdr exp))))
@@ -188,26 +208,26 @@
                #:line-width 72
                #:break-long-words? #f))
 
-(define (paragraph exp lp command type formals args accum)
+(define (paragraph exp lp command type formals rest? args accum)
   (list* "\n\n"
          (wrap
           (reverse
            (append-map (lambda (x) (lp x '())) (reverse (cdr exp)))))
          accum))
 
-(define (item exp lp command type formals args accum)
+(define (item exp lp command type formals rest? args accum)
   (list* (append-map (lambda (x) (lp x '())) (reverse (cdr exp)))
          "@item\n"
          accum))
 
-(define (entry exp lp command type formals args accum)
+(define (entry exp lp command type formals rest? args accum)
   (list* (append-map (lambda (x) (lp x '())) (reverse (cddr exp)))
          "\n"
          (append-map (lambda (x) (lp x '())) (reverse (cdar args)))
          "@item "
          accum))
 
-(define (fragment exp lp command type formals args accum)
+(define (fragment exp lp command type formals rest? args accum)
   (list* "address@hidden %end of fragment\n"
          (append-map (lambda (x) (lp x '())) (reverse (cdr exp)))
          "address@hidden %start of fragment\n\n"
@@ -230,10 +250,10 @@
     (FRAGMENT . ,fragment)
     (#f . ,include))) ; support writing include statements
 
-(define (serialize exp lp command type formals args accum)
+(define (serialize exp lp command type formals rest? args accum)
   ((or (assq-ref serializers type)
        (error "Unknown command type" exp type))
-   exp lp command type formals args accum))
+   exp lp command type formals rest? args accum))
 
 (define escaped-chars '(#\} #\{ #\@))
 (define (escape str)
@@ -263,6 +283,7 @@
                         (symbol->string (car in))
                         (cadr command-spec)
                         (filter* symbol? (cddr command-spec))
+                        (not (list? (cddr command-spec)))
                         (cond
                          ((and (pair? (cdr in)) (pair? (cadr in))
                                (eq? (caadr in) '%))
diff --git a/test-suite/tests/texinfo.serialize.test 
b/test-suite/tests/texinfo.serialize.test
index 554390c..1c28b5a 100644
--- a/test-suite/tests/texinfo.serialize.test
+++ b/test-suite/tests/texinfo.serialize.test
@@ -28,7 +28,7 @@
 
 (with-test-prefix "test-serialize"
   (define (assert-serialize stexi str)
-    (pass-if str (equal? str (stexi->texi stexi))))
+    (pass-if-equal stexi str (stexi->texi stexi)))
 
   (assert-serialize '(para)
                     "
@@ -182,4 +182,11 @@ foo
                     "@deffnx bar foo (x @code{int})
 ")
 
+  (assert-serialize '(deffnx (% (name "foo") (category "bar baz") (arguments 
"(" "x" " " (code "int") ")")))
+                    "@deffnx {bar baz} foo (x @code{int})
+")
+
+  (assert-serialize '(deffnx (% (name "foo") (category (code "bar") " baz") 
(arguments "(" "x" " " (code "int") ")")))
+                    "@deffnx address@hidden baz} foo (x @code{int})
+")
   )



reply via email to

[Prev in Thread] Current Thread [Next in Thread]