uahgi2/expander.rkt

95 lines
3.6 KiB
Racket
Raw Permalink Normal View History

2025-09-29 22:12:15 +08:00
2025-10-07 01:37:09 +08:00
(module uahgi2 racket/base
(require racket/dict)
(require racket/list)
2025-10-07 01:37:09 +08:00
(define main-config (make-hash
'(["paper-width". 2480]
["paper-height". 3508]
2025-10-07 02:41:00 +08:00
["lang" . #f]
2025-10-07 01:37:09 +08:00
["font-family" . "FreeSerif"]
["font-family-CJK" . "Noto Sans CJK TC"]
["font-size" . 14]
["font-weight" . "regular"]
["font-style" . "normal"]
)))
(define main-frame (make-hash
`(["id" . 1]
["font-family" . ,(dict-ref main-config "font-family")]
["class" . "frame"]
2025-10-07 01:37:09 +08:00
["width" . 2000]
["height" . 3000]
["x" . 200]
["y" . 250]
["content" . #f])))
(define (set-main-config attr val)
(dict-set! main-config attr val))
(define-syntax text-series
(syntax-rules ()
[(_ x ...)
; delete the beginning newline
(if (eq? (caar `(x ...)) "\n")
`('text ,(cdar `(x ...)))
2025-10-07 02:41:00 +08:00
`('text ,(caar `(x ...)) ,(cdar `(x ...))))]))
(define plugin-list '())
2025-10-07 02:41:00 +08:00
(define [two-newlines-into-par-aux cont]
(display (list-ref cont 1))
(define (sexp-processing res remain)
[cond
[(eq? remain '()) (reverse res)]
[(and (equal? (car remain) "\n") (equal? (car res) "\n")) (sexp-processing (cons '(par) (cdr res)) [cdr remain])]
[else (sexp-processing(cons (car remain) res) [cdr remain])]])
(list-set cont 1 (sexp-processing '() (list-ref cont 1))))
2025-10-07 02:41:00 +08:00
(define two-newlines-into-par (make-hash `(["lang" . "all"] ; for all languages
["body" . ,two-newlines-into-par-aux])))
2025-10-07 02:41:00 +08:00
2025-10-08 21:07:16 +08:00
(define [is-cjk-matched? char]
(define cjk-range #rx"[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF\U00020000-\U0002EBEF\u3000-\u303F,。!.?()—:;]")
(regexp-match? cjk-range char)
)
(define [remove-newline-between-cjk-aux cont]
(display (list-ref cont 1))
(define (sexp-processing res remain)
[cond
[(eq? remain '()) (reverse res)]
[(and(equal? (car remain) "\n") (is-cjk-matched? (car res)) (= (length remain) 1) (sexp-processing(cons (car remain) res) [cdr remain]))]
[(and(equal? (car remain) "\n") (is-cjk-matched? (car res)) (is-cjk-matched? (cadr remain)))
(sexp-processing (cons (cadr remain) res) [cddr remain])]
[else (sexp-processing(cons (car remain) res) [cdr remain])]])
(list-set cont 1 (sexp-processing '() (list-ref cont 1))))
(define remove-newline-between-cjk (make-hash `(["lang" . "zh"]
["body" . ,remove-newline-between-cjk-aux])))
2025-10-07 02:41:00 +08:00
(define-syntax append-plugin!
(syntax-rules ()
[(_ ls plugin) (set! ls (reverse (cons plugin (reverse ls))))]))
[append-plugin! plugin-list two-newlines-into-par]
2025-10-08 21:07:16 +08:00
[append-plugin! plugin-list remove-newline-between-cjk]
2025-10-07 02:41:00 +08:00
(define (main-text txt)
(begin
(dict-set! main-frame "content" txt)
(display plugin-list)
(for/list ([p plugin-list])
[if [or (memq (dict-ref p "lang") (dict-ref main-config "lang"))
(eq? (dict-ref p "lang") "all")]
[let ([tmp ((dict-ref p "body") (dict-ref main-frame "content"))])
(dict-set! main-frame "content" tmp)] #f])))
2025-10-07 02:41:00 +08:00
2025-10-07 01:37:09 +08:00
(provide text-series main-text main-frame main-config set-main-config set!
(all-from-out racket/base) (all-from-out racket/dict)
#%module-begin #%app #%datum #%expression #%top)
2025-10-07 02:41:00 +08:00
)