21 травня 2012

Kawa: XML-літерали

Kawa має дуже цікаві XML-літерали. Але все псує неможливість вказати кодування. #<p>слон</p> перетворюється в <p>&#x441;&#x43B;&#x43E;&#x43D;</p> — і з цим, здається, нічого не можна зробити. :(

Поки що знайшов тільки такий (потворний) варіант:

#<p>&{(unescaped-data "слон")}</p>

Але тоді треба вручну заміняти < на &lt, > на &gt, " на &quot; та губиться можливість вставляти всередені код через &{(...)}.

Я для себе зробив функції encode-xml-entities та utf8-in-xml, й викликаю #<p>&{(utf8-in-xml "слон")}</p> замість #<p>"слон"</p>. Усе одно незручно… Але ще подумаю. А поки що ось який в мене код:

(require 'pregexp 'srfi-1)

(define (encode-xml-entities string)
  (fold (lambda (c r s) (pregexp-replace* c s r))
          string
          '("&"     "<"    ">"    "\"")
          '("&amp;" "&lt;" "&gt;" "&quot;")))
(define (utf8-in-xml string)
  (unescaped-data (encode-xml-entities string)))

0 коментарів | Коментувати