src/main/java/lv/semti/morphology/analyzer/Splitting.java
public static LinkedList<Word> tokenize(Analyzer morphoAnalyzer, String chunk) {		
		LinkedList<Word> tokens = new LinkedList<Word>();
		if (chunk == null) return tokens;
		
		Trie automats = morphoAnalyzer.automats;

	    //bug fix - pievienota beigās whitespace
		String str = chunk+" ";
		//workaround dubultapostrofu izvirtībai
        str = str.replaceAll("''", "\u200B''"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace on Offsetus
        //workaround teikuma beigu saīsinājumiem utt
        str = str.replaceAll("([\\p{L}\\d])\\.(\\p{Z})*$", "$1\u200B.$2"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace un offsetus
//        str = str.replaceAll("([\\d])\\.(\\p{Z})*$", "$1\u200B.$2"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace un offsetus

        // te tiek ciklā doti visi tekstā esošie vārdi uz morfoanalīzi.
        int progress = 0;
		boolean inApostrophes=false;
		Status statuss = Status.IN_SPACE;
		StringBuilder accumulatedWhitespace = new StringBuilder();
		int lastGoodEnd=0;
		boolean canEndInNextStep=false;
		
		for (int i = 0; i < str.length(); i++) {
			switch (statuss) {
			case IN_SPACE:
				if (!Splitting.isSpace(str.charAt(i))) {
					if (str.charAt(i)=='\'') inApostrophes=true;

					automats.reset(); //atjauno automāta stāvokli
					automats.findNextBranch(str.charAt(i)); //atrod pirmo derīgo zaru
					
					if(automats.status()>0) { //pārbauda vai automātā atrada meklēto simbolu
						//ja atrada
						statuss=Status.IN_WORD;
						progress=i;
						//pārbauda vai ar to var arī virkne beigties
						canEndInNextStep = (automats.status()==2);
					} else {
						//ja neatrada, pievieno vienu simbolu un mēģina vēl
                        tokens.add( formToken(morphoAnalyzer, str, i, i+1, accumulatedWhitespace));
					}
				} else {
				   accumulatedWhitespace.append(str.charAt(i));
                }
				break;
			case IN_WORD:
				//pārbauda vai ir atrastas potenciālās beigas
		        if (canEndInNextStep==true &&
			            (Splitting.isSeparator(str.charAt(i)) || !Character.isLetter((i>0 ? str.charAt(i-1) : 0) ) ) )
				{
					lastGoodEnd=i;
					if(str.charAt(i)=='\'' && inApostrophes) {
						tokens.add( formToken(morphoAnalyzer, str, progress, i, accumulatedWhitespace));
                        accumulatedWhitespace = new StringBuilder();
                        tokens.add( formToken(morphoAnalyzer, str, i, i+1, accumulatedWhitespace));
						inApostrophes=false;
						statuss=Status.IN_SPACE;
						break;
					}
				}
				canEndInNextStep=false;
				
				//mēģina atrast nākamo simbolu automātā
				if (automats.findNext(str.charAt(i))>0) { //ja atrada 
					//pārbauda vai ar to var arī virkne beigties
					if (automats.status()==2)
						canEndInNextStep=true;
				} else {
					//ja neatrada, pārbauda vai automāta darbības laikā tika atrasta potenciālā beigu pozīcija
					if (lastGoodEnd>progress) {
                        tokens.add( formToken(morphoAnalyzer, str, progress, lastGoodEnd, accumulatedWhitespace));
						i=lastGoodEnd-1;
						statuss = Status.IN_SPACE;
                        accumulatedWhitespace = new StringBuilder();
					} else {
						i=progress;
						//mēgina atrast nākamo derīgo zaru
						automats.nextBranch();
						automats.findNextBranch(str.charAt(i));
						if(automats.status()>0) { //pārbauda vai atrada meklēto simbolu
							//pārbauda vai ar to var arī virkne beigties
							if(automats.status()==2)
								canEndInNextStep=true;
						} else {
							//ja neatrada, pievieno simbolu rezultātam un pēc tam dosies meklēt jauno sākumu
                            //vispār šis ir fishy. FIXME
                            tokens.add( formToken(morphoAnalyzer, str, i,i+1, accumulatedWhitespace));
							statuss = Status.IN_SPACE;
                            accumulatedWhitespace = new StringBuilder();
						}
					}
				}				
				break;
			}
		} // for i..
		
		
		if (statuss == Status.IN_WORD) { 
			tokens.add( formToken(morphoAnalyzer, str, progress, str.length(), accumulatedWhitespace));
		}
		
		return tokens;
	}
public static LinkedList<Word> tokenize(Analyzer morphoAnalyzer, String chunk) {		
		LinkedList<Word> tokens = new LinkedList<Word>();
		if (chunk == null) return tokens;
		
		Trie automats = morphoAnalyzer.automats;

	    //bug fix - pievienota beigās whitespace
		String str = chunk+" ";
		//workaround dubultapostrofu izvirtībai
        str = str.replaceAll("''", "\u200B''"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace on Offsetus
        //workaround teikuma beigu saīsinājumiem utt
        str = str.replaceAll("([\\p{L}\\d])\\.(\\p{Z})*$", "$1\u200B.$2"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace un offsetus
//        str = str.replaceAll("([\\d])\\.(\\p{Z})*$", "$1\u200B.$2"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace un offsetus

        // te tiek ciklā doti visi tekstā esošie vārdi uz morfoanalīzi.
        int progress = 0;
		boolean inApostrophes=false;
		Status statuss = Status.IN_SPACE;
		StringBuilder accumulatedWhitespace = new StringBuilder();
		int lastGoodEnd=0;
		boolean canEndInNextStep=false;
		
		for (int i = 0; i < str.length(); i++) {
			switch (statuss) {
			case IN_SPACE:
				if (!Splitting.isSpace(str.charAt(i))) {
					if (str.charAt(i)=='\'') inApostrophes=true;

					automats.reset(); //atjauno automāta stāvokli
					automats.findNextBranch(str.charAt(i)); //atrod pirmo derīgo zaru
					
					if(automats.status()>0) { //pārbauda vai automātā atrada meklēto simbolu
						//ja atrada
						statuss=Status.IN_WORD;
						progress=i;
						//pārbauda vai ar to var arī virkne beigties
						canEndInNextStep = (automats.status()==2);
					} else {
						//ja neatrada, pievieno vienu simbolu un mēģina vēl
                        tokens.add( formToken(morphoAnalyzer, str, i, i+1, accumulatedWhitespace));
					}
				} else {
				   accumulatedWhitespace.append(str.charAt(i));
                }
				break;
			case IN_WORD:
				//pārbauda vai ir atrastas potenciālās beigas
		        if (canEndInNextStep==true &&
			            (Splitting.isSeparator(str.charAt(i)) || !Character.isLetter((i>0 ? str.charAt(i-1) : 0) ) ) )
				{
					lastGoodEnd=i;
					if(str.charAt(i)=='\'' && inApostrophes) {
						tokens.add( formToken(morphoAnalyzer, str, progress, i, accumulatedWhitespace));
                        accumulatedWhitespace = new StringBuilder();
                        tokens.add( formToken(morphoAnalyzer, str, i, i+1, accumulatedWhitespace));
						inApostrophes=false;
						statuss=Status.IN_SPACE;
						break;
					}
				}
				canEndInNextStep=false;
				
				//mēģina atrast nākamo simbolu automātā
				if (automats.findNext(str.charAt(i))>0) { //ja atrada 
					//pārbauda vai ar to var arī virkne beigties
					if (automats.status()==2)
						canEndInNextStep=true;
				} else {
					//ja neatrada, pārbauda vai automāta darbības laikā tika atrasta potenciālā beigu pozīcija
					if (lastGoodEnd>progress) {
                        tokens.add( formToken(morphoAnalyzer, str, progress, lastGoodEnd, accumulatedWhitespace));
						i=lastGoodEnd-1;
						statuss = Status.IN_SPACE;
                        accumulatedWhitespace = new StringBuilder();
					} else {
						i=progress;
						//mēgina atrast nākamo derīgo zaru
						automats.nextBranch();
						automats.findNextBranch(str.charAt(i));
						if(automats.status()>0) { //pārbauda vai atrada meklēto simbolu
							//pārbauda vai ar to var arī virkne beigties
							if(automats.status()==2)
								canEndInNextStep=true;
						} else {
							//ja neatrada, pievieno simbolu rezultātam un pēc tam dosies meklēt jauno sākumu
                            //vispār šis ir fishy. FIXME
                            tokens.add( formToken(morphoAnalyzer, str, i,i+1, accumulatedWhitespace));
							statuss = Status.IN_SPACE;
                            accumulatedWhitespace = new StringBuilder();
						}
					}
				}				
				break;
			}
		} // for i..
		
		
		if (statuss == Status.IN_WORD) { 
			tokens.add( formToken(morphoAnalyzer, str, progress, str.length(), accumulatedWhitespace));
		}
		
		return tokens;
	}
public static LinkedList < Word > tokenize ( Analyzer morphoAnalyzer , String chunk ) { LinkedList < Word > tokens = new LinkedList < Word > ( ) ; if ( chunk == null ) return tokens ; Trie automats = morphoAnalyzer . automats ; //bug fix - pievienota beigās whitespace
 String str = chunk + " " ; //workaround dubultapostrofu izvirtībai
 str = str . replaceAll ( "''" , "\u200B''" ) ; // FIXME mēs te mazliet izčakarējam accumulatedWhitespace on Offsetus
 //workaround teikuma beigu saīsinājumiem utt
 str = str . replaceAll ( "([\\p{L}\\d])\\.(\\p{Z})*$" , "$1\u200B.$2" ) ; // FIXME mēs te mazliet izčakarējam accumulatedWhitespace un offsetus
 //        str = str.replaceAll("([\\d])\\.(\\p{Z})*$", "$1\u200B.$2"); // FIXME mēs te mazliet izčakarējam accumulatedWhitespace un offsetus
 // te tiek ciklā doti visi tekstā esošie vārdi uz morfoanalīzi.
 int progress = 0 ; boolean inApostrophes = false ; Status statuss = Status . IN_SPACE ; StringBuilder accumulatedWhitespace = new StringBuilder ( ) ; int lastGoodEnd = 0 ; boolean canEndInNextStep = false ; for ( int i = 0 ; i < str . length ( ) ; i ++ ) { switch ( statuss ) { case IN_SPACE : if ( ! Splitting . isSpace ( str . charAt ( i ) ) ) { if ( str . charAt ( i ) == ' ' ) inApostrophes = true ; automats . reset ( ) ; //atjauno automāta stāvokli
 automats . findNextBranch ( str . charAt ( i ) ) ; //atrod pirmo derīgo zaru
 if ( automats . status ( ) > 0 ) { //pārbauda vai automātā atrada meklēto simbolu
 //ja atrada
 statuss = Status . IN_WORD ; progress = i ; //pārbauda vai ar to var arī virkne beigties
 canEndInNextStep = ( automats . status ( ) == 2 ) ; } else { //ja neatrada, pievieno vienu simbolu un mēģina vēl
 tokens . add ( formToken ( morphoAnalyzer , str , i , i + 1 , accumulatedWhitespace ) ) ; } } else { accumulatedWhitespace . append ( str . charAt ( i ) ) ; } break ; case IN_WORD : //pārbauda vai ir atrastas potenciālās beigas
 if ( canEndInNextStep == true && ( Splitting . isSeparator ( str . charAt ( i ) ) || ! Character . isLetter ( ( i > 0 ? str . charAt ( i - 1 ) : 0 ) ) ) ) { lastGoodEnd = i ; if ( str . charAt ( i ) == ' ' && inApostrophes ) { tokens . add ( formToken ( morphoAnalyzer , str , progress , i , accumulatedWhitespace ) ) ; accumulatedWhitespace = new StringBuilder ( ) ; tokens . add ( formToken ( morphoAnalyzer , str , i , i + 1 , accumulatedWhitespace ) ) ; inApostrophes = false ; statuss = Status . IN_SPACE ; break ; } } canEndInNextStep = false ; //mēģina atrast nākamo simbolu automātā
 if ( automats . findNext ( str . charAt ( i ) ) > 0 ) { //ja atrada 
 //pārbauda vai ar to var arī virkne beigties
 if ( automats . status ( ) == 2 ) canEndInNextStep = true ; } else { //ja neatrada, pārbauda vai automāta darbības laikā tika atrasta potenciālā beigu pozīcija
 if ( lastGoodEnd > progress ) { tokens . add ( formToken ( morphoAnalyzer , str , progress , lastGoodEnd , accumulatedWhitespace ) ) ; i = lastGoodEnd - 1 ; statuss = Status . IN_SPACE ; accumulatedWhitespace = new StringBuilder ( ) ; } else { i = progress ; //mēgina atrast nākamo derīgo zaru
 automats . nextBranch ( ) ; automats . findNextBranch ( str . charAt ( i ) ) ; if ( automats . status ( ) > 0 ) { //pārbauda vai atrada meklēto simbolu
 //pārbauda vai ar to var arī virkne beigties
 if ( automats . status ( ) == 2 ) canEndInNextStep = true ; } else { //ja neatrada, pievieno simbolu rezultātam un pēc tam dosies meklēt jauno sākumu
 //vispār šis ir fishy. FIXME
 tokens . add ( formToken ( morphoAnalyzer , str , i , i + 1 , accumulatedWhitespace ) ) ; statuss = Status . IN_SPACE ; accumulatedWhitespace = new StringBuilder ( ) ; } } } break ; } } // for i..
 if ( statuss == Status . IN_WORD ) { tokens . add ( formToken ( morphoAnalyzer , str , progress , str . length ( ) , accumulatedWhitespace ) ) ; } return tokens ; }
/*
Tokenizes the string (sentence?) and runs morphoanalysis on each word.
/ * Tokenizes the string ( sentence? ) and runs morphoanalysis on each word .