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; } }