/
DomSvgApi.scala
54 lines (47 loc) · 1.78 KB
/
DomSvgApi.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package reftree.svg
import monocle.macros.GenPrism
import monocle.{Getter, Lens, Optional}
import org.scalajs.dom
import org.scalajs.dom.ext.PimpedNodeList
import reftree.svg.api.SimpleSvgApi
/**
* An implementation of [[api.BaseSvgApi]] for scala-js-dom [[dom.Node]]
*/
object DomSvgApi extends SimpleSvgApi[dom.Node] {
val elementName = Getter[dom.Node, String](_.nodeName)
lazy val element = GenPrism[dom.Node, dom.Element]
def optAttr(attr: String): Optional[dom.Node, Option[String]] =
element composeLens
Lens[dom.Element, Option[String]] { elem ⇒
Option(elem.getAttribute(attr))
} { value ⇒ elem ⇒
val clone = elem.cloneNode(deep = true).asInstanceOf[dom.Element]
value.fold(clone.removeAttribute(attr))(clone.setAttribute(attr, _))
clone
}
def attr(attr: String): Optional[dom.Node, String] =
element composeLens
Lens[dom.Element, String] { elem ⇒
elem.getAttribute(attr)
} { value ⇒ elem ⇒
val clone = elem.cloneNode(deep = true).asInstanceOf[dom.Element]
clone.setAttribute(attr, value)
clone
}
def prefixedAttr(uri: String, attr: String): Optional[dom.Node, Option[String]] =
element composeLens
Lens[dom.Element, Option[String]] { elem ⇒
Option(elem.getAttributeNS(uri, attr))
} { value ⇒ elem ⇒
val clone = elem.cloneNode(deep = true).asInstanceOf[dom.Element]
value.fold(clone.removeAttributeNS(uri, attr))(clone.setAttributeNS(uri, attr, _))
clone
}
def immediateChildren: Optional[dom.Node, List[dom.Node]] =
element composeLens
Lens[dom.Element, List[dom.Node]](_.childNodes.toList) { children ⇒ elem ⇒
val clone = elem.cloneNode(deep = false).asInstanceOf[dom.Element]
children.foreach(clone.appendChild)
clone
}
}