File: recoder.lisp

package info (click to toggle)
cl-cxml 20110619-2
  • links: PTS, VCS
  • area: main
  • in suites: buster, jessie, jessie-kfreebsd, stretch
  • size: 888 kB
  • sloc: lisp: 9,331; xml: 1,925; sh: 32; makefile: 18
file content (125 lines) | stat: -rw-r--r-- 3,392 bytes parent folder | download | duplicates (2)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
;;;; recoder.lisp -- SAX handler for string conversion
;;;;
;;;; This file is part of the CXML parser, released under Lisp-LGPL.
;;;; See file COPYING for details.
;;;;
;;;; Developed 2004 for headcraft - http://headcraft.de/
;;;; Copyright: David Lichteblau

(in-package :cxml)

(defclass recoder ()
    ((recoder :initarg :recoder :accessor recoder)
     (chained-handler :initarg :chained-handler :accessor chained-handler)))

(defun make-recoder (chained-handler recoder-fn)
  (make-instance 'recoder
    :recoder recoder-fn
    :chained-handler chained-handler))

(macrolet ((%string (rod)
             `(let ((rod ,rod))
                (if (typep rod '(or rod string))
                    (funcall (recoder handler) rod)
                    rod)))
           (defwrapper (name (&rest args) &rest forms)
             `(defmethod ,name ((handler recoder) ,@args)
                (,name (chained-handler handler) ,@forms))))
  (defwrapper sax:start-document ())

  (defwrapper sax:start-element
      (namespace-uri local-name qname attributes)
    (%string namespace-uri)
    (%string local-name)
    (%string qname)
    (mapcar (lambda (attr)
              (sax:make-attribute
               :namespace-uri (%string (sax:attribute-namespace-uri attr))
               :local-name (%string (sax:attribute-local-name attr))
               :qname (%string (sax:attribute-qname attr))
               :value (%string (sax:attribute-value attr))
               :specified-p (sax:attribute-specified-p attr)))
            attributes))

  (defwrapper sax:start-prefix-mapping (prefix uri)
    (%string prefix)
    (%string uri))

  (defwrapper sax:characters (data)
    (%string data))

  (defwrapper sax:processing-instruction (target data)
    (%string target)
    (%string data))

  (defwrapper sax:end-prefix-mapping (prefix)
    (%string prefix))

  (defwrapper sax:end-element (namespace-uri local-name qname)
    (%string namespace-uri)
    (%string local-name)
    (%string qname))

  (defwrapper sax:end-document ())

  (defwrapper sax:comment (data)
    (%string data))

  (defwrapper sax:start-cdata ())

  (defwrapper sax:end-cdata ())

  (defwrapper sax:start-dtd (name public-id system-id)
    (%string name)
    (%string public-id)
    (%string system-id))

  (defwrapper sax:start-internal-subset ())
  (defwrapper sax:end-internal-subset ())

  (defwrapper sax:end-dtd ())

  (defwrapper sax:unparsed-entity-declaration
      (name public-id system-id notation-name)
    (%string name)
    (%string public-id)
    (%string system-id)
    (%string notation-name))

  (defwrapper sax:external-entity-declaration
      (kind name public-id system-id)
    (%string kind)
    (%string name)
    (%string public-id)
    (%string system-id))

  (defwrapper sax:internal-entity-declaration
      (kind name value)
    kind
    (%string name)
    (%string value))

  (defwrapper sax:notation-declaration
      (name public-id system-id)
    (%string name)
    (%string public-id)
    (%string system-id))

  (defwrapper sax:element-declaration (name model)
    (%string name)
    model)

  (defwrapper sax:attribute-declaration
      (element-name attribute-name type default)
    (%string element-name)
    (%string attribute-name)
    (%string type)
    (%string default))

  (defwrapper sax:entity-resolver
      (resolver)
    resolver)

  (defwrapper sax::dtd
      (dtd)
    dtd))