Add Calendar Plugin
Calendar Plugin for CL-Wiki. Making video (ttyrec).
/(calendar 3 2004 :center)
| Mar 2004 | ||||||
| Mon | Tue | Wed | Thu | Fri | Sat | Sun | 
|   1 | 2 | 3 | 4 | 5 | 6 |   7 | 
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 
| 15 | 16 | 17 | 18 | 19 | 20 | 21 | 
| 22 | 23 | 24 | 25 | 26 | 27 | 28 | 
| 29 | 30 | 31 | ||||
(in-package :blog)
(defconstant +day-names+
   '("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday"))
(defconstant +month-names+
   '("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"))
(defun weekday-name (week) (nth week +day-names+))
(defun month-name (month) (nth (1- month) +month-names+))
(defun get-this-year () (sixth (multiple-value-list (get-decoded-time))))
(defun get-this-month () (fifth (multiple-value-list (get-decoded-time))))
(defun calendar (month year)
  (let ((dtime (encode-universal-time 0 0 12 1 month year)))
    (flet ((next-day ()
             (multiple-value-bind (se mi ho da mo ye week)
                 (decode-universal-time dtime)
               (declare (ignorable se mi ho ye))
               (incf dtime (* 60 60 24))
               (if (= mo month) (list da week) nil))))
      (loop for d = (next-day) while d collect d))))
(defun format-html-calendar (stream month year fn)
  (let* ((c (calendar month year))
         (p (loop for i from 0 below (second (car c)) collect (list nil i)))
         (c (nconc p c)))
    (format stream
       "<table summary=\"~A ~A\">~%<tr><td colspan=\"7\"><div align=\"center\">~A ~A</div></td></tr>~%<tr>~{<td>~A</td>~}</tr>~%"
            (month-name month) year
            (month-name month) year
            (mapcar (lambda (e) (subseq e 0 3)) +day-names+))
    (loop for (day week) in c and i from 0 do
          (when (= (mod week 7) 0) (format stream "<tr>"))
          (if day
              (format stream "<td>~A</td>" (funcall fn year month day))
              (format stream "<td> </td>"))
          (when (= (mod week 7) 6) (format stream "</tr>~%"))
          finally
          (loop repeat (- 6 (mod week 7)) do
               (write-string "<td> </td>" stream)
               finally (write-line "</tr>" stream)))
    (format stream "</table>~%")))
(defplugin "/(calendar [month] [year] [:center|:right]) - calendar plugin."
  (lambda (blog req page arg stream)
    (declare (ignorable blog req page arg))
    (cond ((find :center arg) (write-line "<div align=\"center\">" stream))
          ((find :right arg) (write-line "<div align=\"right\">" stream)))
    (format-html-calendar
     stream
     (or (and (not (keywordp (first arg))) (first arg)) (get-this-month))
     (or (and (not (keywordp (second arg))) (second arg))(second arg) (get-this-year))
     (lambda (year month day)
       (let ((name (format nil "~4,'0D~2,'0D~2,'0D" year month day)))
         (if (find-page blog :page name)
             (format nil "<a href=\"~A.html\">~2D</a>" name day)
             (format nil "~2D" day)))))
    (cond ((find :center arg) (write-line "</div>" stream))
          ((find :right arg) (write-line "</div>" stream)))))
- 3/15 最後の部分が閉じてないのと <center> じゃなくて <div align="center"> を使うように修正。