aboutsummaryrefslogtreecommitdiffstats
path: root/src/xfdf.lisp
blob: 2dfb493186d2fa5a14dbb1856cc108d1f9b935de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(in-package :xfdf)

(defun write-xfdf (output-stream fields)
  "Write an XFDF document to `output-stream` using cons cells in the `fields`
list."
  (format output-stream "~
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xfdf xmlns=\"http://ns.adobe.com/xfdf/\" xml:space=\"preserve\">
	<fields>
")

;   (loop for (name . value) in fields
;         do
;         (let ((value (cond ((eq value t) "Yes")
;                            ((eq value nil) "Off")
;                            (t value))))
;           (format output-stream "		<field name=\"~A\">
; 			<value>~A</value>
; 		</field>
; "
; name
; value)))

  (loop for (name . value) in fields
        do
        (format output-stream "~A" (field-xfdf name value)))

  (format output-stream "	</fields>
</xfdf>")

  output-stream)

(defun field-xfdf (name value)
  (field-xfdf* name value 0))

(defun field-xfdf* (name value nesting-level)
  ""
  (let ((indent (+ 2 nesting-level)))
    ;; TODO: Add checkbox default values.
    (format t "debug1: n'~A' : v'~A' : n'~A'~%" name value nesting-level)
    (if (consp value)
        ;; TODO: We need to do something with value
        ;; TODO: How to concat results from dolist?
        (let ((inner-fields
                (loop for field in value
                      collect
                      (let ((subname (if (listp field)
                                         (first field)
                                         field))
                            (subfield (if (listp field)
                                          (rest field)
                                          field)))
                        (field-xfdf* subname subfield (1+ nesting-level))))))
          (format nil "~
~v{~A~:*~}<field name=\"~A\">
~{~A~}~v{~A~:*~}</field>
"
indent
'("	")
name
inner-fields
indent
'("	")))

        ;; TODO: Put checkbox stuff here.
        (let ((value (cond ((eq value t) "Yes")
                           ((eq value nil) "Off")
                           (t value))))
          (format t "debug2: n'~A' : v'~A' : n'~A'~%" name value nesting-level)
          (format nil "~
~v{~A~:*~}<field name=\"~A\">
~v{~A~:*~}	<value>~A</value>
~v{~A~:*~}</field>
"
indent
'("	")
name
indent
'("	")
value
indent
'("	"))))))
;; * (format t "~v{~A~:*~}<>~A" 5 '("Hello") "Next")