diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile | 26 | ||||
-rw-r--r-- | main.scm | 8 | ||||
-rw-r--r-- | test/lions.md | 8 | ||||
-rw-r--r-- | wikme.scm | 13 | ||||
-rw-r--r-- | wikme.sld | 79 | ||||
-rw-r--r-- | wikme.ss (renamed from wikme-impl.scm) | 77 |
7 files changed, 173 insertions, 40 deletions
diff --git a/.gitignore b/.gitignore index 637f6da..768cfe1 100644 --- a/.gitignore +++ b/.gitignore | |||
@@ -1,3 +1,5 @@ | |||
1 | wikme | 1 | wikme |
2 | *.so | 2 | *.so |
3 | *.o | 3 | *.o |
4 | *.import.scm | ||
5 | out/ | ||
diff --git a/Makefile b/Makefile index 506d366..1dd66d1 100644 --- a/Makefile +++ b/Makefile | |||
@@ -1,20 +1,28 @@ | |||
1 | # wikme | 1 | # wikme |
2 | 2 | ||
3 | PREFIX = /usr/bin | 3 | PREFIX = /usr/bin |
4 | CSC = csc -I$(PWD) | 4 | CSC = csc -R r7rs |
5 | 5 | ||
6 | OBJ = wikme.scm.o | 6 | NAME = wikme |
7 | PROG = $(NAME).scm | ||
8 | SOURCE = $(NAME).ss | ||
9 | LIB = $(NAME).sld | ||
10 | OBJ = $(NAME)-lib.o | ||
7 | 11 | ||
8 | wikme: main.scm $(OBJ) | 12 | $(NAME): $(PROG) $(OBJ) |
9 | $(CSC) -o $@ $(OBJ) -uses wikme main.scm | 13 | $(CSC) -o $@ $(OBJ) -uses $(NAME) $(PROG) |
10 | 14 | ||
11 | $(OBJ): wikme.scm wikme-impl.scm | 15 | $(OBJ): $(LIB) |
12 | $(CSC) -c -J wikme.scm -unit wikme -o $@ | 16 | $(CSC) -c -J $(LIB) -unit $(NAME) -o $@ |
13 | 17 | ||
14 | .PHONY: install clean | 18 | $(LIB): $(SOURCE) |
15 | 19 | ||
16 | install: wikme | 20 | .PHONY: install test clean |
17 | install -Dt $(DESTDIR)$(PREFIX)/$@ $< | 21 | |
22 | install: $(NAME) | ||
23 | install -Dt $(DESTDIR)$(PREFIX)/$@ $(NAME) | ||
24 | |||
25 | test: # TODO | ||
18 | 26 | ||
19 | clean: | 27 | clean: |
20 | rm -f *.import.scm *.so *.o | 28 | rm -f *.import.scm *.so *.o |
diff --git a/main.scm b/main.scm deleted file mode 100644 index c3e4554..0000000 --- a/main.scm +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | (import wikme | ||
2 | (chicken process-context)) | ||
3 | |||
4 | (define (main args) | ||
5 | (display (wikify-links "Hi from [[wikme]]!")) | ||
6 | (newline)) | ||
7 | |||
8 | (main (command-line-arguments)) | ||
diff --git a/test/lions.md b/test/lions.md new file mode 100644 index 0000000..ec465e7 --- /dev/null +++ b/test/lions.md | |||
@@ -0,0 +1,8 @@ | |||
1 | # Lions!! RAWWR :3 | ||
2 | |||
3 | Lions are great big [[cats]] that like to pounce and play on things, or something. | ||
4 | They live on this thing called the [[grassland|savannah]] and eat [[birds]]. | ||
5 | |||
6 | I assume they eat other stuff too, but I don't know what, lol. | ||
7 | |||
8 | [A link to a lion](https://lions.org). | ||
diff --git a/wikme.scm b/wikme.scm index 10b1a1a..a8b4755 100644 --- a/wikme.scm +++ b/wikme.scm | |||
@@ -1,4 +1,9 @@ | |||
1 | (module wikme * | 1 | (import wikme |
2 | (import scheme | 2 | (scheme) |
3 | (chicken base)) | 3 | (chicken process-context)) |
4 | (include "wikme-impl.scm")) | 4 | |
5 | (define (main args) | ||
6 | (build-wiki "./test/" | ||
7 | destination: "./out/")) | ||
8 | |||
9 | (main (command-line-arguments)) | ||
diff --git a/wikme.sld b/wikme.sld new file mode 100644 index 0000000..ca3ddd8 --- /dev/null +++ b/wikme.sld | |||
@@ -0,0 +1,79 @@ | |||
1 | #+chicken-5 | ||
2 | (import (r7rs)) | ||
3 | |||
4 | (define-library wikme | ||
5 | (import (scheme)) | ||
6 | (cond-expand | ||
7 | (chicken-5 (import (chicken base) | ||
8 | (chicken file) | ||
9 | (chicken file posix) | ||
10 | (chicken format) | ||
11 | (chicken io) | ||
12 | (chicken irregex) | ||
13 | (chicken pathname) | ||
14 | (chicken port) | ||
15 | (chicken process) | ||
16 | (chicken process-context) | ||
17 | (chicken string) | ||
18 | (chicken time posix) | ||
19 | (cmark) | ||
20 | (regex) ; XXX: deprecated upstream | ||
21 | (srfi-13))) | ||
22 | (else (error "Wikme doesn't support this R7RS scheme implementation yet."))) | ||
23 | |||
24 | ;; <wiki> | ||
25 | (export <wiki> | ||
26 | wiki-base-url | ||
27 | wiki-origin-dir | ||
28 | wiki-destination-dir | ||
29 | wiki-pages | ||
30 | wiki-defaults | ||
31 | wiki-default-ref | ||
32 | wiki-default-set!) | ||
33 | |||
34 | ;; <page> | ||
35 | (export <page> | ||
36 | page-source | ||
37 | page-body | ||
38 | page-origin | ||
39 | page-destination | ||
40 | page-template | ||
41 | page-source-transformers | ||
42 | page-path-transformers | ||
43 | page-wiki | ||
44 | page-meta | ||
45 | page-meta-ref | ||
46 | page-meta-set!) | ||
47 | |||
48 | ;; transformers | ||
49 | (export transform | ||
50 | transform-source! | ||
51 | transform-path! | ||
52 | page-cmark->html) | ||
53 | |||
54 | ;; templates | ||
55 | (export render-template | ||
56 | env->replacements | ||
57 | render) | ||
58 | |||
59 | ;; links | ||
60 | (export wiki-link-sre | ||
61 | wikify-links | ||
62 | linkify | ||
63 | slugify | ||
64 | string-capitalize | ||
65 | unslugify | ||
66 | path-relativize | ||
67 | wiki-page-origin-path | ||
68 | wiki-page-destination-path) | ||
69 | |||
70 | ;; page building | ||
71 | (export file->page | ||
72 | guess-title | ||
73 | basename | ||
74 | indexify | ||
75 | guess-last-updated | ||
76 | page->file | ||
77 | build-wiki) | ||
78 | |||
79 | (include "wikme.ss")) | ||
diff --git a/wikme-impl.scm b/wikme.ss index 2097af7..cc7aac1 100644 --- a/wikme-impl.scm +++ b/wikme.ss | |||
@@ -1,20 +1,5 @@ | |||
1 | ;;; Wikme --- convert a directory of markdown files into a static wiki | 1 | ;;; Wikme --- convert a directory of markdown files into a static wiki |
2 | 2 | ||
3 | (import (chicken file) | ||
4 | (chicken file posix) | ||
5 | (chicken format) | ||
6 | (chicken io) | ||
7 | (chicken irregex) | ||
8 | (chicken pathname) | ||
9 | (chicken port) | ||
10 | (chicken process) | ||
11 | (chicken process-context) | ||
12 | (chicken string) | ||
13 | (chicken time posix) | ||
14 | (cmark) | ||
15 | (regex) ; XXX: deprecated upstream | ||
16 | (srfi-13)) | ||
17 | |||
18 | ;;; Records | 3 | ;;; Records |
19 | 4 | ||
20 | (define-record-type <wiki> | 5 | (define-record-type <wiki> |
@@ -145,9 +130,11 @@ | |||
145 | 130 | ||
146 | (define wiki-link-sre | 131 | (define wiki-link-sre |
147 | ;;; An SRE for [[wiki-style links|with optional titles]]. | 132 | ;;; An SRE for [[wiki-style links|with optional titles]]. |
133 | ;; XXX | ||
148 | '(: "[[" | 134 | '(: "[[" |
149 | (submatch-named pname (+ (~ "|"))) | 135 | (=> pname (*? (~ "|"))) |
150 | (? (submatch "|" (submatch-named ptitle (*? nonl)))) | 136 | (? ($ "|" (=> ptitle |
137 | (*? (~ "]"))))) | ||
151 | "]]")) | 138 | "]]")) |
152 | 139 | ||
153 | (define (wikify-links text #!optional page) | 140 | (define (wikify-links text #!optional page) |
@@ -167,6 +154,7 @@ | |||
167 | "")) | 154 | "")) |
168 | ptitle))))) | 155 | ptitle))))) |
169 | 156 | ||
157 | ;;; TODO: merge linkify and indexify ... they're almost the same thing. | ||
170 | (define (linkify pagename base-url) | 158 | (define (linkify pagename base-url) |
171 | ;;; Turn a page name into a link suitable for an <a> tag. | 159 | ;;; Turn a page name into a link suitable for an <a> tag. |
172 | (make-pathname (list base-url (slugify pagename)) | 160 | (make-pathname (list base-url (slugify pagename)) |
@@ -212,6 +200,18 @@ | |||
212 | (string-trim (string-drop path (string-prefix-length path dir)) | 200 | (string-trim (string-drop path (string-prefix-length path dir)) |
213 | (lambda (c) (char=? c #\/)))))) | 201 | (lambda (c) (char=? c #\/)))))) |
214 | 202 | ||
203 | (define (wiki-page-origin-path page #!optional wiki) | ||
204 | ;;; Return PAGE's origin path in WIKI. | ||
205 | (path-relativize (page-origin page) | ||
206 | (wiki-origin-dir (or wiki | ||
207 | (page-wiki page))))) | ||
208 | |||
209 | (define (wiki-page-destination-path page #!optional wiki) | ||
210 | ;;; Return PAGE's destination path in WIKI. | ||
211 | (path-relativize (page-destination page) | ||
212 | (wiki-destination-dir (or wiki | ||
213 | (page-wiki page))))) | ||
214 | |||
215 | ;;; Build a page | 215 | ;;; Build a page |
216 | 216 | ||
217 | (define (file->page file wiki | 217 | (define (file->page file wiki |
@@ -264,8 +264,7 @@ | |||
264 | (define (guess-last-updated page) | 264 | (define (guess-last-updated page) |
265 | ;;; Guess when PAGE was last edited. | 265 | ;;; Guess when PAGE was last edited. |
266 | ;; Tries to use git, but falls back to mtime. | 266 | ;; Tries to use git, but falls back to mtime. |
267 | (let ((f (path-relativize (page-origin page) | 267 | (let ((f (wiki-page-origin-path page))) |
268 | (wiki-origin-dir (page-wiki page))))) | ||
269 | (time->string | 268 | (time->string |
270 | (seconds->local-time | 269 | (seconds->local-time |
271 | (or #; | 270 | (or #; |
@@ -288,3 +287,43 @@ | |||
288 | (lambda () | 287 | (lambda () |
289 | (write-string (render page)))))) | 288 | (write-string (render page)))))) |
290 | 289 | ||
290 | (define (eprintf . args) | ||
291 | (apply fprintf (current-error-port) args)) | ||
292 | |||
293 | (define (build-wiki origin | ||
294 | #!key | ||
295 | (destination (make-pathname origin "out")) | ||
296 | (base-url "") | ||
297 | (base-template (make-pathname origin "template.html")) | ||
298 | (source-transformers (list page-cmark->html wikify-links)) | ||
299 | (path-transformers (list indexify)) | ||
300 | (source-extension "md")) | ||
301 | (define w (make-wiki | ||
302 | base-url | ||
303 | origin | ||
304 | destination | ||
305 | '() | ||
306 | `((template . ,base-template) | ||
307 | (source-transformers . ,source-transformers) | ||
308 | (path-transformers . ,path-transformers) | ||
309 | (source-extension . ,source-extension)))) | ||
310 | |||
311 | (eprintf "\nBuilding pages...\n") | ||
312 | (for-each (lambda (f) | ||
313 | (let ((p (file->page f w))) | ||
314 | (eprintf "~a -> ~a\n" f (page-meta-ref p 'title)))) | ||
315 | (glob (make-pathname origin | ||
316 | "*" | ||
317 | (wiki-default-ref w 'source-extension)))) | ||
318 | |||
319 | (let ((dd (wiki-destination-dir w))) | ||
320 | (eprintf "\nCreating destination directory: ~a\n" dd) | ||
321 | (create-directory dd 'parents)) | ||
322 | |||
323 | (eprintf "\nWriting pages...\n") | ||
324 | (for-each (lambda (p) | ||
325 | (eprintf "~a -> ~a\n" | ||
326 | (page-meta-ref p 'title) | ||
327 | (wiki-page-destination-path p)) | ||
328 | (page->file p)) | ||
329 | (wiki-pages w))) | ||