private IProducerConsumer CreateChain(ConverterInput input, ConverterOutput output, IProgressMonitor progressMonitor) { locked = true; HtmlInjection injection = null; if (injectHead != null || injectTail != null) { injection = new HtmlInjection( injectHead, injectTail, injectionFormat, filterHtml, htmlCallback, testBoundaryConditions, null, progressMonitor); normalizeInputHtml = true; } if (filterHtml || outputFragment || htmlCallback != null) { normalizeInputHtml = true; } IHtmlParser parser; if (normalizeInputHtml) { var preParser = new HtmlParser( input, detectEncodingFromMetaTag, false, testMaxTokenRuns, testMaxHtmlTagAttributes, testBoundaryConditions); parser = new HtmlNormalizingParser( preParser, injection, htmlCallback != null, testMaxHtmlNormalizerNesting, testBoundaryConditions, testNormalizerTraceStream, testNormalizerTraceShowTokenNum, testNormalizerTraceStopOnTokenNum); } else { parser = new HtmlParser( input, detectEncodingFromMetaTag, false, testMaxTokenRuns, testMaxHtmlTagAttributes, testBoundaryConditions); } var writer = new HtmlWriter( output, filterHtml, normalizeInputHtml && !testNoNewLines); return(new HtmlToHtmlConverter( parser, writer, testConvertFragment, outputFragment, filterHtml, htmlCallback, testTruncateForCallback, injection != null && injection.HaveTail, testTraceStream, testTraceShowTokenNum, testTraceStopOnTokenNum, smallCssBlockThreshold, preserveDisplayNoneStyle, progressMonitor)); }