package com.scrivenvar.processors;
import com.scrivenvar.AbstractFileFactory;
import com.scrivenvar.FileEditorTab;
import com.scrivenvar.preview.HTMLPreviewPane;
import java.nio.file.Path;
import java.util.Map;
import javafx.beans.value.ObservableValue;
public class ProcessorFactory extends AbstractFileFactory {
private final HTMLPreviewPane previewPane;
private final Map<String, String> resolvedMap;
private Processor<String> terminalProcessChain;
public ProcessorFactory(
final HTMLPreviewPane previewPane,
final Map<String, String> resolvedMap ) {
this.previewPane = previewPane;
this.resolvedMap = resolvedMap;
}
public Processor<String> createProcessor( final FileEditorTab tab ) {
final Path path = tab.getPath();
final Processor<String> processor;
switch( lookup( path ) ) {
case RMARKDOWN:
processor = createRProcessor( tab );
break;
case SOURCE:
processor = createMarkdownProcessor( tab );
break;
case XML:
processor = createXMLProcessor( tab );
break;
case RXML:
processor = createRXMLProcessor( tab );
break;
default:
processor = createIdentityProcessor( tab );
break;
}
return processor;
}
private Processor<String> getCommonProcessor() {
if( this.terminalProcessChain == null ) {
this.terminalProcessChain = createCommonProcessor();
}
return this.terminalProcessChain;
}
private Processor<String> createCommonProcessor() {
final Processor<String> hpp = new HTMLPreviewProcessor( getPreviewPane() );
final Processor<String> mcrp = new CaretReplacementProcessor( hpp );
final Processor<String> mpp = new MarkdownProcessor( mcrp );
return mpp;
}
protected Processor<String> createIdentityProcessor( final FileEditorTab tab ) {
final Processor<String> hpp = new HTMLPreviewProcessor( getPreviewPane() );
final Processor<String> ip = new IdentityProcessor( hpp );
return ip;
}
protected Processor<String> createMarkdownProcessor( final FileEditorTab tab ) {
final ObservableValue<Integer> caret = tab.caretPositionProperty();
final Processor<String> tpc = getCommonProcessor();
final Processor<String> cip = createMarkdownInsertionProcessor( tpc, caret );
final Processor<String> dvp = new DefaultVariableProcessor( cip, getResolvedMap() );
return dvp;
}
protected Processor<String> createXMLProcessor( final FileEditorTab tab ) {
final ObservableValue<Integer> caret = tab.caretPositionProperty();
final Processor<String> tpc = getCommonProcessor();
final Processor<String> xmlp = new XMLProcessor( tpc, tab.getPath() );
final Processor<String> dvp = new DefaultVariableProcessor( xmlp, getResolvedMap() );
final Processor<String> xcip = createXMLInsertionProcessor( dvp, caret );
return xcip;
}
protected Processor<String> createRProcessor( final FileEditorTab tab ) {
final ObservableValue<Integer> caret = tab.caretPositionProperty();
final Processor<String> tpc = getCommonProcessor();
final Processor<String> rp = new InlineRProcessor( tpc, getResolvedMap(), tab.getPath() );
final Processor<String> rvp = new RVariableProcessor( rp, getResolvedMap() );
final Processor<String> cip = createRInsertionProcessor( rvp, caret );
return cip;
}
protected Processor<String> createRXMLProcessor( final FileEditorTab tab ) {
final ObservableValue<Integer> caret = tab.caretPositionProperty();
final Processor<String> tpc = getCommonProcessor();
final Processor<String> xmlp = new XMLProcessor( tpc, tab.getPath() );
final Processor<String> rp = new InlineRProcessor( xmlp, getResolvedMap(), tab.getPath() );
final Processor<String> rvp = new RVariableProcessor( rp, getResolvedMap() );
final Processor<String> xcip = createXMLInsertionProcessor( rvp, caret );
return xcip;
}
private Processor<String> createMarkdownInsertionProcessor(
final Processor<String> tpc, final ObservableValue<Integer> caret ) {
return new MarkdownCaretInsertionProcessor( tpc, caret );
}
private Processor<String> createRInsertionProcessor(
final Processor<String> processor, final ObservableValue<Integer> caret ) {
return new RMarkdownCaretInsertionProcessor( processor, caret );
}
private Processor<String> createXMLInsertionProcessor(
final Processor<String> tpc, final ObservableValue<Integer> caret ) {
return new XMLCaretInsertionProcessor( tpc, caret );
}
private HTMLPreviewPane getPreviewPane() {
return this.previewPane;
}
private Map<String, String> getResolvedMap() {
return this.resolvedMap;
}
}