diff --git a/collects/scribble/html-render.rkt b/collects/scribble/html-render.rkt index fb37dbd770..0dc3dad923 100644 --- a/collects/scribble/html-render.rkt +++ b/collects/scribble/html-render.rkt @@ -1382,12 +1382,14 @@ (list (format "~s" i))])) (define/private (ascii-ize s) - (let ([m (regexp-match-positions #rx"[^\u01-\u7E]" s)]) - (if m - (append (ascii-ize (substring s 0 (caar m))) - (list (char->integer (string-ref s (caar m)))) - (ascii-ize (substring s (cdar m)))) - (list s)))) + (if (= (string-utf-8-length s) (string-length s)) + (list s) + (let ([m (regexp-match-positions #rx"[^\u01-\u7E]" s)]) + (if m + (append (ascii-ize (substring s 0 (caar m))) + (list (char->integer (string-ref s (caar m)))) + (ascii-ize (substring s (cdar m)))) + (list s))))) ;; ---------------------------------------- diff --git a/collects/scribblings/main/private/make-search.rkt b/collects/scribblings/main/private/make-search.rkt index 57ef7954c2..573aa4b740 100644 --- a/collects/scribblings/main/private/make-search.rkt +++ b/collects/scribblings/main/private/make-search.rkt @@ -28,7 +28,7 @@ ;; to heavy to load twice). (define-runtime-path search-context-page "search-context.html") -(define (quote-string str) +(define (quote-string val) (define (hex4 ch) (let ([s (number->string (char->integer (string-ref ch 0)) 16)]) (string-append "\\u" (case (string-length s) @@ -36,8 +36,12 @@ [(2) (string-append "00" s)] [(3) (string-append "0" s)] [else s])))) - ;; use ~s to create a javascript-quoted string, then quote unicode chars - (regexp-replace* #px"[^[:ascii:]]" (format "~s" str) hex4)) + (define str (format "~s" val)) + (if (= (string-utf-8-length str) (string-length str)) + ;; It's ASCII: + str + ;; Quote unicode chars: + (regexp-replace* #px"[^[:ascii:]]" str hex4))) (define (make-script user-dir? renderer sec ri) (define dest-dir (send renderer get-dest-directory #t)) @@ -62,6 +66,8 @@ (match xexprs [`() xexprs] [`("" . ,r) (compact r)] + [`(,(? string? s) ...) + (list (apply string-append xexprs))] [`(,(? string? s1) ,(? string? s2) . ,r) (compact `(,(string-append s1 s2) . ,r))] [`((span ([class ,c]) . ,b1) (span ([class ,c]) . ,b2) . ,r) @@ -73,16 +79,16 @@ (cons (cons c n) span-classes)) n)])]) (cons `(,c . ,(compact-body b)) (compact r)))] - [`(,x . ,r) (cons (xexpr->string x) (compact r))])) + [`(,x . ,r) + (cons (xexpr->string x) (compact r))])) ;; generate javascript array code (let loop ([body (compact xexprs)]) (if (andmap string? body) (quote-string (string-append* body)) - (let ([body (map (lambda (x) - (if (string? x) - (quote-string x) - (format "[~a,~a]" (car x) (cdr x)))) - body)]) + (let ([body (for/list ([x (in-list body)]) + (if (string? x) + (quote-string x) + (format "[~a,~a]" (car x) (cdr x))))]) (if (= 1 (length body)) (car body) (string-append* `("[" ,@(add-between body ",") "]")))))))