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

cz.vutbr.web.csskit.OutputUtil Maven / Gradle / Ivy

package cz.vutbr.web.csskit;

import java.util.List;

import cz.vutbr.web.css.PrettyOutput;
import cz.vutbr.web.css.Term;
import cz.vutbr.web.css.TermOperator;

/**
 * Helper class for generation output for given CSS rules
 * @author kapy
 *
 */
public class OutputUtil {

	public static final String EMPTY_DELIM = "";
	public static final String SPACE_DELIM = " ";
	public static final String DEPTH_DELIM = "\t";
    public static final String QUERY_DELIM = " AND ";
	public static final String RULE_OPENING = " {\n";
	public static final String RULE_CLOSING = "}\n";
	public static final String MEDIA_DELIM = ", ";
	public static final String SELECTOR_DELIM = ", ";
	public static final String IMPORT_KEYWORD = "@import ";
	public static final String URL_OPENING = "url('";
	public static final String URL_CLOSING = "')";
	public static final String LINE_CLOSING = ";\n";
	public static final String NEW_LINE = "\n";
	public static final String MEDIA_KEYWORD = "@media ";
    public static final String KEYFRAMES_KEYWORD = "@keyframes ";
	public static final String RULE_DELIM = "\n";
	public static final String CHARSET_KEYWORD = "@charset ";
	public static final String CHARSET_OPENING = "\"";
	public static final String CHARSET_CLOSING = "\";\n";
	public static final String PROPERTY_OPENING = ": ";
	public static final String PROPERTY_CLOSING = ";\n";
	public static final String IMPORTANT_KEYWORD = "!important";
	public static final String PAGE_KEYWORD = "@page";
	public static final String PSEUDO_OPENING = ":";
	public static final String PAGE_CLOSING = "";
    public static final String VIEWPORT_KEYWORD = "@viewport";
    public static final String FONT_FACE_KEYWORD = "@font-face";
	public static final String FUNCTION_OPENING = "(";
	public static final String FUNCTION_CLOSING = ")";
	public static final String STRING_OPENING = "'";
	public static final String STRING_CLOSING = "'";
	public static final String ATTRIBUTE_OPENING = "[";
	public static final String ATTRIBUTE_CLOSING = "]";
	public static final String PERCENT_SIGN = "%";
	public static final String HASH_SIGN = "#";
	public static final String MARGIN_AREA_OPENING = "@";
    public static final String MEDIA_EXPR_OPENING = "(";
    public static final String MEDIA_EXPR_CLOSING = ")";
    public static final String MEDIA_FEATURE_DELIM = ": ";
    public static final String CALC_KEYWORD = "calc";
    public static final String RECT_KEYWORD = "rect";
	
	
	
	
	/**
	 * Appends string multiple times to buffer
	 * @param sb StringBuilder to be modified
	 * @param append String to be added
	 * @param times Number of times append is added 
	 * @return Modified StringBuilder sb to allow chaining
	 */
	public static StringBuilder appendTimes(StringBuilder sb, String append, int times) {
		
		for(;times>0; times--)
			sb.append(append);
		
		return sb;
	}
	
	/**
	 * Appends all elements of array to buffer, separated by delimiter
	 * @param  Type of elements stored in array
	 * @param sb StringBuilder to be modified
	 * @param array Array of elements
	 * @param delimiter Delimiter to separate elements
	 * @return Modified sb to allow chaining
	 */
	public static  StringBuilder appendArray(StringBuilder sb, T[] array, String delimiter) {
		
		boolean firstRun = true;
		
		for(T elem: array) {
			if(!firstRun) 
				sb.append(delimiter);
			else 
				firstRun = false;
			
			sb.append(elem.toString());
		}
		
		return sb;
		
	}
	
	/**
	 * Appends all elements of list to buffer, separated by delimiter
	 * @param  Type of elements stored in list
	 * @param sb StringBuilder to be modified
	 * @param list List of elements
	 * @param delimiter Delimiter to separate elements
	 * @return Modified sb to allow chaining
	 */
	public static  StringBuilder appendList(StringBuilder sb, List list, String delimiter) {
		
		boolean firstRun = true;
		
		for(T elem: list) {
			if(!firstRun) 
				sb.append(delimiter);
			else 
				firstRun = false;
			
			sb.append(elem.toString());
		}
		
		return sb;
		
	}
	
	/**
	 * Appends of elements of list to list, separater by delimiter.
	 * Uses depth parameter to make output nicer for each element
	 * @param  List of elements, which implements Rule
	 * @param sb StringBuilder to be modified
	 * @param list List of elements
	 * @param delimiter Delimeter between elements
	 * @param depth Depth of each element
	 * @return Modified sb to allow chaining
	 */
	public static  StringBuilder appendList(
			StringBuilder sb, List list, 
			String delimiter, int depth) {
		
		boolean firstRun = true;
		
		for(T elem: list) {
			if(!firstRun)
				sb.append(delimiter);
			else
				firstRun = false;
			
			sb.append(elem.toString(depth));
		}
		
		return sb;
	}
	
	/**
	 * Appends the calc() function arguments to a string builder.
	 * @param sb the string builder to be modified
	 * @param args the calc arguments
	 * @return Modified sb to allow chaining
	 */
	public static StringBuilder appendCalcArgs(StringBuilder sb, CalcArgs args) {
	    final String astr = args.evaluate(CalcArgs.stringEvaluator);
	    if (!astr.startsWith(FUNCTION_OPENING)) {
	        sb.append(FUNCTION_OPENING);
	        sb.append(astr);
	        sb.append(FUNCTION_CLOSING);
	    } else {
	        sb.append(astr);
	    }
	    return sb;
	}
	
    /**
     * Appends the formatted list of function arguments to a string builder. The individual
     * arguments are separated by spaces with the exception of commas.
     * @param sb the string builder to be modified
     * @param list the list of function arguments
     * @return Modified sb to allow chaining
     */
	public static StringBuilder appendFunctionArgs(StringBuilder sb, List> list) {

        Term prev = null, pprev = null;
        
        for (Term elem : list) {
            boolean sep = true;
            if (elem instanceof TermOperator && ((TermOperator) elem).getValue() == ',')
                sep = false; //no spaces before commas
            if ((prev != null && prev instanceof TermOperator && ((TermOperator) prev).getValue() == '-')
                    && (pprev == null || pprev instanceof TermOperator)) //nothing or an operator before -
                sep = false; //no spaces after unary minus
            if (prev != null && sep)
                sb.append(SPACE_DELIM);
            pprev = prev;
            prev = elem;

            sb.append(elem.toString());
        }

        return sb;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy