use super::prelude::*;
pub fn resolve_gradient_stops(doc: &mut Document) {
let iter = doc.root().descendants()
.filter(|n| n.is_gradient())
.filter(|n| n.has_attribute(("xlink", AId::Href)))
.filter(|n| !n.has_children());
for node in iter {
let link = node.clone();
resolve(doc, node.clone(), &link);
}
let iter = doc.root().descendants()
.filter(|n| n.is_gradient())
.filter(|n| n.has_attribute(("xlink", AId::Href)));
for mut node in iter {
node.remove_attribute(("xlink", AId::Href));
}
}
fn resolve(doc: &mut Document, mut gradient: Node, linked_gradient: &Node) {
if !linked_gradient.is_gradient() {
return;
}
if !linked_gradient.has_children() {
let av = linked_gradient.attributes().get_value(("xlink", AId::Href)).cloned();
if let Some(AValue::Link(ref_node)) = av {
resolve(doc, gradient, &ref_node);
return;
}
}
for stop in linked_gradient.children() {
let new_stop = doc.copy_node(stop);
gradient.append(new_stop);
}
}