package com.kodcu.service.convert.docbook;
import com.kodcu.config.DocbookConfigBean;
import com.kodcu.engine.AsciidocConverterProvider;
import com.kodcu.other.Current;
import com.kodcu.other.IOHelper;
import com.kodcu.other.XMLHelper;
import com.kodcu.service.ThreadService;
import com.kodcu.service.convert.DocumentConverter;
import org.joox.Match;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.xml.sax.InputSource;
import java.io.StringReader;
import java.nio.file.Path;
import java.util.function.Consumer;
import static org.joox.JOOX.$;
/**
* Created by usta on 19.07.2014.
*/
@Component
public class DocBookConverter implements DocbookTraversable, DocumentConverter<String> {
private Logger logger = LoggerFactory.getLogger(DocBookConverter.class);
private final Current current;
private final AsciidocConverterProvider converterProvider;
private final DocbookValidator docbookValidator;
private final DocbookConfigBean docbookConfigBean;
private final ThreadService threadService;
@Autowired
public DocBookConverter(Current current, AsciidocConverterProvider converterProvider, DocbookValidator docbookValidator, DocbookConfigBean docbookConfigBean, ThreadService threadService) {
this.current = current;
this.converterProvider = converterProvider;
this.docbookValidator = docbookValidator;
this.docbookConfigBean = docbookConfigBean;
this.threadService = threadService;
}
@Override
public void convert(boolean askPath, Consumer<String>... nextStep) {
Path currentTabPath = current.currentPath().get();
Path currentTabPathDir = currentTabPath.getParent();
String asciidoc = current.currentEditorValue();
threadService.runTaskLater(() -> {
String rendered = converterProvider.get(docbookConfigBean).convertDocbook(asciidoc).getRendered();
boolean validated = docbookValidator.validateDocbook(rendered);
if (!validated)
return;
StringReader bookReader = new StringReader(rendered);
Match rootDocument = IOHelper.$(new InputSource(bookReader));
bookReader.close();
// // makes figure centering
rootDocument.find("figure").find("imagedata").attr("align", "center");
// remove callout's duplicated refs and pick last
rootDocument.find("callout").forEach(elem -> {
String arearefs = $(elem).attr("arearefs");
String[] cos = arearefs.split(" ");
if (cos.length > 1)
$(elem).attr("arearefs", cos[cos.length - 1]);
});
String result = XMLHelper.nodeToString(rootDocument.document(), false);
// result = result.replace("00HEADER00COLON00", ":");
for (Consumer<String> step : nextStep) {
step.accept(result);
}
});
}
}