;; Copyright 2004 Mike Burns ;; For research use only. Do not distribute with intent to use. ;; Mike Burns 2004-10-03 mike@mike-burns,com ;; Re-write of rss->xexpr using a hypothetical RDF library. ;; Based on this, the API for RDF will look like: ;; Data: ;; URI : String ;; Object : (union String Node (listof Object)) ;; Namespace : String ;; Node : completely internal, no idea yet ;; RDF : completely internal, no idea yet ;; Functions: ;; rdf-namespace : String -> Namespace ;; rdf-base-node : URI Object ... -> RDF ;; rdf-node : (cons Symbol Namespace) ;; (union (cons Symbol Namespace) String #f) Object ... -> Node ;; rdf->xexpr : RDF -> Xexpr ;; The result of rss->xexpr, for a RSS with one item, will resemble this idea: ;; { ;; ( (rss-link a-rss), rdf#type, rss#channel ), ;; ( (rss-link a-rss), rss#description, (rss-description a-rss) ), ;; ( (rss-link a-rss), rss#items, jklsadjfl ), ;; ( jklsadjfl, rdf#type, rdf#seq ), ;; ( jklsadjfl, rdf#_1, (item-link a-item) ), ;; ( (item-link a-item), rdf#type, rss#item), ;; ( (item-link a-item), rss#title, (item-title a-item) ), ;; ( (item-link a-item), rss#link, (item-link a-item) ), ;; ( (item-link a-item), dc#date, (item-date a-item) ), ;; ( (item-link a-item), dc#creator, (item-author a-item) ), ;; ( (item-link a-item), content#encoded, (item-text a-item) ), ;; } ;; Note that 'jklsadjfl' was completely made up, and replaces the #f. To think ;; about: need this made-up URI remain consistent across runs? With modified ;; input? (module write mzscheme (require (lib "xml.ss" "xml") (planet "create.ss" ("mburns" "rdf.plt" 1 0))) (provide rss->xexpr) ;; rss->xexpr : RSS -> Xexpr ;; Produce the XML representation of the RSS, which is just RDF afterall. (define (rss->xexpr a-rss) (let ((rdf-ns (rdf-namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#")) (rss-ns (rdf-namespace "http://my.netscape.com/rdf/simple/0.9/"))) (let ((type (cons 'type rdf-ns))) (rdf->xexpr (rdf-base-node (rss-link a-rss) (rdf-node type (cons 'channel rss-ns)) (rdf-node (cons 'description rss-ns) (rss-description a-rss)) (rdf-node (cons 'items rss-ns) #f (rdf-node type (cons 'seq rdf-ns)) (rss-items->rdfs rdf-ns rss-ns (rss-items a-rss)))))))) ;; rss-items->rdf : Namespace Namespace (listof Item) -> (listof RDF) ;; A list of RDFs, each corresponding to a RSS Item. (define (rss-items->rdfs rdf-ns rss-ns items) (let ((content-ns (rdf-namespace "http://purl.org/rss/1.0/modules/content/")) (dc-ns (rdf-namespace "http://purl.org/dc/elements/1.1/"))) (map (lambda (a-item n) (rdf-node (cons n rdf-ns) (item-link a-item) (rdf-node type (cons 'item rss-ns)) (rdf-node (cons 'title dc-ns) (item-title a-item)) (rdf-node (cons 'link rss-ns) (item-link a-item)) (rdf-node (cons 'date dc-ns) (item-date a-item)) (rdf-node (cons 'creator dc-ns) (item-author a-item)) (rdf-node (cons 'encoded content-ns) (item-text a-item)))) items (sequence-numbers (length items))))) ;; sequence-numbers : Number -> (listof Symbol) ;; Produce the Seq names for all the numbers specified. (define (sequence-numbers n) (build-list n (lambda (n) (string->symbol (string-append "_" (number->string (add1 n))))))) )