You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.7 KiB
Racket
90 lines
2.7 KiB
Racket
#lang racket/base
|
|
(require racket/list racket/string xml xml/path)
|
|
(require "readability.rkt" "debug.rkt" "predicates.rkt" "tools.rkt")
|
|
|
|
;; setup for test cases
|
|
(module+ test (require rackunit))
|
|
|
|
(provide (all-defined-out))
|
|
|
|
;; todo: better fallback template
|
|
|
|
(define fallback-template-data "FALLBACK! ◊(put-as-html main)")
|
|
|
|
;; todo: tests & contracts for this subsection
|
|
|
|
(define (from x query)
|
|
; cache x
|
|
(let ([x (put x)])
|
|
; try finding it in metas, if not, find it in main, if not then return false
|
|
(or (from-metas x query) (from-main x query))))
|
|
|
|
(define (from-main x query) ; this used to be plain from
|
|
; check results first
|
|
(let* ([x (put x)]
|
|
[results (se-path*/list (list query) x)])
|
|
; if results exist, send back xexpr as output
|
|
(if (not (empty? results))
|
|
`(,query ,@results) ; todo: why use query as tag?
|
|
#f)))
|
|
|
|
(define (from-metas x key)
|
|
(let* ([x (put x)]
|
|
[meta-hash (make-meta-hash x)]
|
|
[key (->symbol key)])
|
|
(if (in? meta-hash key)
|
|
`(value ,(get meta-hash key)) ;todo: why use value as tag?
|
|
#f)))
|
|
|
|
(define (put x)
|
|
; handles either xexpr or pollen file as input
|
|
(cond
|
|
; pass through xexpr as is
|
|
; put is optional for xexprs.
|
|
; it's only here to make the idiom smooth.
|
|
[(tagged-xexpr? x) x]
|
|
; todo: how to externalize pollen main tag into world name?
|
|
[(file-exists? (->path x)) (dynamic-require x 'main)]
|
|
; also try adding pollen file extension
|
|
; this makes put compatible with map references
|
|
[(let ([x (make-pollen-source-path x)])
|
|
(when (file-exists? x)
|
|
(put x)))]
|
|
[else (error "put: need named xexpr or pollen file, but got" x)]))
|
|
|
|
|
|
(define (merge x)
|
|
(cond
|
|
[(tagged-xexpr? x)
|
|
; return content of xexpr.
|
|
; pollen language rules will splice these into the main flow.
|
|
(if (empty? x)
|
|
""
|
|
(let-values([(name attr content) (break-tagged-xexpr x)])
|
|
content))]
|
|
[(string? x) (list x)]))
|
|
|
|
|
|
#|(define (merge-strings x)
|
|
(when (empty? x) (error "merge-strings got empty x"))
|
|
;todo: filter metas?
|
|
; leaning toward no. Simplest behavior.
|
|
; function is not intended to be used with whole pollen body anyhow.
|
|
(let ([x (merge x)])
|
|
(string-join (filter string? (flatten x)) " ")))|#
|
|
|
|
(define (merge-strings x)
|
|
(string-join (filter string? (flatten x)) " "))
|
|
|
|
|
|
(define (make-html x)
|
|
(if (tagged-xexpr? x)
|
|
(xexpr->string x)
|
|
(let ([x (->list x)])
|
|
(when (andmap xexpr? x)
|
|
(string-join (map xexpr->string x) "")))))
|
|
|
|
; generate *-as-html versions of functions
|
|
(define-values (put-as-html merge-as-html merge-strings-as-html)
|
|
(apply values (map (λ(proc) (λ(x) (make-html (proc x)))) (list put merge merge-strings))))
|