使用Emacs将纯文本文件转换为HTML。如何添加结束标签?

时间:2013-08-24 04:57:17

标签: html emacs lisp elisp

我正在为Emacs编写一个函数,将自动生成的纯文本文件转换为HTML,但遇到问题...如何添加结束标记(例如</div>)?

(注意:Org-mode的内置组织导出不是我想要的。)

纯文本输入如下:

* 2012
** Jan
   balahbalah
   ...
** Feb
   balahbalah
   ...
* 2013
** Mar
   balahbalah
   ...

(我写过一个函数可以将整个文件复制到另一个缓冲区并处理“balahbalah”。)

所需的输出是:

<div class="year">
  <h2>2012</h2>
  <div class="month">
    <h3>Jan</h3>
    balahbalah
    ....
  </div>
  <div class="month">
    <h3>Feb</h3>
    balahbalah
    ....
  </div>
</div>

<div class="year">
  <h2>2013</h2>
  <div class="month">
    <h3>March</h3>
    balahbalah
    ....
  </div>
</div>

我该怎么办?谢谢!

2 个答案:

答案 0 :(得分:2)

这里有一些新鲜的代码:

(defun org-to-list ()
  (interactive)
  (let* ((str
          (buffer-substring-no-properties (point-min) 
                                          (point-max)))
         (years-str (delete "" (split-string str "^* ")))
         (years 
          (mapcar 
           (lambda(x) 
             (when (string-match "^\\([0-9]+\\)\\([^\0]*\\)$" x)
               (list (match-string 1 x)
                     (mapcar 
                      (lambda (y)
                        (when (string-match 
                               "^\\([a-zA-Z]+\\)\\([^\0]*\\)$" y)
                          (cons (match-string 1 y)
                                (match-string 2 y))))
                      (delete 
                       "\n" 
                       (split-string (match-string 2 x) "^** "))))))
           years-str)))
    (switch-to-buffer-other-window 
     (get-buffer-create "*Generated HTML*"))
    (delete-region (point-min) (point-max))
    (insert
     (mapconcat 
      (lambda(x) 
        (concat
         (format "<div class=\"year\">\n  <h2>%s</h2>\n" (car x))
         (mapconcat 
          (lambda(y)
            (concat
             (format 
              "  <div class=\"month\">\n    <h3>%s</h3>\n" (car y))
             (mapconcat 
              (lambda(z)(format "    %s" z))
              (delete "" (split-string (cdr y) "\n"))
              "\n")
             "\n  </div>"))
          (cadr x)
          "\n")
         "\n</div>\n"))
      years
      "\n"))))

您可以使用 M-x 运行它。它创建一个包含以下内容的新缓冲区:

<div class="year">
  <h2>2012</h2>
  <div class="month">
    <h3>Jan</h3>
    spam
  </div>
  <div class="month">
    <h3>Feb</h3>
    and eggs!
  </div>
</div>

<div class="year">
  <h2>2013</h2>
  <div class="month">
    <h3>Mar</h3>
    spam spam?
  </div>
</div>

答案 1 :(得分:0)

Emacs org-mode附带一个html-exporter。 组织模式有自己的信息文件:

C-h i RET m Org Mode RET

请参阅“导出”标记