#|-------------------- 0.1 |# "./breadcrumbs.meta" 316 ;;; breadcrumbs.meta -*- scheme -*- ((egg "breadcrumbs.egg") (synopsis "Breadcrumbs for web pages") (author "Mario Domenech Goulart") (license "BSD") (category web) (files "test.scm" "breadcrumbs.scm" "breadcrumbs.setup" "breadcrumbs.meta")) #|-------------------- 0.1 |# "./breadcrumbs.scm" 2121 (module breadcrumbs (;; parameters breadcrumbs-home-path breadcrumbs-home-label breadcrumbs-separator breadcrumbs-link debug-breadcrumbs breadcrumbs ;; procedures add-breadcrumb! get-breadcrumb) (import scheme chicken data-structures extras) (use files srfi-1) (define breadcrumbs-home-path (make-parameter "/")) (define breadcrumbs-home-label (make-parameter "Home")) (define breadcrumbs (make-parameter '())) (define breadcrumbs-separator (make-parameter " > ")) (define debug-breadcrumbs (make-parameter #f)) (define (path-join parts) (string-intersperse parts "/")) (define (path-split path) (string-split path "/")) (define (path-diff path) (let ((path (path-split path))) (lset-difference equal? path (path-split (breadcrumbs-home-path))))) (define breadcrumbs-link (make-parameter (lambda (uri text) (string-append "" text "")))) (define (add-breadcrumb! path title) (let ((diff (path-diff path))) (unless (alist-ref diff (breadcrumbs) equal?) (breadcrumbs (cons (cons diff title) (breadcrumbs)))))) (define (get-breadcrumb path) (let ((diff (path-diff path))) (when (debug-breadcrumbs) (print "Current breadcrumbs table:") (pp (breadcrumbs)) (display "\nRequested path: ") (pp path) (display "Diff: ") (pp diff)) (if (null? diff) "" (string-intersperse (append (list ((breadcrumbs-link) (breadcrumbs-home-path) (breadcrumbs-home-label))) (reverse (let loop ((parts (butlast diff))) (if (null? parts) '() (let ((bc (alist-ref parts (breadcrumbs) equal?))) (if bc (cons ((breadcrumbs-link) (make-pathname (breadcrumbs-home-path) (path-join parts)) bc) (loop (butlast parts))) (loop (cdr parts))))))) (list (alist-ref diff (breadcrumbs) equal?))) (breadcrumbs-separator))))) ) ; end module #|-------------------- 0.1 |# "./breadcrumbs.setup" 267 ;;; breadcrumbs.setup -*- scheme -*- (compile -s -O2 -d1 -j breadcrumbs breadcrumbs.scm) (compile -s -O2 -d1 breadcrumbs.import.scm) (install-extension 'breadcrumbs '("breadcrumbs.so" "breadcrumbs.import.so") '((version 0.1))) #|-------------------- 0.1 |# "./test.scm" 599 #!/usr/bin/csi -script (load "breadcrumbs.scm") (import breadcrumbs) (use test) (test-begin "breadcrumbs") (add-breadcrumb! "/a" "A") (test "" (get-breadcrumb "/")) (test "Home > A" (get-breadcrumb "/a")) (add-breadcrumb! "/a/b" "B") (test "Home > A > B" (get-breadcrumb "/a/b")) ;; Changing the home path (breadcrumbs '()) (breadcrumbs-home-path "/a") (add-breadcrumb! "/a" "A") (add-breadcrumb! "/a/b" "B") (test "" (get-breadcrumb "/a")) (test "Home > B" (get-breadcrumb "/a/b")) (test-end "breadcrumbs")