Unescape HTML entities in snippets

Change-Id: Icd1b538a67eb8e2c3f7b4a57cccfd8a4a6182e2e
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java
index e4b08d5..9e85cae 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java
@@ -58,8 +58,8 @@
  * - Add format to exporters
  * - Add file suffix to exporters
  * - Add "..." to snippets in RTF exporter
- * - Fix SGML entities in RTF exporter
  * - Test Snippet-Export with multiple classes.
+ * - Test Snippet-Export with cutted matches.
  */
 
 @Path("/")
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
index 633448e..888dec1 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
@@ -130,7 +130,7 @@
     };
 
     // Based on jrtf by Christian Ullenboom
-    static void rtfText(Writer w, String rawText) throws IOException {
+    private static void rtfText(Writer w, String rawText) throws IOException {
         char c;
         for (int i = 0; i < rawText.length(); i++) {
             c = rawText.charAt( i ); 
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Snippet.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Snippet.java
index 6750948..8726934 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Snippet.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Snippet.java
@@ -8,17 +8,13 @@
 
 
     public Snippet (String snippetstr) {
-        String[] split = snippetstr.split("</?mark>");
-        String splitleft = split[0];
-        String splitmatch = split[1];
-        String splitright = split[2];
-        //(?i) makes the regex case insensitive.
-        String splitleftr = splitleft.replaceAll("(?i)</?span[^>]*>", "");
-        this.setLeft(splitleftr.trim());
-        String splitmatchr = splitmatch.replaceAll("(?i)</?span[^>]*>", "");
-        this.setMark(splitmatchr.trim());
-        String splitrightr = splitright.replaceAll("(?i)</?span[^>]*>", "");
-        this.setRight(splitrightr.trim());
+        String[] split = snippetstr
+            .replaceAll("(?i)</?span[^>]*>", "")
+            .split("</?mark>");
+
+        this.setLeft(unescapeHTML(split[0].trim()));
+        this.setMark(unescapeHTML(split[1].trim()));
+        this.setRight(unescapeHTML(split[2].trim()));
     }
 
 
@@ -50,4 +46,16 @@
     public void setMark (String mark) {
         this.mark = mark;
     }
+
+    private static String unescapeHTML (String text) {
+        if (text == null)
+			return "";
+		
+        return text
+            .replace("&quot;", "\"")
+            .replace("&apos;", "'")
+            .replace("&lt;", "<")
+            .replace("&gt;", ">")
+            .replace("&amp;", "&");
+    };
 }
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExportTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExportTest.java
index 0ba95c7..a357dbe 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExportTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExportTest.java
@@ -42,13 +42,14 @@
                   "\"title\":\"Title2\","+
                   "\"pubDate\":\"20051104\","+
                   "\"textSigle\":\"RTF/G59/34285\","+
-                  "\"snippet\":\"Simpler <mark>match2</mark> Snippet\"}"+
+                  "\"snippet\":\"Simpler <mark>&quot;match2&quot;</mark> Snippet\"}"+
                   "]}");
 
         Response resp = json.serve().build();
         String x = (String) resp.getEntity();
         resp.close();
         assertTrue(x.contains("{\\b match1}"));
+        assertTrue(x.contains("{\\b \"match2\"}"));
         assertTrue(x.contains("{\\b Title1"));
         assertTrue(x.contains("{\\b Title2"));
     };
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/SnippetTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/SnippetTest.java
index d8d7e18..41f9144 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/SnippetTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/SnippetTest.java
@@ -20,4 +20,19 @@
         assertEquals(s.getRight(),"ging um");
         assertEquals(s.getMark(),"Plagegeist");
     };
+
+    @Test
+    public void testReal () {
+        Snippet s = new Snippet("<span class=\"context-left\"><span class=\"more\"></span>und wie ich in einem Buch von Bernhard Karlgren gelesen habe, wird da eine alte Bedeutung &quot;Blutegel&quot; für dieses Zeichen angenommen, bzw. auch andere Ungeziefer konnten wohl gemeint sein. Der ma-Teil des Worts wurde also ursprünglich wahrscheinlich im Sinne von &quot;</span><span class=\"match\"><mark>Plagegeist</mark></span><span class=\"context-right\">&quot; verwendet, folglich war 蚂蚁 ursprünglich frei übersetzt eine &quot;Sch...-Ameise&quot; ;-) -- 18:21, 30. Apr. 2007 (CEST) Hallo Allgaeuer, mag sein, dass es für dich ein Hammer ist, aber es ist Stand der aktuellen Forschung in der Sinologie. Schriften von Karlgren u.<span class=\"more\"></span></span>");
+        assertEquals(s.getLeft(),
+                     "und wie ich in einem Buch von Bernhard Karlgren "+
+                     "gelesen habe, wird da eine alte Bedeutung "+
+                     "\"Blutegel\" "+
+                     "für dieses Zeichen angenommen, bzw. auch andere "+
+                     "Ungeziefer konnten wohl gemeint sein. Der ma-Teil "+
+                     "des Worts wurde also ursprünglich wahrscheinlich "+
+                     "im Sinne von \"");
+        assertEquals(s.getRight(),"\" verwendet, folglich war 蚂蚁 ursprünglich frei übersetzt eine \"Sch...-Ameise\" ;-) -- 18:21, 30. Apr. 2007 (CEST) Hallo Allgaeuer, mag sein, dass es für dich ein Hammer ist, aber es ist Stand der aktuellen Forschung in der Sinologie. Schriften von Karlgren u.");
+        assertEquals(s.getMark(),"Plagegeist");
+    };
 };