/* * Copyright 2015 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.rendering.nui.widgets.browser.data.html; import org.terasology.rendering.nui.Color; import org.terasology.rendering.nui.HorizontalAlign; import org.terasology.rendering.nui.widgets.browser.ui.style.ContainerInteger; import org.terasology.rendering.nui.widgets.browser.ui.style.FixedContainerInteger; import org.terasology.rendering.nui.widgets.browser.ui.style.ParagraphRenderStyle; import org.terasology.rendering.nui.widgets.browser.ui.style.PercentageContainerInteger; import org.xml.sax.Attributes; public final class HTMLUtils { private HTMLUtils() { } public static String findAttribute(Attributes attributes, String name) { int size = attributes.getLength(); for (int i = 0; i < size; i++) { if (attributes.getQName(i).equalsIgnoreCase(name)) { return attributes.getValue(i); } } return null; } public static ParagraphRenderStyle createParagraphRenderStyleFromCommonAttributes(Attributes attributes) { Color textColor = getTextColor(attributes); ParagraphRenderStyle.FloatStyle floatStyle = getFloatStyle(attributes); ParagraphRenderStyle.ClearStyle clearStyle = getClearStyle(attributes); HorizontalAlign horizontalAlign = getHorizontalAlign(attributes); Color backgroundColor = getBackgroundColor(attributes); ContainerInteger paragraphMarginTop = getParagraphMarginTop(attributes); ContainerInteger paragraphMarginBottom = getParagraphMarginBottom(attributes); ContainerInteger paragraphMarginLeft = getParagraphMarginLeft(attributes); ContainerInteger paragraphMarginRight = getParagraphMarginRight(attributes); ContainerInteger paragraphPaddingTop = getParagraphPaddingTop(attributes); ContainerInteger paragraphPaddingBottom = getParagraphPaddingBottom(attributes); ContainerInteger paragraphPaddingLeft = getParagraphPaddingLeft(attributes); ContainerInteger paragraphPaddingRight = getParagraphPaddingRight(attributes); ContainerInteger minimumWidth = getMinimumWidth(attributes); return new ParagraphRenderStyle() { @Override public Color getColor(boolean hyperlink) { return textColor; } @Override public FloatStyle getFloatStyle() { return floatStyle; } @Override public ClearStyle getClearStyle() { return clearStyle; } @Override public HorizontalAlign getHorizontalAlignment() { return horizontalAlign; } @Override public Color getParagraphBackground() { return backgroundColor; } @Override public ContainerInteger getParagraphMarginTop() { return paragraphMarginTop; } @Override public ContainerInteger getParagraphMarginBottom() { return paragraphMarginBottom; } @Override public ContainerInteger getParagraphMarginLeft() { return paragraphMarginLeft; } @Override public ContainerInteger getParagraphMarginRight() { return paragraphMarginRight; } @Override public ContainerInteger getParagraphPaddingTop() { return paragraphPaddingTop; } @Override public ContainerInteger getParagraphPaddingBottom() { return paragraphPaddingBottom; } @Override public ContainerInteger getParagraphPaddingLeft() { return paragraphPaddingLeft; } @Override public ContainerInteger getParagraphPaddingRight() { return paragraphPaddingRight; } @Override public ContainerInteger getParagraphMinimumWidth() { return minimumWidth; } }; } private static ContainerInteger getMinimumWidth(Attributes attributes) { String widthStr = getStyleAttribute(attributes, "width"); if (widthStr != null) { return parseContainerInteger(widthStr); } return null; } private static ContainerInteger getParagraphMarginTop(Attributes attributes) { return getStyleTopContainerInteger(attributes, "margin"); } private static ContainerInteger getParagraphMarginBottom(Attributes attributes) { return getStyleBottomContainerInteger(attributes, "margin"); } private static ContainerInteger getParagraphMarginLeft(Attributes attributes) { return getStyleLeftContainerInteger(attributes, "margin"); } private static ContainerInteger getParagraphMarginRight(Attributes attributes) { return getStyleRightContainerInteger(attributes, "margin"); } private static ContainerInteger getParagraphPaddingTop(Attributes attributes) { return getStyleTopContainerInteger(attributes, "padding"); } private static ContainerInteger getParagraphPaddingBottom(Attributes attributes) { return getStyleBottomContainerInteger(attributes, "padding"); } private static ContainerInteger getParagraphPaddingLeft(Attributes attributes) { return getStyleLeftContainerInteger(attributes, "padding"); } private static ContainerInteger getParagraphPaddingRight(Attributes attributes) { return getStyleRightContainerInteger(attributes, "padding"); } private static ContainerInteger getStyleTopContainerInteger(Attributes attributes, String groupName) { return getStyleContainerInteger(attributes, groupName, "top", 0, 0, 0); } private static ContainerInteger getStyleBottomContainerInteger(Attributes attributes, String groupName) { return getStyleContainerInteger(attributes, groupName, "bottom", 2, 2, 0); } private static ContainerInteger getStyleLeftContainerInteger(Attributes attributes, String groupName) { return getStyleContainerInteger(attributes, groupName, "left", 3, 1, 1); } private static ContainerInteger getStyleRightContainerInteger(Attributes attributes, String groupName) { return getStyleContainerInteger(attributes, groupName, "right", 1, 1, 1); } private static ContainerInteger getStyleContainerInteger(Attributes attributes, String groupName, String sideName, int fourIndex, int threeIndex, int twoIndex) { String elementStr = getStyleAttribute(attributes, groupName + "-" + sideName); if (elementStr != null) { return parseContainerInteger(elementStr); } String groupStr = getStyleAttribute(attributes, groupName); if (groupStr != null) { String[] groupSplit = groupStr.split(" "); if (groupSplit.length == 4) { return parseContainerInteger(groupSplit[fourIndex]); } else if (groupSplit.length == 3) { return parseContainerInteger(groupSplit[threeIndex]); } else if (groupSplit.length == 2) { return parseContainerInteger(groupSplit[twoIndex]); } else if (groupSplit.length == 1) { return parseContainerInteger(groupSplit[0]); } return null; } return null; } private static ContainerInteger parseContainerInteger(String value) { if (value.endsWith("px")) { return new FixedContainerInteger(Integer.parseInt(value.substring(0, value.length() - 2))); } else if (value.endsWith("%")) { return new PercentageContainerInteger(Integer.parseInt(value.substring(0, value.length() - 1))); } return null; } private static String getStyleAttribute(Attributes attributes, String name) { String styleStr = findAttribute(attributes, "style"); if (styleStr != null) { for (String style : styleStr.split(";")) { String[] styleSplit = style.trim().split(":", 2); if (styleSplit.length == 2 && styleSplit[0].trim().equals(name)) { return styleSplit[1].trim(); } } } return null; } private static ParagraphRenderStyle.FloatStyle getFloatStyle(Attributes attributes) { String floatStr = getStyleAttribute(attributes, "float"); if (floatStr == null) { return null; } switch (floatStr) { case "left": return ParagraphRenderStyle.FloatStyle.LEFT; case "right": return ParagraphRenderStyle.FloatStyle.RIGHT; case "none": return ParagraphRenderStyle.FloatStyle.NONE; } return null; } private static ParagraphRenderStyle.ClearStyle getClearStyle(Attributes attributes) { String clearStr = getStyleAttribute(attributes, "clear"); if (clearStr == null) { return null; } switch (clearStr) { case "left": return ParagraphRenderStyle.ClearStyle.LEFT; case "right": return ParagraphRenderStyle.ClearStyle.RIGHT; case "both": return ParagraphRenderStyle.ClearStyle.BOTH; case "none": return ParagraphRenderStyle.ClearStyle.NONE; } return null; } private static HorizontalAlign getHorizontalAlign(Attributes attributes) { String alignStr = getStyleAttribute(attributes, "text-align"); if (alignStr == null) { return null; } switch (alignStr) { case "left": return HorizontalAlign.LEFT; case "right": return HorizontalAlign.RIGHT; case "center": return HorizontalAlign.CENTER; } return null; } private static Color getBackgroundColor(Attributes attributes) { String backgroundColorStr = getStyleAttribute(attributes, "background-color"); return parseColor(backgroundColorStr); } private static Color getTextColor(Attributes attributes) { String backgroundColorStr = getStyleAttribute(attributes, "color"); return parseColor(backgroundColorStr); } private static Color parseColor(String colorStr) { if (colorStr == null || colorStr.length() != 7 || colorStr.charAt(0) != '#') { return null; } return new Color( Integer.parseInt(colorStr.substring(1, 3), 16), Integer.parseInt(colorStr.substring(3, 5), 16), Integer.parseInt(colorStr.substring(5, 7), 16), 255); } }