1

自動生成されたプレーン テキスト ファイルを HTML に変換する Emacs 用の関数を作成していますが、質問が発生しました...終了タグ (例: </div>) を追加するにはどうすればよいですか?

(注: Org-mode の組み込みの org-export は、私が望んでいるものではありません。)

次のような入力としてのプレーンテキスト:

* 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>

どうすればいいですか?ありがとう!

4

2 に答える 2

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>
于 2013-08-24T09:37:19.493 に答える