Есть ли библиотека Emacs Lisp для генерации HTML? - PullRequest
17 голосов
/ 28 апреля 2009

Я ищу решение, которое позволило бы мне написать собственный код Emacs Lisp и во время компиляции превращать его в HTML, например htmlgen * * * * Franz's * * * * * * * * * *

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

Конечно, я могу

написать свои собственные макросы , но мне интересно, есть ли проекты, связанные с этой проблемой.

Ответы [ 5 ]

6 голосов
/ 08 октября 2009

Как вы обнаружили , xmlgen генерирует XML из структуры списка. Что меня действительно разочаровало в пакете `` xmlgen` ', тот формат, который он поддерживает, не совсем противоположен Emacs' xml parser .

Я добавил это в свою копию 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-gen (не xmlgen, который является исходным разбором).

С этим интерфейсом выполняется следующее:

(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>)

Новый xml-gen не стремится сохранить пробелы, вокруг которых генерируется подпрограмма xml-parse-region.

2 голосов
/ 28 апреля 2009

Это может быть отправной точкой: http://www.emacswiki.org/emacs/HtmlLite

1 голос
/ 08 сентября 2012

У меня было похожее требование, чтобы иметь возможность анализировать xml с помощью функций xml-parse, преобразовывать его и затем выводить обратно в виде строки xml.

Решение Трея почти сработало, за исключением того, что мне нужно было сохранить пробельные элементы xml. Поэтому я написал свою собственную реализацию здесь:

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

1 голос
/ 28 апреля 2009

Тем временем я нашел некоторый код , который содержит что-то похожее, что я хочу. Теперь я могу написать:

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

Реализация имеет несколько ограничений (например, жестко закодированный список элементов), но, похоже, это хорошая отправная точка.

1 голос
/ 28 апреля 2009

Это не совсем то, что вы ищете, но есть 20-минутное видео, где парень создает простой веб-сайт, используя UCW, среду веб-приложений UnCommon. Все это делается в Emacs с использованием lisp ...

Вот ссылка на стенограмму (весь код (~ 25 строк) доступен в конце стенограммы).

...