/*
* Copyright 2013-2016 Skynav, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY SKYNAV, INC. AND ITS CONTRIBUTORS “AS IS” AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SKYNAV, INC. OR ITS CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.skynav.ttx.transformer.isd;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
import com.skynav.ttv.model.ttml.TTML;
public abstract class TTMLHelper extends ISDHelper {
public static final String NAMESPACE_TT = TTML.Constants.NAMESPACE_TT;
public static final String NAMESPACE_TT_METADATA = TTML.Constants.NAMESPACE_TT_METADATA;
public static final String NAMESPACE_TT_STYLE = TTML.Constants.NAMESPACE_TT_STYLE;
public static final String NAMESPACE_TT_PARAMETER = TTML.Constants.NAMESPACE_TT_PARAMETER;
public boolean hasUsableContent(Element elt) {
if (isParagraphElement(elt))
return hasUsableContentInParagraph(elt);
else if (isImageElement(elt))
return hasUsableContentInImage(elt);
else
return false;
}
public static boolean isRootElement(Element elt) {
return isTimedTextElement(elt, "tt");
}
public static boolean isHeadElement(Element elt) {
return isTimedTextElement(elt, "head");
}
public static boolean isLayoutElement(Element elt) {
return isTimedTextElement(elt, "layout");
}
public static boolean isRegionElement(Element elt) {
return isTimedTextElement(elt, "region");
}
public static boolean isAnonymousRegionElement(Element elt) {
if (!isRegionElement(elt))
return false;
else {
String id = getXmlIdentifier(elt);
return (id != null) && (id.indexOf("isdRegion") == 0);
}
}
public static boolean isOutOfLineRegionElement(Element elt) {
return isRegionElement(elt) && isLayoutElement((Element) elt.getParentNode());
}
public static boolean isInitialElement(Element elt) {
return isTimedTextElement(elt, "initial");
}
public static boolean isStyleElement(Element elt) {
return isTimedTextElement(elt, "style");
}
public static boolean isRootStylingElement(Element elt) {
/* TBD - MIGRATE TO ROOT in TTML2
int version = getHelper(context).getVersion();
if (version == 1)
return TTMLHelper.isRegionElement(elt);
else
return TTMLHelper.isRootElement(elt);
*/
return TTMLHelper.isRegionElement(elt);
}
public static boolean isBodyElement(Element elt) {
return isTimedTextElement(elt, "body");
}
public static boolean isDivisionElement(Element elt) {
return isTimedTextElement(elt, "div");
}
public static boolean isParagraphElement(Element elt) {
return isTimedTextElement(elt, "p");
}
public static boolean isSpanElement(Element elt) {
return isTimedTextElement(elt, "span");
}
public static boolean isAnonymousSpanElement(Element elt) {
if (!isSpanElement(elt))
return false;
else {
String id = getXmlIdentifier(elt);
return (id != null) && (id.indexOf("isdSpan") == 0);
}
}
public static boolean isImageElement(Element elt) {
return isTimedTextElement(elt, "image");
}
public static boolean isAnimationElement(Element elt) {
return isTimedTextElement(elt, "set");
}
public static boolean isContentElement(Element elt) {
String nsUri = elt.getNamespaceURI();
if ((nsUri == null) || !nsUri.equals(TTMLHelper.NAMESPACE_TT))
return false;
else {
String localName = elt.getLocalName();
if (localName.equals("body"))
return true;
else if (localName.equals("div"))
return true;
else if (localName.equals("p"))
return true;
else if (localName.equals("span"))
return true;
else if (localName.equals("br"))
return true;
else
return false;
}
}
public static boolean isRegionOrContentElement(Element elt) {
return isRegionElement(elt) || isContentElement(elt);
}
public static boolean isTimedTextElement(Element elt, String localName) {
if (elt != null) {
String nsUri = elt.getNamespaceURI();
if ((nsUri != null) && nsUri.equals(NAMESPACE_TT) && elt.getLocalName().equals(localName))
return true;
}
return false;
}
public static boolean isTimedElement(Element elt) {
String nsUri = elt.getNamespaceURI();
if ((nsUri == null) || !nsUri.equals(NAMESPACE_TT))
return false;
else {
String localName = elt.getLocalName();
if (localName.equals("animate"))
return true;
else if (localName.equals("body"))
return true;
else if (localName.equals("div"))
return true;
else if (localName.equals("p"))
return true;
else if (localName.equals("span"))
return true;
else if (localName.equals("br"))
return true;
else if (localName.equals("region"))
return true;
else if (localName.equals("set"))
return true;
else
return false;
}
}
public static String getRegionIdentifier(Element elt) {
if (elt.hasAttributeNS(null, "region"))
return elt.getAttributeNS(null, "region");
else
return null;
}
private static boolean hasUsableContentInParagraph(Element elt) {
String content = elt.getTextContent();
for (int i = 0, n = content.length(); i < n; ++i) {
if (!Character.isWhitespace(content.charAt(i)))
return true;
}
return false;
}
private static boolean hasUsableContentInImage(Element elt) {
// [TBD] - return true only if image is resolvable
return true;
}
public static boolean isStyleAttribute(QName attrName) {
String nsUri = attrName.getNamespaceURI();
return (nsUri != null) && nsUri.equals(NAMESPACE_TT_STYLE);
}
}