git.fiddlerwoaroof.com
Raw Blame History
#lang racket

(require pollen/tag compatibility/defmacro)
(require pollen/decode txexpr srfi/48)
(provide (all-defined-out))

(defmacro defun (name args . body)
  `(define (,name ,@args)
     ,@body))

(defmacro funcall (fun . args)
  `(,fun ,@args))

(defmacro defvar (name def)
  `(define ,name ,def))

;; This is a macro so that the parameterize form evaluates in the right order
(define-syntax section
  (syntax-rules ()
    [(section #:headline %headline . body)
     (parameterize ([head-tag-num (1+ (head-tag-num))])
       (section `,(headline %headline) . body))]
    [(section . body)
     (txexpr 'section empty
             (decode-elements (list . body)
                              #:txexpr-elements-proc
                              (lambda (x)
                                (decode-paragraphs x
                                                   #:linebreak-proc
                                                   (lambda (y) y)))))]))

(defvar head-tag-num
  (make-parameter 0))

(defvar def
  (default-tag-function 'a #:name "foo"))

(defvar items
  (default-tag-function 'ul))

(defvar item
  (default-tag-function 'li 'p))

(defvar %section-tag
  (default-tag-function 'section))

(defun 1+ (n)
  (+ 1 n))

(defun current-head-tag ()
  (string->symbol (format "h~d" (head-tag-num))))

(defun headline (element)
  (funcall (default-tag-function (current-head-tag)) empty element))

(defun term (val)
  (let ([code (default-tag-function 'code)]
        [u (default-tag-function 'u)]
        [a (default-tag-function 'a)])
    (code (u (a #:href (string-append "#" val)
                val)))))

(defun link (url text)
  `(a (funcall (href ,url)) ,text))

(defun sidenote (label . xs)
  `(splice-me
    (label ((for ,label) (class "margin-toggle sidenote-number")))
    (input ((id ,label) (class "margin-toggle")(type "checkbox")))
    (span ((class "sidenote")) ,@xs)))