1   package org.daisy.pipeline.braille.common.saxon.impl;
2   
3   import java.util.Iterator;
4   
5   import org.daisy.common.xpath.saxon.ExtensionFunctionProvider;
6   import org.daisy.common.xpath.saxon.ReflexiveExtensionFunctionProvider;
7   import org.daisy.pipeline.braille.common.BrailleTranslator;
8   import org.daisy.pipeline.braille.common.BrailleTranslator.FromStyledTextToBraille;
9   import org.daisy.pipeline.braille.common.BrailleTranslatorRegistry;
10  import org.daisy.pipeline.braille.common.Query;
11  import static org.daisy.pipeline.braille.common.Query.util.query;
12  import org.daisy.pipeline.braille.css.CSSStyledText;
13  
14  import org.osgi.service.component.annotations.Component;
15  import org.osgi.service.component.annotations.Reference;
16  import org.osgi.service.component.annotations.ReferenceCardinality;
17  import org.osgi.service.component.annotations.ReferencePolicy;
18  
19  import org.slf4j.Logger;
20  import org.slf4j.LoggerFactory;
21  
22  @Component(
23  	name = "pf:text-transform",
24  	service = { ExtensionFunctionProvider.class }
25  )
26  public class TextTransformDefinition extends ReflexiveExtensionFunctionProvider {
27  
28  	public TextTransformDefinition() {
29  		super();
30  		addExtensionFunctionDefinitionsFromClass(TextTransform.class, new TextTransform());
31  	}
32  
33  	private BrailleTranslatorRegistry translatorRegistry;
34  
35  	@Reference(
36  		name = "BrailleTranslatorRegistry",
37  		unbind = "-",
38  		service = BrailleTranslatorRegistry.class,
39  		cardinality = ReferenceCardinality.MANDATORY,
40  		policy = ReferencePolicy.STATIC
41  	)
42  	protected void bindBrailleTranslatorRegistry(BrailleTranslatorRegistry registry) {
43  		translatorRegistry = registry.withContext(logger);
44  		logger.debug("Binding BrailleTranslator registry: {}", registry);
45  	}
46  
47  	public class TextTransform {
48  
49  		public Iterator<CSSStyledText> transform(String query, Iterable<CSSStyledText> styledText) {
50  			return transform(query(query), styledText);
51  		}
52  
53  		private Iterator<CSSStyledText> transform(Query query, Iterable<CSSStyledText> styledText) {
54  			for (BrailleTranslator t : translatorRegistry.getWithHyphenator(query)) {
55  				FromStyledTextToBraille fsttb;
56  				try {
57  					fsttb = t.fromStyledTextToBraille();
58  				} catch (UnsupportedOperationException e) {
59  					logger.trace("Translator does not implement the FromStyledTextToBraille interface: " + t);
60  					continue;
61  				}
62  				try {
63  					return fsttb.transform(styledText).iterator();
64  				} catch (Exception e) {
65  					logger.debug("Failed to translate string with translator " + t);
66  					throw e; }
67  			}
68  			throw new RuntimeException("Could not find a BrailleTranslator for query: " + query);
69  		}
70  	}
71  
72  	private static final Logger logger = LoggerFactory.getLogger(TextTransformDefinition.class);
73  
74  }