/*
* Copyright 2015
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://opensource.org/licenses/eclipse-1.0.txt
*/
package de.lynorics.eclipse.jangaroo.ui.asdoc;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* Converts from {@link Asdoc} to an HTML representation.
*
* @author Lynorics
*/
public class AsdocHTMLConverter {
@SuppressWarnings("serial")
private Map<String, String> TRANSLATIONS = new TreeMap<String, String>() {{
put("author", "Author");
put("created", "Created");
put("deprecated", "Deprecated");
put("invariant", "Invariant");
put("pattern", "Design Pattern");
put("return", "Returns");
put("see", "See Also");
put("since", "Since");
put("throws", "Throws");
put("version", "Version");
}};
@SuppressWarnings("serial")
private List<String> ORDER_OF_TAGS = new ArrayList<String>() {{
add("author");
add("version");
add("param");
add("return");
add("throws");
add("see");
add("since");
add("deprecated");
}};
/**
* Converts from {@link Asdoc} to an HTML string representation.
*
* @param asdoc
*
* @return the HTML (may be <code>null</code>)
*/
public String convert(Asdoc asdoc) {
if (asdoc == null) {
return null;
}
StringBuilder sb = new StringBuilder();
convertText(asdoc, sb);
convertParameters(asdoc, sb);
convertTags(asdoc, sb);
return sb.toString();
}
private void convertText(Asdoc asdoc, StringBuilder sb) {
sb.append("<p>");
sb.append(asdoc.getText().replaceAll("<paragraph>", "</p>\n<p>"));
sb.append("</p>\n");
}
private void convertParameters(Asdoc asdoc, StringBuilder sb) {
if (asdoc.getParameters().size() > 0) {
sb.append("<dl>\n");
sb.append("<dt><span class=\"strong\">");
sb.append("Parameters:");
sb.append("</dt>\n");
for (Parameter parameter : asdoc.getParameters()) {
convertParameter(sb, parameter);
}
sb.append("</dl>\n");
}
}
private void convertParameter(StringBuilder sb, Parameter parameter) {
sb.append("<dd>");
sb.append("<code>");
sb.append(parameter.getName());
sb.append("</code>");
sb.append(" - ");
sb.append(parameter.getText());
sb.append("</dd>\n");
}
private void convertTags(Asdoc asdoc, StringBuilder sb) {
if (asdoc.getTags().size() > 0) {
// first the known tags in correct order
for(String tagName: ORDER_OF_TAGS) {
for (Tag tag : asdoc.getTags()) {
if (tag.getName().equals(tagName)) {
convertTag(sb, tag);
}
}
}
// now, the unknown tags just in appearance
for (Tag tag : asdoc.getTags()) {
if (!ORDER_OF_TAGS.contains(tag.getName())) {
convertTag(sb, tag);
}
}
}
}
private void convertTag(StringBuilder sb, Tag tag) {
sb.append("<dl>\n");
sb.append("<dt><span class=\"strong\">");
sb.append(translate(tag.getName()));
sb.append("</dt>\n");
sb.append("<dd>");
if ("see".equals(tag.getName())) {
sb.append(parseUrl(tag.getText()));
}
else {
sb.append(tag.getText());
}
sb.append("</dd>\n");
sb.append("</dl>\n");
}
private String parseUrl(String text) {
StringBuilder result = new StringBuilder();
if (text.startsWith("http://") ||
text.startsWith("https://")) {
String[] split = text.split(" ", 2);
result.append("<a href=\"");
result.append(split[0]);
result.append("\">");
if (split.length > 1) {
result.append(split[1]);
}
else {
result.append(split[0]);
}
result.append("</a>");
}
else {
result.append(text);
}
return result.toString();
}
private String translate(String name) {
if (TRANSLATIONS.containsKey(name)) {
return TRANSLATIONS.get(name);
}
char first = Character.toUpperCase(name.charAt(0));
return first + name.substring(1);
}
}