Changeset 14752 in project


Ignore:
Timestamp:
05/23/09 07:30:44 (11 years ago)
Author:
Alex Shinn
Message:

simplifying escapes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/4/html-parser/trunk/html-parser.scm

    r14750 r14752  
    7878  (make-html-parser make-string-reader/ci
    7979   html->sxml html-strip html-escape html-display-escaped-string
     80   html-tag->string html-attr->string
    8081   sxml->html sxml-display-as-html)
    8182(import scheme
     
    608609      (reverse (apply parse '() o)))))
    609610
    610 (define (html-display-escaped-attr str)
    611   (let ((start 0)
    612         (end (string-length str)))
    613     (let lp ((from start) (to start))
    614       (if (>= to end)
    615         (display (substring str from to))
    616         (let ((c (string-ref str to)))
    617           (cond
    618             ((eq? c #\<)
    619              (display (substring str from to))
    620              (display "&lt;")
    621              (lp (+ to 1) (+ to 1)))
    622             ((eq? c #\&)
    623              (display (substring str from to))
    624              (display "&amp;")
    625              (lp (+ to 1) (+ to 1)))
    626             ((eq? c #\")
    627              (display (substring str from to))
    628              (display "&quot;")
    629              (lp (+ to 1) (+ to 1)))
    630             (else
    631              (lp from (+ to 1)))))))))
    632 
    633611(define (html-escape-attr str)
    634   (with-output-to-string
    635     (lambda () (html-display-escaped-attr str))))
     612  (call-with-output-string
     613    (lambda (out) (html-display-escaped-string str out))))
    636614
    637615(define (html-attr->string attr)
     
    646624        (apply string-append (reverse (cons ">" res)))
    647625        (lp (cdr ls) (cons (html-attr->string (car ls)) (cons " " res))))))
     626
     627(define html-character-escapes
     628  '((#\< . "&lt;")
     629    (#\> . "&gt;")
     630    (#\& . "&amp;")
     631    (#\" . "&quot;")
     632    (#\' . "&#39;")))
    648633
    649634(define (html-display-escaped-string str out)
     
    653638      (if (>= to end)
    654639          (display (substring str from to) out)
    655           (let ((c (string-ref str to)))
    656             (cond
    657              ((eq? c #\<)
    658               (display (substring str from to) out)
    659               (display "&lt;" out)
    660               (let ((next (+ to 1)))
    661                 (lp next next)))
    662              ((eq? c #\&)
    663               (display (substring str from to) out)
    664               (display "&amp;" out)
    665               (let ((next (+ to 1)))
    666                 (lp next next)))
    667              (else
    668               (lp from (+ to 1)))))))))
     640          (cond
     641           ((assq (string-ref str to) html-character-escapes)
     642            => (lambda (esc)
     643                 (display (substring str from to) out)
     644                 (display (cdr esc) out)
     645                 (lp (+ to 1) (+ to 1))))
     646           (else
     647            (lp from (+ to 1))))))))
    669648
    670649(define (html-escape str)
Note: See TracChangeset for help on using the changeset viewer.