2009-04-28 2 views
17

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

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

Конечно, могу write my own macros, но меня интересует, если есть любые проекты вокруг этой проблемы.

+0

Почему вы хотите быть в Emacs, устаревшем диалекте? Вы можете легко взаимодействовать с Common Lisp с помощью SLIME, а затем вы можете использовать htmlgen или yaclml или htout или LML (2) или CL-WHO или Scribble или ... –

+1

Я использую фреймворк, написанный на Emacs Lisp, который я бы хотел расширяются с помощью этой функции генерации HTML. Он тесно интегрирован с Emacs, поэтому я ищу решение Elisp. –

ответ

1

Между тем, я обнаружил, что some code содержит что-то подобное, я хочу. Теперь я могу написать:

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

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

1

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

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

+0

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

2

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

+1

Спасибо, это тоже полезно. Моя единственная проблема заключается в том, что он загрязняет пространство имен многими функциями вместо использования макроса. –

6

Как вы found out, 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 процедура генерирует.

+0

Это замечательно, спасибо. Было бы неплохо, если бы эта функциональность была частью xml.el ;-) – Upgradingdave

1

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

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

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