You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.7 KiB
Java

/**
* *****************************************************************************
* Copyright 2013 Jeremie Bresson
*
* 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 net.apocalypselabs.symat; // Package name changed.
import java.awt.Color;
import java.util.List;
import java.util.Map.Entry;
import syntaxhighlight.ParseResult;
import syntaxhighlight.Style;
import syntaxhighlight.Theme;
/**
*
* @author Skylar
*/
public class PrettifyToHtml {
private static final String MAIN_CLASS = "prettyprint";
/**
* Format the {@link ParseResult} into an HTML file.
*
* @param content
* @param parseResults
* @return
*/
public static String toHtml(String content, List<ParseResult> parseResults) {
int endIndex = 0;
StringBuilder sb = new StringBuilder();
sb.append("<div class=\"" + MAIN_CLASS + "\">");
sb.append("<pre>");
for (ParseResult pr : parseResults) {
int startIndex = pr.getOffset();
if (startIndex > endIndex) {
sb.append(content.substring(endIndex, startIndex));
}
endIndex = startIndex + pr.getLength();
sb.append("<span class=\"" + pr.getStyleKeysString() + "\">");
sb.append(content.substring(startIndex, endIndex));
sb.append("</span>");
}
if (content.length() > endIndex) {
sb.append(content.substring(endIndex, content.length()));
}
sb.append("</pre>");
sb.append("</div>");
return sb.toString();
}
/**
*
* @param theme
* @return
*/
public static String toCss(Theme theme) {
StringBuilder sb = new StringBuilder();
sb.append("." + MAIN_CLASS + " {");
sb.append("font-family:monospace; ");
appendCssColor(sb, "background-color", theme.getBackground());
sb.append("}\n");
for (Entry<String, Style> entry : theme.getStyles().entrySet()) {
sb.append("." + MAIN_CLASS + " ." + entry.getKey() + " {");
Style style = entry.getValue();
appendCssColor(sb, "background-color", style.getBackground());
appendCssColor(sb, "color", style.getColor());
appendCssText(sb, "font-weight: bold", style.isBold());
appendCssText(sb, "font-style: italic", style.isItalic());
appendCssText(sb, "text-decoration: underline", style.isUnderline());
sb.append("}\n");
}
theme.getStyles();
return sb.toString();
}
private static void appendCssColor(StringBuilder sb, String cssKey, Color color) {
if (color != null) {
sb.append(cssKey + ": " + encode(color) + "; ");
}
}
private final static String encode(Color color) {
String s = Integer.toHexString(color.getRGB() & 0xffffff);
if (s.length() < 6) {
s = "000000".substring(0, 6 - s.length()) + s;
}
return '#' + s;
}
private static void appendCssText(StringBuilder sb, String cssProp, boolean isSet) {
if (isSet) {
sb.append(cssProp + "; ");
}
}
}