17

Franz の htmlgen のように、ネイティブの Emacs Lisp コードを記述し、コンパイル時に HTML に変換できるソリューションを探しています。

(html
 ((:div class "post")
  (:h1 "Title")
  (:p "Hello, World!")))

もちろん、自分でマクロを書くこともできますが、この問題に関するプロジェクトがあれば興味があります。

4

6 に答える 6

6

ご存じのようxmlgenに、 はリスト構造から XML を生成します。xmlgen パッケージがサポートするフォーマットが Emacs のxml パーサーの逆ではないことに私が失望した点です。

これをxmlgenのコピーに追加しました:

;; this creates a routine to be the inverse of what xml-parse does
;;;###autoload
(defun xml-gen (form &optional in-elm level)
  "Convert a sexp to xml:
  '(p :class \"big\")) => \"<p class=\\\"big\\\" />\""
  (let ((level (or level 0)))
    (cond
     ((numberp form) (number-to-string form))
     ((stringp form) form)
     ((listp form)
      (destructuring-bind (xml attrs) (xml-gen-extract-plist form)
        (let ((el (car xml)))
          (unless (symbolp el)
            (error "Element must be a symbol (got '%S')." el))
          (setq el (symbol-name el))
          (concat "<" el (xml-gen-attr-to-string attrs)
                  (if (> (length xml) 1)
                      (concat ">" (mapconcat
                                   (lambda (s) (xml-gen s el (1+ level)))
                                   (cdr xml)
                                   "")
                              "</" el ">")
                    "/>"))))))))

(defun xml-gen-attr-to-string (plist)
  (reduce 'concat (mapcar (lambda (p) (concat " " (symbol-name (car p)) "=\"" (cdr p) "\"")) plist)))

(defun xml-gen-extract-plist (list)
  (list (cons (car list) (let ((kids (xml-node-children list)))
                           (if (= 1 (length kids))
                               kids
                             (remove-if-not 'listp kids))))
        (xml-node-attributes list)))

注:これのインターフェースはxml-genxmlgen元の解析ではありません)です。

このインターフェイスでは、次のことが成り立ちます。

(string-equal (xml-gen (car (xml-parse-region <some-region-of-xml>)))
              <some-region-of-xml>)

(equal (car (xml-parse-region (insert (xml-gen <some-xml-form>))))
       <some-xml-form>)

newは、ルーチンが生成するxml-gen周囲の空白を保持しようとはしません。xml-parse-region

于 2009-10-08T17:35:49.530 に答える
2

これは出発点になる可能性があります: http://www.emacswiki.org/emacs/HtmlLite

于 2009-04-28T14:09:48.613 に答える
1

これはあなたが探しているものではありませんが、UnCommon Web アプリケーション フレームワークである UCW を使用して単純な Web サイトを作成する 20 分間のビデオがあります。それはすべて、Lispを使用してEmacsで行われます...

ここにトランスクリプトへのリンクがあります (すべてのコード (約 25 行) はトランスクリプトの最後にあります)。

于 2009-04-28T14:01:05.373 に答える
1

xml-parse 関数を使用して xml を解析し、それを変換してから、xml 文字列として出力できるという同様の要件がありました。

Trey のソリューションは、空白の xml 要素を保持する必要があることを除いて、ほとんど機能しました。だから私はここに私自身の実装を書きました:

https://github.com/upgradingdave/xml-to-string

于 2012-09-08T15:00:57.957 に答える
1

その間、私が欲しいものに似たものを含むコードを見つけました。今私は書くことができます:

(views-with-html
 ((body)
  (h1 "Title")
  ((p (class . "entry")) "Hello, World!")))

実装にはいくつかの制限があります (ハードコードされた要素リストなど) が、出発点としては適切なようです。

于 2009-04-28T14:12:06.830 に答える