2

hunchentootとcl-whoを介して個人のWebサイトを構築しようとしていますが、次のコードでセマンティックエラーが発生しています。

(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)」に1つのテスト記事がある場合)は次のようになります。

<!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>なぜ出力がないのか疑問に思いました。format関数に問題があると思いますが、何がわかりません。

4

3 に答える 3

3

具体的には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>"

同様に、htmHTMLモードから脱出したときに、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>"
于 2010-12-17T11:25:37.103 に答える
2

明らかな間違いの1つは、「標準」のスペルを間違えていることです。したがって、おそらく意図したように、ストリームを*standart-output*(sic)にバインドしても再バインド*standard-output*されません。

于 2010-12-16T15:22:46.533 に答える
1

CL-WHOサイトでの使用例を見ると、文字列を返す形式だけを実行できるとは思いません。それらの例はすべて、内部で動的変数に書き込むように見えるカスタム出力関数(fmtなど)を使用しています。CL-WHOによって生成されたコードの例では、これはマクロ展開の行として表示されます。 (format http-output-stream ....)

これは、出力が得られない理由を説明します。使用しているものの代わりに、カスタム出力ライターを使用する必要があり(format nil ..)ます。あなたはおそらく次のようなものが欲しいでしょう

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

于 2010-12-16T12:43:32.043 に答える