From 423ac382f9e73bf1ca7fc6b400f98db087cd7d22 Mon Sep 17 00:00:00 2001
From: Case Duckworth
Date: Wed, 5 Jun 2024 09:21:25 -0500
Subject: Write executable
This involved moving `src' to `lib' and making `bin'.
`bin' holds the program, which only imports `jimmy.main' from lib.
---
src/emit.scm | 89 ------------------------------------------------------------
src/html.scm | 61 -----------------------------------------
src/read.scm | 88 -----------------------------------------------------------
src/util.scm | 49 ---------------------------------
src/wrap.scm | 23 ----------------
5 files changed, 310 deletions(-)
delete mode 100644 src/emit.scm
delete mode 100644 src/html.scm
delete mode 100644 src/read.scm
delete mode 100644 src/util.scm
delete mode 100644 src/wrap.scm
(limited to 'src')
diff --git a/src/emit.scm b/src/emit.scm
deleted file mode 100644
index 4c3581f..0000000
--- a/src/emit.scm
+++ /dev/null
@@ -1,89 +0,0 @@
-(declare (module (jimmy emit)))
-
-(import scheme (chicken base)
- (chicken format)
- (chicken irregex)
- (chicken string)
- (only utf8-srfi-13 string-join)
- (jimmy util))
-
-(define-public (emit doc)
- (for-each display (map format-stanza doc)))
-
-(define-public formats
- (make-parameter
- ;; (TYPE (line . LINE-FMT) (stanza . STANZA-FMT) (inline . INLINE-FMT))
- '((para (line . "~A")
- (stanza . "~A~%~%"))
- (verb (line . "~A~%")
- (stanza . "```~%~A```~%~%"))
- (link (line . "=> ~A ~A~%") ; Note: link has 2 format arguments
- (stanza . "~A~%")
- (inline . "~%=> ~A ~A~%"))
- (list (line . "* ~A~%")
- (stanza . "~A~%"))
- (quot (line . "~A")
- (stanza . "> ~A~%~%"))
- (hdr1 (line . "# ~A~%")
- (stanza . "~A~%"))
- (hdr2 (line . "## ~A~%")
- (stanza . "~A~%"))
- (hdr3 (line . "### ~A~%")
- (stanza . "~A~%")))))
-
-(define-public filters
- (make-parameter
- ;; (TYPE (line . LINE-FILTER) (stanza . STANZA-FILTER))
- ;; line-filter : (lambda (list-of-strs) ...) -> list-of-strs (for format)
- ;; stanza-filter : (lambda (list-of-strs) ...) -> str
- `((verb (line . ,identity)
- (stanza . ,join-lines))
- (default
- (line . ,identity)
- (stanza . ,flush-lines-left)))))
-
-(define (format-line line el)
- (cond
- ((string? (car line)) ; regular stanza line
- (sprintf* (get-format el 'line)
- ((get-filter el 'line) line)))
- ((symbol? (car line)) ; inline element
- (sprintf* (get-format (car line) 'inline)
- ((get-filter (car line) 'line) (cdr line))))
- (else (error "Malformed line" line))))
-
-(define (format-stanza stanza)
- (let* ((type (car stanza))
- (data (cdr stanza))
- (text (map (lambda (ln)
- (format-line ln type))
- data)))
- (sprintf (get-format type 'stanza)
- ((get-filter type 'stanza) text))))
-
-;;; Utilities
-
-(define (get-from alist el scope)
- (or (alist-walk alist el scope)
- (alist-walk alist 'default scope)
- (and (eq? scope 'inline)
- (alist-walk alist 'default 'line))))
-
-(define (get-format el scope)
- (or (get-from (formats) el scope)
- ""))
-(define (get-filter el scope) (get-from (filters) el scope))
-
-(define (sprintf* fmt lis)
- (let loop ((num (length (irregex-extract "~[aA]" fmt)))
- (lis lis)
- (out '()))
- (cond
- ((null? lis)
- (apply sprintf fmt (reverse out)))
- ((= 1 num)
- (loop 0 '() (cons (string-join lis) out)))
- (else
- (loop (- num 1)
- (cdr lis)
- (cons (car lis) out))))))
diff --git a/src/html.scm b/src/html.scm
deleted file mode 100644
index 07cd921..0000000
--- a/src/html.scm
+++ /dev/null
@@ -1,61 +0,0 @@
-(declare (module (jimmy html)))
-
-(import scheme (chicken base)
- (chicken irregex)
- (jimmy emit)
- (jimmy util))
-
-(define (escape-entities s)
- (irregex-replace/all "[&<>]" s
- (lambda (m)
- (let ((c (irregex-match-substring m)))
- (cond
- ((equal? c "&") "&")
- ((equal? c "<") "<")
- ((equal? c ">") ">"))))))
-
-(define (add-inline-markup s)
- (define (char->tag ch tag)
- (lambda (s)
- (irregex-replace/all `(: ,ch ($ (* (~ ,ch))) ,ch) s
- "<" tag ">" 1 "" tag ">")))
-
- ((o (char->tag "*" "b")
- (char->tag "_" "i")
- (char->tag "`" "code")) s))
-
-(formats
- '((para (line . "~a~%")
- (stanza . "
~% ~a
~%"))
- (verb (line . "~a~%")
- (stanza . "~a
~%"))
- (link (line . "~a~%")
- (stanza . "~%")
- (inline . "~a~%"))
- (list (line . "~a~%")
- (stanza . "~%"))
- (quot (line . "~a~%")
- (stanza . "~% ~a
~%"))
- (hdr1 (line . "~a")
- (stanza . "~a
~%"))
- (hdr2 (line . "~a")
- (stanza . "~a
~%"))
- (hdr3 (line . "~a")
- (stanza . "~a
~%"))))
-
-(filters
- `((verb (line . ,identity)
- (stanza . ,join-lines))
- (link (line . ,(lambda (ln)
- (cons (car ln)
- ((o list
- add-inline-markup
- escape-entities
- string-join)
- (cdr ln))))))
- (default
- (line . ,(o list
- add-inline-markup
- escape-entities
- string-join))
- (stanza . ,string-join))))
diff --git a/src/read.scm b/src/read.scm
deleted file mode 100644
index 1b611bb..0000000
--- a/src/read.scm
+++ /dev/null
@@ -1,88 +0,0 @@
-(declare (module (jimmy read)))
-
-(import scheme (chicken base)
- (jimmy util)
- (only (chicken io) read-lines)
- (only (chicken string) string-split))
-
-(define-public line-types
- ;; (sigil type inlines word-select)
- `((default para (link) ,identity) ; if nothing else matches
- ("```" verb)
- ("=>" link)
- (">" quot)
- ("#" hdr1)
- ("##" hdr2)
- ("###" hdr3)
- ("*" list)
- ;; extra!
- (":" meta)))
-
-(define-public (parse #!optional port)
- (parse-lines (read-lines (or port (current-input-port))) '()))
-
-(define (line-type line)
- (let ((lin (if (string? line) (string-split line) line))
- (def (cdr (assoc 'default line-types))))
- (cond
- ((null? lin) def) ; empty line
- ((assoc (car lin) line-types) => cdr) ; a line type exists
- (else def)))) ; otherwise ...
-
-(define (parse-lines lines doc)
- (if (null? lines) (reverse doc)
- (let ((words (string-split (car lines))))
- (cond
- ((null? words) ; empty line
- (parse-lines (cdr lines) doc))
- ((equal? (car words) "```") ; verbatim
- ;; Format for verbatim header:
- ;; ``` ?html | command ...
- ;; -- only run command on block with html output.
- ;; other outputs process the block normally
- ;; ``` ?!html | command ...
- ;; -- only run command on block when *not* outputting html.
- ;; html processes the block normally
- ;; ``` ?:html | command ...
- ;; -- like ?html, but ignore the block in non-html outputs.
- ;;;; FIXME: I think this necessitates a special emit-verbatim
- ;;;; function.
- (parse-verbatim (cdr lines) doc '()
- #; (if (< 1 (length words))
- (cons 'verb (cdr words))
- 'verb)
- 'verb))
- (else ; another line type
- (apply parse-stanza lines doc '() (line-type words)))))))
-
-(define (parse-verbatim lines doc block bhead)
- (define (close-verbatim) (cons (cons bhead (reverse block)) doc))
- (cond
- ((null? lines) ; end of document
- (parse-lines lines (close-verbatim)))
- ((equal? (car lines) "```") ; end of verbatim block
- (parse-lines (cdr lines) (close-verbatim)))
- (else ; verbatim block continues
- (parse-verbatim (cdr lines) doc (cons (list (car lines)) block) bhead))))
-
-(define (parse-stanza lines doc stanza st-type
- #!optional (st-inlines '()) (st-words cdr))
- (define (close-stanza) (cons (cons st-type (reverse stanza)) doc))
- (if (null? lines) ; end of document
- (parse-lines lines (close-stanza))
- (let* ((ln (car lines))
- (ws (string-split ln))
- (lt (line-type ln)))
- (cond
- ((null? ws) ; end of stanza (blank line)
- (parse-lines (cdr lines) (close-stanza)))
- ((memq (car lt) st-inlines) ; in-line for *this* stanza
- (parse-stanza (cdr lines) doc
- (cons (cons (car lt) (cdr ws)) stanza)
- st-type st-inlines st-words))
- ((not (eq? st-type (car (line-type ws)))) ; beginning of a new stanza
- (parse-lines lines (close-stanza)))
- (else ; continue this stanza
- (parse-stanza (cdr lines) doc
- (cons (st-words ws) stanza)
- st-type st-inlines st-words))))))
diff --git a/src/util.scm b/src/util.scm
deleted file mode 100644
index c71c600..0000000
--- a/src/util.scm
+++ /dev/null
@@ -1,49 +0,0 @@
-(module (jimmy util) *
-
- (import scheme (chicken base)
- (chicken condition)
- (only (chicken irregex) irregex-replace/all)
- (chicken string))
-
- (define-syntax define-public
- (syntax-rules ()
- ((define-public (name . arg) forms ...)
- (begin (export name)
- (define (name . arg) forms ...)))
- ((define-public (name args ...) forms ...)
- (begin (export name)
- (define (name args ...) forms ...)))
- ((define-public name value)
- (begin (export name)
- (define name value)))))
-
- (define-syntax ignore-errors
- (syntax-rules ()
- ((ignore-errors x)
- (handle-exceptions e #f x))))
-
- (define (alist-walk lis . keys)
- (if (null? keys)
- lis
- (let ((kv (assoc (car keys) lis)))
- (cond
- ((not kv) #f)
- ((atom? (cdr kv))
- (and (null? (cdr keys)) ; this shouldn't error...
- (cdr kv)))
- ((list? (cdr kv))
- (apply alist-walk (cdr kv) (cdr keys)))))))
-
- (define (string-join ss #!optional (sep " "))
- (string-intersperse ss sep))
-
- (define (flush-lines-left lines)
- (irregex-replace/all '(: bol (* space))
- (string-join lines) ""))
-
- (define (join-lines lines)
- (apply string-append lines))
-
- )
-
-
diff --git a/src/wrap.scm b/src/wrap.scm
deleted file mode 100644
index aa077d8..0000000
--- a/src/wrap.scm
+++ /dev/null
@@ -1,23 +0,0 @@
-(declare (module (jimmy wrap)))
-
-(import scheme (chicken base)
- (jimmy emit)
- (jimmy util)
- (only (chicken io) read-string)
- (only (chicken port) with-output-to-string)
- (only (chicken string) string-translate* string-intersperse))
-
-;; templates are strings with variables interpolated with "{{variables}}"
-
-(define-public (wrap document template)
- (let* ((meta (map (lambda (el)
- (cons (string-append "{{" (car el) "}}")
- (string-intersperse (cdr el) " ")))
- (alist-walk document 'meta)))
- (body (cons "{{body}}"
- (with-output-to-string
- (lambda () (emit document))))))
- (string-translate* template (cons body meta))))
-
-(define-public (wrap-with document file)
- (wrap document (with-input-from-file file read-string)))
--
cgit 1.4.1-21-gabe81