/*=============================================================================#
# Copyright (c) 2015-2016 David Green and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
# David Green - initial API and implementation in Mylyn
# Stephan Wahlbrink (WalWare.de)
#=============================================================================*/
package de.walware.docmlet.wikitext.internal.commonmark.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
import org.eclipse.mylyn.wikitext.core.parser.HtmlParser;
import org.eclipse.mylyn.wikitext.core.parser.IdGenerator;
import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentHandler;
import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import de.walware.docmlet.wikitext.commonmark.core.CommonmarkLanguage;
import de.walware.docmlet.wikitext.commonmark.core.ICommonmarkConfig;
import de.walware.docmlet.wikitext.internal.commonmark.core.spec.SimplifiedHtmlDocumentBuilder;
public class CommonmarkAsserts {
public static ProcessingContext newContext() {
return new ProcessingContext(Commonmark.newSourceBlocks(), Commonmark.newInlineParser(),
createCommonmarkIdGenerator(), ProcessingContext.INITIALIZE_CONTEXT );
}
private static IdGenerator createCommonmarkIdGenerator() {
IdGenerator idGenerator= new IdGenerator();
idGenerator.setGenerationStrategy(new CommonmarkIdGenerationStrategy());
return idGenerator;
}
public static void assertCanStart(SourceBlock block, String input) {
LineSequence lineSequence= LineSequence.create(input);
assertTrue(block.canStart(lineSequence, null));
}
public static void assertCannotStart(SourceBlock block, String input) {
LineSequence lineSequence= LineSequence.create(input);
assertFalse(block.canStart(lineSequence, null));
}
public static void assertContent(String expectedHtml, String input) {
assertContent(expectedHtml, input, 0);
}
public static void assertContent(String expectedHtml, String input, int mode) {
CommonmarkLanguage language= new CommonmarkLanguage(null, mode, null);
String html = parseToHtml(language, input);
assertHtmlEquals(expectedHtml, html);
}
public static void assertContent(String expectedHtml, String input, ICommonmarkConfig config) {
CommonmarkLanguage language= new CommonmarkLanguage(null, 0, null);
language.setMarkupConfig(config);
String html = parseToHtml(language, input);
assertHtmlEquals(expectedHtml, html);
}
public static void assertContent(MarkupLanguage language, String expectedHtml, String input) {
String html = parseToHtml(language, input);
assertHtmlEquals(expectedHtml, html);
}
private static void assertHtmlEquals(String expectedHtml, String html) {
if (expectedHtml.equals(html)) {
return;
}
expectedHtml= expectedHtml.trim();
html= html.trim();
if (expectedHtml.equals(html)) {
return;
}
assertEquals(toComparisonValue(expectedHtml), toComparisonValue(html));
}
private static String toComparisonValue(String html) {
if (html == null) {
return null;
}
try {
StringWriter out = new StringWriter();
DocumentBuilder builder = createDocumentBuilder(out);
HtmlParser.instance().parse(new InputSource(new StringReader(html)), builder);
return out.toString();
} catch (IOException | SAXException e) {
throw new RuntimeException(html, e);
}
}
private static String parseToHtml(MarkupLanguage markupLanguage, String input) {
StringWriter out = new StringWriter();
DocumentBuilder builder = createDocumentBuilder(out);
MarkupParser parser = new MarkupParser(markupLanguage, builder);
parser.parse(input);
return out.toString();
}
private static DocumentBuilder createDocumentBuilder(StringWriter out) {
SimplifiedHtmlDocumentBuilder builder = new SimplifiedHtmlDocumentBuilder(out);
builder.setResolveEntityReferences(true);
builder.setDocumentHandler(new HtmlDocumentHandler() {
@Override
public void beginDocument(HtmlDocumentBuilder builder, XmlStreamWriter writer) {
}
@Override
public void endDocument(HtmlDocumentBuilder builder, XmlStreamWriter writer) {
}
});
return builder;
}
}