From e99a3ba3babf2dfb6e6bcdf543157002e515f832 Mon Sep 17 00:00:00 2001 From: Jeremy Dormitzer Date: Sun, 9 Jun 2019 13:18:52 -0400 Subject: [PATCH] Use metas instead of tags for title and published --- src/blog/a-dsl-for-music.html.pm | 12 ++++++------ src/blog/index.html.pm | 5 +++-- src/index.html.pm | 2 +- src/pollen.rkt | 20 ++++++++++++-------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/blog/a-dsl-for-music.html.pm b/src/blog/a-dsl-for-music.html.pm index b9d1b57..e0ca0de 100644 --- a/src/blog/a-dsl-for-music.html.pm +++ b/src/blog/a-dsl-for-music.html.pm @@ -1,9 +1,9 @@ #lang pollen -◊title{A DSL for Music} -◊published-date[2018 8 5] +◊(define-meta title "A DSL for Music") +◊(define-meta published "2018-08-05") -◊section{Haskell School of Music} +◊heading{Haskell School of Music} I recently discovered Haskell School of Music. It’s a book about algorithmic music, which is awesome because: a) I’ve been obsessed with procedural generation for years and b) I like music as much as I like programming. So you can imagine my excitement when I discovered that someone had written a textbook combining my favorite areas of study. @@ -13,7 +13,7 @@ I like Haskell, but I want to write music in Clojure. Why? First of all, because Before we can explore what a DSL for music would look like, we need to understand how HSoM represents music as data. -◊section{Music as data} +◊heading{Music as data} HSoM breaks music down into its component pieces. It represents music using Haskell data structures: @@ -49,7 +49,7 @@ But as powerful as this data type is, I wouldn’t call it a domain-specific lan Here’s where Clojure comes in. -◊section{A DSL for music with Clojure} +◊heading{A DSL for music with Clojure} What would a domain-specific language for music look like in Clojure? I found inspiration in the HTML templating library ◊link[#:href "https://github.com/weavejester/hiccup"]{Hiccup}. Hiccup represents HTML documents (a graph of complex nested nodes, just like music values) using Clojure vectors, like so: @@ -127,7 +127,7 @@ Furthermore, because Clojure is dynamically typed and supports ◊link[#:href "h Like the Hiccup vectors, our music vectors blur the boundary between a DSL and a data structure. The vectors are expressive enough to represent any musical concept, but can still be passed around and operated on by normal Clojure functions. As an added advantage, the vectors look similar enough to the HSoM data structures that I can easily follow along with the textbook using Clojure and Overtone. -◊section{What's next} +◊heading{What's next} So I have a way to represent music in Clojure now. What’s next? Haskell School of Music ships with a library called Euterpea that knows how to turn the Music data structure into actual sound. So the next step for me is probably porting something like that to Clojure. I’m hoping to offload most of that work to Overtone. After that, I’ll explore algorithmic composition using the techniques outlined in HSoM. Stay tuned! diff --git a/src/blog/index.html.pm b/src/blog/index.html.pm index b413086..2abf86f 100644 --- a/src/blog/index.html.pm +++ b/src/blog/index.html.pm @@ -14,9 +14,10 @@ ◊(define (get-posts) (children 'blog)) +◊title{} + ◊for/splice[((post (get-posts)))]{ ◊let[((src (get-source (path->string (path->complete-path (symbol->string post))))))]{ - ◊(string-append "blog/" (symbol->string post)) - ◊;◊link[#:href ◊post]{◊(select 'h1 src)} + ◊link[#:href (symbol->string post)]{◊section{◊(select 'h1 src)}} } } \ No newline at end of file diff --git a/src/index.html.pm b/src/index.html.pm index 1f333b7..32117ac 100644 --- a/src/index.html.pm +++ b/src/index.html.pm @@ -1,6 +1,6 @@ #lang pollen -◊title{Jeremy Dormitzer} +◊(define-meta title "Jeremy Dormitzer") ◊image[#:class "float-left" #:src "images/jeremy.jpg" #:height "512px"] diff --git a/src/pollen.rkt b/src/pollen.rkt index e9fa536..75157f5 100644 --- a/src/pollen.rkt +++ b/src/pollen.rkt @@ -1,12 +1,16 @@ #lang racket -(require pollen/decode txexpr gregor) +(require pollen/core pollen/decode txexpr gregor) (provide (all-defined-out)) (define (root . elements) - (txexpr 'div - '((class "content")) - (decode-elements elements - #:txexpr-elements-proc decode-paragraphs))) + (let ((the-title (select-from-metas 'title (current-metas))) + (published (select-from-metas 'published (current-metas)))) + (txexpr 'div + '((class "content")) + `(,(when/splice the-title (title the-title)) + ,(when/splice published (published-date published)) + ,@(decode-elements elements + #:txexpr-elements-proc decode-paragraphs))))) (define (zip-kws kws kw-args) (map list (map string->symbol (map keyword->string kws)) kw-args)) @@ -22,7 +26,7 @@ (lambda (kws kw-args . elements) (txexpr 'h1 (zip-kws kws kw-args) elements)))) -(define section +(define heading (make-keyword-procedure (lambda (kws kw-args . elements) (txexpr 'h2 (with-class (zip-kws kws kw-args) "section-header") elements)))) @@ -51,7 +55,7 @@ ;; TODO make these links to an index page for each tag (txexpr 'span '((class "tags")) `("Tagged " ,(string-join taglist ", ")))) -(define (published-date year month day) - (let ((publish-date (date year month day))) +(define (published-date date-str) + (let ((publish-date (iso8601->date date-str))) (txexpr 'span '((class "published-date")) `("Posted on " ,(~t publish-date "MMMM d, y")))))