Function: xml-substitute-special
xml-substitute-special is a byte-compiled function defined in
xml.el.gz.
Signature
(xml-substitute-special STRING)
Documentation
Return STRING, after substituting entity and character references.
STRING is assumed to occur in an XML attribute value.
Source Code
;; Defined in /usr/src/emacs/lisp/xml.el.gz
;;; Substituting special XML sequences
(defun xml-substitute-special (string)
"Return STRING, after substituting entity and character references.
STRING is assumed to occur in an XML attribute value."
(let ((strlen (length string))
children)
(while (string-match xml-entity-or-char-ref-re string)
(push (substring string 0 (match-beginning 0)) children)
(let* ((remainder (substring string (match-end 0)))
(is-hex (match-string 1 string)) ; Is it a hex numeric reference?
(ref (match-string 2 string))) ; Numeric part of reference
(if ref
;; [4.6] Character references are included as
;; character data.
(let ((val (decode-char 'ucs (string-to-number ref (if is-hex 16)))))
(push (cond (val (string val))
(xml-validating-parser
(error "XML: (Validity) Undefined character `x%s'" ref))
(t xml-undefined-entity))
children)
(setq string remainder
strlen (length string)))
;; [4.4.5] Entity references are "included in literal".
;; Note that we don't need do anything special to treat
;; quotes as normal data characters.
(setq ref (match-string 3 string)) ; entity name
(let ((val (or (cdr (assoc ref xml-entity-alist))
(if xml-validating-parser
(error "XML: (Validity) Undefined entity `%s'" ref)
xml-undefined-entity))))
(setq string (concat val remainder)))
(and xml-entity-expansion-limit
(> (length string) (+ strlen xml-entity-expansion-limit))
(error "XML: Passed `xml-entity-expansion-limit' while expanding `&%s;'"
ref)))))
(mapconcat 'identity (nreverse (cons string children)) "")))