diff mbox series

[bug#48637] website: Add publications page

Message ID rvOMdPKRHNINHsvhy8aneQ-XeN8CAbV_3HNdrYNCGNvsUZwp7pzSfusn3eH4q1H3CH45XVYjnSkSLkVdX1TZUlIUPRgVtx4oe7cco70mXE4=@protonmail.com
State Accepted
Headers show
Series [bug#48637] website: Add publications page | expand

Checks

Context Check Description
cbaines/applying patch fail View Laminar job
cbaines/issue success View issue

Commit Message

Luis Felipe May 26, 2021, 2:06 p.m. UTC
On Wednesday, May 26, 2021 10:00 AM, pelzflorian (Florian Pelz) <pelzflorian@pelzflorian.de> wrote:

> On Tue, May 25, 2021 at 10:03:01PM -0400, Julien Lepiller wrote:
>
> > Le 25 mai 2021 16:16:42 GMT-04:00, Luis Felipe luis.felipe.la@protonmail.com a écrit :
> >
> > > #:authors (G_ "Jane Roe, Eva Lua and Luis Felipe")
> >
> > I think so, but I think we'll have to test, because I don't really know the i18n process either for the website ^^'
>
> Yes, it is correct and the best way, but testing by running the
> sexp-xgettext script is good too.
>
> > > That's what I thought, and I was about to ask if it was possible to
> > > have <date> and <authors> instead of <1> and <2>. I guess not...
> > > I need a course on the i18n system :)
>
> I wanted the sexp-xgettext i18n system so developers would not have to
> add a tag name to every element … Well, we can use regexp helper
> function find-empty-element like website/sexp-xgettext.scm uses at the
> beginning of the deconstruct procedure:
>
> (define (find-empty-element msgstr name)
> "Return the regex match structure for the empty tag for XML
> element of type NAME inside MSGSTR. If the element does not exist or
> is more than the empty tag, #f is returned."
> (string-match (string-append "<" (regexp-quote name) "/>") msgstr))
>
> and call it on a translation with G_, but I would prefer not to
> increase code complexity in the website.

Ok, here is the new patch with the suggested changes.

I updated the POT to check the translation strings and I think they are well formed. For example:

#. TRANSLATORS: <1/> is a date, and <2/> a list of authors.
#: apps/media/templates/components.scm:50
#, xml-text
msgid "Published <1/> by <2/>"
msgstr ""

I didn't include the POT update in the patch though. Maybe for future patches I'll do the whole i18n process.

Comments

Julien Lepiller May 26, 2021, 5:41 p.m. UTC | #1
Since last time we calked, I changed che script that updates weblate, so it now ignores the checked out pot file and regenerates it for weblate. Maybe we should now drop it entirely?

Le 26 mai 2021 10:06:43 GMT-04:00, Luis Felipe <luis.felipe.la@protonmail.com> a écrit :
>On Wednesday, May 26, 2021 10:00 AM, pelzflorian (Florian Pelz)
><pelzflorian@pelzflorian.de> wrote:
>
>> On Tue, May 25, 2021 at 10:03:01PM -0400, Julien Lepiller wrote:
>>
>> > Le 25 mai 2021 16:16:42 GMT-04:00, Luis Felipe
>luis.felipe.la@protonmail.com a écrit :
>> >
>> > > #:authors (G_ "Jane Roe, Eva Lua and Luis Felipe")
>> >
>> > I think so, but I think we'll have to test, because I don't really
>know the i18n process either for the website ^^'
>>
>> Yes, it is correct and the best way, but testing by running the
>> sexp-xgettext script is good too.
>>
>> > > That's what I thought, and I was about to ask if it was possible
>to
>> > > have <date> and <authors> instead of <1> and <2>. I guess not...
>> > > I need a course on the i18n system :)
>>
>> I wanted the sexp-xgettext i18n system so developers would not have
>to
>> add a tag name to every element … Well, we can use regexp helper
>> function find-empty-element like website/sexp-xgettext.scm uses at
>the
>> beginning of the deconstruct procedure:
>>
>> (define (find-empty-element msgstr name)
>> "Return the regex match structure for the empty tag for XML
>> element of type NAME inside MSGSTR. If the element does not exist or
>> is more than the empty tag, #f is returned."
>> (string-match (string-append "<" (regexp-quote name) "/>") msgstr))
>>
>> and call it on a translation with G_, but I would prefer not to
>> increase code complexity in the website.
>
>Ok, here is the new patch with the suggested changes.
>
>I updated the POT to check the translation strings and I think they are
>well formed. For example:
>
>#. TRANSLATORS: <1/> is a date, and <2/> a list of authors.
>#: apps/media/templates/components.scm:50
>#, xml-text
>msgid "Published <1/> by <2/>"
>msgstr ""
>
>I didn't include the POT update in the patch though. Maybe for future
>patches I'll do the whole i18n process.
Luis Felipe May 26, 2021, 6:25 p.m. UTC | #2
On Wednesday, May 26, 2021 5:41 PM, Julien Lepiller <julien@lepiller.eu> wrote:

> Since last time we calked, I changed che script that updates weblate, so it now ignores the checked out pot file and regenerates it for weblate. Maybe we should now drop it entirely?

Ah, right. But it would be better to do that in a separate patch, right? To decide what can be removed. Because the sexp-xgettext script would still be useful to check that new translation strings are well formed.
Julien Lepiller May 26, 2021, 6:42 p.m. UTC | #3
Absolutely, let's take care of that later, in a separate patch. I think your patch is in a very good shape now. Do you have commit access?

Le 26 mai 2021 14:25:48 GMT-04:00, Luis Felipe <luis.felipe.la@protonmail.com> a écrit :
>On Wednesday, May 26, 2021 5:41 PM, Julien Lepiller
><julien@lepiller.eu> wrote:
>
>> Since last time we calked, I changed che script that updates weblate,
>so it now ignores the checked out pot file and regenerates it for
>weblate. Maybe we should now drop it entirely?
>
>Ah, right. But it would be better to do that in a separate patch,
>right? To decide what can be removed. Because the sexp-xgettext script
>would still be useful to check that new translation strings are well
>formed.
Luis Felipe May 26, 2021, 7:05 p.m. UTC | #4
On Wednesday, May 26, 2021 6:42 PM, Julien Lepiller <julien@lepiller.eu> wrote:

> Absolutely, let's take care of that later, in a separate patch. I think your patch is in a very good shape now. Do you have commit access?

I don't :)
diff mbox series

Patch

From 0bfa0bc0992a8cfc81903ce0418bab6490b5d110 Mon Sep 17 00:00:00 2001
From: Luis Felipe <luis.felipe.la@protonmail.com>
Date: Mon, 24 May 2021 17:54:17 -0500
Subject: [PATCH] website: Add publications page.

This page lists different kinds of written publications that talk about
Guix.

* website/apps/base/templates/components.scm (navbar): Link to the new
page from the Media menu.
* website/apps/media/builder.scm (publication-list-builder): New helper
builder.
(builder): Use the new helper builder.
* website/apps/media/data.scm (publications): New data set.
* website/apps/media/templates/components.scm (publication->shtml): New
component.
* website/apps/media/templates/publication-list.scm: New template.
* website/apps/media/types.scm (<publication>): New record type.
* website/static/base/img/link-arrow-shaper.svg: New image.
* website/static/media/css/publications.css: New style sheet.
---
 website/apps/base/templates/components.scm    | 14 +++-
 website/apps/media/builder.scm                | 19 ++++--
 website/apps/media/data.scm                   | 25 +++++++
 website/apps/media/templates/components.scm   | 28 +++++++-
 .../apps/media/templates/publication-list.scm | 46 +++++++++++++
 website/apps/media/types.scm                  | 52 ++++++++++++++-
 website/static/base/img/link-arrow-shaper.svg | 66 +++++++++++++++++++
 website/static/media/css/publications.css     | 35 ++++++++++
 8 files changed, 277 insertions(+), 8 deletions(-)
 create mode 100644 website/apps/media/templates/publication-list.scm
 create mode 100644 website/static/base/img/link-arrow-shaper.svg
 create mode 100644 website/static/media/css/publications.css

diff --git a/website/apps/base/templates/components.scm b/website/apps/base/templates/components.scm
index b615f98..e2a74d3 100644
--- a/website/apps/base/templates/components.scm
+++ b/website/apps/base/templates/components.scm
@@ -461,8 +461,18 @@  manual.
       ,(menu-dropdown #:label (C_ "website menu" "Media") #:active-item active-item
         #:items
         (list
-         (C_ "website menu" (menu-item #:label "Videos" #:active-item active-item #:url (guix-url "videos/")))
-         (C_ "website menu" (menu-item #:label "Screenshots" #:active-item active-item #:url (guix-url "screenshots/")))))
+         (C_ "website menu"
+             (menu-item #:label "Videos"
+                        #:active-item active-item
+                        #:url (guix-url "videos/")))
+         (C_ "website menu"
+             (menu-item #:label "Screenshots"
+                        #:active-item active-item
+                        #:url (guix-url "screenshots/")))
+         (C_ "website menu"
+             (menu-item #:label "Publications"
+                        #:active-item active-item
+                        #:url (guix-url "publications/")))))
 
       ,(C_ "website menu" (menu-item #:label "Donate" #:active-item active-item #:url (guix-url "donate/")))
 
diff --git a/website/apps/media/builder.scm b/website/apps/media/builder.scm
index 53378e6..c270db5 100644
--- a/website/apps/media/builder.scm
+++ b/website/apps/media/builder.scm
@@ -6,11 +6,13 @@ 
 (define-module (apps media builder)
   #:use-module (apps aux system)
   #:use-module (apps media data)
+  #:use-module (apps media templates publication-list)
   #:use-module (apps media templates screenshot)
   #:use-module (apps media templates screenshots-overview)
   #:use-module (apps media templates video)
   #:use-module (apps media templates video-list)
   #:use-module (apps media types)
+  #:use-module (haunt artifact)
   #:use-module (haunt html)
   #:use-module (haunt page)
   #:use-module (haunt utils)
@@ -37,11 +39,13 @@ 
      A list of post objects that represent articles from the blog. See
      Haunt <post> objects for more information.
 
-   RETURN (list of <page>)
-     A list of page objects that represent the web resources of the
-     application. See Haunt <page> objects for more information."
+   RETURN (list of <artifact> and <page>)
+     A list of objects that represent the web resources of the
+     application. See Haunt <artifact> and <page> objects for more
+     information."
   (flatten
-   (list (screenshots-overview-builder)
+   (list (publication-list-builder)
+         (screenshots-overview-builder)
          (screenshots-builder)
          (videos-builder)
          (video-list-builder))))
@@ -51,6 +55,13 @@ 
 ;;; Helper builders.
 ;;;
 
+(define (publication-list-builder)
+  "Return a Haunt artifact representing the publications page."
+  (serialized-artifact (url-path-join "publications" "index.html")
+                       (publication-list-t publications)
+                       sxml->html))
+
+
 (define (screenshots-builder)
   "Return a list of Haunt pages representing screenshot pages."
   (map
diff --git a/website/apps/media/data.scm b/website/apps/media/data.scm
index 9b1e2c5..a82d647 100644
--- a/website/apps/media/data.scm
+++ b/website/apps/media/data.scm
@@ -9,6 +9,7 @@ 
   #:use-module (apps media types)
   #:use-module (srfi srfi-19)
   #:export (playlists
+            publications
             screenshots))
 
 
@@ -98,6 +99,30 @@  distribution."))
      #:last-updated (string->date "2020-03-28T16:00:00" "~Y-~m-~dT~H:~M:~S")))))
 
 
+(define publications
+  (list
+   (publication
+    #:title "Functional Package Management with Guix"
+    #:url "https://arxiv.org/abs/1305.4584"
+    #:authors "Ludovic Courtès"
+    #:date (string->date "2013-05-20" "~Y-~m-~d"))
+   (publication
+    #:title "Reproducible and User-Controlled Software Environments in HPC with Guix"
+    #:url "https://hal.inria.fr/hal-01161771/en"
+    #:authors (G_ "Ludovic Courtès, Ricardo Wurmus")
+    #:date (string->date "2015-07-25" "~Y-~m-~d"))
+   (publication
+    #:title "Code Staging in GNU Guix"
+    #:url "https://arxiv.org/abs/1709.00833"
+    #:authors "Ludovic Courtès"
+    #:date (string->date "2017-09-04" "~Y-~m-~d"))
+   (publication
+    #:title "Guix: A most advanced operating system"
+    #:url "https://ambrevar.xyz/guix-advance/index.html"
+    #:authors "Pierre Neidhardt"
+    #:date (string->date "2019-01-14" "~Y-~m-~d"))))
+
+
 (define screenshots
   (list
    (screenshot
diff --git a/website/apps/media/templates/components.scm b/website/apps/media/templates/components.scm
index d928d23..ce9d944 100644
--- a/website/apps/media/templates/components.scm
+++ b/website/apps/media/templates/components.scm
@@ -14,7 +14,8 @@ 
   #:use-module (apps media types)
   #:use-module (apps media utils)
   #:use-module (srfi srfi-19)
-  #:export (screenshot->shtml
+  #:export (publication->shtml
+            screenshot->shtml
             screenshots-box
             video->shtml
             video-content
@@ -25,6 +26,31 @@ 
 ;;; Components.
 ;;;
 
+(define (publication->shtml publication)
+  "Return an SHTML representation of the given publication object.
+
+   PUBLICATION (<publication>)
+     A publication object as defined in (apps media types)."
+  (let ((date
+         (date->string (publication-date publication)
+                       (C_ "SRFI-19 date->string format" "~b ~d, ~Y"))))
+
+    `(a
+      (@ (class "publication-preview")
+         (href ,(publication-url publication)))
+
+      (h3
+       (@ (lang ,(publication-language publication))
+          (class "publication-title"))
+       ,(publication-title publication))
+
+      (p
+       (@ (class "publication-info"))
+       ;; TRANSLATORS: <1/> is a date, and <2/> a list of authors.
+       ,(G_ `("Published " ,date " by "
+              ,(publication-authors publication) ""))))))
+
+
 (define (screenshot->shtml shot)
   "Return an SHTML representation of the given screenshot object.
 
diff --git a/website/apps/media/templates/publication-list.scm b/website/apps/media/templates/publication-list.scm
new file mode 100644
index 0000000..44847c7
--- /dev/null
+++ b/website/apps/media/templates/publication-list.scm
@@ -0,0 +1,46 @@ 
+;;; GNU Guix web site
+;;; Public domain 2021 Luis Felipe López Acevedo
+
+(define-module (apps media templates publication-list)
+  #:use-module (apps base templates theme)
+  #:use-module (apps base types)
+  #:use-module (apps base utils)
+  #:use-module (apps i18n)
+  #:use-module (apps media templates components)
+  #:export (publication-list-t))
+
+
+(define (publication-list-t publications)
+  "Return the Publication list page in SHTML.
+
+   PUBLICATIONS (list of <publication>)
+     See the (apps media types) module for information on the
+     <publication> type."
+  (theme
+   #:title (C_ "webpage title" '("Publications"))
+   #:description
+   (G_ "A list of written publications about GNU Guix.")
+   #:keywords
+   ;; TRANSLATORS: |-separated list of webpage keywords.
+   (string-split (G_ "Publications|Papers") #\|)
+   #:active-menu-item (C_ "website menu" "Publications")
+   #:css (list
+	  (guix-url "static/base/css/page.css")
+	  (guix-url "static/media/css/publications.css"))
+   #:crumbs (list (crumb (C_ "website menu" "Publications") "./"))
+   #:content
+   `(main
+     (section
+      (@ (class "page"))
+      ,(G_ `(h2 "Publications"))
+
+      ,(G_
+        `(p
+          (@ (class "centered-block limit-width"))
+
+          "The following is a list of written materials that talk about GNU Guix. It is a diverse collection of writings, from blog posts to grey literature to academic and research papers."))
+
+      (div
+       (@ (class "publication-list centered-block limit-width"))
+
+       ,@(map publication->shtml publications))))))
diff --git a/website/apps/media/types.scm b/website/apps/media/types.scm
index 50c0989..579e642 100644
--- a/website/apps/media/types.scm
+++ b/website/apps/media/types.scm
@@ -5,7 +5,14 @@ 
 
 (define-module (apps media types)
   #:use-module (srfi srfi-9)
-  #:export (screenshot
+  #:export (publication
+            publication?
+            publication-authors
+            publication-date
+            publication-language
+            publication-title
+            publication-url
+            screenshot
             screenshot?
             screenshot-caption
             screenshot-image
@@ -32,6 +39,49 @@ 
 ;;; Data types.
 ;;;
 
+;;; Publication (record type)
+;;; -------------------------
+;;;
+;;; A publication object represents a written material that talks about
+;;; GNU Guix.
+;;;
+;;; Objects of this type can be created with the "publication" procedure
+;;; (see Helper procedures below).
+;;;
+;;; Fields:
+;;;
+;;; title (string)
+;;;   The title of the publication.
+;;;
+;;; url (string)
+;;;   A URL to the publication.
+;;;
+;;; authors (string)
+;;;   The names of the authors.
+;;;
+;;; date (date)
+;;;   The date of publication.
+;;;
+;;; language (string)
+;;;   IETF language tag corresponding to the language in which the
+;;;   publication is written.
+;;;
+(define-record-type <publication>
+  (make-publication title url authors date language)
+  publication?
+  (title publication-title)
+  (url publication-url)
+  (authors publication-authors)
+  (date publication-date)
+  (language publication-language))
+
+;;; Helper procedures.
+
+(define* (publication #:key title url authors date (language "en"))
+  "Return a <publication> object with the given attributes."
+  (make-publication title url authors date language))
+
+
 ;;; Screenshot (record type)
 ;;; ------------------------
 ;;;
diff --git a/website/static/base/img/link-arrow-shaper.svg b/website/static/base/img/link-arrow-shaper.svg
new file mode 100644
index 0000000..834fd84
--- /dev/null
+++ b/website/static/base/img/link-arrow-shaper.svg
@@ -0,0 +1,66 @@ 
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="50"
+   height="100"
+   id="RSSicon"
+   viewBox="0 0 100 200"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
+   sodipodi:docname="link-arrow-shaper.svg"
+   inkscape:export-filename="feed-bg-whitepng.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata34">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1016"
+     id="namedview32"
+     showgrid="false"
+     inkscape:showpageshadow="false"
+     inkscape:zoom="1"
+     inkscape:cx="94.060188"
+     inkscape:cy="157.85589"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="RSSicon"
+     inkscape:snap-page="false"
+     inkscape:document-rotation="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <defs
+     id="defs3" />
+  <path
+     id="rect88"
+     style="opacity:1;fill:#ffffff;stroke:none;stroke-width:3.77734"
+     d="M 0,-4 H 104 V 204 H 0 L 56,100 Z"
+     sodipodi:nodetypes="cccccc" />
+</svg>
diff --git a/website/static/media/css/publications.css b/website/static/media/css/publications.css
new file mode 100644
index 0000000..797918f
--- /dev/null
+++ b/website/static/media/css/publications.css
@@ -0,0 +1,35 @@ 
+.publication-list {
+    margin-top: 2em;
+}
+
+.publication-preview,
+.publication-preview:link,
+.publication-preview:visited {
+    display: block;
+    border-image: linear-gradient(to right, gray, transparent) 1;
+    border-style: none none solid none;
+    border-width: thin thick;
+    color: #4D4D4D;
+    padding: 20px 70px 20px 10px;
+    transition: border-width .2s cubic-bezier(.22,.61,.36,1);
+}
+
+.publication-preview:active,
+.publication-preview:focus,
+.publication-preview:hover {
+    background-color: gold;
+    background-image: url("/static/base/img/link-arrow-shaper.svg");
+    background-position: right;
+    background-repeat: no-repeat;
+    background-size: auto 100%;
+    border-image: linear-gradient(to right, #333, white, white) 1;
+    border-style: none none solid solid;
+}
+
+.publication-title {
+    margin: 0px;
+}
+
+.publication-info {
+    margin-bottom: 0px;
+}

base-commit: eeb5120135ad3f96f4aad2c7fa37364e6dca584b
-- 
2.31.1