Refactor snippet generation and fix inline markers in contexts

Change-Id: Iff81bde2b7126e5efb9d664dcb28f65415ee122e
diff --git a/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java b/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java
index 27f03c9..257e32c 100644
--- a/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java
+++ b/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java
@@ -529,7 +529,7 @@
 
 		km = kr.getMatch(3);
 		assertEquals(
-			"<span class=\"context-left\"><span class=\"match\"></span></span>",
+			"<span class=\"context-left\"></span><span class=\"match\"></span><span class=\"context-right\"></span>",
 			km.getSnippetHTML());
 
 	};
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
index 97aa429..39385eb 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
@@ -458,7 +458,7 @@
 			snippet
 			);
 
-		// Expansion - no context
+		// Expansion - no context but inner match
 		km = ki.getMatchInfo("match-WPD17/H81/63495-p88-91", "tokens",
 								   "xyz", "s", true, true, true);
 		snippet = km.getSnippetHTML();
@@ -1138,40 +1138,39 @@
         	"match-Corpus/Doc/0002-p0-6",
         					 "tokens", "malt", null, true, false);
 
-		        assertEquals(
-					"SnippetHTML (1)",
-					"<span class=\"context-left\">"+
-					"</span>"+
-					"<span class=\"match\">"+
-					"<span xml:id=\"token-Corpus/Doc/0002-p0-6\">"+
-					"<mark>"+
-					"<span xml:id=\"token-Corpus/Doc/0002-p0\">"+
-					"<span xlink:title=\"malt/d:ROOT\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p0-6\">Maximen</span>"+
-					"</span>"+
-					" "+
-					"<span xml:id=\"token-Corpus/Doc/0002-p1\">"+
-					"<span xlink:title=\"malt/d:KON\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p0\">und</span>"+
-					"</span>"+
-					" "+
-					"<span xlink:title=\"malt/d:CJ\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p1\">Reflexionen</span>"+
-					" "+
-					"<span xml:id=\"token-Corpus/Doc/0002-p3\">"+
-					"<span xlink:title=\"malt/d:KON\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p0\">Religion</span>"+
-					"</span>"+
-					" "+
-					"<span xml:id=\"token-Corpus/Doc/0002-p4\">"+
-					"<span xlink:title=\"malt/d:KON\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p3\">und</span>"+
-					"</span>"+
-					" "+
-					"<span xlink:title=\"malt/d:CJ\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p4\">Christentum</span>"+
-					"</mark>"+
-					"</span>"+
-					"</span>"+
-					"<span class=\"context-right\">"+
-					"<span class=\"more\"></span>"+
-					"</span>",
-					km.getSnippetHTML()
-					);
+        assertEquals("SnippetHTML (1)",
+                     "<span class=\"context-left\"></span>"+
+                     "<span class=\"match\">"+
+                     "<span xml:id=\"token-Corpus/Doc/0002-p0-6\">"+
+                     "<mark>"+
+                     "<span xml:id=\"token-Corpus/Doc/0002-p0\">"+
+                     "<span xlink:title=\"malt/d:ROOT\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p0-6\">Maximen</span>"+
+                     "</span>"+
+                     " "+
+                     "<span xml:id=\"token-Corpus/Doc/0002-p1\">"+
+                     "<span xlink:title=\"malt/d:KON\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p0\">und</span>"+
+                     "</span>"+
+                     " "+
+                     "<span xlink:title=\"malt/d:CJ\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p1\">Reflexionen</span>"+
+                     " "+
+                     "<span xml:id=\"token-Corpus/Doc/0002-p3\">"+
+                     "<span xlink:title=\"malt/d:KON\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p0\">Religion</span>"+
+                     "</span>"+
+                     " "+
+                     "<span xml:id=\"token-Corpus/Doc/0002-p4\">"+
+                     "<span xlink:title=\"malt/d:KON\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p3\">und</span>"+
+                     "</span>"+
+                     " "+
+                     "<span xlink:title=\"malt/d:CJ\" xlink:show=\"none\" xlink:href=\"#token-Corpus/Doc/0002-p4\">Christentum</span>"+
+                     "</mark>"+
+                     "</span>"+
+                     "</span>"+
+                     "<span class=\"context-right\">"+
+                     "<span class=\"more\"></span>"+
+                     "</span>",
+                     km.getSnippetHTML()
+            );
+        
 	};
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestPagebreakIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestPagebreakIndex.java
index 4492313..fc612ac 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestPagebreakIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestPagebreakIndex.java
@@ -77,10 +77,12 @@
 
         assertEquals(5, kr.getMatch(2).getStartPos());
 		assertEquals(6, kr.getMatch(2).getEndPos());
-		assertEquals(528, kr.getMatch(2).getStartPage());
-        assertEquals("<span class=\"context-left\">abcab</span><span class=\"match\"><mark>c</mark></span><span class=\"context-right\">abac</span>",
+		assertEquals(529, kr.getMatch(2).getStartPage());
+        assertEquals("<span class=\"context-left\"><span class=\"pb\" data-after=\"528\"></span>abcab</span><span class=\"match\"><mark><span class=\"pb\" data-after=\"529\"></span>c</mark></span><span class=\"context-right\">ab<span class=\"pb\" data-after=\"530\"></span>ac</span>",
                      kr.getMatch(2).getSnippetHTML());
-		assertEquals(529, kr.getMatch(2).getEndPage()); // Debatable
+        assertEquals("{%528}abcab[[{%529}c]]ab{%530}ac",
+                     kr.getMatch(2).getSnippetBrackets());
+		assertEquals(-1, kr.getMatch(2).getEndPage()); // Debatable
 
         assertEquals(9, kr.getMatch(3).getStartPos());
 		assertEquals(10, kr.getMatch(3).getEndPos());
@@ -106,10 +108,11 @@
 		assertEquals(3, kr.getMatch(0).getEndPos());
 		assertEquals(528, kr.getMatch(0).getStartPage());
 		assertEquals(-1, kr.getMatch(0).getEndPage());
+
 		assertEquals(
 			"snippetHTML",
 			"<span class=\"context-left\">"+
-			// "<span class=\"pb\" data-after=\"528\"></span>"+
+            "<span class=\"pb\" data-after=\"528\"></span>"+
 			"ab"+
 			"</span>"+
 			"<span class=\"match\">"+
@@ -119,15 +122,17 @@
 			"</span>"+
 			"<span class=\"context-right\">"+
 			"ab"+
-			// "<span class=\"pb\" data-after=\"528\"></span>"+
+            "<span class=\"pb\" data-after=\"529\"></span>"+
 			"cab"+
-			// "<span class=\"pb\" data-after=\"528\"></span>"+
+            "<span class=\"pb\" data-after=\"530\"></span>"+
 			"a"+
 			"<span class=\"more\">"+
 			"</span>"+
 			"</span>",
 			kr.getMatch(0).getSnippetHTML());
 
+		assertEquals("snippetBrackets","{%528}ab[[c]]ab{%529}cab{%530}a ...",kr.getMatch(0).getSnippetBrackets());
+        
 		QueryBuilder qb = new QueryBuilder("tokens");
 		sq = qb.seq().append(
 			qb.repeat(
@@ -139,11 +144,10 @@
 
 		assertEquals(sq.toString(), "spanNext(spanRepetition(spanNext(spanNext(tokens:s:a, tokens:s:b), tokens:s:c){2,2}), tokens:s:a)");
 
-
 		kr = ki.search(sq, (short) 10);
 		
 		assertEquals(528, kr.getMatch(0).getStartPage());
-		assertEquals(529, kr.getMatch(0).getEndPage());
+		assertEquals(-1, kr.getMatch(0).getEndPage());
 
 		assertEquals(
 			"snippetHTML",
@@ -157,8 +161,10 @@
 			"</mark>"+
 			"</span>"+
 			"<span class=\"context-right\">"+
-			"bac"+
+			"b<span class=\"pb\" data-after=\"530\"></span>ac"+
 			"</span>",
 			kr.getMatch(0).getSnippetHTML());
+
+		assertEquals("snippetBrackets","[[{%528}abcab{%529}ca]]b{%530}ac",kr.getMatch(0).getSnippetBrackets());
 	};
 };
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
index ec38fa4..0b34e56 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
@@ -759,7 +759,41 @@
         assertEquals(0, kr.getStartIndex());
         assertEquals(25, kr.getItemsPerPage());
         Match m = kr.getMatch(0);
-        assertEquals("<span class=\"context-left\"></span><span class=\"match\"><span class=\"inline-marker\" data-key=\"who\" data-value=\"Mai Thi Nguyen-Kim\"></span><span class=\"inline-marker\" data-key=\"start\" data-value=\"0:00\"></span><span class=\"inline-marker\" data-key=\"end\" data-value=\"01:20\"></span>(<mark>Räuspern</mark></span><span class=\"context-right\">) Wie viele Geschlechter gibt es? Wenn<span class=\"more\"></span></span>", m.getSnippetHTML());
+        assertEquals(
+            "<span class=\"context-left\"><span class=\"inline-marker\" data-key=\"who\" data-value=\"Mai Thi Nguyen-Kim\"></span><span class=\"inline-marker\" data-key=\"start\" data-value=\"0:00\"></span><span class=\"inline-marker\" data-key=\"end\" data-value=\"01:20\"></span>(</span><span class=\"match\"><mark>Räuspern</mark></span><span class=\"context-right\">) Wie viele Geschlechter gibt es? Wenn<span class=\"more\"></span></span>",
+            m.getSnippetHTML());      
+
+        assertEquals(
+            "{*who=Mai Thi Nguyen-Kim}{*start=0:00}{*end=01:20}([[Räuspern]]) Wie viele Geschlechter gibt es? Wenn ...",
+            m.getSnippetBrackets());      
+        
+        ks = new Krill(new QueryBuilder("tokens").seg("s:Geschlechter"));
+        kr = ks.apply(ki);
+
+        assertEquals(5, kr.getTotalResults());
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(25, kr.getItemsPerPage());
+        m = kr.getMatch(0);
+        assertEquals("<span class=\"context-left\"><span class=\"inline-marker\" data-key=\"who\" data-value=\"Mai Thi Nguyen-Kim\"></span><span class=\"inline-marker\" data-key=\"start\" data-value=\"0:00\"></span><span class=\"inline-marker\" data-key=\"end\" data-value=\"01:20\"></span>(Räuspern) Wie viele </span><span class=\"match\"><mark>Geschlechter</mark></span><span class=\"context-right\"> gibt es? Wenn man hierzu öffentliche<span class=\"more\"></span></span>", m.getSnippetHTML());
+
+        assertEquals(
+            "{*who=Mai Thi Nguyen-Kim}{*start=0:00}{*end=01:20}(Räuspern) Wie viele [[Geschlechter]] gibt es? Wenn man hierzu öffentliche ...",
+            m.getSnippetBrackets());      
+
+        ks = new Krill(new QueryBuilder("tokens").seg("s:Zunächst"));
+        kr = ks.apply(ki);
+
+        assertEquals(1, kr.getTotalResults());
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(25, kr.getItemsPerPage());
+        m = kr.getMatch(0);
+        assertEquals("<span class=\"context-left\"><span class=\"more\"></span>Perspektiven, die dazu einladen, aneinander vorbeizureden </span><span class=\"match\"><mark><span class=\"inline-marker\" data-key=\"who\" data-value=\"Mai Thi Nguyen-Kim\"></span><span class=\"inline-marker\" data-key=\"start\" data-value=\"0:00\"></span><span class=\"inline-marker\" data-key=\"end\" data-value=\"01:20\"></span>Zunächst</mark></span><span class=\"context-right\"> einmal bezeichnet Geschlecht eine Rolle bei<span class=\"more\"></span></span>", m.getSnippetHTML());
+
+        assertEquals(
+            "... Perspektiven, die dazu einladen, aneinander vorbeizureden [[{*who=Mai Thi Nguyen-Kim}{*start=0:00}{*end=01:20}Zunächst]] einmal bezeichnet Geschlecht eine Rolle bei ...",
+            m.getSnippetBrackets());      
+
+        
     };