67 lines
1.7 KiB
Scheme
67 lines
1.7 KiB
Scheme
(define-module (runewidth internal)
|
|
#:use-module (ice-9 peg)
|
|
#:use-module (ice-9 textual-ports)
|
|
#:use-module (ice-9 exceptions)
|
|
#:use-module (ice-9 i18n)
|
|
#:use-module (web uri)
|
|
#:use-module (web client)
|
|
#:use-module (web request)
|
|
#:use-module (srfi srfi-71)
|
|
#:export (@hex
|
|
@codepoint
|
|
@codepoint-range
|
|
@comment
|
|
@ws
|
|
hex-string->integer
|
|
format-exception-msg
|
|
in-surrogate-range
|
|
wget-to-lines
|
|
file-to-lines))
|
|
|
|
(define-peg-pattern @hex body (peg "[a-fA-F0-9]"))
|
|
|
|
(define-peg-pattern @codepoint all
|
|
(* @hex))
|
|
|
|
(define-peg-pattern @codepoint-range all
|
|
(or
|
|
(and @codepoint (ignore "..") @codepoint)
|
|
@codepoint))
|
|
|
|
|
|
(define-peg-pattern @comment all
|
|
(and (ignore "#") (* peg-any)))
|
|
|
|
(define-peg-pattern @ws none
|
|
(or " " "\t"))
|
|
|
|
(define (hex-string->integer str)
|
|
;; XXX: We would ideally do integer->char here and save it to file as such
|
|
;; However read-expr* does not actually work for all the characters!
|
|
;; So they can't be written out as such.
|
|
(locale-string->integer str 16))
|
|
|
|
(define (format-exception-msg port err)
|
|
(apply format port (exception-message err) (exception-irritants err))
|
|
(display "\n" port))
|
|
|
|
(define (in-surrogate-range num)
|
|
(and (>= num #xd800)
|
|
(<= num #xdfff)))
|
|
|
|
|
|
(define* (wget-to-lines url #:optional (port #f))
|
|
(format port "Downloading from ~a..." url)
|
|
|
|
(let* ((response body (http-get (string->uri url)))
|
|
(lines (string-split body #\newline)))
|
|
(format port " done.\n")
|
|
lines))
|
|
|
|
(define* (file-to-lines path #:optional (port #f))
|
|
(format port "Loading from local file ~a\n" path)
|
|
(string-split
|
|
(with-input-from-file path
|
|
(λ () (get-string-all (current-input-port)))) #\newline))
|
|
|
|
|