1   package org.daisy.pipeline.css.speech;
2   
3   import java.util.Map;
4   
5   import cz.vutbr.web.css.CSSProperty;
6   import cz.vutbr.web.css.CSSProperty.Cue;
7   import cz.vutbr.web.css.CSSProperty.SpeechRate;
8   import cz.vutbr.web.css.CSSProperty.VoiceFamily;
9   import cz.vutbr.web.css.Declaration;
10  import cz.vutbr.web.css.Term;
11  import cz.vutbr.web.css.TermList;
12  import cz.vutbr.web.css.TermPercent;
13  import cz.vutbr.web.css.TermTime;
14  import cz.vutbr.web.css.TermURI;
15  import cz.vutbr.web.domassign.DeclarationTransformer;
16  
17  public class SpeechDeclarationTransformer extends DeclarationTransformer {
18  
19  	@Override
20  	public boolean parseDeclaration(Declaration d, Map<String, CSSProperty> properties, Map<String, Term<?>> values) {
21  		String propertyName = d.getProperty().toLowerCase();
22  		if ("cue-before".equals(propertyName) || "cue-after".equals(propertyName)) {
23  			return genericTerm(TermURI.class, d.get(0), d.getProperty(), Cue.uri, false,
24  			                   properties, values);
25  		} else if (propertyName.startsWith("pause")) {
26  			// jStyleParser doesn't accept pauses with "ms" or "s" at the end
27  			Term<?> term = d.get(0);
28  			if (!(term instanceof TermTime))
29  				return super.parseDeclaration(d, properties, values);
30  			properties.put(propertyName, null);
31  			values.put(propertyName, term);
32  			return true;
33  		} else if ("voice-family".equals(propertyName)) {
34  			if (d.size() == 0)
35  				return false;
36  			TermList list = tf.createList();
37  			for (Term<?> t : d) {
38  				list.add(t);
39  			}
40  			try {
41  				list = VoiceFamilyList.of(list);
42  			} catch (IllegalArgumentException e) {
43  				return false;
44  			}
45  			properties.put(d.getProperty(), VoiceFamily.list_values);
46  			values.put(d.getProperty(), list);
47  			return true;
48  		} else if ("speech-rate".equals(propertyName)) {
49  			if (d.size() == 1 && d.get(0) instanceof TermPercent) {
50  				TermPercent p = (TermPercent)d.get(0);
51  				if (p.getValue() <= 0) {
52  					return false; // must be non-negative percentage
53  				} else {
54  					properties.put(d.getProperty(), SpeechRate.number);
55  					values.put(d.getProperty(), p);
56  					return true;
57  				}
58  			}
59  			return super.parseDeclaration(d, properties, values);
60  		} else {
61  			return super.parseDeclaration(d, properties, values);
62  		}
63  	}
64  }