/*
* 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.basic;
import com.google.common.collect.Maps;
import org.terasology.rendering.assets.font.Font;
import org.terasology.rendering.nui.Color;
import org.terasology.rendering.nui.widgets.browser.data.ParagraphData;
import org.terasology.rendering.nui.widgets.browser.data.basic.FlowParagraphData;
import org.terasology.rendering.nui.widgets.browser.data.basic.flow.TextFlowRenderable;
import org.terasology.rendering.nui.widgets.browser.data.html.HTMLBlockBuilder;
import org.terasology.rendering.nui.widgets.browser.data.html.HTMLFontResolver;
import org.terasology.rendering.nui.widgets.browser.data.html.HTMLParseException;
import org.terasology.rendering.nui.widgets.browser.data.html.HTMLUtils;
import org.terasology.rendering.nui.widgets.browser.ui.style.TextRenderStyle;
import org.xml.sax.Attributes;
import java.util.Map;
public class ParagraphBuilder implements HTMLBlockBuilder {
private HTMLFontResolver htmlFontResolver;
private Map<String, FlowRenderableFactory> flowRenderableFactoryMap = Maps.newHashMap();
private FlowParagraphData paragraphData;
private String hyperlink;
private String fontName;
private boolean bold;
private Color color;
public ParagraphBuilder(HTMLFontResolver htmlFontResolver, Attributes attributes) {
this.htmlFontResolver = htmlFontResolver;
paragraphData = new FlowParagraphData(HTMLUtils.createParagraphRenderStyleFromCommonAttributes(attributes));
}
public void addKnownFlowTag(String tag, FlowRenderableFactory flowRenderableFactory) {
flowRenderableFactoryMap.put(tag, flowRenderableFactory);
}
@Override
public boolean startTag(String tag, Attributes attributes) {
if (tag.equalsIgnoreCase("b")) {
bold = true;
return true;
} else if (tag.equalsIgnoreCase("font")) {
String name = HTMLUtils.findAttribute(attributes, "name");
if (name != null) {
fontName = name;
}
String colorAttr = HTMLUtils.findAttribute(attributes, "color");
if (colorAttr != null && colorAttr.length() == 7 && colorAttr.charAt(0) == '#') {
color = new Color(Integer.parseInt(colorAttr.substring(1), 16));
}
return true;
} else if (tag.equalsIgnoreCase("a")) {
String href = HTMLUtils.findAttribute(attributes, "href");
if (href == null) {
throw new HTMLParseException("Expected href attribute");
}
hyperlink = href;
}
for (Map.Entry<String, FlowRenderableFactory> flowRenderableFactoryEntry : flowRenderableFactoryMap.entrySet()) {
if (flowRenderableFactoryEntry.getKey().equalsIgnoreCase(tag)) {
paragraphData.append(flowRenderableFactoryEntry.getValue().create(attributes, htmlFontResolver.getFont(fontName, bold), color, hyperlink));
return true;
}
}
return false;
}
@Override
public void text(String text) {
StaticTextRenderStyle renderStyle = new StaticTextRenderStyle(htmlFontResolver.getFont(fontName, bold), color);
paragraphData.append(new TextFlowRenderable(text, renderStyle, hyperlink));
}
@Override
public void endTag(String tag) {
if (tag.equalsIgnoreCase("b")) {
bold = false;
} else if (tag.equalsIgnoreCase("font")) {
fontName = null;
color = null;
} else if (tag.equalsIgnoreCase("a")) {
hyperlink = null;
}
}
@Override
public ParagraphData build() {
return paragraphData;
}
private static final class StaticTextRenderStyle implements TextRenderStyle {
private Font font;
private Color color;
private StaticTextRenderStyle(Font font, Color color) {
this.font = font;
this.color = color;
}
@Override
public Font getFont(boolean hyperlink) {
return font;
}
@Override
public Color getColor(boolean hyperlink) {
return color;
}
}
}