1
1
use std:: { collections:: HashSet , rc:: Rc } ;
2
2
3
+ use markup5ever:: local_name;
3
4
use oxvg_ast:: Attributes ;
4
5
use serde:: Deserialize ;
5
6
6
7
use crate :: Job ;
7
8
8
9
#[ derive( Deserialize , Default , Clone ) ]
10
+ #[ serde( rename_all = "camelCase" ) ]
9
11
pub struct AddAttributesToSVGElement {
10
12
pub attributes : Attributes ,
11
13
}
@@ -14,7 +16,12 @@ impl Job for AddAttributesToSVGElement {
14
16
fn run ( & self , node : & Rc < rcdom:: Node > ) {
15
17
use rcdom:: NodeData :: Element ;
16
18
17
- let Element { attrs, .. } = & node. data else {
19
+ let Element { attrs, name, .. } = & node. data else {
20
+ return ;
21
+ } ;
22
+
23
+ let is_root = oxvg_selectors:: Element :: new ( node. clone ( ) ) . is_root ( ) ;
24
+ if name. local != local_name ! ( "svg" ) || !is_root {
18
25
return ;
19
26
} ;
20
27
let attrs = & mut * attrs. borrow_mut ( ) ;
@@ -31,49 +38,45 @@ impl Job for AddAttributesToSVGElement {
31
38
}
32
39
33
40
#[ test]
34
- fn add_attributes_to_svg_element ( ) -> Result < ( ) , & ' static str > {
35
- use rcdom:: NodeData :: Element ;
36
- use xml5ever:: {
37
- driver:: { parse_document, XmlParseOpts } ,
38
- tendril:: TendrilSink ,
39
- } ;
41
+ fn add_attributes_to_svg_element ( ) -> anyhow:: Result < ( ) > {
42
+ use crate :: test_config;
40
43
41
- let dom: rcdom:: RcDom =
42
- parse_document ( rcdom:: RcDom :: default ( ) , XmlParseOpts :: default ( ) ) . one ( "<svg></svg>" ) ;
43
- let root = & dom. document . children . borrow ( ) [ 0 ] ;
44
- let job = & mut AddAttributesToSVGElement :: default ( ) ;
44
+ insta:: assert_snapshot!( test_config(
45
+ // Add multiple attributes without value
46
+ r#"{ "addAttributesToSvgElement": {
47
+ "attributes": { "data-icon": null, "className={classes}": null }
48
+ } }"# ,
49
+ None ,
50
+ ) ?) ;
45
51
46
- job. attributes
47
- . insert ( markup5ever:: LocalName :: from ( "foo" ) , "bar" . into ( ) ) ;
48
- job. run ( root) ;
49
- match & root. data {
50
- Element { attrs, .. } => {
51
- assert_eq ! (
52
- attrs. borrow( ) . last( ) ,
53
- Some ( & markup5ever:: Attribute {
54
- name: markup5ever:: QualName :: new( None , ns!( svg) , "foo" . into( ) ) ,
55
- value: "bar" . into( )
56
- } )
57
- ) ;
58
- }
59
- _ => Err ( "Attribute not added" ) ?,
60
- }
52
+ insta:: assert_snapshot!( test_config(
53
+ // Add single attribute without value
54
+ r#"{ "addAttributesToSvgElement": {
55
+ "attributes": { "data-icon": null }
56
+ } }"# ,
57
+ None ,
58
+ ) ?) ;
61
59
62
- job. attributes
63
- . insert ( markup5ever:: LocalName :: from ( "foo" ) , "baz" . into ( ) ) ;
64
- job. run ( root) ;
65
- match & root. data {
66
- Element { attrs, .. } => {
67
- assert_eq ! (
68
- attrs. borrow( ) . last( ) ,
69
- Some ( & markup5ever:: Attribute {
70
- name: markup5ever:: QualName :: new( None , ns!( svg) , "foo" . into( ) ) ,
71
- value: "bar" . into( )
72
- } )
73
- ) ;
74
- }
75
- _ => Err ( "Attribute not added" ) ?,
76
- }
60
+ insta:: assert_snapshot!( test_config(
61
+ // Add multiple attributes with values
62
+ r#"{ "addAttributesToSvgElement": {
63
+ "attributes": { "focusable": "false", "data-image": "icon" }
64
+ } }"# ,
65
+ None ,
66
+ ) ?) ;
67
+
68
+ insta:: assert_snapshot!( test_config(
69
+ // Ignore nested <svg> elements
70
+ r#"{ "addAttributesToSvgElement": {
71
+ "attributes": { "data-icon": null }
72
+ } }"# ,
73
+ Some (
74
+ r#"<svg xmlns="http://www.w3.org/2000/svg">
75
+ test
76
+ <svg />
77
+ </svg>"#
78
+ ) ,
79
+ ) ?) ;
77
80
78
81
Ok ( ( ) )
79
82
}
0 commit comments