emacs-museについて

emacs-museとはemacs上のwikiみたいなものです.wiki形式(つまりテキスト)の記述を HTMLやLaTeXなど多くの書式に自動的に変換してくれます.
私はemacsに慣れすぎてWYSIWYGのエディタではストレスが溜ってしょうがないので emacs-museを用いてwiki形式のテキストからこのHTMLを自動生成しています.

インストール

アーカイブを持ってきてmakeするだけです.私はmuse-3.02.93を使っています.

 $ tar -zxvf muse-3.02.93.tar.gz
 $ cd muse-3.02.93
 $ make install

設定

最低限の設定

museへのpathを通して必要なものをloadします.
例えば以下を~/.emacsに追加します.

 (add-to-list 'load-path "/usr/share/emacs/muse") ; 実際のinstall directory
 (require 'muse-mode)    ; muse-modeを使う
 (require 'muse-project) ; projectを使う
 (require 'muse-html)    ; htmlを生成するのに必要

改行の設定

PHPで実装されたpukiwikiというwikiクローンでは行末が'~'で終わると改行とみなされ
タグに変換されます.これを実現したかったので次のような設定を加えました.

(defun muse-publish-markup-newline ()
  (unless (get-text-property (match-beginning 0) 'muse-link)
    (delete-region (match-beginning 0) (match-end 0))
    (muse-insert-markup (muse-markup-text 'newline))))
(add-to-list 'muse-publish-markup-functions
             '(newline . muse-publish-markup-newline))
(add-to-list 'muse-publish-markup-regexps
             '(5000 "~$" 0 newline))
(add-to-list 'muse-html-markup-strings ;; support only html
             '(newline . "<br>"))

これによって行末の'~'は改行に変換されるようになります.
ちなみに上の設定は試行錯誤の上なんとか見様見まねでやり方を発見したので詳しいこ とは知りません.自分で色々なカスタマイズしたい場合はドキュメント見るなりソース を見るなりして自分でなんとかしましょう.muse-publish.elを見たらなんとなく分か るでしょう.

projectの設定

museでは複数のプロジェクトを管理することができます.

(set 'muse-project-alist
     '(("Web"
        ("~/muse/Web" :default "index")
        (:base   "html"
         :path   "~/muse/Web_html"))
       ("Work"
        ("~/muse/Work" :default "index")
        (:base   "html"
         :path   "~/muse/Work_html"))))

みたいな設定をしてあると'Web'と'Work'という二つのプロジェクトを使い分けること ができます.'base'というのはhtmlとかlatexとか変換(publishと言います)先のファイ ル形式を指定し,'path'というのはpublishする先のディレクトリを指定します.

出力のカスタマイズ

このサイト自身がそうですが,一応出力を色々とカスタマイズできるようになっていま す.

この変数で通常のhtmlのスタイルシートを設定します.
style.cssというファイルを指定するには次のようにします.

(setq muse-html-style-sheet-website
      "<link href=\"style.css\" type=\"text/css\" rel=\"stylesheet\">")

この変数でヘッダとフッタを指定します.divタグとかを使う場合や定型のページを作 る場合はこの変数を調節します.

;;; ヘッダ
(setq muse-html-header
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
<html>
  <head>
    <title>
    <lisp> (concat (muse-publishing-directive \"title\")) </lisp>
    </title>
    <meta name=\"generator\" content=\"EmacsMuse\">
    <meta http-equiv=\"<lisp>muse-html-meta-http-equiv</lisp>\"
          content=\"<lisp>muse-html-meta-content-type</lisp>\">
    <lisp>muse-html-style-sheet</lisp>
  </head>
  <body>
    <!-- header -->
    <div id=\"header\">
    <h1><lisp>
   (concat (muse-publishing-directive \"title\")
          (let ((author (muse-publishing-directive \"author\")))
            (if (not (string= author (user-full-name)))
                (concat \" (by \" author \")\"))))</lisp></h1>
    </div>

  <!-- ナビゲーションとか置くならここに記述 -->

    <!-- main contents -->
    <div id=\"contents\">
    <div id=\"main\">
    <!-- Page published by Emacs Muse begins here -->
")
;;; footer
(setq muse-html-footer
"
<!-- Page published by Emacs Muse ends here -->
  </div>
  </div>
  <div id=\"footer\">
  <!-- 適当に(連絡先とか最終更新日とか) -->
  </div>
  </body>
</html>
")

Projectごとに出力スタイルを変更する

muse-before-project-publish-hookを使用します.このhookはその名の通り, projectをpublishする直前に呼ばれます.このhookで muse-html-header/muse-html-footerなどの変数をprojectに応じて書き換えればよい.

(setq muse-before-project-publish-hook
      '(lambda (project)
         (setq muse-publishing-current-project project)
         (setq muse-publishing-current-project-name (car project))
         (setq muse-publishing-current-project-dir (caar (cdr project)))
         (setq muse-publishing-current-project-style (car (cddr project)))
         ;; style-sheet
         (setq muse-html-style-sheet
               (concat
                "<lisp>(muse-insert-file-or-string muse-html-style-sheet-"
                muse-publishing-current-project-name
                ")</lisp>"))
         ;; header
         (setq muse-html-header
               (concat
                "<lisp>(muse-insert-file-or-string muse-html-header-"
                muse-publishing-current-project-name
                ")</lisp>"))
         ;; footer
         (setq muse-html-footer
               (concat
                "<lisp>(muse-insert-file-or-string muse-html-footer-"
                muse-publishing-current-project-name
                ")</lisp>"))
         ))

上記設定でmuse-html-style-sheet, muse-html-header, muse-html-footerをprojectご とに切替える.ここではprojectの名前をsuffixとした変数を用いる.
具体的には例えばwebsiteというprojectの場合は

という変数を指定しておく.これを必要なプロジェクトすべてに指定すれば切替えがで きる.

Misc

タイムスタンプ

(require 'time-stamp) ;; これをあらかじめしておく
(defun muse-html-time-stamp ()
  (setq time-stamp-format "%:y年%:m月%:d %02H:%02M")
  (concat "最終更新 : " (time-stamp-string)))

これを例えばmuse-html-footerとかに適当にいれておく.

ナビゲーション/メニュー

ナビゲーションバーみたいなやつをつけるにはどうするかということですが, muse-html-headerの適切な位置に

<lisp>muse-html-contents-navigation</lisp>

という記述をしておいて

(setq muse-html-contents-navigation
  "<!-- そこに挿入されるべきhtmlをここに書くとか専用の関数を呼ぶとか -->")

しておくといいかと.個人的にはナビゲーション部分のhtmlを記述した専用のファイル を用意しておいてその内容を挿入するようにしています.