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 }