Skip to content

Commit

Permalink
- Manage Asciidoctor options seamlessly
Browse files Browse the repository at this point in the history
  • Loading branch information
rahmanusta committed Aug 31, 2015
1 parent 893bc9f commit b1d56c9
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 90 deletions.
95 changes: 95 additions & 0 deletions 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("^:(?<key>.*):(.*)$", 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<String, JsonValue> entry : config.entrySet()) {
String key = entry.getKey();
JsonValue value = entry.getValue();

if (!"attributes".equals(key)) {
finalBuilder.add(key, value);
}
}

// find document attributes
List<String> foundKeys = new LinkedList<>();
while (matcher.find()) {
String key = matcher.group("key");
foundKeys.add(key);
}

// add document attributes
for (Map.Entry<String, JsonValue> 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<String> 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;
}
}
43 changes: 27 additions & 16 deletions src/main/java/com/kodcu/engine/AsciidocNashornConverter.java
@@ -1,24 +1,29 @@
package com.kodcu.engine; package com.kodcu.engine;


import com.kodcu.config.DocbookConfigBean; import com.kodcu.config.*;
import com.kodcu.config.HtmlConfigBean;
import com.kodcu.config.OdfConfigBean;
import com.kodcu.config.PreviewConfigBean;
import com.kodcu.controller.ApplicationController; import com.kodcu.controller.ApplicationController;
import com.kodcu.other.ConverterResult; import com.kodcu.other.ConverterResult;
import com.kodcu.service.ThreadService; import com.kodcu.service.ThreadService;
import javafx.collections.ObservableList;
import jdk.nashorn.api.scripting.JSObject; import jdk.nashorn.api.scripting.JSObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; 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 javax.script.*;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;


/** /**
* Created by usta on 22.08.2015. * Created by usta on 22.08.2015.
Expand All @@ -31,6 +36,7 @@ public class AsciidocNashornConverter implements AsciidocConvertible {
private final ApplicationController controller; private final ApplicationController controller;
private final DocbookConfigBean docbookConfigBean; private final DocbookConfigBean docbookConfigBean;
private final ThreadService threadService; private final ThreadService threadService;
private final EditorConfigBean editorConfigBean;
private final CompletableFuture completableFuture = new CompletableFuture(); private final CompletableFuture completableFuture = new CompletableFuture();


private Invocable invocable; private Invocable invocable;
Expand All @@ -39,17 +45,20 @@ public class AsciidocNashornConverter implements AsciidocConvertible {
private final PreviewConfigBean previewConfigBean; private final PreviewConfigBean previewConfigBean;
private final HtmlConfigBean htmlConfigBean; private final HtmlConfigBean htmlConfigBean;
private final OdfConfigBean odfConfigBean; private final OdfConfigBean odfConfigBean;
private final AsciidocConfigMerger configMerger;


@Autowired @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.scriptEngine = scriptEngine;
this.controller = controller; this.controller = controller;
this.docbookConfigBean = docbookConfigBean; this.docbookConfigBean = docbookConfigBean;
this.threadService = threadService; this.threadService = threadService;
this.editorConfigBean = editorConfigBean;
this.previewConfigBean = previewConfigBean; this.previewConfigBean = previewConfigBean;
this.htmlConfigBean = htmlConfigBean; this.htmlConfigBean = htmlConfigBean;
this.odfConfigBean = odfConfigBean; this.odfConfigBean = odfConfigBean;
this.configMerger = configMerger;


completableFuture.runAsync(() -> { completableFuture.runAsync(() -> {
try { try {
Expand All @@ -61,7 +70,7 @@ public AsciidocNashornConverter(ScriptEngine scriptEngine, ApplicationController
List<String> scripts = Arrays.asList("jade.js", "asciidoctor-all.js", "asciidoctor-image-size-info.js", List<String> 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-uml-block.js", "asciidoctor-ditaa-block.js", "asciidoctor-math-block.js",
"asciidoctor-tree-block.js", "asciidoctor-chart-block.js", "asciidoctor-docbook.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"); "outliner.js", "converters.js");




Expand All @@ -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 { try {
completableFuture.join(); 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; JSObject convertDocbook = (JSObject) o;
ConverterResult converterResult = new ConverterResult(convertDocbook); ConverterResult converterResult = new ConverterResult(convertDocbook);
return converterResult; return converterResult;
Expand All @@ -105,26 +116,22 @@ private ConverterResult convert(String functionName, String asciidoc, String con


@Override @Override
public ConverterResult convertDocbook(String asciidoc) { public ConverterResult convertDocbook(String asciidoc) {
String config = docbookConfigBean.getJSON().toString(); return convert("convertDocbook", asciidoc, docbookConfigBean.getJSON());
return convert("convertDocbook", asciidoc, config);
} }


@Override @Override
public ConverterResult convertAsciidoc(String asciidoc) { public ConverterResult convertAsciidoc(String asciidoc) {
String config = previewConfigBean.getJSON().toString(); return convert("convertAsciidoc", asciidoc, previewConfigBean.getJSON());
return convert("convertAsciidoc", asciidoc, config);
} }


@Override @Override
public ConverterResult convertHtml(String asciidoc) { public ConverterResult convertHtml(String asciidoc) {
String config = htmlConfigBean.getJSON().toString(); return convert("convertHtml", asciidoc, htmlConfigBean.getJSON());
return convert("convertHtml", asciidoc, config);
} }


@Override @Override
public void convertOdf(String asciidoc) { public void convertOdf(String asciidoc) {
String config = odfConfigBean.getJSON().toString(); convert("convertOdf", asciidoc, odfConfigBean.getJSON());
convert("convertOdf", asciidoc, config);
} }


@Override @Override
Expand All @@ -137,4 +144,8 @@ public void fillOutlines(Object doc) {
} }
}); });
} }

private JsonObject updateConfig(String asciidoc, JsonObject config) {
return configMerger.updateConfig(asciidoc, config);
}
} }
66 changes: 30 additions & 36 deletions src/main/java/com/kodcu/engine/AsciidocWebkitConverter.java
@@ -1,10 +1,7 @@
package com.kodcu.engine; package com.kodcu.engine;


import com.kodcu.component.ViewPanel; import com.kodcu.component.ViewPanel;
import com.kodcu.config.DocbookConfigBean; import com.kodcu.config.*;
import com.kodcu.config.HtmlConfigBean;
import com.kodcu.config.OdfConfigBean;
import com.kodcu.config.PreviewConfigBean;
import com.kodcu.controller.ApplicationController; import com.kodcu.controller.ApplicationController;
import com.kodcu.other.ConverterResult; import com.kodcu.other.ConverterResult;
import com.kodcu.other.Current; import com.kodcu.other.Current;
Expand All @@ -18,10 +15,11 @@
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;


import javax.json.JsonObject;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Optional; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream; import java.util.stream.Stream;


Expand All @@ -35,16 +33,18 @@ public class AsciidocWebkitConverter extends ViewPanel implements AsciidocConver
private final OdfConfigBean odfConfigBean; private final OdfConfigBean odfConfigBean;
private final DocbookConfigBean docbookConfigBean; private final DocbookConfigBean docbookConfigBean;
private final HtmlConfigBean htmlConfigBean; private final HtmlConfigBean htmlConfigBean;
private final AsciidocConfigMerger configMerger;


private Logger logger = LoggerFactory.getLogger(AsciidocWebkitConverter.class); private Logger logger = LoggerFactory.getLogger(AsciidocWebkitConverter.class);


@Autowired @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); super(threadService, controller, current);
this.previewConfigBean = previewConfigBean; this.previewConfigBean = previewConfigBean;
this.odfConfigBean = odfConfigBean; this.odfConfigBean = odfConfigBean;
this.docbookConfigBean = docbookConfigBean; this.docbookConfigBean = docbookConfigBean;
this.htmlConfigBean = htmlConfigBean; this.htmlConfigBean = htmlConfigBean;
this.configMerger = configMerger;
} }


public WebView getWebView() { public WebView getWebView() {
Expand Down Expand Up @@ -88,58 +88,52 @@ public String findRenderedSelection(String content) {
return (String) webEngine().executeScript("findRenderedSelection(context)"); 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<ConverterResult> completableFuture = new CompletableFuture<>();
final CompletableFuture<ConverterResult> completableFuture = new CompletableFuture<>();


completableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
threadService.runActionLater(() -> { JsonObject finalConfig = updateConfig(asciidoc, config);
try { threadService.runActionLater(() -> {
ConverterResult result = convert(functionName, asciidoc, config); try {
completableFuture.complete(result); this.setMember("editorValue", asciidoc);
} catch (Exception e) { this.setMember("editorOptions", finalConfig.toString());
completableFuture.completeExceptionally(e); JSObject result = (JSObject) webEngine().executeScript(String.format("%s(editorValue,editorOptions)", functionName));
} ConverterResult converterResult = new ConverterResult(result);
});
}, threadService.executor());


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 @Override
public ConverterResult convertDocbook(String asciidoc) { public ConverterResult convertDocbook(String asciidoc) {
String config = docbookConfigBean.getJSON().toString(); return convert("convertDocbook", asciidoc, docbookConfigBean.getJSON());
return convert("convertDocbook", asciidoc, config);
} }


@Override @Override
public ConverterResult convertAsciidoc(String asciidoc) { public ConverterResult convertAsciidoc(String asciidoc) {
String config = previewConfigBean.getJSON().toString(); return convert("convertAsciidoc", asciidoc, previewConfigBean.getJSON());
return convert("convertAsciidoc", asciidoc, config);
} }


@Override @Override
public ConverterResult convertHtml(String asciidoc) { public ConverterResult convertHtml(String asciidoc) {
String config = htmlConfigBean.getJSON().toString(); return convert("convertHtml", asciidoc, htmlConfigBean.getJSON());
return convert("convertHtml", asciidoc, config);
} }


@Override @Override
public void convertOdf(String asciidoc) { public void convertOdf(String asciidoc) {
String config = odfConfigBean.getJSON().toString(); convert("convertOdf", asciidoc, odfConfigBean.getJSON());
convert("convertOdf", asciidoc, config);
} }


public boolean isHtml(String text) { public boolean isHtml(String text) {
Expand Down
10 changes: 4 additions & 6 deletions src/main/resources/public/js/converters.js
Expand Up @@ -7,6 +7,10 @@ if ((typeof setTimeout) == "undefined") {
}; };
} }


function getOption(options) {
return Opal.hash(JSON.parse(options));
}

var filloutTimeout; var filloutTimeout;
function convertAsciidoc(content, options) { function convertAsciidoc(content, options) {


Expand Down Expand Up @@ -39,17 +43,13 @@ function convertOdf(content, options) {


var doc = Opal.Asciidoctor.$load(content, getOption(options)); var doc = Opal.Asciidoctor.$load(content, getOption(options));


doc.attributes.keys["lang"] = doc.attributes.keys["lang"] || getDefaultLanguage();

return doc.$convert(); return doc.$convert();
} }


function convertHtml(content, options) { function convertHtml(content, options) {


var doc = Opal.Asciidoctor.$load(content, getOption(options)); var doc = Opal.Asciidoctor.$load(content, getOption(options));


doc.attributes.keys["lang"] = doc.attributes.keys["lang"] || getDefaultLanguage();

return { return {
rendered: doc.$render(), rendered: doc.$render(),
doctype: doc.doctype, doctype: doc.doctype,
Expand All @@ -61,8 +61,6 @@ function convertDocbook(content, options) {


var doc = Opal.Asciidoctor.$load(content, getOption(options)); var doc = Opal.Asciidoctor.$load(content, getOption(options));


//doc.attributes.keys["lang"] = doc.attributes.keys["lang"] || getDefaultLanguage();

return { return {
rendered: doc.$render(), rendered: doc.$render(),
doctype: doc.doctype, doctype: doc.doctype,
Expand Down

0 comments on commit b1d56c9

Please sign in to comment.