;;; -*- mode: lisp; coding: utf-8; -*- ;;; Generate the index.html file (ql:quickload '(:dev.metalisp.sbt :3bmd)) (defpackage :website (:use :cl #:ml-sbt) (:import-from #:ml-sbt/section #:define-section-type #:with-section #:with-section-row #:with-section-col #:with-title-bar) (:import-from #:ml-sbt/navbar #:with-navbar) (:import-from #:ml-sbt/list-group #:list-group #:with-list-group #:with-list-group*) (:import-from #:ml-sbt/card #:with-card*) (:import-from #:ml-sbt/utility #:make-grid-class) (:import-from #:ml-sbt/btn #:btn)) (in-package :website) (defvar *lang* "en") (define-section-type with-section-projects (make-grid-class :row 1 :sm 2 :md 3 :g 3) nil) (defparameter *active-projects* '(("metalisp.sbt" ("Library of Common Lisp Macros to generate HTML." "In Active Development" "Common Lisp") "https://code.metalisp.dev/marcuskammer/dev.metalisp.sbt") ("metalisp.survey" ("Create questionnaires and analyze the results." "In Active Development" "Common Lisp") "https://code.metalisp.dev/marcuskammer/dev.metalisp.survey") ("metalisp.qmetrics" ("Calculation engine for questionnaires." "In Active Development" "Common Lisp") "https://code.metalisp.dev/marcuskammer/dev.metalisp.qmetrics") ("metalisp.activitystreams" ("ActivityStreams 2 library" "In Active Development" "Common Lisp") "https://code.metalisp.dev/marcuskammer/dev.metalisp.activitystreams") ("emacs dot files" ("Personal emacs dot files." "In Active Development" "Emacs Lisp") "https://code.metalisp.dev/marcuskammer/emacs.d"))) (unless (uiop:directory-exists-p #P"public/") (uiop:ensure-all-directories-exist '(#P"public/"))) (defparameter *index-html* (with-page (:title "metalisp.dev projects") (with-body-header nil "Crafting Software with the Power of Lisp" *lang* (with-navbar nil "metalisp" "/" nil nil)) (with-body-main nil ;; Introduction (with-section (with-title-bar "About metalisp") (:raw (md-file-to-html-string "introduction.md"))) ;; News (with-section (with-title-bar "News") (:raw (md-file-to-html-string "news.md"))) ;; Active Projects (with-section (with-title-bar "Active Projects") (with-section-projects (dolist (project *active-projects*) (destructuring-bind (cheader citems curl) project (with-card* :card-header cheader :card-items citems :card-body (btn (:url curl) (t9n "view-details" *lang*))))))) ;; Contact (with-section (with-title-bar "Contact") (with-list-group nil "email: post at metalisp.dev" "jabber chatgroup: metalisp@conference.mailbox.org" (:a :rel "me" :href "https://fosstodon.org/@metalisp" "Mastodon")))))) (with-open-file (ofile "public/index.html" :direction :output :if-exists :supersede) (princ *index-html* ofile))