1   package org.daisy.pipeline.css;
2   
3   import java.net.URI;
4   import java.util.Collection;
5   import java.util.function.Function;
6   import java.util.List;
7   
8   import cz.vutbr.web.css.Declaration;
9   import cz.vutbr.web.css.Term;
10  import cz.vutbr.web.css.TermFunction;
11  import cz.vutbr.web.css.TermIdent;
12  import cz.vutbr.web.css.TermInteger;
13  import cz.vutbr.web.css.TermList;
14  import cz.vutbr.web.css.TermNumber;
15  import cz.vutbr.web.css.TermPair;
16  import cz.vutbr.web.css.TermPercent;
17  import cz.vutbr.web.css.TermString;
18  import cz.vutbr.web.css.TermURI;
19  
20  import org.daisy.common.file.URLs;
21  
22  public final class CssSerializer {
23  
24  	private CssSerializer() {}
25  
26  	public static String toString(Term<?> term) {
27  		return toString(term, t -> toString(t));
28  	}
29  
30  	public static String toString(Term<?> term, Function<Term<?>,String> toStringFunction) {
31  		if (term instanceof TermInteger) {
32  			TermInteger integer = (TermInteger)term;
33  			return "" + integer.getIntValue(); }
34  		else if (term instanceof TermNumber) {
35  			TermNumber number = (TermNumber)term;
36  			Double value = number.getValue().doubleValue();
37  			if (value == Math.floor(value))
38  				return "" + value.intValue();
39  			else
40  				return "" + value; }
41  		else if (term instanceof TermPercent) {
42  			TermPercent percent = (TermPercent)term;
43  			Double value = percent.getValue().doubleValue();
44  			if (value == Math.floor(value))
45  				return "" + value.intValue() + "%";
46  			else
47  				return "" + value + "%"; }
48  		else if (term instanceof TermList
49  		         || term instanceof Declaration) {
50  			String s = serializeTermList((List<Term<?>>)term, toStringFunction);
51  			if (term instanceof TermFunction) {
52  				TermFunction function = (TermFunction)term;
53  				s = function.getFunctionName() + "(" + s + ")"; }
54  			return s; }
55  		else if (term instanceof TermPair) {
56  			TermPair<?,?> pair = (TermPair<?,?>)term;
57  			Object val = pair.getValue();
58  			return "" + pair.getKey() + " " + (val instanceof Term ? toStringFunction.apply((Term<?>)val) : val.toString()); }
59  		else if (term instanceof TermURI) {
60  			TermURI termURI = (TermURI)term;
61  			URI uri = URLs.asURI(termURI.getValue());
62  			if (termURI.getBase() != null)
63  				uri = URLs.resolve(URLs.asURI(termURI.getBase()), uri);
64  			return "url(\"" + uri + "\")"; }
65  		else if (term instanceof TermString) {
66  			TermString string = (TermString)term;
67  			return "'" + string.getValue().replaceAll("\n", "\\\\A ").replaceAll("'", "\\\\27 ") + "'"; }
68  		else if (term instanceof TermIdent) {
69  			TermIdent ident = (TermIdent)term;
70  			return ident.getValue(); }
71  		else
72  			return term.toString().replaceAll("^[,/ ]+", "");
73  	}
74  
75  	public static String serializeTermList(Collection<? extends Term<?>> termList) {
76  		return serializeTermList(termList, t -> toString(t));
77  	}
78  
79  	public static String serializeTermList(Collection<? extends Term<?>> termList, Function<Term<?>,String> toStringFunction) {
80  		String s = "";
81  		for (Term<?> t : termList) {
82  			if (!s.isEmpty()) {
83  				Term.Operator o = t.getOperator();
84  				if (o != null)
85  					switch (o) {
86  					case COMMA:
87  						s += ","; }
88  				s += " "; }
89  			s += toStringFunction.apply(t); }
90  		return s;
91  	}
92  }