Формат в cl-who не работает должным образом - PullRequest
2 голосов
/ 16 декабря 2010

Я пытаюсь создать личный веб-сайт с помощью hunchentoot и cl-who, но у меня возникает семантическая ошибка в следующем коде:

(defun index ()
  (standart-page (:title "~apb")
                 (dolist (article (articles))
                   (cl-who:htm
                    (:ul
                     (:li (format nil "~a: ~a" (article-date article) (article-title article))))))))

"standart-page" - это макрос:

(defmacro standart-page ((&key title) &body body)   `(cl-who:with-html-output-to-string (*standart-output* nil :prologue t :indent t)
                               (:html :xmlns "http://www.w3.org/1999/xhtml"
                                      :xml\:lang "de"
                                      :lang "de"
                                      (:head
                                       (:title ,title)
                                       (:body
                                        (:div :id "wrapper"
                                              (:div :id "header"
                                                    (:h1 "~apb"))
                                              (:div :id "content"
                                                    ,@body)))))))

Оценка "(index)" (с одной тестовой статьей в "(Articles)" возвращает:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='de' lang='de'>
  <head>
    <title>
      ~apb
    </title>
    <body>
      <div id='wrapper'>
        <div id='header'>
          <h1>
            ~apb
          </h1>
        </div>
        <div id='content'>
          <ul>
            <li>
            </li>
          </ul>
        </div>
      </div>
    </body>
  </head>
</html>

Глядя на теги <li>..</li>, мне было интереснопочему нет вывода. Я думаю, что-то не так с функцией форматирования, но я не могу понять, что.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Для format, в частности, Эндрю ответ правильный.В общем, вы можете использовать str:

CL-USER> (with-html-output-to-string (*standard-output*)
           (:p (str (format nil "~A" '<hello/>))))
"<p><HELLO/></p>"

Обратите внимание, что в этом случае строка не экранирована HTML (это относится и к fmt).Если вы хотите, чтобы это было, используйте esc вместо:

CL-USER> (with-html-output-to-string (*standard-output*)
           (:p (esc (format nil "~A" '<hello/>))))
"<p>&lt;HELLO/&gt;</p>"

Аналогично, используйте htm, чтобы вернуться в режим HTML после выхода из него:

CL-USER> (with-html-output-to-string (*standard-output*)
           (:ul (loop for x from 1 to 3
                      do (htm (:li (str x))))))
"<ul><li>1</li><li>2</li><li>3</li></ul>"
2 голосов
/ 16 декабря 2010

Одна очевидная ошибка в том, что вы ошиблись "стандартом". Следовательно, привязка потока к *standart-output* (sic) не приводит к повторной привязке *standard-output*, как вы, возможно, и предполагали.

1 голос
/ 16 декабря 2010

Глядя на примеры использования на сайте CL-WHO, я не думаю, что вы можете просто сделать формат, который возвращает строку.Во всех их примерах либо используются пользовательские функции вывода (например, fmt), которые, по-видимому, записывают в динамическую переменную под капотом.В примере кода, сгенерированного CL-WHO, вы видите это в виде строки (format <em>http-output-stream</em> ....) в расширении макроса.

Это объясняет, почему вы не получаете никакого вывода, вам просто нужно использовать их собственные средства записи вывода вместо (format nil ..), который вы используете.Вы, вероятно, хотите что-то вроде

(fmt "~a: ~a" (article-date article) (article-title article))

...