Win7 + CCL で動作してます。
参考>> HUNCHENTOOT - The Common Lisp web server formerly known as TBNL
参考>> CL-WHO - Yet another Lisp markup language
参考>> Common Lisp で Web アプリを作るためのブランクプロジェクト
参考>> (Lisperp sakuranbo) => t を目指す日記 会社から投稿テスト
UNIX板が見れます。
(eval-when (:compile-toplevel :load-toplevel :execute)
(require :hunchentoot)
(require :cl-who)
(require :drakma)
(require :jp)
(require :cl-ppcre))
(defpackage :web-sample
(:use :cl :hunchentoot :cl-who :drakma :jp :cl-ppcre)
(:shadow :COOKIE-VALUE
:*HEADER-STREAM*
:PARAMETER-ERROR
:COOKIE-NAME
:COOKIE-DOMAIN
:COOKIE-PATH
:COOKIE-EXPIRES)
(:export #:start-server #:stop-server))
;; 参考
;; Common Lisp で Web アプリを作るためのブランクプロジェクト
;; http://read-eval-print.blogspot.com/2011/02/common-lisp-web.html
(in-package :web-sample)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 環境設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defparameter *default-directory*
(pathname (directory-namestring #.(or *compile-file-truename*
*load-truename*))) "このファイルがあるディレクトリ")
(defparameter *js-path* (merge-pathnames "js/" *default-directory*) "JavaScript 用ディレクトリ")
(defparameter *css-path* (merge-pathnames "css/" *default-directory*) "スタイルシート用ディレクトリ")
(setf
;; for utf-8
hunchentoot:*hunchentoot-default-external-format* (flexi-streams:make-external-format :utf-8)
hunchentoot:*default-content-type* "text/html; charset=utf-8"
;; for debug
hunchentoot:*catch-errors-p* nil)
(setf hunchentoot:*dispatch-table*
(list
'hunchentoot:dispatch-easy-handlers
(hunchentoot:create-folder-dispatcher-and-handler "/css/" *css-path*)
(hunchentoot:create-folder-dispatcher-and-handler "/js/" *js-path*)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 汎用関数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar *port8080-acceptor* (make-instance 'hunchentoot:acceptor :port 8080))
(defun start-server ()
"Web サーバ起動"
(start *port8080-acceptor*))
(defun stop-server ()
"Web サーバ停止"
(stop *port8080-acceptor*))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; トップページ(2ch UNIX板のスレッド一覧)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; スレッド一覧を取得する
(defun get-thread-subject (url bkey)
(jp:decode (http-request (concatenate 'string url bkey "/subject.txt") :force-binary t) :guess))
;; 取得したスレッドをリストに分解する
(defun make-thread-list (text)
(mapcar #'(lambda (x) (cl-ppcre:split "<>" x))
(cl-ppcre:split #\LineFeed text)))
;; スレッド一覧を表示するHTMLを構築
(defun make-thread-html (list url bkey)
(with-html-output-to-string (*standard-output* nil :indent t)
(:html (:head (:title "スレ一覧")
(:script))
(:body
(loop for (dat title) in list
do (htm (:a :href (concatenate 'string "thread?"
"dat=" (url-encode dat)
"&url=" (url-encode url)
"&bkey=" (url-encode bkey))
:target "_blank" (str title)) :br))))))
(defun index-html (url bkey)
""
(make-thread-html (make-thread-list (get-thread-subject url bkey)) url bkey))
(define-easy-handler (index :uri "/index") ()
(setf (hunchentoot:content-type*) "text/html; charset=utf-8")
(index-html "http://hibari.2ch.net/" "unix"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; スレッドビュー
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defclass res ()
((num :initarg :num)
(name :initarg :name)
(mail :initarg :mail)
(date :initarg :date)
(text :initarg :text)))
(defun get-thread-dat (url bkey dat)
"スレッドDATを取得する。"
(jp:decode (http-request (concatenate 'string
(url-decode url)
(url-decode bkey) "/dat/"
(url-decode dat)) :force-binary t) :guess))
(defun make-thread-res-list (text)
"DATを分解して配列に格納する。"
(let ((i 1)
(result nil))
(loop for res in (cl-ppcre:split #\LineFeed text)
do (let ((temp (cl-ppcre:split "<>" res)))
(when (= i 1)
(push (make-instance 'res :num 0 :text (car (last temp))) result)
(push (make-instance 'res
:num i
:name (first temp)
:mail (second temp)
:date (third temp)
:text (fourth temp)) result))
(when (not (= i 1))
(push (make-instance 'res
:num i
:name (first temp)
:mail (second temp)
:date (third temp)
:text (fourth temp)) result))
(incf i)))
(reverse result)))
(defun thread-html (url bkey dat)
"スレッドを展開してHTML化"
(let ((res (make-thread-res-list (get-thread-dat url bkey dat))))
(with-html-output-to-string (*standard-output* nil :indent t)
(:html (:head (:title "スレッドビュー")
(:script))
(:body (loop for i in res
do (cond
((= 0 (slot-value i 'num)) (htm (:font :color "red" (:b (str (slot-value i 'text)))) :br :br))
(t (progn
(htm (:dl (:dt
(htm (str (slot-value i 'num))
(:b :style "color:forestgreen;" (str (slot-value i 'name)))
(str (concatenate 'string "[" (slot-value i 'mail) "]"))
(str (slot-value i 'date)) :br)
(htm (:dd (str (slot-value i 'text)) :br :br))))))))))))))
(define-easy-handler (thread :uri "/thread") (url bkey dat)
(setf (hunchentoot:content-type*) "text/html; charset=utf-8")
(thread-html url bkey dat))
0 件のコメント:
コメントを投稿