Shammer's Philosophy

My private adversaria

ソースコードをHTML表示用に整形するLISPver0.1

以下のようなものを作成。まだ空白の扱いや、予約語の扱いはない。それは今後の課題。

(defparameter first-line-html "<tr><td>1</td><td rowspan=\"~A\" style=\"width: 1pm; height: 12px; background-color:green;\"></td><td>~A</td></tr>~%")
(defparameter other-line-html "<tr><td>~A</td><td>~A</td></tr>~%")

(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)
		  (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) ))))
		  (format t first-line-html (length line-list) (first line-list))
		  (setf line-list (cdr line-list))
		  (dotimes (i (length line-list))
		    (format t other-line-html i (first line-list))
		    (setf line-list (cdr line-list)))
		  (format t "</table>~%")))
(quit)

実行すると以下のように表示される。

$ ccl64 -l source-code-format-html.lisp -- test.c
<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>0</td><td>#include <string.h></td></tr>
<tr><td>1</td><td></td></tr>
<tr><td>2</td><td>int main(int argc, char * args[]){</td></tr>
<tr><td>3</td><td>    char * value;</td></tr>
<tr><td>4</td><td>    printf("Type message:");</td></tr>
<tr><td>5</td><td>    fgets(value, sizeof(value), stdin);</td></tr>
<tr><td>6</td><td>    printf("%s\n", value);</td></tr>
<tr><td>7</td><td>    return 0;</td></tr>
<tr><td>8</td><td>}</td></tr>
</table>