package org.markdownwriterfx.preview;
import java.nio.file.Path;
import java.util.Collections;
import javafx.scene.Node;
import javafx.scene.web.WebView;
import org.pegdown.LinkRenderer;
import org.pegdown.ToHtmlSerializer;
import org.pegdown.VerbatimSerializer;
import org.pegdown.ast.RootNode;
import org.pegdown.plugins.PegDownPlugins;
class WebViewPreview
implements MarkdownPreviewPane.Preview
{
private final WebView webView = new WebView();
private int lastScrollX;
private int lastScrollY;
Node getNode() {
return webView;
}
static String toHtml(RootNode astRoot) {
if (astRoot == null)
return "";
return new ToHtmlSerializer(new LinkRenderer(),
Collections.<String, VerbatimSerializer>emptyMap(),
PegDownPlugins.NONE.getHtmlSerializerPlugins())
.toHtml(astRoot);
}
@Override
public void update(RootNode astRoot, Path path) {
if (!webView.getEngine().getLoadWorker().isRunning()) {
Object scrollXobj = webView.getEngine().executeScript("window.scrollX");
Object scrollYobj = webView.getEngine().executeScript("window.scrollY");
lastScrollX = (scrollXobj instanceof Number) ? ((Number)scrollXobj).intValue() : 0;
lastScrollY = (scrollYobj instanceof Number) ? ((Number)scrollYobj).intValue() : 0;
}
String base = (path != null)
? ("<base href=\"" + path.getParent().toUri().toString() + "\">\n")
: "";
String scrollScript = (lastScrollX > 0 || lastScrollY > 0)
? (" onload='window.scrollTo("+lastScrollX+", "+lastScrollY+");'")
: "";
webView.getEngine().loadContent(
"<!DOCTYPE html>\n"
+ "<html>\n"
+ "<head>\n"
+ "<link rel=\"stylesheet\" href=\"" + getClass().getResource("markdownpad-github.css") + "\">\n"
+ base
+ "</head>\n"
+ "<body" + scrollScript + ">\n"
+ toHtml(astRoot)
+ "</body>\n"
+ "</html>");
}
@Override
public void scrollY(double value) {
webView.getEngine().executeScript(
"window.scrollTo(0, (document.body.scrollHeight - window.innerHeight) * "+value+");");
}
}