1 | ;;; |
---|
2 | ;;; generate rss-1.0 from recent logs |
---|
3 | ;;; |
---|
4 | ;;; (c)2008 naoya_t |
---|
5 | ;;; |
---|
6 | (require "./setting") |
---|
7 | (require "./lib/rawlog") |
---|
8 | |
---|
9 | (use srfi-19) ; date |
---|
10 | |
---|
11 | (define today-jd (date->julian-day (current-date))) |
---|
12 | |
---|
13 | (define (rss-1.0 links items) |
---|
14 | (string-append |
---|
15 | "<?xml version=\"1.0\" encoding=\"UTF-8\"?> |
---|
16 | <?xml-stylesheet href=\"./rdf.xsl\" type=\"text/xsl\"?> |
---|
17 | <rdf:RDF xmlns:image=\"http://purl.org/rss/1.0/modules/image/\" |
---|
18 | xmlns:taxo=\"http://purl.org/rss/1.0/modules/taxonomy/\" |
---|
19 | xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" |
---|
20 | xmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\" |
---|
21 | xmlns:dc=\"http://purl.org/dc/elements/1.1/\" |
---|
22 | xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" |
---|
23 | xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\" |
---|
24 | xmlns=\"http://purl.org/rss/1.0/\"> |
---|
25 | <channel rdf:about=\"" rss-output-dir-url "\"> |
---|
26 | <title>IRC " irc-channel " log</title> |
---|
27 | <link>" logview-root-url "</link> |
---|
28 | <description>" irc-channel " on " irc-server "</description> |
---|
29 | <items> |
---|
30 | <rdf:Seq> |
---|
31 | " |
---|
32 | (string-join (map (cut format " <rdf:li resource=\"~a\"/>\n" <>) links) "") |
---|
33 | " </rdf:Seq> |
---|
34 | </items> |
---|
35 | <taxo:topics> |
---|
36 | <rdf:Bag/> |
---|
37 | </taxo:topics> |
---|
38 | </channel> |
---|
39 | " |
---|
40 | (string-join items "") |
---|
41 | " |
---|
42 | </rdf:RDF>")) |
---|
43 | |
---|
44 | (define (hh:mm:dd->sec hh:mm:dd) |
---|
45 | (fold (lambda (x y) (+ x (* y 60))) 0 (map string->number (string-split hh:mm:dd ":")))) |
---|
46 | |
---|
47 | (let loop ([ofs 1] [links '()] [items '()]) |
---|
48 | (let ([last_t 86399] |
---|
49 | [sep #f]) |
---|
50 | (define (plain-filter timestamp user cmd room msg) |
---|
51 | (let1 msg (regexp-replace #/</ msg "<") |
---|
52 | (case cmd |
---|
53 | [(JOIN PART QUIT) #f] |
---|
54 | [(PRIVMSG) |
---|
55 | (let1 t (hh:mm:dd->sec timestamp) |
---|
56 | (let1 s (format "~a~a <~a> ~a<br/>\n" |
---|
57 | (if (< (+ last_t 3600) t) "<hr>\n" "") ; separator |
---|
58 | timestamp user msg) |
---|
59 | (set! last_t t) |
---|
60 | s))] |
---|
61 | [(NICK) |
---|
62 | (format "~a <~a => ~a><br/>\n" timestamp user msg)] |
---|
63 | [(TOPIC) |
---|
64 | (format "~a <~a> TOPIC => ~a><br/>\n" timestamp user msg)] |
---|
65 | [else #f]))) |
---|
66 | |
---|
67 | (let* ([d (julian-day->date (- today-jd ofs))] |
---|
68 | [date-str (date->string d "~Y-~m-~d")] ;;(format "~4,'0d-~2,'0d-~2,'0d" (date-year d) (date-month d) (date-day d))] |
---|
69 | [content (daily-log date-str plain-filter)]) |
---|
70 | (if (and (<= ofs 3) content) |
---|
71 | (let* ([link (logview-url date-str)] |
---|
72 | [description (string-append (substring content 0 (min (string-length content) 100)) " ...")] |
---|
73 | [content-br (regexp-replace #/\n/ content "<br/>\n")] |
---|
74 | [title date-str] |
---|
75 | [subject date-str] |
---|
76 | [item (format |
---|
77 | " <item rdf:about=\"~a\"> |
---|
78 | <title>~a</title> |
---|
79 | <link>~a</link> |
---|
80 | <description>~a</description> |
---|
81 | <dc:subject>~a</dc:subject> |
---|
82 | <dc:date>~aT00:05:00+09:00</dc:date> |
---|
83 | <taxo:topics> |
---|
84 | <rdf:Bag/> |
---|
85 | </taxo:topics> |
---|
86 | <content:encoded><![CDATA[~a]]></content:encoded> |
---|
87 | </item>" link title link description subject date-str content-br) |
---|
88 | ]) |
---|
89 | (loop (+ ofs 1) |
---|
90 | (cons link links) |
---|
91 | (cons item items))) |
---|
92 | (with-output-to-file (string-append rss-output-dir "/" rdf-name) |
---|
93 | (lambda () |
---|
94 | (print (rss-1.0 (reverse! links) (reverse! items))) |
---|
95 | )) |
---|
96 | )))) |
---|