You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2015/10/21 14:47:20 UTC

svn commit: r1709820 - in /uima/ruta/trunk: ruta-core/src/main/java/org/apache/uima/ruta/action/SplitAction.java ruta-core/src/test/java/org/apache/uima/ruta/action/SplitTest.java ruta-docbook/src/docbook/tools.ruta.language.actions.xml

Author: pkluegl
Date: Wed Oct 21 12:47:20 2015
New Revision: 1709820

URL: http://svn.apache.org/viewvc?rev=1709820&view=rev
Log:
UIMA-4633
- extended test and fixed trivial case
- added documentation

Modified:
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/SplitAction.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/SplitTest.java
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/SplitAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/SplitAction.java?rev=1709820&r1=1709819&r2=1709820&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/SplitAction.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/SplitAction.java Wed Oct 21 12:47:20 2015
@@ -165,9 +165,14 @@ public class SplitAction extends Abstrac
 
   private boolean trimInvisible(Annotation annotation, RutaStream stream) {
     List<RutaBasic> basics = new ArrayList<>(stream.getAllBasicsInWindow(annotation));
+    
     int min = annotation.getEnd();
     int max = annotation.getBegin();
 
+    if(min <= max) {
+      return false;
+    }
+
     for (RutaBasic each : basics) {
       if (stream.isVisible(each)) {
         min = Math.min(min, each.getBegin());

Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/SplitTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/SplitTest.java?rev=1709820&r1=1709819&r2=1709820&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/SplitTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/SplitTest.java Wed Oct 21 12:47:20 2015
@@ -41,248 +41,248 @@ import org.junit.Test;
 
 public class SplitTest {
 
-//  @Test
-//  public void testDefault() {
-//    String document = "Some text. More text , with 1 , and more. even more text.";
-//    String script = "PERIOD #{-> T1} PERIOD;";
-//    script += " #{-> T1} PERIOD;";
-//    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
-//    script += "Complex{-> SPLIT(COMMA)};";
-//
-//    Map<String, String> typeMap = new TreeMap<String, String>();
-//    String typeName = "Complex";
-//    typeMap.put(typeName, "uima.tcas.Annotation");
-//
-//    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
-//    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
-//    featureMap.put(typeName, list);
-//    String fn = "number";
-//    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
-//
-//    CAS cas = null;
-//    try {
-//      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
-//      Ruta.apply(cas, script);
-//    } catch (Exception e) {
-//      e.printStackTrace();
-//    }
-//
-//    Type t = null;
-//    AnnotationIndex<AnnotationFS> ai = null;
-//    FSIterator<AnnotationFS> iterator = null;
-//
-//    t = cas.getTypeSystem().getType(typeName);
-//    Feature f1 = t.getFeatureByBaseName(fn);
-//    ai = cas.getAnnotationIndex(t);
-//       
-//    assertEquals(3, ai.size());
-//    iterator = ai.iterator();
-//    AnnotationFS next = iterator.next();
-//    assertEquals("More text", next.getCoveredText());
-//    FeatureStructure featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals("with 1", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals("and more", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    if (cas != null) {
-//      cas.release();
-//    }
-//
-//  }
-//  
-//  @Test
-//  public void testAddBegin() {
-//    String document = "Some text. More text , with 1 , and more. even more text.";
-//    String script = "PERIOD #{-> T1} PERIOD;";
-//    script += " #{-> T1} PERIOD;";
-//    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
-//    script += "Complex{-> SPLIT(COMMA, true, true, false)};";
-//
-//    Map<String, String> typeMap = new TreeMap<String, String>();
-//    String typeName = "Complex";
-//    typeMap.put(typeName, "uima.tcas.Annotation");
-//
-//    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
-//    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
-//    featureMap.put(typeName, list);
-//    String fn = "number";
-//    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
-//
-//    CAS cas = null;
-//    try {
-//      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
-//      Ruta.apply(cas, script);
-//    } catch (Exception e) {
-//      e.printStackTrace();
-//    }
-//
-//    Type t = null;
-//    AnnotationIndex<AnnotationFS> ai = null;
-//    FSIterator<AnnotationFS> iterator = null;
-//
-//    t = cas.getTypeSystem().getType(typeName);
-//    Feature f1 = t.getFeatureByBaseName(fn);
-//    ai = cas.getAnnotationIndex(t);
-//       
-//    assertEquals(3, ai.size());
-//    iterator = ai.iterator();
-//    AnnotationFS next = iterator.next();
-//    assertEquals("More text", next.getCoveredText());
-//    FeatureStructure featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals(", with 1", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals(", and more", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    if (cas != null) {
-//      cas.release();
-//    }
-//
-//  }
-//  
-//  @Test
-//  public void testAddEnd() {
-//    String document = "Some text. More text , with 1 , and more. even more text.";
-//    String script = "PERIOD #{-> T1} PERIOD;";
-//    script += " #{-> T1} PERIOD;";
-//    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
-//    script += "Complex{-> SPLIT(COMMA, true, false, true)};";
-//
-//    Map<String, String> typeMap = new TreeMap<String, String>();
-//    String typeName = "Complex";
-//    typeMap.put(typeName, "uima.tcas.Annotation");
-//
-//    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
-//    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
-//    featureMap.put(typeName, list);
-//    String fn = "number";
-//    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
-//
-//    CAS cas = null;
-//    try {
-//      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
-//      Ruta.apply(cas, script);
-//    } catch (Exception e) {
-//      e.printStackTrace();
-//    }
-//
-//    Type t = null;
-//    AnnotationIndex<AnnotationFS> ai = null;
-//    FSIterator<AnnotationFS> iterator = null;
-//
-//    t = cas.getTypeSystem().getType(typeName);
-//    Feature f1 = t.getFeatureByBaseName(fn);
-//    ai = cas.getAnnotationIndex(t);
-//       
-//    assertEquals(3, ai.size());
-//    iterator = ai.iterator();
-//    AnnotationFS next = iterator.next();
-//    assertEquals("More text ,", next.getCoveredText());
-//    FeatureStructure featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals("with 1 ,", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals("and more", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    if (cas != null) {
-//      cas.release();
-//    }
-//
-//  }
-//  
-//  @Test
-//  public void testAddBoth() {
-//    String document = "Some text. More text , with 1 , and more. even more text.";
-//    String script = "PERIOD #{-> T1} PERIOD;";
-//    script += " #{-> T1} PERIOD;";
-//    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
-//    script += "Complex{-> SPLIT(COMMA, true, true, true)};";
-//
-//    Map<String, String> typeMap = new TreeMap<String, String>();
-//    String typeName = "Complex";
-//    typeMap.put(typeName, "uima.tcas.Annotation");
-//
-//    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
-//    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
-//    featureMap.put(typeName, list);
-//    String fn = "number";
-//    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
-//
-//    CAS cas = null;
-//    try {
-//      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
-//      Ruta.apply(cas, script);
-//    } catch (Exception e) {
-//      e.printStackTrace();
-//    }
-//
-//    Type t = null;
-//    AnnotationIndex<AnnotationFS> ai = null;
-//    FSIterator<AnnotationFS> iterator = null;
-//
-//    t = cas.getTypeSystem().getType(typeName);
-//    Feature f1 = t.getFeatureByBaseName(fn);
-//    ai = cas.getAnnotationIndex(t);
-//       
-//    assertEquals(3, ai.size());
-//    iterator = ai.iterator();
-//    AnnotationFS next = iterator.next();
-//    assertEquals("More text ,", next.getCoveredText());
-//    FeatureStructure featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals(", with 1 ,", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    next = iterator.next();
-//    assertEquals(", and more", next.getCoveredText());
-//    featureValue = next.getFeatureValue(f1);
-//    assertNotNull(featureValue);
-//    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
-//
-//    if (cas != null) {
-//      cas.release();
-//    }
-//
-//  }
+  @Test
+  public void testDefault() {
+    String document = "Some text. More text , with 1 , and more. even more text.";
+    String script = "PERIOD #{-> T1} PERIOD;";
+    script += " #{-> T1} PERIOD;";
+    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
+    script += "Complex{-> SPLIT(COMMA)};";
+
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    String typeName = "Complex";
+    typeMap.put(typeName, "uima.tcas.Annotation");
+
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put(typeName, list);
+    String fn = "number";
+    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+
+    t = cas.getTypeSystem().getType(typeName);
+    Feature f1 = t.getFeatureByBaseName(fn);
+    ai = cas.getAnnotationIndex(t);
+       
+    assertEquals(3, ai.size());
+    iterator = ai.iterator();
+    AnnotationFS next = iterator.next();
+    assertEquals("More text", next.getCoveredText());
+    FeatureStructure featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals("with 1", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals("and more", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    if (cas != null) {
+      cas.release();
+    }
+
+  }
   
   @Test
-  public void testBoundary() {
+  public void testAddBegin() {
+    String document = "Some text. More text , with 1 , and more. even more text.";
+    String script = "PERIOD #{-> T1} PERIOD;";
+    script += " #{-> T1} PERIOD;";
+    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
+    script += "Complex{-> SPLIT(COMMA, true, true, false)};";
+
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    String typeName = "Complex";
+    typeMap.put(typeName, "uima.tcas.Annotation");
+
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put(typeName, list);
+    String fn = "number";
+    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+
+    t = cas.getTypeSystem().getType(typeName);
+    Feature f1 = t.getFeatureByBaseName(fn);
+    ai = cas.getAnnotationIndex(t);
+       
+    assertEquals(3, ai.size());
+    iterator = ai.iterator();
+    AnnotationFS next = iterator.next();
+    assertEquals("More text", next.getCoveredText());
+    FeatureStructure featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals(", with 1", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals(", and more", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    if (cas != null) {
+      cas.release();
+    }
+
+  }
+  
+  @Test
+  public void testAddEnd() {
+    String document = "Some text. More text , with 1 , and more. even more text.";
+    String script = "PERIOD #{-> T1} PERIOD;";
+    script += " #{-> T1} PERIOD;";
+    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
+    script += "Complex{-> SPLIT(COMMA, true, false, true)};";
+
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    String typeName = "Complex";
+    typeMap.put(typeName, "uima.tcas.Annotation");
+
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put(typeName, list);
+    String fn = "number";
+    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+
+    t = cas.getTypeSystem().getType(typeName);
+    Feature f1 = t.getFeatureByBaseName(fn);
+    ai = cas.getAnnotationIndex(t);
+       
+    assertEquals(3, ai.size());
+    iterator = ai.iterator();
+    AnnotationFS next = iterator.next();
+    assertEquals("More text ,", next.getCoveredText());
+    FeatureStructure featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals("with 1 ,", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals("and more", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    if (cas != null) {
+      cas.release();
+    }
+
+  }
+  
+  @Test
+  public void testAddBoth() {
+    String document = "Some text. More text , with 1 , and more. even more text.";
+    String script = "PERIOD #{-> T1} PERIOD;";
+    script += " #{-> T1} PERIOD;";
+    script += "T1{CONTAINS(NUM)-> CREATE(Complex, \"number\"= NUM)};";
+    script += "Complex{-> SPLIT(COMMA, true, true, true)};";
+
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    String typeName = "Complex";
+    typeMap.put(typeName, "uima.tcas.Annotation");
+
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put(typeName, list);
+    String fn = "number";
+    list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+
+    t = cas.getTypeSystem().getType(typeName);
+    Feature f1 = t.getFeatureByBaseName(fn);
+    ai = cas.getAnnotationIndex(t);
+       
+    assertEquals(3, ai.size());
+    iterator = ai.iterator();
+    AnnotationFS next = iterator.next();
+    assertEquals("More text ,", next.getCoveredText());
+    FeatureStructure featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals(", with 1 ,", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    next = iterator.next();
+    assertEquals(", and more", next.getCoveredText());
+    featureValue = next.getFeatureValue(f1);
+    assertNotNull(featureValue);
+    assertEquals("1", ((AnnotationFS) featureValue).getCoveredText());
+
+    if (cas != null) {
+      cas.release();
+    }
+
+  }
+  
+  @Test
+  public void testBoundarySplit() {
     String document = "Some text. More text , with 1 , and more. even more text.";
     String script = "PERIOD #{-> T1} PERIOD;";
     script += "#{-> T1} PERIOD;";
@@ -339,6 +339,45 @@ public class SplitTest {
 
     if (cas != null) {
       cas.release();
+    }
+
+  }
+  
+  @Test
+  public void testBoundary() {
+    String document = "Some text. More text , with 1 , and more. even more text.";
+    String script = "PERIOD #{-> T1} PERIOD;";
+    script += "#{-> T1} PERIOD;";
+    script += "T1{-> SPLIT(PERIOD, true, false, true)};";
+
+    CAS cas = null;
+    try {
+      cas = RutaTestUtils.getCAS(document);
+      Ruta.apply(cas, script);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    Type t = null;
+    AnnotationIndex<AnnotationFS> ai = null;
+    FSIterator<AnnotationFS> iterator = null;
+
+    t = RutaTestUtils.getTestType(cas, 1);
+    ai = cas.getAnnotationIndex(t);
+       
+    assertEquals(3, ai.size());
+    iterator = ai.iterator();
+    AnnotationFS next = iterator.next();
+    assertEquals("Some text.", next.getCoveredText());
+
+    next = iterator.next();
+    assertEquals("More text , with 1 , and more.", next.getCoveredText());
+
+    next = iterator.next();
+    assertEquals("even more text.", next.getCoveredText());
+
+    if (cas != null) {
+      cas.release();
     }
 
   }

Modified: uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml?rev=1709820&r1=1709819&r2=1709820&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml (original)
+++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml Wed Oct 21 12:47:20 2015
@@ -1288,6 +1288,40 @@ Document{-> MARKTABLE(Struct, 1, TestTab
       </section>
     </section>
 
+    <section id="ugr.tools.ruta.language.actions.split">
+      <title>SHIFT</title>
+      <para>
+        The SPLIT action is able to split the matched annotation for each occurence of annotation 
+        of the given type. There are three additional parameters: The first one specifies if complete annotations of the given type 
+        should be used to split the matched annotations. If set to false, then even the boundary of an annotation will cause splitting.
+        The third (addToBegin) and fourth (addToEnd) argument specify if the complete annotation (for splitting) 
+        will be added to the begin or end of the splitted annotation. 
+        The latter two are only utilized if the first one is set to true..
+        If omitted, the first argument is true and the other two arguments are false by default.
+      </para>
+      <section>
+        <title>
+          <emphasis role="bold">Definition:</emphasis>
+        </title>
+        <para>
+          <programlisting><![CDATA[SPLIT(TypeExpression(,BooleanExpression, 
+          (BooleanExpression, BooleanExpression)? )?]]></programlisting>
+        </para>
+      </section>
+      <section>
+        <title>
+          <emphasis role="bold">Example:</emphasis>
+        </title>
+        <para>
+          <programlisting><![CDATA[Sentence{-> SPLIT(PERIOD, true, false, true)};]]></programlisting>
+        </para>
+        <para>
+          In this example, an annotation of the type <quote>Sentence</quote> is 
+          splitted for each occurence of a period, which is added to the end of the new sentence. 
+        </para>
+      </section>
+    </section>
+
   <section id="ugr.tools.ruta.language.actions.transfer">
     <title>TRANSFER</title>
     <para>