From b1d56c90fe7084e0b218b7092fd1c7cd57b1ff21 Mon Sep 17 00:00:00 2001 From: Rahman Usta Date: Mon, 31 Aug 2015 17:58:52 +0300 Subject: [PATCH] - Manage Asciidoctor options seamlessly --- .../kodcu/config/AsciidocConfigMerger.java | 95 +++++++++++++++++++ .../engine/AsciidocNashornConverter.java | 43 +++++---- .../kodcu/engine/AsciidocWebkitConverter.java | 66 ++++++------- src/main/resources/public/js/converters.js | 10 +- src/main/resources/public/js/optionhelper.js | 31 ------ src/main/resources/public/worker.html | 1 - 6 files changed, 156 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/kodcu/config/AsciidocConfigMerger.java delete mode 100644 src/main/resources/public/js/optionhelper.js diff --git a/src/main/java/com/kodcu/config/AsciidocConfigMerger.java b/src/main/java/com/kodcu/config/AsciidocConfigMerger.java new file mode 100644 index 000000000..16067cf13 --- /dev/null +++ b/src/main/java/com/kodcu/config/AsciidocConfigMerger.java @@ -0,0 +1,95 @@ +package com.kodcu.config; + +import javafx.collections.ObservableList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.json.*; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by usta on 31.08.2015. + */ +@Component +public class AsciidocConfigMerger { + + private Logger logger = LoggerFactory.getLogger(AsciidocConfigMerger.class); + + private final EditorConfigBean editorConfigBean; + + public final Pattern attributePattern = Pattern.compile("^:(?.*):(.*)$", Pattern.MULTILINE); + + @Autowired + public AsciidocConfigMerger(EditorConfigBean editorConfigBean) { + this.editorConfigBean = editorConfigBean; + } + + public JsonObject updateConfig(String asciidoc, JsonObject config) { + try { + + Matcher matcher = attributePattern.matcher(asciidoc); + + JsonObject currentAttributes = config.getJsonObject("attributes"); + + JsonObjectBuilder finalBuilder = Json.createObjectBuilder(); + JsonArrayBuilder finalAttrBuilder = Json.createArrayBuilder(); + + // add converter attributes + for (Map.Entry entry : config.entrySet()) { + String key = entry.getKey(); + JsonValue value = entry.getValue(); + + if (!"attributes".equals(key)) { + finalBuilder.add(key, value); + } + } + + // find document attributes + List foundKeys = new LinkedList<>(); + while (matcher.find()) { + String key = matcher.group("key"); + foundKeys.add(key); + } + + // add document attributes + for (Map.Entry entry : currentAttributes.entrySet()) { + String key = entry.getKey(); + JsonValue value = entry.getValue(); + String finalValue = ""; + + if (value.getValueType() == JsonValue.ValueType.STRING) { + finalValue = ((JsonString) value).getString(); + } else { + finalValue = value.toString().replace("\"", ""); + } + + if (!foundKeys.contains(key)) { + finalAttrBuilder.add(key + "=" + finalValue); + } + } + + + if (!foundKeys.contains("lang") && !currentAttributes.containsKey("lang")) { + ObservableList defaultLanguage = editorConfigBean.getDefaultLanguage(); + + if (defaultLanguage.size() > 0) { + finalAttrBuilder.add("lang=" + defaultLanguage.get(0)); + } + + } + + finalBuilder.add("attributes", finalAttrBuilder); + + return finalBuilder.build(); + } catch (Exception e) { + logger.error("Problem occured while merging options", e); + } + return config; + } +} diff --git a/src/main/java/com/kodcu/engine/AsciidocNashornConverter.java b/src/main/java/com/kodcu/engine/AsciidocNashornConverter.java index ad5e660ed..39af83bc8 100644 --- a/src/main/java/com/kodcu/engine/AsciidocNashornConverter.java +++ b/src/main/java/com/kodcu/engine/AsciidocNashornConverter.java @@ -1,24 +1,29 @@ package com.kodcu.engine; -import com.kodcu.config.DocbookConfigBean; -import com.kodcu.config.HtmlConfigBean; -import com.kodcu.config.OdfConfigBean; -import com.kodcu.config.PreviewConfigBean; +import com.kodcu.config.*; import com.kodcu.controller.ApplicationController; import com.kodcu.other.ConverterResult; import com.kodcu.service.ThreadService; +import javafx.collections.ObservableList; import jdk.nashorn.api.scripting.JSObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; import javax.script.*; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.regex.Matcher; /** * Created by usta on 22.08.2015. @@ -31,6 +36,7 @@ public class AsciidocNashornConverter implements AsciidocConvertible { private final ApplicationController controller; private final DocbookConfigBean docbookConfigBean; private final ThreadService threadService; + private final EditorConfigBean editorConfigBean; private final CompletableFuture completableFuture = new CompletableFuture(); private Invocable invocable; @@ -39,17 +45,20 @@ public class AsciidocNashornConverter implements AsciidocConvertible { private final PreviewConfigBean previewConfigBean; private final HtmlConfigBean htmlConfigBean; private final OdfConfigBean odfConfigBean; + private final AsciidocConfigMerger configMerger; @Autowired - public AsciidocNashornConverter(ScriptEngine scriptEngine, ApplicationController controller, DocbookConfigBean docbookConfigBean, ThreadService threadService, PreviewConfigBean previewConfigBean, HtmlConfigBean htmlConfigBean, OdfConfigBean odfConfigBean) { + public AsciidocNashornConverter(ScriptEngine scriptEngine, ApplicationController controller, DocbookConfigBean docbookConfigBean, ThreadService threadService, EditorConfigBean editorConfigBean, PreviewConfigBean previewConfigBean, HtmlConfigBean htmlConfigBean, OdfConfigBean odfConfigBean, AsciidocConfigMerger configMerger) { this.scriptEngine = scriptEngine; this.controller = controller; this.docbookConfigBean = docbookConfigBean; this.threadService = threadService; + this.editorConfigBean = editorConfigBean; this.previewConfigBean = previewConfigBean; this.htmlConfigBean = htmlConfigBean; this.odfConfigBean = odfConfigBean; + this.configMerger = configMerger; completableFuture.runAsync(() -> { try { @@ -61,7 +70,7 @@ public AsciidocNashornConverter(ScriptEngine scriptEngine, ApplicationController List scripts = Arrays.asList("jade.js", "asciidoctor-all.js", "asciidoctor-image-size-info.js", "asciidoctor-uml-block.js", "asciidoctor-ditaa-block.js", "asciidoctor-math-block.js", "asciidoctor-tree-block.js", "asciidoctor-chart-block.js", "asciidoctor-docbook.js", - "asciidoctor-reveal.js", "asciidoctor-deck.js", "asciidoctor-odf.js", "optionhelper.js", + "asciidoctor-reveal.js", "asciidoctor-deck.js", "asciidoctor-odf.js", "outliner.js", "converters.js"); @@ -86,12 +95,14 @@ public AsciidocNashornConverter(ScriptEngine scriptEngine, ApplicationController } - private ConverterResult convert(String functionName, String asciidoc, String config) { + private ConverterResult convert(String functionName, String asciidoc, JsonObject config) { try { completableFuture.join(); - Object o = invocable.invokeFunction(functionName, asciidoc, config); + JsonObject finalConfig = updateConfig(asciidoc, config); + + Object o = invocable.invokeFunction(functionName, asciidoc, finalConfig.toString()); JSObject convertDocbook = (JSObject) o; ConverterResult converterResult = new ConverterResult(convertDocbook); return converterResult; @@ -105,26 +116,22 @@ private ConverterResult convert(String functionName, String asciidoc, String con @Override public ConverterResult convertDocbook(String asciidoc) { - String config = docbookConfigBean.getJSON().toString(); - return convert("convertDocbook", asciidoc, config); + return convert("convertDocbook", asciidoc, docbookConfigBean.getJSON()); } @Override public ConverterResult convertAsciidoc(String asciidoc) { - String config = previewConfigBean.getJSON().toString(); - return convert("convertAsciidoc", asciidoc, config); + return convert("convertAsciidoc", asciidoc, previewConfigBean.getJSON()); } @Override public ConverterResult convertHtml(String asciidoc) { - String config = htmlConfigBean.getJSON().toString(); - return convert("convertHtml", asciidoc, config); + return convert("convertHtml", asciidoc, htmlConfigBean.getJSON()); } @Override public void convertOdf(String asciidoc) { - String config = odfConfigBean.getJSON().toString(); - convert("convertOdf", asciidoc, config); + convert("convertOdf", asciidoc, odfConfigBean.getJSON()); } @Override @@ -137,4 +144,8 @@ public void fillOutlines(Object doc) { } }); } + + private JsonObject updateConfig(String asciidoc, JsonObject config) { + return configMerger.updateConfig(asciidoc, config); + } } diff --git a/src/main/java/com/kodcu/engine/AsciidocWebkitConverter.java b/src/main/java/com/kodcu/engine/AsciidocWebkitConverter.java index 72d37b854..4fd3c6736 100644 --- a/src/main/java/com/kodcu/engine/AsciidocWebkitConverter.java +++ b/src/main/java/com/kodcu/engine/AsciidocWebkitConverter.java @@ -1,10 +1,7 @@ package com.kodcu.engine; import com.kodcu.component.ViewPanel; -import com.kodcu.config.DocbookConfigBean; -import com.kodcu.config.HtmlConfigBean; -import com.kodcu.config.OdfConfigBean; -import com.kodcu.config.PreviewConfigBean; +import com.kodcu.config.*; import com.kodcu.controller.ApplicationController; import com.kodcu.other.ConverterResult; import com.kodcu.other.Current; @@ -18,10 +15,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.json.JsonObject; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; @@ -35,16 +33,18 @@ public class AsciidocWebkitConverter extends ViewPanel implements AsciidocConver private final OdfConfigBean odfConfigBean; private final DocbookConfigBean docbookConfigBean; private final HtmlConfigBean htmlConfigBean; + private final AsciidocConfigMerger configMerger; private Logger logger = LoggerFactory.getLogger(AsciidocWebkitConverter.class); @Autowired - public AsciidocWebkitConverter(ThreadService threadService, ApplicationController controller, Current current, PreviewConfigBean previewConfigBean, OdfConfigBean odfConfigBean, DocbookConfigBean docbookConfigBean, HtmlConfigBean htmlConfigBean) { + public AsciidocWebkitConverter(ThreadService threadService, ApplicationController controller, Current current, PreviewConfigBean previewConfigBean, OdfConfigBean odfConfigBean, DocbookConfigBean docbookConfigBean, HtmlConfigBean htmlConfigBean, AsciidocConfigMerger configMerger) { super(threadService, controller, current); this.previewConfigBean = previewConfigBean; this.odfConfigBean = odfConfigBean; this.docbookConfigBean = docbookConfigBean; this.htmlConfigBean = htmlConfigBean; + this.configMerger = configMerger; } public WebView getWebView() { @@ -88,58 +88,52 @@ public String findRenderedSelection(String content) { return (String) webEngine().executeScript("findRenderedSelection(context)"); } - private ConverterResult convert(String functionName, String asciidoc, String config) { + protected ConverterResult convert(String functionName, String asciidoc, JsonObject config) { - if (!Platform.isFxApplicationThread()) { - final CompletableFuture completableFuture = new CompletableFuture<>(); + final CompletableFuture completableFuture = new CompletableFuture<>(); - completableFuture.runAsync(() -> { - threadService.runActionLater(() -> { - try { - ConverterResult result = convert(functionName, asciidoc, config); - completableFuture.complete(result); - } catch (Exception e) { - completableFuture.completeExceptionally(e); - } - }); - }, threadService.executor()); + CompletableFuture.runAsync(() -> { + JsonObject finalConfig = updateConfig(asciidoc, config); + threadService.runActionLater(() -> { + try { + this.setMember("editorValue", asciidoc); + this.setMember("editorOptions", finalConfig.toString()); + JSObject result = (JSObject) webEngine().executeScript(String.format("%s(editorValue,editorOptions)", functionName)); + ConverterResult converterResult = new ConverterResult(result); - return completableFuture.join(); - } + completableFuture.complete(converterResult); + } catch (Exception e) { + completableFuture.completeExceptionally(e); + } + }); + }, threadService.executor()); -// long start = System.currentTimeMillis(); + return completableFuture.join(); - this.setMember("editorValue", asciidoc); - this.setMember("editorOptions", config); - JSObject result = (JSObject) webEngine().executeScript(String.format("%s(editorValue,editorOptions)", functionName)); - ConverterResult converterResult = new ConverterResult(result); -// logger.debug("Rendered in {}", (System.currentTimeMillis() - start)); - return converterResult; + } + private JsonObject updateConfig(String asciidoc, JsonObject config) { + return configMerger.updateConfig(asciidoc, config); } @Override public ConverterResult convertDocbook(String asciidoc) { - String config = docbookConfigBean.getJSON().toString(); - return convert("convertDocbook", asciidoc, config); + return convert("convertDocbook", asciidoc, docbookConfigBean.getJSON()); } @Override public ConverterResult convertAsciidoc(String asciidoc) { - String config = previewConfigBean.getJSON().toString(); - return convert("convertAsciidoc", asciidoc, config); + return convert("convertAsciidoc", asciidoc, previewConfigBean.getJSON()); } @Override public ConverterResult convertHtml(String asciidoc) { - String config = htmlConfigBean.getJSON().toString(); - return convert("convertHtml", asciidoc, config); + return convert("convertHtml", asciidoc, htmlConfigBean.getJSON()); } @Override public void convertOdf(String asciidoc) { - String config = odfConfigBean.getJSON().toString(); - convert("convertOdf", asciidoc, config); + convert("convertOdf", asciidoc, odfConfigBean.getJSON()); } public boolean isHtml(String text) { diff --git a/src/main/resources/public/js/converters.js b/src/main/resources/public/js/converters.js index 8dc25b03e..8dd597428 100644 --- a/src/main/resources/public/js/converters.js +++ b/src/main/resources/public/js/converters.js @@ -7,6 +7,10 @@ if ((typeof setTimeout) == "undefined") { }; } +function getOption(options) { + return Opal.hash(JSON.parse(options)); +} + var filloutTimeout; function convertAsciidoc(content, options) { @@ -39,8 +43,6 @@ function convertOdf(content, options) { var doc = Opal.Asciidoctor.$load(content, getOption(options)); - doc.attributes.keys["lang"] = doc.attributes.keys["lang"] || getDefaultLanguage(); - return doc.$convert(); } @@ -48,8 +50,6 @@ function convertHtml(content, options) { var doc = Opal.Asciidoctor.$load(content, getOption(options)); - doc.attributes.keys["lang"] = doc.attributes.keys["lang"] || getDefaultLanguage(); - return { rendered: doc.$render(), doctype: doc.doctype, @@ -61,8 +61,6 @@ function convertDocbook(content, options) { var doc = Opal.Asciidoctor.$load(content, getOption(options)); - //doc.attributes.keys["lang"] = doc.attributes.keys["lang"] || getDefaultLanguage(); - return { rendered: doc.$render(), doctype: doc.doctype, diff --git a/src/main/resources/public/js/optionhelper.js b/src/main/resources/public/js/optionhelper.js deleted file mode 100644 index a2a62d9e3..000000000 --- a/src/main/resources/public/js/optionhelper.js +++ /dev/null @@ -1,31 +0,0 @@ -function getOption(opt) { - - var jsonObject = JSON.parse(opt); - - var attrs = jsonObject.attributes; - var attrKeys = Object.keys(attrs); - var fixAttr = []; - - fixAttr.push("lang=" + getDefaultLanguage()); - - attrKeys.forEach(function (key, index) { - fixAttr.push(key + "=" + attrs[key]); - }); - - jsonObject.attributes = fixAttr; - - return Opal.hash2(Object.keys(jsonObject), jsonObject); -}; - - -function getDefaultLanguage() { - var defaultLanguage = "en"; - - if ((typeof afx) != "undefined") { - var languages = afx.getEditorConfigBean().getDefaultLanguage(); - if (languages.size() > 0) { - defaultLanguage = languages.get(0); - } - } - return defaultLanguage; -} \ No newline at end of file diff --git a/src/main/resources/public/worker.html b/src/main/resources/public/worker.html index d50226f09..9619fd714 100644 --- a/src/main/resources/public/worker.html +++ b/src/main/resources/public/worker.html @@ -21,7 +21,6 @@ -