Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git

WebView preview added

Author Karl Tauber <email>
Date 2015-07-22 17:15:01 GMT+0200
Commit a200763ed633cac44e18ca71689695c4dcb7cc36
Parent bd6a670
Delta 389 lines added, 1 line removed, 388-line increase
src/main/java/org/markdownwriterfx/preview/MarkdownPreviewPane.java
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
+import javafx.geometry.Side;
import javafx.scene.Node;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TabPane;
+import javafx.scene.control.TabPane.TabClosingPolicy;
import org.pegdown.ast.RootNode;
public class MarkdownPreviewPane
{
+ private final WebViewPreview webViewPreview = new WebViewPreview();
private final ASTPreview astPreview = new ASTPreview();
+ private TabPane tabPane;
public MarkdownPreviewPane() {
markdownAST.addListener((observable, oldValue, newValue) -> {
+ webViewPreview.update(newValue);
astPreview.update(newValue);
});
}
public Node getNode() {
- return astPreview.getNode();
+ if(tabPane == null) {
+ tabPane = new TabPane();
+ tabPane.setSide(Side.BOTTOM);
+ tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
+
+ Tab webViewTab = new Tab("Preview", webViewPreview.getNode());
+ tabPane.getTabs().add(webViewTab);
+
+ Tab astTab = new Tab("AST", astPreview.getNode());
+ tabPane.getTabs().add(astTab);
+ }
+ return tabPane;
}
src/main/java/org/markdownwriterfx/preview/WebViewPreview.java
+/*
+ * Copyright (c) 2015 Karl Tauber <karl at jformdesigner dot com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.markdownwriterfx.preview;
+
+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;
+
+/**
+ * WebView preview.
+ * Serializes the AST tree to HTML and shows it in a WebView.
+ *
+ * @author Karl Tauber
+ */
+class WebViewPreview
+{
+ private final WebView webView = new WebView();
+
+ Node getNode() {
+ return webView;
+ }
+
+ void update(RootNode astRoot) {
+ String html = new ToHtmlSerializer(new LinkRenderer(),
+ Collections.<String, VerbatimSerializer>emptyMap(),
+ PegDownPlugins.NONE.getHtmlSerializerPlugins())
+ .toHtml(astRoot);
+
+ webView.getEngine().loadContent(
+ "<!DOCTYPE html><html><head><link rel=\"stylesheet\" href=\""
+ + getClass().getResource("markdownpad-github.css")
+ + "\"></head><body>"
+ + html
+ + "</body></html>");
+ }
+}
src/main/java/org/markdownwriterfx/preview/markdownpad-github.css
+/*
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* Source: https://github.com/nicolashery/markdownpad-github */
+
+/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
+
+/* RESET
+=============================================================================*/
+
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+}
+
+/* BODY
+=============================================================================*/
+
+body {
+ font-family: Helvetica, arial, freesans, clean, sans-serif;
+ font-size: 14px;
+ line-height: 1.6;
+ color: #333;
+ background-color: #fff;
+ padding: 20px;
+ max-width: 960px;
+ margin: 0 auto;
+}
+
+body>*:first-child {
+ margin-top: 0 !important;
+}
+
+body>*:last-child {
+ margin-bottom: 0 !important;
+}
+
+/* BLOCKS
+=============================================================================*/
+
+p, blockquote, ul, ol, dl, table, pre {
+ margin: 15px 0;
+}
+
+/* HEADERS
+=============================================================================*/
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 20px 0 10px;
+ padding: 0;
+ font-weight: bold;
+ -webkit-font-smoothing: antialiased;
+}
+
+h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
+ font-size: inherit;
+}
+
+h1 {
+ font-size: 28px;
+ color: #000;
+}
+
+h2 {
+ font-size: 24px;
+ border-bottom: 1px solid #ccc;
+ color: #000;
+}
+
+h3 {
+ font-size: 18px;
+}
+
+h4 {
+ font-size: 16px;
+}
+
+h5 {
+ font-size: 14px;
+}
+
+h6 {
+ color: #777;
+ font-size: 14px;
+}
+
+body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
+ margin-top: 0;
+ padding-top: 0;
+}
+
+a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
+ margin-top: 0;
+ padding-top: 0;
+}
+
+h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
+ margin-top: 10px;
+}
+
+/* LINKS
+=============================================================================*/
+
+a {
+ color: #4183C4;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+/* LISTS
+=============================================================================*/
+
+ul, ol {
+ padding-left: 30px;
+}
+
+ul li > :first-child,
+ol li > :first-child,
+ul li ul:first-of-type,
+ol li ol:first-of-type,
+ul li ol:first-of-type,
+ol li ul:first-of-type {
+ margin-top: 0px;
+}
+
+ul ul, ul ol, ol ol, ol ul {
+ margin-bottom: 0;
+}
+
+dl {
+ padding: 0;
+}
+
+dl dt {
+ font-size: 14px;
+ font-weight: bold;
+ font-style: italic;
+ padding: 0;
+ margin: 15px 0 5px;
+}
+
+dl dt:first-child {
+ padding: 0;
+}
+
+dl dt>:first-child {
+ margin-top: 0px;
+}
+
+dl dt>:last-child {
+ margin-bottom: 0px;
+}
+
+dl dd {
+ margin: 0 0 15px;
+ padding: 0 15px;
+}
+
+dl dd>:first-child {
+ margin-top: 0px;
+}
+
+dl dd>:last-child {
+ margin-bottom: 0px;
+}
+
+/* CODE
+=============================================================================*/
+
+pre, code, tt {
+ font-size: 12px;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+}
+
+code, tt {
+ margin: 0 0px;
+ padding: 0px 0px;
+ white-space: nowrap;
+ border: 1px solid #eaeaea;
+ background-color: #f8f8f8;
+ border-radius: 3px;
+}
+
+pre>code {
+ margin: 0;
+ padding: 0;
+ white-space: pre;
+ border: none;
+ background: transparent;
+}
+
+pre {
+ background-color: #f8f8f8;
+ border: 1px solid #ccc;
+ font-size: 13px;
+ line-height: 19px;
+ overflow: auto;
+ padding: 6px 10px;
+ border-radius: 3px;
+}
+
+pre code, pre tt {
+ background-color: transparent;
+ border: none;
+}
+
+kbd {
+ -moz-border-bottom-colors: none;
+ -moz-border-left-colors: none;
+ -moz-border-right-colors: none;
+ -moz-border-top-colors: none;
+ background-color: #DDDDDD;
+ background-image: linear-gradient(#F1F1F1, #DDDDDD);
+ background-repeat: repeat-x;
+ border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
+ border-image: none;
+ border-radius: 2px 2px 2px 2px;
+ border-style: solid;
+ border-width: 1px;
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+ line-height: 10px;
+ padding: 1px 4px;
+}
+
+/* QUOTES
+=============================================================================*/
+
+blockquote {
+ border-left: 4px solid #DDD;
+ padding: 0 15px;
+ color: #777;
+}
+
+blockquote>:first-child {
+ margin-top: 0px;
+}
+
+blockquote>:last-child {
+ margin-bottom: 0px;
+}
+
+/* HORIZONTAL RULES
+=============================================================================*/
+
+hr {
+ clear: both;
+ margin: 15px 0;
+ height: 0px;
+ overflow: hidden;
+ border: none;
+ background: transparent;
+ border-bottom: 4px solid #ddd;
+ padding: 0;
+}
+
+/* TABLES
+=============================================================================*/
+
+table th {
+ font-weight: bold;
+}
+
+table th, table td {
+ border: 1px solid #ccc;
+ padding: 6px 13px;
+}
+
+table tr {
+ border-top: 1px solid #ccc;
+ background-color: #fff;
+}
+
+table tr:nth-child(2n) {
+ background-color: #f8f8f8;
+}
+
+/* IMAGES
+=============================================================================*/
+
+img {
+ max-width: 100%
+}