Skip to content

Commit

Permalink
优化html文本构建
Browse files Browse the repository at this point in the history
  • Loading branch information
GGXBoo committed Jul 7, 2018
1 parent d8e9fa1 commit 1f39180
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 119 deletions.
115 changes: 29 additions & 86 deletions src/main/java/com/ggx/editor/controller/MainController.java
Original file line number Diff line number Diff line change
Expand Up @@ -683,29 +683,36 @@ public void export2HTML(ActionEvent actionEvent) throws IOException {
e.printStackTrace();
}
}
String html = "<!DOCTYPE html>\n"
+ "<html>\n"
+ "<head>\n"
+ "<meta charset=\"utf-8\" />"
+"<title>"+htmlFile.getName()+"</title>"
+ "<link rel=\"stylesheet\" href=\"./css/markdownpad-github.css\">\n"
+ "<style>\n"
+ ".mwfx-editor-selection {\n"
+ " border-right: 5px solid #f47806;\n"
+ " margin-right: -5px;\n"
+ " background-color: rgb(253, 247, 241);\n"
+ "}\n"
+ "</style>\n"
+ "<script src=\"./js/preview.js\"></script>\n"
+ prismSyntaxHighlighting(markDownEditorPane.getMarkDownAST())
+ "</head>\n"
+ "<body>\n"
+ content
+ "<script>preview.highlightNodesAt("+content.length()+");</script>\n"
+ "</body>\n"
+ "</html>";
StringBuilder html=new StringBuilder();
html.append("<!DOCTYPE html>\n");
html.append("<html>\n");
html.append("<head>\n");
html.append("<meta charset=\"utf-8\" />\n");
html.append("<title>");
html.append(htmlFile.getName());
html.append("</title>\n");
html.append("<link rel=\"stylesheet\" href=\"./css/markdownpad-github.css\">\n");
html.append("<style>\n");
html.append(".mwfx-editor-selection {\n");
html.append(" border-right: 5px solid #f47806;\n");
html.append(" margin-right: -5px;\n");
html.append(" background-color: rgb(253, 247, 241);\n");
html.append("}\n");
html.append("</style>\n");
html.append("<script src=\"./js/preview.js\"></script>\n");
html.append(WebViewPreview.prismSyntaxHighlighting(markDownEditorPane.getMarkDownAST()));
html.append("</head>\n");
html.append("<body>\n");
html.append(content);
html.append("<script>\n");
html.append("preview.highlightNodesAt(")
.append(content.length())
.append(");\n");
html.append("</script>\n");
html.append("</body>\n");
html.append("</html>");
try (FileWriter writer = new FileWriter(htmlFile)) {
writer.write(html);
writer.write(html.toString());
writer.flush();
} catch (IOException e) {
e.printStackTrace();
Expand All @@ -720,68 +727,4 @@ private void showError(String content){
error.setContentText(content);
error.show();
}

private String prismSyntaxHighlighting(com.vladsch.flexmark.ast.Node astRoot) {
HashMap<String, String> prismLangDependenciesMap = new HashMap<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
Resource.getResAsStream("js/prism/lang_dependencies.txt"))))
{
String line;
while ((line = reader.readLine()) != null) {
if (!line.startsWith("{"))
continue;

line = line.replaceAll("(\\[.+),(.+\\])", "$1;$2");
line = WebViewPreview.trimDelim(line, "{", "}");
for (String str : line.split(",")) {
String[] parts = str.split(":");
if (parts[1].startsWith("["))
continue; // not supported

String key = WebViewPreview.trimDelim(parts[0], "\"", "\"");
String value = WebViewPreview.trimDelim(parts[1], "\"", "\"");
prismLangDependenciesMap.put(key, value);
}
}
} catch (IOException e) {
// ignore
}

// check whether markdown contains fenced code blocks and remember languages
ArrayList<String> languages = new ArrayList<>();
NodeVisitor visitor = new NodeVisitor(Collections.emptyList()) {
@Override
public void visit(com.vladsch.flexmark.ast.Node node) {
if (node instanceof FencedCodeBlock) {
String language = ((FencedCodeBlock)node).getInfo().toString();
if (language.contains(language))
languages.add(language);

// dependencies
while ((language = prismLangDependenciesMap.get(language)) != null) {
if (language.contains(language))
languages.add(0, language); // dependencies must be loaded first
}
} else
visitChildren(node);
}
};
visitor.visit(astRoot);

if (languages.isEmpty())
return "";

// build HTML (only load used languages)
// Note: not using Prism Autoloader plugin because it lazy loads/highlights, which causes flicker
// during fast typing; it also does not work with "alias" languages (e.g. js, html, xml, svg, ...)
StringBuilder buf = new StringBuilder();
buf.append("<link rel=\"stylesheet\" href=\"").append(Resource.getResource("js/prism/prism.css")).append("\">\n");
buf.append("<script src=\"").append(Resource.getResource("js/prism/prism-core.min.js")).append("\"></script>\n");
for (String language : languages) {
URL url = Resource.getResource("js/prism/components/prism-"+language+".min.js");
if (url != null)
buf.append("<script src=\"").append(url).append("\"></script>\n");
}
return buf.toString();
}
}
67 changes: 34 additions & 33 deletions src/main/java/com/ggx/editor/editor/preview/WebViewPreview.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,32 +112,35 @@ public void update(MarkDownPreviewPane.PreviewContext context,
String scrollScript = (lastScrollX > 0 || lastScrollY > 0)
? (" onload='window.scrollTo("+lastScrollX+", "+lastScrollY+");'")
: "";
String html=renderer.getHtml();

webView.getEngine().loadContent(
"<!DOCTYPE html>\n"
+ "<html>\n"
+ "<head>\n"
+ "<meta charset=\"utf-8\" />"
+ base
+ "<link rel=\"stylesheet\" href=\"" + Resource.getResource("css/markdownpad-github.css") + "\">\n"
+ "<style>\n"
+ ".mwfx-editor-selection {\n"
+ " border-right: 5px solid #f47806;\n"
+ " margin-right: -5px;\n"
+ " background-color: rgb(253, 247, 241);\n"
+ "}\n"
+ "</style>\n"
+ "<script src=\"" + Resource.getResource("js/preview.js") + "\"></script>\n"
+ prismSyntaxHighlighting(context.getMarkdownAST())
/*+ base*/
+ "</head>\n"
+ "<body" + scrollScript + ">\n"
+ html
+ "<script>" + highlightNodesAt(lastEditorSelection) + "</script>\n"
+ "</body>\n"
+ "</html>"
);
String content=renderer.getHtml();
StringBuilder html=new StringBuilder();
html.append("<!DOCTYPE html>\n");
html.append("<html>\n");
html.append("<head>\n");
html.append("<meta charset=\"utf-8\" />\n");
html.append(base);
html.append("<link rel=\"stylesheet\" href=\"")
.append(Resource.getResource("css/markdownpad-github.css"))
.append("\">\n");
html.append("<style>\n");
html.append(".mwfx-editor-selection {\n");
html.append(" border-right: 5px solid #f47806;\n");
html.append(" margin-right: -5px;\n");
html.append(" background-color: rgb(253, 247, 241);\n");
html.append("}\n");
html.append("</style>\n");
html.append("<script src=\"")
.append(Resource.getResource("js/preview.js"))
.append("\"></script>\n");
html.append(prismSyntaxHighlighting(context.getMarkdownAST()));
html.append("</head>\n");
html.append("<body").append(scrollScript).append(">\n");
html.append(content);
html.append("<script>\n");
html.append("<script>").append(highlightNodesAt(lastEditorSelection)).append("</script>\n");
html.append("</body>\n");
html.append("</html>");
webView.getEngine().loadContent(html.toString());
}

/**
Expand Down Expand Up @@ -165,7 +168,7 @@ private String highlightNodesAt(IndexRange range) {
return "preview.highlightNodesAt(" + range.getEnd() + ")";
}

private String prismSyntaxHighlighting(com.vladsch.flexmark.ast.Node astRoot) {
public static String prismSyntaxHighlighting(com.vladsch.flexmark.ast.Node astRoot) {
initPrismLangDependencies();

// check whether markdown contains fenced code blocks and remember languages
Expand All @@ -192,9 +195,8 @@ public void visit(com.vladsch.flexmark.ast.Node node) {
if (languages.isEmpty())
return "";

// build HTML (only load used languages)
// Note: not using Prism Autoloader plugin because it lazy loads/highlights, which causes flicker
// during fast typing; it also does not work with "alias" languages (e.g. js, html, xml, svg, ...)
//在构建html的时候只使用用到的语言插件,这里不使用prism的自动载入插件因为他们是延迟加载的会导致快速打字的时候出现
//闪烁的情况
StringBuilder buf = new StringBuilder();
buf.append("<link rel=\"stylesheet\" href=\"").append(Resource.getResource("js/prism/prism.css")).append("\">\n");
buf.append("<script src=\"").append(Resource.getResource("js/prism/prism-core.min.js")).append("\"></script>\n");
Expand All @@ -207,7 +209,7 @@ public void visit(com.vladsch.flexmark.ast.Node node) {
}

/**
* load and parse prism/lang_dependencies.txt
* 载入并解析 prism/lang_dependencies.txt
*/
private static void initPrismLangDependencies() {
if (!prismLangDependenciesMap.isEmpty())
Expand All @@ -233,8 +235,7 @@ private static void initPrismLangDependencies() {
prismLangDependenciesMap.put(key, value);
}
}
} catch (IOException e) {
// ignore
} catch (IOException ignored) {
}
}

Expand Down

0 comments on commit 1f39180

Please sign in to comment.