@@ -16,10 +16,10 @@ package parsing
1616
1717import scala .collection .Seq
1818import org .xml .sax .Attributes
19- import org .xml .sax .helpers . DefaultHandler
19+ import org .xml .sax .ext . DefaultHandler2
2020
2121// can be mixed into FactoryAdapter if desired
22- trait ConsoleErrorHandler extends DefaultHandler {
22+ trait ConsoleErrorHandler extends DefaultHandler2 {
2323 // ignore warning, crimson warns even for entity resolution!
2424 override def warning (ex : SAXParseException ): Unit = {}
2525 override def error (ex : SAXParseException ): Unit = printError(" Error" , ex)
@@ -39,8 +39,8 @@ trait ConsoleErrorHandler extends DefaultHandler {
3939 * namespace bindings, without relying on namespace handling of the
4040 * underlying SAX parser.
4141 */
42- abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader [Node ] {
43- var rootElem : Node = null
42+ abstract class FactoryAdapter extends DefaultHandler2 with factory.XMLLoader [Node ] {
43+ var rootElem : Node = _
4444
4545 val buffer = new StringBuilder ()
4646 /** List of attributes
@@ -72,7 +72,7 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
7272 */
7373 var scopeStack = List .empty[NamespaceBinding ]
7474
75- var curTag : String = null
75+ var curTag : String = _
7676 var capture : Boolean = false
7777
7878 // abstract methods
@@ -105,6 +105,11 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
105105 */
106106 def createProcInstr (target : String , data : String ): Seq [ProcInstr ]
107107
108+ /**
109+ * creates a new comment node.
110+ */
111+ def createComment (characters : String ): Seq [Comment ]
112+
108113 //
109114 // ContentHandler methods
110115 //
@@ -118,7 +123,7 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
118123 * @param length
119124 */
120125 override def characters (ch : Array [Char ], offset : Int , length : Int ): Unit = {
121- if (! capture) return
126+ if (! capture) ()
122127 // compliant: report every character
123128 else if (! normalizeWhitespace) buffer.appendAll(ch, offset, length)
124129 // normalizing whitespace is not compliant, but useful
@@ -170,7 +175,7 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
170175
171176 if (pre == " xmlns" || (pre == null && qname == " xmlns" )) {
172177 val arg = if (pre == null ) null else key
173- scpe = new NamespaceBinding (arg, nullIfEmpty(value), scpe)
178+ scpe = NamespaceBinding (arg, nullIfEmpty(value), scpe)
174179 } else
175180 m = Attribute (Option (pre), key, Text (value), m)
176181 }
@@ -183,7 +188,7 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
183188 * captures text, possibly normalizing whitespace
184189 */
185190 def captureText (): Unit = {
186- if (capture && buffer.length > 0 )
191+ if (capture && buffer.nonEmpty )
187192 hStack = createText(buffer.toString) :: hStack
188193
189194 buffer.clear()
@@ -226,4 +231,10 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
226231 captureText()
227232 hStack = hStack.reverse_::: (createProcInstr(target, data).toList)
228233 }
234+
235+ override def comment (ch : Array [Char ], start : Int , length : Int ): Unit = {
236+ captureText()
237+ val commentText : String = String .valueOf(ch.slice(start, start + length))
238+ hStack = hStack.reverse_::: (createComment(commentText).toList)
239+ }
229240}
0 commit comments