1   package org.daisy.pipeline.tts.config;
2   
3   import java.net.URI;
4   import java.util.ArrayList;
5   import java.util.Collection;
6   import java.util.Map;
7   
8   import net.sf.saxon.s9api.QName;
9   import net.sf.saxon.s9api.XdmNode;
10  
11  import org.daisy.pipeline.tts.VoiceInfo;
12  import org.daisy.pipeline.tts.VoiceInfo.Gender;
13  import org.daisy.pipeline.tts.config.ConfigReader;
14  
15  import org.slf4j.Logger;
16  import org.slf4j.LoggerFactory;
17  
18  public class VoiceConfigExtension implements ConfigReader.Extension {
19  
20  	private static final Logger logger = LoggerFactory.getLogger(VoiceConfigExtension.class);
21  
22  	@Override
23  	public boolean parseNode(XdmNode node, URI documentURI, ConfigReader parent) {
24  		String name = node.getNodeName().getLocalName();
25  		if ("voice".equalsIgnoreCase(name)) {
26  			String lang = node.getAttributeValue(new QName(null, "lang"));
27  			if (lang == null)
28  				node.getAttributeValue(new QName("http://www.w3.org/XML/1998/namespace", "lang"));
29  			String vengine = node.getAttributeValue(new QName(null, "engine"));
30  			String vname = node.getAttributeValue(new QName(null, "name"));
31  			String priority = node.getAttributeValue(new QName(null, "priority"));
32  			Gender gender = Gender.of(node.getAttributeValue(new QName(null, "gender")));
33  			if (node.getAttributeValue(new QName(null, "marks")) != null) {
34  				logger.warn("mark attribute on voice is deprecated");
35  			}
36  
37  			if (priority == null)
38  				priority = "5";
39  			if (lang == null || vengine == null || vname == null || gender == null) {
40  				logger.warn("Config file invalid near " + node.toString());
41  			} else {
42  				try {
43  					mVoices.add(new VoiceInfo(vengine, vname, lang, gender, Float.valueOf(priority)));
44  				} catch (NumberFormatException e) {
45  					logger.warn("Error while converting config file's priority " + priority
46  					        + " to float.");
47  				} catch (IllegalArgumentException e) {
48  					logger.warn("Invalid language in config file: " + lang);
49  					logger.debug("Invalid language in config file: " + lang, e);
50  				}
51  			}
52  			return true;
53  		}
54  		return false;
55  	}
56  
57  	public Collection<VoiceInfo> getVoiceDeclarations() {
58  		return mVoices;
59  	}
60  
61  	private Collection<VoiceInfo> mVoices = new ArrayList<VoiceInfo>();
62  }