tyxml
tyxml copied to clipboard
Error "Unknown attribute in SVG element: stddeviation" when using ppx
I have a preexisting SVG that I would like to process with the tyxml ppx. However, when doing so I get an error: Error: Unknown attribute in SVG element: stddeviation
.
I'm not sure if this is a bug or if I'm misunderstanding something about the ppx.
Here is a tiny example to reproduce the problem.
I have this code (just a tiny example) that makes part of an svg and sticks it into a div. (The created html is a stand in for the actual svg that I would like to process.)
open Tyxml
let v =
Html.div
[
Html.svg
[
Svg.defs
[
Svg.filter
[
Svg.feGaussianBlur
~a:[ Svg.a_in `SourceAlpha; Svg.a_stdDeviation (1.0, None) ]
[];
];
];
];
]
It compiles fine, and when I write it out to a string I get this html:
<div>
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<defs>
<filter>
<feGaussianBlur in="sourceAlpha" stdDeviation="1"></feGaussianBlur>
</filter>
</defs>
</svg>
</div>
When I read that html back in using the ppx like this:
let _y =
[%html
{|
<div>
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<defs>
<filter>
<feGaussianBlur in="sourceAlpha" stdDeviation="1"></feGaussianBlur>
</filter>
</defs>
</svg>
</div>
|}]
I get an error:
Error: Unknown attribute in SVG element: stddeviation
hmm, that might be due to some over-enthusiastic case normalisation ...
I looked into this some more and found that the Markup
code either parsing or writing html (not sure yet which) is lowercasing the stddeviation
, but not feGaussianBlur
. Here is an example:
let () =
let open Markup in
string {|<feGaussianBlur in="sourceAlpha" stdDeviation="1"></feGaussianBlur>|}
|> parse_html |> signals |> pretty_print |> write_html
|> to_channel Out_channel.stdout
Which outputs:
<feGaussianBlur in="sourceAlpha" stddeviation="1"></feGaussianBlur>
I will continue to look into it.
I may have found the source of the problem. I noticed in the above example switching from parse_html
to parse_xml
works.
The tyxml-ppx uses Markup.parse_html
.
https://github.com/ocsigen/tyxml/blob/47423cf70b804c67386583a9b7eccd9157316475/ppx/tyxml_ppx.ml#L291
Here are some links to lines in a couple of files showing what I think may be going on.
If you look in Markup.parse_html
function, you will see a spot in which the attributes either get pushed through here, or adjusted with adjust_svg_attributes
(here).
If you look at the adjust_svg_attributes
function, it fixes the case of the stdDeviation
attribute here.
I think the lowercasing comes in around here. In contrast, the xml_parser
is fine for that toy example, because it doesn't lowercase anything first (I think...).
(Sorry for the mess of links!)
Anyway, I think that may be what's causing the issue here....
Thanks for all the hints @mooreryan, I started looking into this issue as well because I tried parsing an <svg viewBox="...">...</svg>
with tyxml-ppx
.
I describe my findings here https://github.com/aantron/markup.ml/pull/69.
It looks like this is solved in markup, closing !