Support quote combinations at the end of sentences

Change-Id: I6ae7015b1b69464238360e7c7205e56e113430bc
diff --git a/matrix_test.go b/matrix_test.go
index 80523e5..c017af5 100644
--- a/matrix_test.go
+++ b/matrix_test.go
@@ -302,6 +302,35 @@
 	assert.Equal(len(sentences), 3)
 	assert.Equal("\"\nAusschalten\n!!!\n\"\n,\nsagte\ner\n.", sentences[0])
 	assert.Equal("\"\nHast\nDu\nnicht\ngehört\n???\n\"", sentences[1])
+
+	w.Reset()
+	assert.True(mat.Transduce(strings.NewReader("“Ausschalten!!!”, sagte er. «Hast Du nicht gehört???»"), w))
+	sentences = strings.Split(w.String(), "\n\n")
+	assert.Equal(len(sentences), 3)
+	assert.Equal("“\nAusschalten\n!!!\n”\n,\nsagte\ner\n.", sentences[0])
+	assert.Equal("«\nHast\nDu\nnicht\ngehört\n???\n»", sentences[1])
+
+	w.Reset()
+	assert.True(mat.Transduce(strings.NewReader("“Ausschalten!!!”, sagte er. «Hast Du nicht gehört???»"), w))
+	sentences = strings.Split(w.String(), "\n\n")
+	assert.Equal(len(sentences), 3)
+	assert.Equal("“\nAusschalten\n!!!\n”\n,\nsagte\ner\n.", sentences[0])
+	assert.Equal("«\nHast\nDu\nnicht\ngehört\n???\n»", sentences[1])
+
+	text := `»Meinetwegen. Denkst du, daß ich darauf warte? Das fehlte noch.
+Übrigens, ich kriege schon einen und vielleicht bald. Da ist mir nicht
+bange. Neulich erst hat mir der kleine Ventivegni von drüben gesagt:
+'Fräulein Effi, was gilt die Wette, wir sind hier noch in diesem Jahre
+zu Polterabend und Hochzeit.'«
+
+»Und was sagtest du da?«`
+
+	w.Reset()
+	assert.True(mat.Transduce(strings.NewReader(text), w))
+	sentences = strings.Split(w.String(), "\n\n")
+	assert.Equal(len(sentences), 8)
+	assert.Equal("Neulich\nerst\nhat\nmir\nder\nkleine\nVentivegni\nvon\ndrüben\ngesagt\n:\n'\nFräulein\nEffi\n,\nwas\ngilt\ndie\nWette\n,\nwir\nsind\nhier\nnoch\nin\ndiesem\nJahre\nzu\nPolterabend\nund\nHochzeit\n.\n'\n«", sentences[5])
+	assert.Equal("»\nUnd\nwas\nsagtest\ndu\nda\n?\n«", sentences[6])
 }
 
 func TestMatrixFullTokenizerTokenSplitter(t *testing.T) {
diff --git a/src/tokenizer.xfst b/src/tokenizer.xfst
index 4193c28..8a93c21 100644
--- a/src/tokenizer.xfst
+++ b/src/tokenizer.xfst
@@ -209,7 +209,7 @@
 echo - Introduce Token splitter
 
 define Token [
-  RealToken @-> ... NLout,
+  [%. %. %. | RealToken] @-> ... NLout,
   XML @-> ... NLout,
   URL @-> ... NLout,
   Email @-> ... NLout,
@@ -220,10 +220,13 @@
 
 echo - Introduce Sentence splitter
 ! And compose Whitespace ignorance
+
+define DQuotes ["”"|%"|"»"|"«"];
+
 read regex Token .o. [
-  SP NLout ["”"|"›"|"»"|%"|%’|"'"] @-> ... NLout \/ _ NLout \%,
+  SP NLout [DQuotes | "›" (NLout DQuotes)| %‹ (NLout DQuotes)| %’ (NLout DQuotes)| "'" (NLout DQuotes)] @-> ... NLout \/ _ NLout \%,
 ] .o. [
-  SP @-> ... NLout \/ NLout _ NLout [? - "”" - "›" - "»" - %" - %’ - "'"]
+  SP @-> ... NLout \/ NLout _ NLout [? - "”" - %" - "»" - "«" - "›" - %‹ - %’ - "'" - NLout]
 ] .o. [
   [WS|NL]+ @-> 0 || [ .#. | NLout ] _
 ];