package im.actor.core.js.utils;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.safehtml.shared.UriUtils;
import im.actor.runtime.markdown.*;
import java.util.ArrayList;
public class HtmlMarkdownUtils {
public static String processText(String markdown, int mode) {
MDDocument doc = new MarkdownParser(mode).processDocument(markdown);
ArrayList<String> renderedSections = new ArrayList<String>();
for (MDSection section : doc.getSections()) {
renderedSections.add(renderSection(section));
}
StringBuilder builder = new StringBuilder();
for (String section : renderedSections) {
builder.append("<p>");
builder.append(section);
builder.append("</p>");
}
return builder.toString();
}
public static String renderSection(MDSection section) {
if (section.getType() == MDSection.TYPE_CODE) {
return renderCode(section.getCode());
} else if (section.getType() == MDSection.TYPE_TEXT) {
return renderText(section.getText());
} else {
return "";
}
}
public static String renderCode(MDCode code) {
return "<pre><code>" + SafeHtmlUtils.htmlEscape(code.getCode()) + "</pre></code>";
}
public static String renderText(MDText[] texts) {
StringBuilder builder = new StringBuilder();
for (MDText text : texts) {
if (text instanceof MDRawText) {
final MDRawText rawText = (MDRawText) text;
builder.append(SafeHtmlUtils.htmlEscape(rawText.getRawText()).replace("\n", "<br/>"));
} else if (text instanceof MDSpan) {
final MDSpan span = (MDSpan) text;
builder.append(spanElement(span.getSpanType(), renderText(span.getChild())));
} else if (text instanceof MDUrl) {
final MDUrl url = (MDUrl) text;
builder.append(urlElement(url));
}
}
return builder.toString();
}
private static String spanElement(int type, String innerHTML) {
if (type == MDSpan.TYPE_BOLD) {
return "<b>" + innerHTML + "</b>";
} else if (type == MDSpan.TYPE_ITALIC) {
return "<i>" + innerHTML + "</i>";
} else {
return innerHTML;
}
}
private static String urlElement(MDUrl url) {
// Sanitizing URL
String href = UriUtils.sanitizeUri(url.getUrl());
// "DeSanitize" custom url scheme
if (url.getUrl().startsWith("send:")) {
href = UriUtils.encodeAllowEscapes(url.getUrl());
} else {
// HotFixing url without prefix
if (!href.equals("#") && !href.contains("://")) {
href = "http://" + href;
}
}
return "<a " +
"target=\"_blank\" " +
"onClick=\"window.messenger.handleLinkClick(event)\" " +
"href=\"" + href + "\">" +
SafeHtmlUtils.htmlEscape(url.getUrlTitle()) +
"</a>";
}
}