ソースコードをHTML表示用に整形するLISPver0.2
ソースコードをHTML表示用に整形するLISPver0.1 - Shammerismの続き。まだエスケープ文字もそのままだが、defparameter をなくして、行を生成する関数を入れてみた。
(defun tr (&rest contents) (let ((line "<tr>")) (cond ((typep contents 'string) (setf line (concatenate 'string line contents))) ((typep contents 'list) (dolist (x contents) (setf line (concatenate 'string line x))))) (concatenate 'string line "</tr>~%"))) (defun td (contents &optional is-first-line rows) (let ((line "<td")) (when is-first-line (setf line (concatenate 'string line " rowspan=\"" rows "\"")) (setf line (concatenate 'string line " style=\"")) (setf line (concatenate 'string line "width: 1pm; ")) (setf line (concatenate 'string line "height: 12px; ")) (setf line (concatenate 'string line "background-color:green;\""))) (setf line (concatenate 'string line ">" contents "</td>")))) (defun calc-indent (indent) (* 4 indent)) (let ((line-list nil) (indent-spaces 0) (file-name (first *unprocessed-command-line-arguments*))) (format t "<table border='0'>~%") (with-open-file (input-stream file-name :direction :input) ;;;; Reading file and structure list by all lines (loop (let ((line (read-line input-stream nil 'eof))) (if (eql line 'eof) (return)) (dotimes (i indent-spaces) (format t " ")) (setf line-list (append line-list (cons line nil) )))) ;;;; output all lines as html (do ((i 1 (+ i 1))) ((null line-list)) (format t (tr (td (write-to-string i)) (when (equal i 1) (td "" t (write-to-string (length line-list)))) (td (first line-list)))) (setf line-list (cdr line-list))) (format t "</table>~%"))) (quit)
出力結果のサンプルは以下。
<table border='0'> <tr><td>1</td><td rowspan="10" style="width: 1pm; height: 12px; background-color:green;"></td><td>#include <stdio.h></td></tr> <tr><td>2</td><td>#include <string.h></td></tr> <tr><td>3</td><td></td></tr> <tr><td>4</td><td>int main(int argc, char * args[]){</td></tr> <tr><td>5</td><td> char * value;</td></tr> <tr><td>6</td><td> printf("Type message:");</td></tr> <tr><td>7</td><td> fgets(value, sizeof(value), stdin);</td></tr> <tr><td>8</td><td> printf("%s\n", value);</td></tr> <tr><td>9</td><td> return 0;</td></tr> <tr><td>10</td><td>}</td></tr> </table>
まだエスケープ処理ができていないので、include の行は完全に表示されないしインデントもゼロ。引き続き要改善。