2007年 10月 22日

Vim で blosxom クローン書いてみた

なんかいくつかの意味にとれますね。でもちゃんとうごくまでいくまえにめんどくなった (トップページだけなんとなく動く、っていう微妙な感じ)。

http://coderepos.org/share/browser/lang/vim/blosxom.vim.cgi/blosxom.vim.cgi

#!/bin/sh
""exec /usr/local/vim7/bin/vim -u NONE -i NONE --noplugin -e --cmd ":so $0"
" vim:ft=vim:
" -e で ex モードにすることで、エスケープシーケンスを排除してる。
"  完全じゃないっぽい?

で起動して、ダブルクオートは vim script ではコメントなので、vim に処理がうつったあとは exec が無視され、あとにつづくスクリプトが実行される。

開いた Vim 上で出力を生成して、

" Output
silent exe "w " . tempname()
silent exe "!cat %"
q!

最後に保存して cat で出力してみた (cat は反則な気がするけど、echo だとエスケープシーケンスがでてしまう)。もっと簡単な方法あるのかなぁ……


もうちょいアグレッシブに、

  • テンプレートをよみこむ
  • ヘッダ部分を s/// で置換する
  • エントリ部分を /entry-start^MV/entry-endYp でコピーしながら置換する

とかやったほうがおもしろいかも

Emacs で CGI 書く

#!/bin/sh
#@56
exec /usr/bin/emacs -Q --batch --no-unibyte --kill -l $0
; #@count は count 文文字をよみとばす elisp の機能
; vim:ft=scheme:expandtab:
; ↑ vim で elisp かよぷぷぷ scheme モードのほうがインデントがいい

(require 'cl)

(defun list-files (dir)
  (let ((ret '()))
    (loop for f in (directory-files dir t) do
          (let* ((attr (file-attributes f))
                 (dir?  (eq (car attr) t))
                 (file? (null (car attr)))
                 (mtime (nth 5 attr)))
            ;(print (list f dir? file?))
            (if (null (string-match "\\(\\.\\|\\.\\.\\)$" f))
              (progn
                (if dir?  (setf ret (append ret (list-files f))))
                (if file? (setf ret (append ret (list f)))))
              )
            )
          )
    ret)
  )

(princ "Content-Type: text/html; charset=utf-8\n\n")

(princ "<h1>aaaa</h1>")
(princ "<pre>")

(princ "Hello\n\n")

(print (pwd))
(print (list-files "data"))

(print system-configuration)
(print system-name)
(print (emacs-version))

(print (format-time-string "%Y-%m-%d %H:%M:%S" (current-time)))

(print (getenv "PATH_INFO"))
(print invocation-name)
(print process-environment)

(princ "</pre>")

Scheme と同じノリで書けるかと思ったら全然違う。Blosxom クローンつくろうとおもったけど途中までしか書いてない。続き書くかわからない。