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 }