@@ -19,14 +19,18 @@ sealed trait Node {
1919 def map (f : Node => Node ): T
2020 def flatMap (f : Node => List [Node ]): T
2121 def mapFirst (f : PartialFunction [Node , Node ]): T
22+
23+ /** Recursively traverses tree and returns content of first text node */
24+ def textContent : Option [String ]
2225}
2326
2427case class Text (text : String ) extends Node {
2528 override type T = Text
2629
27- def map (f : Node => Node ): T = this
28- def flatMap (f : Node => List [Node ]): T = this
29- def mapFirst (f : PartialFunction [Node , Node ]): T = this
30+ override def map (f : Node => Node ): T = this
31+ override def flatMap (f : Node => List [Node ]): T = this
32+ override def mapFirst (f : PartialFunction [Node , Node ]): T = this
33+ override def textContent : Option [String ] = Some (text)
3034}
3135
3236case class Tag [TagName <: Singleton ](tagName : String with TagName ,
@@ -129,7 +133,7 @@ case class Tag[TagName <: Singleton](tagName : String with TagName,
129133 }
130134
131135 /** Recursively map children, excluding root node */
132- def map (f : Node => Node ): Tag [TagName ] = set(children.map(f(_).map(f)))
136+ override def map (f : Node => Node ): Tag [TagName ] = set(children.map(f(_).map(f)))
133137
134138 /** Recursively map tag children, including root node */
135139 def mapRoot (f : Tag [_] => Tag [_]): Tag [TagName ] = {
@@ -142,10 +146,10 @@ case class Tag[TagName <: Singleton](tagName : String with TagName,
142146 iter(this ).asInstanceOf [T ]
143147 }
144148
145- def flatMap (f : Node => List [Node ]): Tag [TagName ] =
149+ override def flatMap (f : Node => List [Node ]): Tag [TagName ] =
146150 copy(children = children.flatMap(n => f(n.flatMap(f))))
147151
148- def mapFirst (f : PartialFunction [Node , Node ]): Tag [TagName ] = {
152+ override def mapFirst (f : PartialFunction [Node , Node ]): Tag [TagName ] = {
149153 var done = false
150154
151155 def m (n : Node ): Node =
@@ -168,6 +172,17 @@ case class Tag[TagName <: Singleton](tagName : String with TagName,
168172 def partialMap (f : PartialFunction [Node , Node ]): Tag [TagName ] =
169173 map(node => f.lift(node).getOrElse(node))
170174
175+ override def textContent : Option [String ] = {
176+ for (c <- children) {
177+ c.textContent match {
178+ case Some (c) => return Some (c)
179+ case _ =>
180+ }
181+ }
182+
183+ None
184+ }
185+
171186 /**
172187 * Recursively adds `suffix` to every given attribute.
173188 *
0 commit comments