;;; tissue --- Text based issue tracker ;;; Copyright © 2022 Arun Isaac ;;; ;;; This file is part of tissue. ;;; ;;; tissue is free software: you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; tissue is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with tissue. If not, see . (define-module (tissue tissue) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-71) #:use-module (ice-9 match) #:use-module (tissue git) #:use-module (tissue web themes default) #:export (tissue-configuration tissue-configuration? tissue-configuration-aliases tissue-configuration-indexed-documents tissue-configuration-web-search-renderer tissue-configuration-web-files gemtext-files-in-directory)) (define-record-type (make-tissue-configuration aliases indexed-documents web-search-renderer web-files) tissue-configuration? (aliases delayed-tissue-configuration-aliases) (indexed-documents delayed-tissue-configuration-indexed-documents) (web-search-renderer delayed-tissue-configuration-web-search-renderer) (web-files delayed-tissue-configuration-web-files)) (define tissue-configuration-aliases (compose force delayed-tissue-configuration-aliases)) (define tissue-configuration-indexed-documents (compose force delayed-tissue-configuration-indexed-documents)) (define tissue-configuration-web-search-renderer (compose force delayed-tissue-configuration-web-search-renderer)) (define tissue-configuration-web-files (compose force delayed-tissue-configuration-web-files)) (define* (gemtext-files-in-directory #:optional directory) "Return a list of all gemtext files in @var{directory} tracked in the current git repository. The returned paths are relative to the top-level directory of the current repository and do not have a leading slash. If @var{directory} is unspecified, return the list of all gemtext files tracked in the current git repository regardless of which directory they are in." (filter (lambda (filename) (and (or (not directory) (string-prefix? directory filename)) (string-suffix? ".gmi" filename))) (git-tracked-files (current-git-repository)))) (define-syntax define-lazy (lambda (x) "Define function that lazily evaluates all its arguments." (syntax-case x () ((_ (name formal-args ...) body ...) (with-syntax ((delayed-formal-args (map (lambda (formal-arg) (syntax-case formal-arg () ((name default-value) #'(name (delay default-value))) (x #'x))) #'(formal-args ...)))) #`(define-syntax name (lambda (x) (with-ellipsis ::: (syntax-case x () ((_ args :::) #`((lambda* delayed-formal-args body ...) #,@(map (lambda (arg) (if (keyword? (syntax->datum arg)) arg #`(delay #,arg))) #'(args :::))))))))))))) (define-lazy (tissue-configuration #:key (aliases '()) (indexed-documents '()) (web-search-renderer (default-theme)) (web-files '())) "Construct a object. All arguments are evaluated lazily. @var{aliases} is a list of aliases used to refer to authors in the repository. Each element is in turn a list of aliases an author goes by, the first of which is the canonical name of that author. @var{indexed-documents} is a list of @code{} objects (or objects of classes inheriting from @code{}) representing documents to index. @var{web-search-renderer} is a function that accepts two arguments---a @code{} object describing the search page and a @code{} object describing the project. It must return the rendered SXML. @var{web-files} is a list of @code{} objects representing files to be written to the web output." (make-tissue-configuration aliases indexed-documents web-search-renderer web-files))