From 32376888149d327a07c83cd4825ce0b6e9a6b006 Mon Sep 17 00:00:00 2001 From: Fehmi Can Saglam Date: Tue, 20 Oct 2015 18:40:26 +0300 Subject: [PATCH] Fix XMLEventReader does not handle ' properly Fixes #72 --- .../scala/xml/pull/XMLEventReaderTest.scala | 36 +++++++++++++++++++ shared/src/main/scala/scala/xml/Utility.scala | 2 +- .../scala/xml/parsing/MarkupParser.scala | 13 +++---- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/jvm/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala b/jvm/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala index 6b66326da..f36b8798e 100644 --- a/jvm/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala +++ b/jvm/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala @@ -168,4 +168,40 @@ class XMLEventReaderTest { while(er.hasNext) er.next() er.stop() } + + @Test + def entityRefTest: Unit = { + val source = Source.fromString(""'<>&") + val er = new XMLEventReader(source) + + assertTrue(er.next match { + case EvElemStart(_, "text", _, _) => true + case _ => false + }) + assertTrue(er.next match { + case EvEntityRef("quot") => true + case e => false + }) + assertTrue(er.next match { + case EvEntityRef("apos") => true + case _ => false + }) + assertTrue(er.next match { + case EvEntityRef("lt") => true + case _ => false + }) + assertTrue(er.next match { + case EvEntityRef("gt") => true + case _ => false + }) + assertTrue(er.next match { + case EvEntityRef("amp") => true + case _ => false + }) + assertTrue(er.next match { + case EvElemEnd(_, "text") => true + case _ => false + }) + assert(er.isEmpty) + } } diff --git a/shared/src/main/scala/scala/xml/Utility.scala b/shared/src/main/scala/scala/xml/Utility.scala index e9aa88de6..9fed53b6f 100755 --- a/shared/src/main/scala/scala/xml/Utility.scala +++ b/shared/src/main/scala/scala/xml/Utility.scala @@ -93,7 +93,7 @@ object Utility extends AnyRef with parsing.TokenTests { * For reasons unclear escape and unescape are a long ways from * being logical inverses. */ - val pairs = Map( + private val pairs = Map( "lt" -> '<', "gt" -> '>', "amp" -> '&', diff --git a/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala b/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala index d9a61b393..068336e4e 100755 --- a/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala +++ b/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala @@ -12,7 +12,7 @@ package parsing import scala.io.Source import scala.xml.dtd._ -import Utility.Escapes.{ pairs => unescape } +import Utility.Escapes.unescMap /** * An XML parser. @@ -470,11 +470,12 @@ trait MarkupParser extends MarkupParserCommon with TokenTests { case _ => // EntityRef val n = xName xToken(';') - - if (unescape contains n) { - handle.entityRef(tmppos, n) - ts &+ unescape(n) - } else push(n) + unescMap.get(n) match { + case None => push(n) + case Some(theChar) => + handle.entityRef(tmppos, n) + ts &+ theChar + } } case _ => // text content appendText(tmppos, ts, xText)