package oqube.muse.html;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.uwyn.jhighlight.renderer.JavaXhtmlRenderer;
import com.uwyn.jhighlight.renderer.Renderer;
import com.uwyn.jhighlight.renderer.XhtmlRenderer;
import com.uwyn.jhighlight.renderer.XhtmlRendererFactory;
import fr.lifl.utils.SubstitutableString;
import oqube.muse.AbstractTagHandler;
import oqube.muse.MuseSink;
import oqube.muse.MuseTagHandler;
@author
@see
public class HTMLSourceTag extends AbstractTagHandler {
{
try {
Class.forName("oqube.jhighlight.haskell.HaskellXhtmlRenderer");
Class.forName("oqube.jhighlight.python.PythonXhtmlRenderer");
} catch (Exception e) {
e.printStackTrace();
System.err.println("Error instantiating renderer :"+e);
}
}
private Map ids = new HashMap();
public boolean block(MuseSink sink, String tag, String[][] at, String content) {
if (!"source".equals(tag) && !"src".equals(tag))
if (getNext() != null)
return getNext().block(sink, tag, at, content);
else
return false;
String fname = null;
String lang = null;
for (int i = 0; i < at.length; i++) {
if ("name".equals(at[i][0]))
fname = at[i][1];
else if ("language".equals(at[i][0]) || "lang".equals(at[i][0]))
lang = at[i][1];
else if ("hidden".equals(at[i][0]) && "true".equalsIgnoreCase(at[i][1]))
return true;
}
String hlt;
try {
hlt = highlight(content, lang);
} catch (IOException e) {
hlt = "error";
}
String baseid = fname == null ? "id" : fname;
String id;
String previd = (String) ids.get(baseid);
if (previd != null) {
if (previd.equals(baseid))
id = baseid + '1';
else
id = baseid + (Integer.parseInt(previd.substring(baseid.length())) + 1);
} else {
id = baseid;
}
ids.put(baseid, id);
StringBuffer sb = new StringBuffer();
Pattern pat = Pattern
.compile("<span class=\"java_operator\"><<</span><span class=\"java_plain\">([^<]+)</span><span class=\"java_operator\">>></span>");
Matcher m = pat.matcher(hlt);
while (m.find()) {
m.appendReplacement(sb, "<a href=\"#$1\"><<$1>></a>");
}
m.appendTail(sb);
sink.rawText("<pre class=\"code\" id=\"" + id + "\">");
sink.anchor(id);
if (previd != null)
sink.link("#" + previd, "previous");
sink.rawText(sb.toString());
sink.rawText("</pre>");
return true;
}
private String highlight(String content, String lang) throws IOException {
if (lang == null)
lang = XhtmlRendererFactory.JAVA;
Renderer rend = XhtmlRendererFactory.getRenderer(lang);
if (rend == null)
return content;
return rend.highlight(null, content, "UTF-8", true);
}
public boolean flow(MuseSink sink, String tag, String[][] at, String content) {
return block(sink, tag, at, content);
}
}