package uk.co.bytemark.vm.enigma.inquisition.questions; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.uwyn.jhighlight.renderer.JavaXhtmlRenderer; public class QuestionRenderingHelper { private static final Pattern JAVA_CODE_BLOCK_PATTERN = Pattern.compile("<java>(.*?)</java>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); private static final Logger LOGGER = Logger.getLogger(QuestionRenderingHelper.class.getName()); public static String syntaxHighlightForJava(String htmlText) { Matcher matcher = JAVA_CODE_BLOCK_PATTERN.matcher(htmlText); StringBuffer stringBuffer = new StringBuffer(); String replacement; while (matcher.find()) { try { String javaCodeBlock = matcher.group(1); String rendered = QuestionRenderingHelper.renderJavaCodeBlock(javaCodeBlock); replacement = Matcher.quoteReplacement(rendered); } catch (IOException e) { LOGGER.log(Level.WARNING, "Error in string replacement for: " + htmlText, e); return htmlText; } matcher.appendReplacement(stringBuffer, replacement); } matcher.appendTail(stringBuffer); return stringBuffer.toString(); } private static String renderJavaCodeBlock(String javaCodeBlock) throws IOException { JavaXhtmlRenderer renderer = new JavaXhtmlRenderer(); // TODO: Figure out how this works String rendered = renderer.highlight("", javaCodeBlock, "utf8", true); rendered = rendered.trim(); // In particular, we don't want the trailing newline // replacement = Matcher.quoteReplacement("<table border=1 cellspacing=0><tr><td><pre>" + rendered + // "</pre></td></tr></table>"); rendered = "<pre>" + rendered + "</pre>"; return rendered; } }