All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.parser.SuggestableParser Maven / Gradle / Ivy

package org.unlaxer.parser;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.unlaxer.CodePointIndex;
import org.unlaxer.Source;
import org.unlaxer.StringSource;
import org.unlaxer.Token;
import org.unlaxer.TokenKind;
import org.unlaxer.TransactionElement;
import org.unlaxer.context.ParseContext;
import org.unlaxer.parser.elementary.AbstractTokenParser;

public abstract class SuggestableParser extends AbstractTokenParser {
	
	private static final long serialVersionUID = -7966896868712698646L;
	
	public final boolean ignoreCase;
	public final List targetStrings;
	
	public SuggestableParser(boolean ignoreCase, String... targetStrings) {
		super();
		this.ignoreCase = ignoreCase;
		this.targetStrings = Stream.of(targetStrings)
		    .map(StringSource::createDetachedSource)
		    .collect(Collectors.toList());
	}

	@Override
	public Token getToken(ParseContext parseContext,TokenKind tokenKind ,boolean invertMatch) {
		
		for (Source targetString : targetStrings) {
			Source peeked = parseContext.peek(tokenKind , targetString.codePointLength());
			if(equals(targetString.toString(),peeked.toString())){
				return new Token(tokenKind ,  peeked, this);
			}
		}
//		addSuggests(parseContext);
		
		return Token.empty(tokenKind , 
		    parseContext.getCursor(TokenKind.consumed),this);
	}
	
	//FIXME!
	@SuppressWarnings("unused")
	private void addSuggests(ParseContext parseContext) {
		TransactionElement current = parseContext.getCurrent();
		CodePointIndex position = current.getPosition(TokenKind.consumed);
		for (Source targetString : targetStrings) {
		  Source peeked = parseContext.peek(TokenKind.consumed ,targetString.codePointLength());
			if(peeked.isPresent()){
				continue;
			}
//			String peekWithMax = parseContext.peekWithMax(targetString.length()-1);
//			if(targetString.startsWith(peekWithMax)){
//				parseContext.addSuggests(this , position, targetString);
//			}
		}
	}
	
	public Optional getSuggests(String test){
		
		Suggest suggests = new Suggest(this);
		
		//TODO camel case matching, ignore case
		for(int endIndex= test.length() ; endIndex > 0 ; endIndex--){
			String currentTest = test.substring(0, endIndex);
			for(Source targetString :targetStrings){
				if(targetString.startsWith(currentTest)){
					suggests.words.add(targetString.toString());
				}
			}
			if(suggests.words.size() >0){
				break;
			}
		}
		return suggests.words.size() ==0 ? 
				Optional.empty():
				Optional.of(suggests);
	}
	
	public abstract String getSuggestString(String matchedString);
	
	boolean equals(String targetString , String baseString){
		return ignoreCase ? 
				targetString.equalsIgnoreCase(baseString):
				targetString.equals(baseString);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy