[racket] Bug in scribble's image-element?

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Sun Oct 26 08:11:35 EDT 2014

Thanks for the code and sorry for the delay in looking into this.

It looks like you've added the to-scaled-num-from-str function and
then called it (twice) and otherwise the code is unchanged. I've
pushed that change:

https://github.com/plt/racket/commit/046a851d7090f35a5966a3020e29d40c59948567

Is that what you had in mind? Would you mind seeing if that works with
your scribble file, and perhaps sharing those sources with me?

Thanks,
Robby


On Sat, Oct 25, 2014 at 6:45 PM, Antonio Menezes Leitao
<antonio.menezes.leitao at ist.utl.pt> wrote:
> Hi,
>
> I'm reviving this thread because the problem is still present in the current
> snapshot builds.
>
> Just to remind you what the problem is:
>
> Scribble's image-element allows for a scale argument, but the html-render
> ignores it when processing SVG files.
>
> The problem is in the following function, in file
> shared/pkgs/scribble-pkgs/scribble-lib/scribble/html-render.rkt, which I
> quickly modified. I'll only show a few fragments because the function is
> huge
>
> (define/override (render-content e part ri)
> ...
>         [(image-element? e)
>          (let* ([src (collects-relative->path (image-element-path e))]
>                 [suffixes (image-element-suffixes e)]
>                 [scale (image-element-scale e)]
>                 [to-scaled-num
>                  (lambda (s)
>                    (number->string
>                     (inexact->exact
>                      (floor (* scale (if (number? s)
>                                          s
>                                          (integer-bytes->integer s #f
> #t)))))))]
> ;;Quickly hacked function to parse SVG lengths
>                 [to-scaled-num-from-str
>                  (lambda (s)
>                    (let ((parts
>                           (regexp-match
>
> #rx"^([+-]?[0-9]*\\.?([0-9]+)?)(em|ex|px|in|cm|mm|pt|pc|%|)$"
>                            s)))
>                      (string-append
>                       (number->string
>                        (* scale
>                           (string->number (list-ref parts 1))))
>                       (list-ref parts 3))))]
> ...
>
> ;;Processing SVG file
>                      [svg?
>                       (call-with-input-file*
>                        src
>                        (lambda (in)
>                          (with-handlers ([exn:fail? (lambda (exn)
>                                                       (log-warning
>                                                        (format "warning:
> error while reading SVG file for size: ~a"
>                                                                (if (exn?
> exn)
>
> (exn-message exn)
>                                                                    (format
> "~e" exn))))
>                                                       null)])
>                            (let* ([d (xml:read-xml in)]
>                                   [attribs (xml:element-attributes
>                                             (xml:document-element d))]
>                                   [check-name (lambda (n)
>                                                 (lambda (a)
>                                                   (and (eq? n
> (xml:attribute-name a))
>                                                        (xml:attribute-value
> a))))]
>                                   [w (ormap (check-name 'width) attribs)]
>                                   [h (ormap (check-name 'height) attribs)])
>                              (if (and w h)
> ;;This is needed to scale SVG lengths
>                                    `([width ,(to-scaled-num-from-str w)]
>                                      [height ,(to-scaled-num-from-str h)])
>                                  null)))))]
> ...
>
> So, what I'm saying is that it would be great if something like this could
> be included in the Racket sources.
>
> Best regards,
> António.
>
> On Mon, Aug 4, 2014 at 1:20 PM, Antonio Menezes Leitao
> <antonio.menezes.leitao at ist.utl.pt> wrote:
>>
>> On Mon, Aug 4, 2014 at 10:35 AM, Jens Axel Søgaard <jensaxel at soegaard.net>
>> wrote:
>>>
>>> It is not intended. I am not sure whether it simply doesn't work, or
>>> whether
>>> it is browser related.
>>>
>>> SVG images are currently inserted with an html <object> tag where as the
>>> other
>>> images are inserted as <img>. The width and height attributes are set in
>>> both
>>> cases.
>>
>>
>> Indeed. But in the case of PNGs and GIFs they have their width and height
>> adjusted by the scale, while SVGs do not.
>> I did not test other browsers, but recent versions of Chrome and IE seem
>> to honor the scaled size.
>>
>> In fact, I'm currently using a patched html-render.rkt to generate
>> documentation containing tons of tikz pictures, and it looks great.
>> Each picture is converted to svg by pdflatex+standalone+pdf2svg and then
>> included in an image-element with an appropriate scaling factor.
>> Before, I was converting everything to PNGs but the documentation was
>> taking inordinate amounts of disk space.
>>
>> Obviously, I would prefer to use an officially maintained version of
>> Scribble that supports scaled SVGs.
>>
>> Best,
>> Antonio.
>
>
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>


Posted on the users mailing list.