64 lines
2.7 KiB
Common Lisp
64 lines
2.7 KiB
Common Lisp
(defpackage #:website/components/metadata
|
|
(:use #:cl
|
|
#:hsx
|
|
#:jingle)
|
|
(:import-from #:website/lib/env
|
|
#:website-url)
|
|
(:export #:~metadata))
|
|
(in-package #:website/components/metadata)
|
|
|
|
(defun path->url (path)
|
|
(concatenate 'string
|
|
(website-url)
|
|
(and (not (string= path "/")) path)))
|
|
|
|
(defun complete-metadata (metadata)
|
|
(loop
|
|
:for (key template) :on *default-metadata* :by #'cddr
|
|
:for value := (getf metadata key)
|
|
:append (list key (if (functionp template)
|
|
(funcall template value)
|
|
(or value template)))))
|
|
|
|
(defparameter *default-metadata*
|
|
(list :title (lambda (title) (format nil "~@[~a - ~]skyizwhite" title))
|
|
:description "The personal website of Akira Tempaku (paku)"
|
|
:canonical nil
|
|
:type "website"
|
|
:image (list :url (path->url "/img/og.jpg")
|
|
:height 1024
|
|
:width 1024)
|
|
:error nil))
|
|
|
|
(defcomp ~metadata (&key metadata)
|
|
(destructuring-bind (&key title
|
|
description
|
|
canonical
|
|
type
|
|
image
|
|
error)
|
|
(complete-metadata metadata)
|
|
(let ((path (request-uri *request*)))
|
|
(hsx
|
|
(<>
|
|
(meta :charset "UTF-8")
|
|
(meta :name "viewport" :content "width=device-width, initial-scale=1")
|
|
(title title)
|
|
(meta :name "description" :content description)
|
|
(and (not error)
|
|
(hsx (<>
|
|
(meta :property "og:title" :content title)
|
|
(meta :property "og:description" :content description)
|
|
(meta :property "og:url" :content (path->url path))
|
|
(meta :property "og:type" :content type)
|
|
(meta :property "og:site_name" :content "skyizwhite")
|
|
(meta :property "og:image" :content (getf image :url))
|
|
(meta :property "og:image:width" :content (getf image :width))
|
|
(meta :property "og:image:height" :content (getf image :height))
|
|
(link :rel "canonical" :href (path->url (or canonical path))))))
|
|
(link :rel "icon" :type "image/png" :href "/img/favicon-96x96.png" :sizes "96x96")
|
|
(link :rel "icon" :type "image/svg+xml" :href "/img/favicon.svg")
|
|
(link :rel "shortcut icon" :href "/img/favicon.ico")
|
|
(link :rel "apple-touch-icon" :sizes "180x180" :href "/img/apple-touch-icon.png")
|
|
(meta :name "apple-mobile-web-app-title" :content "skyizwhite")
|
|
(link :rel "manifest" :href "/img/site.webmanifest"))))))
|