
fi.celia.pipeline.braille.impl.CeliaTranslator Maven / Gradle / Ivy
package fi.celia.pipeline.braille.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.net.URI;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import org.daisy.pipeline.braille.common.AbstractBrailleTranslator;
import org.daisy.pipeline.braille.common.AbstractTransformProvider;
import org.daisy.pipeline.braille.common.AbstractTransformProvider.util.Function;
import org.daisy.pipeline.braille.common.AbstractTransformProvider.util.Iterables;
import static org.daisy.pipeline.braille.common.AbstractTransformProvider.util.Iterables.concat;
import static org.daisy.pipeline.braille.common.AbstractTransformProvider.util.Iterables.transform;
import static org.daisy.pipeline.braille.common.AbstractTransformProvider.util.logCreate;
import static org.daisy.pipeline.braille.common.AbstractTransformProvider.util.logSelect;
import org.daisy.pipeline.braille.common.BrailleTranslator;
import org.daisy.pipeline.braille.common.BrailleTranslatorProvider;
import org.daisy.pipeline.braille.common.CSSStyledText;
import org.daisy.pipeline.braille.common.Query;
import org.daisy.pipeline.braille.common.Query.Feature;
import org.daisy.pipeline.braille.common.Query.MutableQuery;
import static org.daisy.pipeline.braille.common.Query.util.mutableQuery;
import org.daisy.pipeline.braille.common.TransformProvider;
import static org.daisy.pipeline.braille.common.TransformProvider.util.dispatch;
import static org.daisy.pipeline.braille.common.TransformProvider.util.memoize;
import static org.daisy.pipeline.braille.common.util.Locales.parseLocale;
import static org.daisy.pipeline.braille.common.util.URIs.asURI;
import org.daisy.pipeline.braille.libhyphen.LibhyphenHyphenator;
import org.daisy.pipeline.braille.liblouis.LiblouisTranslator;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.ComponentContext;
public interface CeliaTranslator {
@Component(
name = "fi.celia.pipeline.braille.impl.CeliaTranslator.Provider",
service = {
TransformProvider.class,
BrailleTranslatorProvider.class
}
)
public class Provider extends AbstractTransformProvider implements BrailleTranslatorProvider {
private URI href;
@Activate
private void activate(ComponentContext context, final Map,?> properties) {
href = asURI(context.getBundleContext().getBundle().getEntry("xml/block-translate.xpl"));
}
private final static Query liblouisTable = mutableQuery().add("liblouis-table", "http://www.liblouis.org/tables/fi.utb,http://www.celia.fi/liblouis/undefined.utb,http://www.celia.fi/liblouis/additional-symbols.utb");
private final static Query hyphenTable = mutableQuery().add("libhyphen-table", "http://www.celia.fi/pipeline/hyphen/hyph-fi.dic");
private final static Iterable empty = Iterables.empty();
private final static List supportedInput = ImmutableList.of("css","text-css","dtbook","html");
private final static List supportedOutput = ImmutableList.of("css", "braille");
/**
* Recognized features:
*
* - translator: Will only match if the value is 'celia'.
* - locale: Will only match if the language subtag is 'fi'.
*
*/
protected Iterable _get(Query query) {
final MutableQuery q = mutableQuery(query);
for (Feature f : q.removeAll("input"))
if (!supportedInput.contains(f.getValue().get()))
return empty;
for (Feature f : q.removeAll("output"))
if (!supportedOutput.contains(f.getValue().get()))
return empty;
if (q.containsKey("locale"))
if (!"fi".equals(parseLocale(q.removeOnly("locale").getValue().get()).getLanguage()))
return empty;
if (q.containsKey("translator"))
if ("celia".equals(q.removeOnly("translator").getValue().get()))
if (q.isEmpty()) {
Iterable hyphenators = logSelect(hyphenTable, libhyphenHyphenatorProvider);
return concat(
transform(
hyphenators,
new Function>() {
public Iterable _apply(LibhyphenHyphenator h) {
Query translatorQuery = mutableQuery(liblouisTable).add("hyphenator", h.getIdentifier());
return transform(
logSelect(translatorQuery, liblouisTranslatorProvider),
new Function() {
public BrailleTranslator _apply(LiblouisTranslator translator) {
return __apply(logCreate(new TransformImpl(translator))); }}); }})); }
return empty;
}
private class TransformImpl extends AbstractBrailleTranslator {
private final FromStyledTextToBraille translator;
private final XProc xproc;
private TransformImpl(LiblouisTranslator translator) {
Map options = ImmutableMap.of("query", mutableQuery().add("id", this.getIdentifier()).toString());
xproc = new XProc(href, null, options);
this.translator = translator.fromStyledTextToBraille();
}
@Override
public XProc asXProc() {
return xproc;
}
@Override
public FromStyledTextToBraille fromStyledTextToBraille() {
return fromStyledTextToBraille;
}
private final FromStyledTextToBraille fromStyledTextToBraille = new FromStyledTextToBraille() {
public java.lang.Iterable transform(java.lang.Iterable styledText) {
return translator.transform(styledText);
}
};
@Override
public String toString() {
return Objects.toStringHelper(CeliaTranslator.class.getSimpleName())
.add("id", getIdentifier())
.toString();
}
}
@Reference(
name = "LiblouisTranslatorProvider",
unbind = "unbindLiblouisTranslatorProvider",
service = LiblouisTranslator.Provider.class,
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC
)
protected void bindLiblouisTranslatorProvider(LiblouisTranslator.Provider provider) {
liblouisTranslatorProviders.add(provider);
}
protected void unbindLiblouisTranslatorProvider(LiblouisTranslator.Provider provider) {
liblouisTranslatorProviders.remove(provider);
liblouisTranslatorProvider.invalidateCache();
}
private List> liblouisTranslatorProviders
= new ArrayList>();
private TransformProvider.util.MemoizingProvider liblouisTranslatorProvider
= memoize(dispatch(liblouisTranslatorProviders));
@Reference(
name = "LibhyphenHyphenatorProvider",
unbind = "unbindLibhyphenHyphenatorProvider",
service = LibhyphenHyphenator.Provider.class,
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC
)
protected void bindLibhyphenHyphenatorProvider(LibhyphenHyphenator.Provider provider) {
libhyphenHyphenatorProviders.add(provider);
}
protected void unbindLibhyphenHyphenatorProvider(LibhyphenHyphenator.Provider provider) {
libhyphenHyphenatorProviders.remove(provider);
libhyphenHyphenatorProvider.invalidateCache();
}
private List> libhyphenHyphenatorProviders
= new ArrayList>();
private TransformProvider.util.MemoizingProvider libhyphenHyphenatorProvider
= memoize(dispatch(libhyphenHyphenatorProviders));
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy