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

org.unlaxer.TokenPrinter Maven / Gradle / Ivy

package org.unlaxer;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.unlaxer.Source.SourceKind;
import org.unlaxer.listener.OutputLevel;
import org.unlaxer.parser.ErrorMessageParser;
import org.unlaxer.parser.Parser;

public class TokenPrinter{
	
//	public enum DebugLevel{simple,detail}

	
	public static void output(Token token , PrintStream out){
		output(token , out, 0 , OutputLevel.simple,true);
	}

	
	public static void output(Token token , PrintStream out, int level){
		output(token , out, level ,OutputLevel.simple,true);
	}
	
	public static void output(Token token , PrintStream out, OutputLevel detailLevel){
		output(token, out, 0 ,detailLevel , true);
	}

	static String EMPTY="";
//	static String EMPTY="'' ";
	
	public static void output(Token token , PrintStream out, int level, 
			OutputLevel detailLevel,boolean outputChildren){
		
		Source tokenString = token.getSource();
		
		for(int i = 0 ; i < level ; i++){
			out.print(" ");
		}
		CursorRange tokenRange = tokenString.cursorRange();
		Parser parser = token.parser;
		if(detailLevel == OutputLevel.detail){
			
			out.format("%s (%d - %d): %s%s%s", 
				tokenString.isPresent() ? quote(tokenString):EMPTY ,//
				tokenRange.startIndexInclusive.position().value(),//
				tokenRange.endIndexExclusive.position().value(), //
				parser.getName(),
				getInverted(token),//
				outputChildren ? "\n":"");
			
		}else if(detailLevel == OutputLevel.withTag){
			
			out.format("%s (%d - %d): %s%s%s%S", 
			    tokenString.isPresent() ? quote(tokenString):EMPTY ,//
			    tokenRange.startIndexInclusive.position().value(),//
					tokenRange.endIndexExclusive.position().value(), //
					parser.getName(),
					getInverted(token),//
					getTag(token),
					outputChildren ? "\n":"");
			
		}else if(detailLevel == OutputLevel.simple){
			
			out.format("%s : %s%s%s" , //
		    tokenString.isPresent() ? quote(tokenString):EMPTY ,//
				parser.getName(),
				getInverted(token),//
				outputChildren ? "\n":"");
		}
		if(false == outputChildren){
			return ;
		}
		level++;
		for(Token original : token.getAstNodeChildren()){
			output(original,out,level,detailLevel,true);
		}
	}
		
	private static String getTag(Token token) {
		StringBuilder builder = new StringBuilder();
		builder.append("{");
		Set tags = token.parser.getTags();
		Iterator iterator = tags.iterator();
		while (iterator.hasNext()) {
			Tag tag = (Tag) iterator.next();
			builder.append(tag.toString());
			if(iterator.hasNext()) {
				builder.append(",");
			}
		}
		builder.append("}");
		return builder.toString();
	}


	static String quote(Source word){
		return "'" +word.toString() + "'";
	}
	
	static String getInverted(Token token){
		return token.parser.getInvertMatchFromParent()?"(inverted)":"";
	}
	
	public static String get(Token token){
		return get(token , 0 ,OutputLevel.simple,true);
	}
	
	public static String get(Token token , int level){
		return get(token , level ,OutputLevel.simple,true);
	}
	
	public static String get(Token token , OutputLevel detailLevel){
		return get(token , 0 ,detailLevel ,true);
	}
	
	public static String get(Token token , int level, 
			OutputLevel detailLevel, boolean outputChildren) {
		
		try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			PrintStream printStream = new PrintStream(byteArrayOutputStream,false,"UTF-8");){
			
			output(token, printStream , level , detailLevel ,outputChildren);
			return byteArrayOutputStream.toString("UTF-8");
			
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public static List getErrorMessages(Token targetToken){
		return targetToken.flatten().stream()
			.filter(token-> token.parser instanceof ErrorMessageParser)
			.map(token->new ErrorMessage(token.source.cursorRange(), ((ErrorMessageParser)token.parser).get()))
			.collect(Collectors.toList());
	}
	
	public static String get(String header , TokenList tokens){
	  String string = tokens.toSource(SourceKind.detached).toString();
		return String.format("%s:%s ", header , string);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy