![JAR search and dependency download from the Maven repository](/logo.png)
org.daisy.pipeline.braille.common.TextTransformParser Maven / Gradle / Ivy
package org.daisy.pipeline.braille.common;
import java.util.HashMap;
import java.util.Map;
import java.net.URI;
import java.net.URL;
import static com.google.common.collect.Iterables.filter;
import cz.vutbr.web.css.Declaration;
import cz.vutbr.web.css.TermIdent;
import cz.vutbr.web.css.TermInteger;
import cz.vutbr.web.css.TermURI;
import org.daisy.braille.css.InlineStyle;
import org.daisy.braille.css.RuleTextTransform;
import org.daisy.common.file.URLs;
import org.daisy.pipeline.braille.common.Query;
import org.daisy.pipeline.braille.common.Query.MutableQuery;
import static org.daisy.pipeline.braille.common.Query.util.mutableQuery;
public class TextTransformParser {
/**
* Parse @text-transform
rules with system: braille-translator
and
* return them as a set of named queries.
*/
public static Map getBrailleTranslatorQueries(String style, URI baseURI, Query baseQuery) {
if (style != null && !"".equals(style)) {
Map queries = null;
for (RuleTextTransform rule : filter(new InlineStyle(style), RuleTextTransform.class)) {
// default system is braille
String system = "braille";
for (Declaration d : rule)
if (d.getProperty().equals("system")) {
if (d.size() == 1
&& d.get(0) instanceof TermIdent)
system = ((TermIdent)d.get(0)).getValue();
else
system = null;
break; }
if (system == null)
continue;
if ("braille-translator".equals(system))
system = "braille";
String translator = null;
if ("liblouis".equals(system)) {
system = "braille";
translator = "liblouis"; }
MutableQuery query = mutableQuery(baseQuery);
// System could be "braille" or something else. Because at this point DAISY Pipeline
// does not support any other systems than braille systems, we assume that
// "something else" could be a feature that Liblouis or another translator provider
// may support.
if (!"braille".equals(system)) {
if (query.containsKey("system"))
query.removeAll("system");
query.add("system", system); }
if (translator != null) {
if (query.containsKey("translator"))
query.removeAll("translator");
query.add("translator", translator);
}
for (Declaration d : rule)
if (d.getProperty().equals("system")) continue;
else if (d.size() == 1
&& (d.get(0) instanceof TermIdent
|| d.get(0) instanceof TermURI
|| d.get(0) instanceof TermInteger)) {
String key = d.getProperty();
if (key.equals("charset") || key.equals("braille-charset")) {
// (silently) ignoring this feature because all braille translators
// used in the whole conversion must use the same output character set
continue;
} else if (key.equals("document-locale")) {
// document-locale is an internal feature and not supported in @text-transform rules
query = null;
break;
} else if (key.equals("hyphenator")) {
// FIXME: deprecate hyphenator feature (in favor of @hyphenation-resource rules)
}
String value;
if (d.get(0) instanceof TermURI) {
URI uri = URLs.asURI(((TermURI)d.get(0)).getValue());
if (!uri.isAbsolute() && !uri.getSchemeSpecificPart().startsWith("/")) {
// relative URI
URI cssBase; {
URL b = ((TermURI)d.get(0)).getBase(); // this is always null because the style is provided as a string
cssBase = b != null ? URLs.asURI(b) : baseURI;
}
uri = URLs.resolve(cssBase, uri);
}
value = uri.toASCIIString();
} else {
if (d.get(0) instanceof TermInteger)
value = "" + ((TermInteger)d.get(0)).getIntValue();
else
value = "" + d.get(0).getValue();
}
if (query.containsKey(key))
// features in base query are overridden by descriptors in @text-transform rule
query.removeAll(key);
if (translator != null && key.equals("translator") && !translator.equals(value)) {
query = null;
break; }
else if (key.equals("contraction") && value.equals("no"))
query.removeAll("grade");
else if (key.equals("table") || key.equals("liblouis-table")) {
query.removeAll("table");
query.removeAll("liblouis-table");
query.removeAll("locale");
query.removeAll("type");
query.removeAll("contraction");
query.removeAll("grade");
query.removeAll("dots");
query.removeAll("direction");
}
query.add(key, value);
} else {
query = null;
break;
}
if (query != null) {
if (queries == null) queries = new HashMap<>();
String name = rule.getName();
queries.put(name == null ? "auto" : name, query);
}
}
return queries;
} else
return null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy