All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.daisy.pipeline.braille.common.TextTransformParser Maven / Gradle / Ivy

There is a newer version: 5.0.2
Show newest version
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