guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/01: website: Download news entries from the Atom feed.


From: Ludovic Courtès
Subject: 01/01: website: Download news entries from the Atom feed.
Date: Wed, 13 May 2015 07:14:22 +0000

civodul pushed a commit to branch master
in repository guix-artwork.

commit 8bbccb95f84ae21c8d97a22bb5a2d3ef3059cdfd
Author: Ludovic Courtès <address@hidden>
Date:   Wed May 13 09:13:49 2015 +0200

    website: Download news entries from the Atom feed.
    
    * website/www.scm (%atom-url): New variable.
      (fetch-news): New procedure.
      (<news-entry>): New record type.
      (news-items, sxml->string*, summarize-string, news-entry->sxml): New
      procedures.
      (main-page): Use 'news-items' and 'news-entry->sxml' instead of
      hard-coded news entries.
---
 website/www.scm |  124 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 97 insertions(+), 27 deletions(-)

diff --git a/website/www.scm b/website/www.scm
index 95cd7bf..50bb4a2 100644
--- a/website/www.scm
+++ b/website/www.scm
@@ -8,6 +8,12 @@
   #:use-module (www contribute)
   #:use-module (www help)
   #:use-module (sxml simple)
+  #:use-module (sxml match)
+  #:use-module (web client)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-9)
+  #:use-module (srfi srfi-19)
+  #:use-module (srfi srfi-26)
   #:use-module (ice-9 match)
   #:export (main-page
 
@@ -15,6 +21,90 @@
             export-web-page
             export-web-site))
 
+(define %atom-url
+  ;; The web site's news feed.
+  "http://savannah.gnu.org/news/atom.php?group=guix";)
+
+(define (fetch-news)
+  "Return the SXML tree of the Atom news feed."
+  (call-with-values
+      (lambda ()
+        (http-get %atom-url))
+    (lambda (response contents)
+      (call-with-input-string contents
+        (lambda (port)
+          (xml->sxml port
+                     #:namespaces '((atom . "http://www.w3.org/2005/Atom";)
+                                    (x . "http://www.w3.org/1999/xhtml";))
+                     #:trim-whitespace? #t))))))
+
+(define-record-type <news-entry>
+  (news-entry url title date author content)
+  news-entry?
+  (url      news-entry-url)                       ;string
+  (title    news-entry-title)                     ;string
+  (date     news-entry-date)                      ;SRFI-19 date
+  (author   news-entry-author)                    ;sxml
+  (content  news-entry-content))                  ;sxml
+
+(define (news-items)
+  "Return the list of <news-entry> taken from the web site's RSS feed."
+  (sxml-match (fetch-news)
+    ((*TOP* (*PI* ,pi ...)
+            (atom:feed
+             (atom:id ,feed-id)
+             (atom:link)
+             (atom:title ,feed-title)
+             (atom:updated ,feed-updated)
+             (atom:entry
+              (atom:id ,id)
+              (atom:link (@ (href ,link)))
+              (atom:title ,title)
+              (atom:updated ,updated)
+              (atom:author ,author)
+              (atom:content ,content)
+              ,rest ...)
+             ...
+             ))
+     (map news-entry
+          link title
+          (map (cut string->date <> "~Y-~m-~d") updated)
+          author content))))
+
+(define (sxml->string* tree)
+  "Flatten tree by dismissing tags and attributes, and return the resulting
+string."
+  (define (sxml->strings tree)
+    (match tree
+      (((? symbol?) ('@ _ ...) body ...)
+       (append-map sxml->strings body))
+      (((? symbol?) body ...)
+       (append-map sxml->strings body))
+      ((? string?)
+       (list tree))))
+
+  (string-concatenate (sxml->strings tree)))
+
+(define (summarize-string str n)
+  "Truncate STR at the first space encountered starting from the Nth
+character."
+  (if (<= (string-length str) n)
+      str
+      (let ((space (string-index str #\space n)))
+        (string-take str (or space n)))))
+
+(define (news-entry->sxml entry)
+  "Return the an SXML tree representing ENTRY, a <news-entry>."
+  `(a (@ (href ,(news-entry-url entry))
+         (class "news-entry"))
+      (h4 ,(news-entry-title entry))
+      (p (@ (class "news-date"))
+         ,(date->string (news-entry-date entry) "~B ~e, ~Y"))
+      (p (@ (class "news-summary"))
+         ,(summarize-string (sxml->string* (news-entry-content entry))
+                            230)
+         "…")))
+
 (define (main-page)
   `(html (@ (lang "en"))
         ,(html-page-header "Home" #:css "index.css")
@@ -128,38 +218,14 @@ packaging API. ")
                    (p (a (@ (href ,(base-url "contribute") )
                             (class "hlink-yellow-boxed"))
                          "Help us package more software →")))
+
               (div (@ (id "news-box"))
                    (h2 "News")
-                   (a (@ (href 
"http://www.fsf.org/news/fsf-adds-guix-system-distribution-to-list-of-endorsed-distributions";)
-                         (class "news-entry"))
-                      (h4 "FSF adds Guix System Distribution to list of
-endorsed distributions")
-                      (p (@ (class "news-date")) "February 3, 2015")
-                      (p (@ (class "news-summary"))
-                         "The Guix System Distribution is a new and growing
-distro that currently ships with just over 1000 packages, already including
-almost all of the programs available from the GNU Project..."))
-                   (a (@ (href 
"https://savannah.gnu.org/forum/forum.php?forum_id=8193";)
-                         (class "news-entry"))
-                      (h4 "GNU Guix 0.8.1 Released")
-                      (p (@ (class "news-date")) "January 29, 2015")
-                      (p (@ (class "news-summary"))
-                         "We are pleased to announce the next alpha release of
-GNU Guix, version 0.8.1. The release comes both with a source tarball, which
-allows you to install it on top of a running GNU/Linux system, and a USB
-installation image to install the standalone Guix System..."))
-                   (a (@ (href 
"https://savannah.gnu.org/forum/forum.php?forum_id=8191";)
-                         (class "news-entry"))
-                      (h4 "GNU Guix at FOSDEM")
-                      (p (@ (class "news-date")) "January 27, 2015")
-                      (p (@ (class "news-summary"))
-                         "Guix will be present at FOSDEM in Brussels, Belgium,
-with a talk entitled \"The Emacs of Distros\" this Saturday, at 3PM, in room
-H.1302. The talk will give an update on developments in Guix and the Guix 
System
-Distribution since last year..."))
+                   ,@(map news-entry->sxml (take (news-items) 3))
                    (p (a (@ (href "https://savannah.gnu.org/news/?group=guix";)
                             (class "hlink-more-dark"))
                          "More news")))
+
               (div (@ (id "contact-box"))
                    (h2 "Contact")
                    (div (@ (class "info-box text-justify"))
@@ -267,3 +333,7 @@ the broader GNU system.")
                                                file-name-separator-string
                                                filename))))
             %web-pages))
+
+;; Local Variables:
+;; eval: (put 'sxml-match 'scheme-indent-function 1)
+;; End:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]