vegashacker / leftparen
- Source
- Commits
- Network (8)
- Issues (0)
- Downloads (4)
- Wiki (1)
- Graphs
-
Tree:
169c896
leftparen / feed.ss
| 07a8ded1 » | vegashacker | 2008-11-24 | 1 | #lang scheme/base | |
| 2 | |||||
| 3 | (require "time.scm" | ||||
| 4 | "util.scm" | ||||
| 6d520540 » | vegashacker | 2008-11-24 | 5 | "contract-lp.ss" | |
| af0a5496 » | vegashacker | 2009-01-08 | 6 | "web-export.ss" | |
| 07a8ded1 » | vegashacker | 2008-11-24 | 7 | "web-support.scm" | |
| 6d520540 » | vegashacker | 2008-11-24 | 8 | "settings.scm" | |
| af0a5496 » | vegashacker | 2009-01-08 | 9 | "page.scm") | |
| 07a8ded1 » | vegashacker | 2008-11-24 | 10 | ||
| c144229e » | vegashacker | 2008-11-25 | 11 | (provide ;; atom-feed (via contract) | |
| 12 | ;; atom-item (via contract) | ||||
| 07a8ded1 » | vegashacker | 2008-11-24 | 13 | ||
| c144229e » | vegashacker | 2008-11-25 | 14 | ;; rss-feed (via contract) | |
| 15 | ;; rss-item (via contract) | ||||
| 16 | ) | ||||
| 07a8ded1 » | vegashacker | 2008-11-24 | 17 | ||
| c144229e » | vegashacker | 2008-11-25 | 18 | (define-struct atom-item (title url updated content)) | |
| 19 | (define-struct rss-item (title url content)) | ||||
| 20 | |||||
| 21 | ;; | ||||
| 22 | ;; atom-feed | ||||
| 23 | ;; | ||||
| 24 | ;; Generate an Atom 1.0 feed. | ||||
| 25 | ;; | ||||
| 26 | (provide/contract | ||||
| 27 | (atom-feed (->* (page? #:feed-title string? #:feed-updated/epoch-seconds integer? | ||||
| 28 | #:author-name string?) | ||||
| 29 | (#:feed-description (or/c #f string?) #:feed-id string? | ||||
| 30 | #:related-content-link string? #:items (listof atom-item?)) | ||||
| 31 | response/full?))) | ||||
| 12fc417f » | vegashacker | 2008-11-26 | 32 | ;; | |
| c144229e » | vegashacker | 2008-11-25 | 33 | (define (atom-feed atom-feed-page | |
| 34 | #:feed-title feed-title | ||||
| 35 | #:feed-updated/epoch-seconds feed-updated | ||||
| 36 | #:author-name author-name | ||||
| 37 | #:feed-description (feed-description #f) | ||||
| 38 | #:feed-id (feed-id (page-url atom-feed-page #:absolute #t)) | ||||
| 39 | #:related-content-link (related-content-link (setting *WEB_APP_URL*)) | ||||
| 40 | #:items (atom-items '())) | ||||
| 07a8ded1 » | vegashacker | 2008-11-24 | 41 | (list-response #:type #"text/xml" | |
| 42 | (list (raw-str "<?xml version=\"1.0\" encoding=\"utf-8\"?>") | ||||
| 43 | `(feed ((xmlns "http://www.w3.org/2005/Atom")) | ||||
| c144229e » | vegashacker | 2008-11-25 | 44 | (id ,feed-id) | |
| 07a8ded1 » | vegashacker | 2008-11-24 | 45 | (title ,feed-title) | |
| c144229e » | vegashacker | 2008-11-25 | 46 | ,@(splice-if feed-description `(subtitle ,feed-description)) | |
| 47 | (link ((href ,(page-url atom-feed-page #:absolute #t)) | ||||
| 48 | (rel "self"))) | ||||
| 49 | (link ((href ,related-content-link) (rel "alternate"))) | ||||
| 50 | (updated ,(atom-time-str feed-updated)) | ||||
| 51 | (author (name ,author-name)) | ||||
| 52 | ,@(map atom-item-markup atom-items))))) | ||||
| 07a8ded1 » | vegashacker | 2008-11-24 | 53 | ||
| c144229e » | vegashacker | 2008-11-25 | 54 | ;; | |
| 55 | ;; atom-item | ||||
| 56 | ;; | ||||
| 57 | ;; A way to make atom-items (which are passed into #:items of atom-feed). | ||||
| 58 | ;; | ||||
| 59 | (provide/contract | ||||
| 60 | (rename construct-atom-item atom-item (->* (#:title string? #:url string? | ||||
| 61 | #:updated-epoch-seconds integer?) | ||||
| 62 | (#:content (or/c #f string?)) | ||||
| 63 | atom-item?))) | ||||
| 64 | ;; | ||||
| 65 | (define (construct-atom-item #:title title #:url url #:updated-epoch-seconds updated | ||||
| 66 | #:content (content #f)) | ||||
| 67 | (make-atom-item title url updated content)) | ||||
| 68 | |||||
| 69 | (define (atom-item-markup atom-item) | ||||
| 70 | (let ((url (atom-item-url atom-item))) | ||||
| 71 | `(entry (title ,(atom-item-title atom-item)) | ||||
| 72 | (link ((href ,url) (rel "self"))) | ||||
| 73 | (id ,url) | ||||
| 74 | (updated ,(atom-time-str (atom-item-updated atom-item))) | ||||
| 75 | ,@(splice-if (aand (atom-item-content atom-item) `(content ,it)))))) | ||||
| 6d520540 » | vegashacker | 2008-11-24 | 76 | ||
| 372b34e6 » | vegashacker | 2008-11-24 | 77 | ;; | |
| 6d520540 » | vegashacker | 2008-11-24 | 78 | ;; rss-feed | |
| 372b34e6 » | vegashacker | 2008-11-24 | 79 | ;; | |
| 6d520540 » | vegashacker | 2008-11-24 | 80 | ;; Generate an RSS 1.0 feed. | |
| 372b34e6 » | vegashacker | 2008-11-24 | 81 | ;; | |
| c144229e » | vegashacker | 2008-11-25 | 82 | (provide/contract | |
| 83 | (rss-feed (->* (page? #:feed-title string? #:feed-description string?) | ||||
| 84 | (#:related-content-link string? #:items (listof rss-item?)) | ||||
| 85 | response/full?))) | ||||
| 6d520540 » | vegashacker | 2008-11-24 | 86 | ;; | |
| 87 | (define (rss-feed rss-feed-page | ||||
| 88 | #:feed-title feed-title | ||||
| 89 | #:feed-description feed-description | ||||
| c144229e » | vegashacker | 2008-11-25 | 90 | #:related-content-link (related-content-link (setting *WEB_APP_URL*)) | |
| 6d520540 » | vegashacker | 2008-11-24 | 91 | #:items (rss-items '())) | |
| 372b34e6 » | vegashacker | 2008-11-24 | 92 | (list-response #:type #"text/xml" | |
| 6d520540 » | vegashacker | 2008-11-24 | 93 | (list (raw-str "<?xml version=\"1.0\" encoding=\"utf-8\"?>") | |
| 07a8ded1 » | vegashacker | 2008-11-24 | 94 | `(rdf:RDF | |
| 95 | ((xmlns "http://purl.org/rss/1.0/") | ||||
| 96 | (xmlns:rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#")) | ||||
| c144229e » | vegashacker | 2008-11-25 | 97 | (channel ((rdf:about ,(page-url rss-feed-page #:absolute #t))) | |
| 6d520540 » | vegashacker | 2008-11-24 | 98 | (title ,feed-title) | |
| c144229e » | vegashacker | 2008-11-25 | 99 | (link ,related-content-link) | |
| 6d520540 » | vegashacker | 2008-11-24 | 100 | (description ,feed-description) | |
| c144229e » | vegashacker | 2008-11-25 | 101 | (items (rdf:Seq ,@(map rss-li rss-items)))) | |
| 102 | ,@(map rss-item-markup rss-items))))) | ||||
| 372b34e6 » | vegashacker | 2008-11-24 | 103 | ||
| 6d520540 » | vegashacker | 2008-11-24 | 104 | (define (rss-li rss-item) | |
| 105 | `(rdf:li ((resource ,(rss-item-url rss-item))))) | ||||
| 07a8ded1 » | vegashacker | 2008-11-24 | 106 | ||
| c144229e » | vegashacker | 2008-11-25 | 107 | ;; | |
| 108 | ;; rss-item | ||||
| 109 | ;; | ||||
| 110 | ;; A way to make rss-items (which are passed into #:items of rss-feed) | ||||
| 111 | ;; | ||||
| 6d520540 » | vegashacker | 2008-11-24 | 112 | (provide/contract | |
| 113 | (rename construct-rss-item rss-item (->* (#:title string? #:url string?) | ||||
| c144229e » | vegashacker | 2008-11-25 | 114 | (#:content (or/c #f string?)) | |
| 6d520540 » | vegashacker | 2008-11-24 | 115 | rss-item?))) | |
| c144229e » | vegashacker | 2008-11-25 | 116 | ;; | |
| 117 | (define (construct-rss-item #:title title #:url url #:content (content #f)) | ||||
| 118 | (make-rss-item title url content)) | ||||
| 6d520540 » | vegashacker | 2008-11-24 | 119 | ||
| c144229e » | vegashacker | 2008-11-25 | 120 | (define (rss-item-markup rss-item) | |
| 6d520540 » | vegashacker | 2008-11-24 | 121 | (let ((url (rss-item-url rss-item))) | |
| 122 | `(item ((rdf:about ,url)) | ||||
| 123 | (title ,(rss-item-title rss-item)) | ||||
| 124 | (link ,url) | ||||
| c144229e » | vegashacker | 2008-11-25 | 125 | ,@(splice-if (aand (rss-item-content rss-item) `(description ,it)))))) | |

