source: project/release/3/svnwiki-discuss/trunk/svnwiki-discuss.scm @ 12533

Last change on this file since 12533 was 12533, checked in by azul, 11 years ago

Importing svnwiki extensions.

  • Property svn:keywords set to id
File size: 5.1 KB
Line 
1; $id$
2;
3; License: GPL-3
4
5(declare (export))
6(use svnwiki-extensions-support html-stream format-modular stream-ext srfi-40 posix)
7
8(define (discuss-counter env)
9  (let-from-environment env (path-in path path-out-real)
10    (assert (and 'discuss-counter (not (null? (string-split path "/")))))
11    (if (or (is-discuss? path)
12            (string=? (get-props-parents-first "svnwiki:discuss" path-in path "yes") "no"))
13      stream-null
14      (svnwiki-render-bottom-span
15        env
16        (html-stream
17          ((a class "render-bottom-span render-bottom-span-discuss-count"
18              href (make-link-url path-out-real (make-discuss path) #f))
19           (let ((n (count-comments path-in path)))
20             (format (current-error-port) "Count comments in: ~A, ~A~%" path-in path)
21             (discussion-format
22               env
23               (get-props-parents-first
24                 (cond
25                   ((zero? n) "svnwiki:text:discuss:link-zero")
26                   ((= n 1) "svnwiki:text:discuss:link-one")
27                   (else "svnwiki:text:discuss:link-many"))
28                 path-in
29                 path
30                 (cond
31                   ((zero? n) "~I Discussion")
32                   (else "~I Discussion (~N)")))))))))))
33
34(define (discuss-update-directory-accept env)
35  (let-from-environment env (path)
36    (and-let* ((path)
37               (comps (string-split path "/"))
38               ((> (length comps) 1)))
39      (string=? "xsvnwiki-discuss" (last (butlast comps))))))
40
41(when "SVNWIKI_UNITTESTS"
42  (assert (discuss-update-directory-accept (environment ((path "xsvnwiki-discuss/foo")))))
43  (assert (discuss-update-directory-accept (environment ((path "bar/xsvnwiki-discuss/foo")))))
44  (assert (not (discuss-update-directory-accept (environment ((path "bar/foo"))))))
45  (assert (not (discuss-update-directory-accept (environment ((path #f)))))))
46
47; TODO: Figure out what we need to do here.  Maybe register links.
48
49(define (discuss-update-directory-meta env)
50  (and (discuss-update-directory-accept env)
51       (let-from-environment env (for-each-change)
52         (for-each-change
53           (lambda (env entry)
54             (discuss-update-file-meta env))))))
55
56; TODO: estraier-update-document!
57
58(define (discuss-update-file-meta env)
59  #f)
60
61(define *comments-separator*
62  (html-stream (hr)))
63
64(define (discuss-update-directory-content env)
65  (let-from-environment env (path-in path path-out return regenerate-page)
66    (and-let* (((discuss-update-directory-accept env))
67               (new-path-output (svnwiki-make-pathname #f path "text/html"))
68               (env (environment env ((path-out-real new-path-output)))))
69      ; Regenerate its associated page so its counters for the number of posts
70      ; looks right.  In the future that counter should probably be loaded
71      ; dynamically with AJAX.  However, we also need to regenerate it so that
72      ; the emails for the discussion get sent out.
73      (regenerate-page (svnwiki-discuss->normal path))
74      (svnwiki-report-progress env (svnwiki-translate env "Generating discussion page for: ~A~%") path)
75      (write-file-with-tmp path "text/html" path-out
76        (svnwiki-render-template
77          env
78          "Discuss: "
79          (stream-append
80            (stream-concatenate
81              (stream-intersperse
82                (stream-map
83                  (lambda (comment-path)
84                    (svnwiki-report-progress env (svnwiki-translate env "Generating discussion page for: ~A (comment ~A)~%") path comment-path)
85                    (let ((comment-path-full (svnwiki-make-pathname path comment-path)))
86                      (stream-append
87                        (let ((subject (get-props-parents-first "svnwiki:mail:headers:subject" path-in comment-path-full)))
88                          (if subject
89                            (html-stream (h2 (stream-html-escape subject)))
90                            stream-null))
91                        (render-file-contents
92                          ; TODO: Maybe we need path-original or something like that to get links right?
93                          (environment env ((path comment-path-full)))
94                          path)
95                        ; TODO: Show the date
96                        (html-stream
97                          (p ((span class "author")
98                              (stream-html-escape (get-props-parents-first "svnwiki:mail:headers:from" path-in comment-path-full "Anonymous")))
99                             ", "
100                             ((span class "date")
101                              (seconds->string
102                                (string->number (car (string-split comment-path ":"))))))))))
103                  (list->stream (sort (directory (svnwiki-repository-path env)) string<?)))
104                *comments-separator*))
105            (html-stream
106              ((div id "post-comment")
107               (show-edit-form env))))
108          'view))
109      (return #t))))
110
111(svnwiki-extension-define 'render-bottmon-span 'discuss-counter discuss-counter)
112(svnwiki-extension-define 'update-directory-meta 'discuss discuss-update-directory-meta)
113(svnwiki-extension-define 'update-directory-content 'discuss discuss-update-directory-content)
Note: See TracBrowser for help on using the repository browser.