@NonNull public static MarkwonHtmlParserImpl create() { return create(HtmlEmptyTagReplacement.create()); }
@Test public void blockTagNewLine() { // we should make sure that a block tag will have a new line for it's // content (white spaces before should be ignored) final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final String html = "<ul>" + " <li>ul-first" + " <li>ul-second" + " <ol>" + " <li>ol-first" + " <li>ol-second" + " </ol>" + " <li>ul-third" + "</ul>"; final StringBuilder output = new StringBuilder(); impl.processFragment(output, html); final String[] split = output.toString().split("\n"); assertEquals(Arrays.toString(split), 5, split.length); }
@Test public void newLineAfterBlockTag() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder(); final String[] fragments = { "<h1>head #1</h1>just text", "<h2>head #2</h2><span>in span tag</span>", "<h3>head #3</h3><custom-tag>in custom-tag</custom-tag>" }; for (String fragment: fragments) { impl.processFragment(output, fragment); } final String expected = "" + "head #1\njust text\n" + "head #2\nin span tag\n" + "head #3\nin custom-tag"; assertEquals(expected, output.toString()); }
); final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(new HtmlEmptyTagReplacement() { @Nullable @Override
@Test public void attributesAreLowerCase() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder(); impl.processFragment(output, "<i CLASS=\"my-class\" dIsAbLeD @HeLLo=\"there\">"); final CaptureInlineTagsAction action = new CaptureInlineTagsAction(); impl.flushInlineTags(output.length(), action); assertTrue(action.called); assertEquals(1, action.tags.size()); with(action.tags.get(0), new Action<HtmlTag.Inline>() { @Override public void apply(@NonNull HtmlTag.Inline inline) { assertEquals("i", inline.name()); with(inline.attributes(), new Action<Map<String, String>>() { @Override public void apply(@NonNull Map<String, String> map) { assertEquals(3, map.size()); assertEquals("my-class", map.get("class")); assertEquals("", map.get("disabled")); assertEquals("there", map.get("@hello")); } }); } }); }
final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(new HtmlEmptyTagReplacement() { @Nullable @Override
@Test public void resetClearsBothInlinesAndBlocks() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder(); impl.processFragment(output, "<p>paragraph <i>italic</i></p><div>div</div>"); impl.reset(); final CaptureInlineTagsAction inlineTagsAction = new CaptureInlineTagsAction(); final CaptureBlockTagsAction blockTagsAction = new CaptureBlockTagsAction(); impl.flushInlineTags(output.length(), inlineTagsAction); impl.flushBlockTags(output.length(), blockTagsAction); assertTrue(inlineTagsAction.called); assertTrue(blockTagsAction.called); assertEquals(0, inlineTagsAction.tags.size()); assertEquals(0, blockTagsAction.tags.size()); }
); final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(new HtmlEmptyTagReplacement() { @Override public String replace(@NonNull HtmlTag tag) {
@Test public void multipleFragmentsContinuation() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(new HtmlEmptyTagReplacement()); final StringBuilder output = new StringBuilder(); impl.processFragment(output, "<i>"); output.append("italic "); impl.processFragment(output, "</i>"); final CaptureInlineTagsAction action = new CaptureInlineTagsAction(); impl.flushInlineTags(output.length(), action); assertTrue(action.called); final List<HtmlTag.Inline> inlines = action.tags; assertEquals(inlines.toString(), 1, inlines.size()); final HtmlTag.Inline inline = inlines.get(0); assertEquals("i", inline.name()); assertEquals(0, inline.start()); assertEquals(output.length(), inline.end()); assertEquals("italic ", output.toString()); }
@Test public void attributes() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder();
@Test public void blockCloseClosesChildren() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder();
); final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(new HtmlEmptyTagReplacement() { @Nullable @Override
try { htmlParser = ru.noties.markwon.html.impl.MarkwonHtmlParserImpl.create(); } catch (Throwable t) { htmlParser = MarkwonHtmlParser.noOp();
@Test public void blockVoidTags() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(new HtmlEmptyTagReplacement() { @Nullable @Override
@Test public void flushClearsInternalState() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder(); impl.processFragment(output, "<p><i>italic <b>bold italic</b></i></p><p>paragraph</p><div>and a div</div>"); final CaptureInlineTagsAction inlineTagsAction = new CaptureInlineTagsAction(); final CaptureBlockTagsAction blockTagsAction = new CaptureBlockTagsAction(); impl.flushInlineTags(output.length(), inlineTagsAction); impl.flushBlockTags(output.length(), blockTagsAction); assertTrue(inlineTagsAction.called); assertTrue(blockTagsAction.called); assertEquals(2, inlineTagsAction.tags.size()); assertEquals(3, blockTagsAction.tags.size()); final CaptureInlineTagsAction captureInlineTagsAction = new CaptureInlineTagsAction(); final CaptureBlockTagsAction captureBlockTagsAction = new CaptureBlockTagsAction(); impl.flushInlineTags(output.length(), captureInlineTagsAction); impl.flushBlockTags(output.length(), captureBlockTagsAction); assertTrue(captureInlineTagsAction.called); assertTrue(captureBlockTagsAction.called); assertEquals(0, captureInlineTagsAction.tags.size()); assertEquals(0, captureBlockTagsAction.tags.size()); }
@Test public void previousListItemClosed() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder();
@Test public void paragraphCannotContainAnythingButInlines() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create();
@Test public void flushCloseTagsIfRequested() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder();
@Test public void allTagsAreLowerCase() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder(); impl.processFragment(output, "<DiV><I>italic <eM>emphasis</Em> italic</i></dIv>");
@Test public void flushDoesNotCloseTagsIfNoEndRequested() { final MarkwonHtmlParserImpl impl = MarkwonHtmlParserImpl.create(); final StringBuilder output = new StringBuilder(); impl.processFragment(output, "<div><i><b><em><strong>divibemstrong"); final CaptureInlineTagsAction inlineTagsAction = new CaptureInlineTagsAction(); final CaptureBlockTagsAction blockTagsAction = new CaptureBlockTagsAction(); impl.flushInlineTags(HtmlTag.NO_END, inlineTagsAction); impl.flushBlockTags(HtmlTag.NO_END, blockTagsAction); assertTrue(inlineTagsAction.called); assertTrue(blockTagsAction.called); with(inlineTagsAction.tags, new Action<List<HtmlTag.Inline>>() { @Override public void apply(@NonNull List<HtmlTag.Inline> inlines) { assertEquals(4, inlines.size()); for (HtmlTag.Inline inline : inlines) { assertFalse(inline.isClosed()); assertEquals(HtmlTag.NO_END, inline.end()); } } }); assertEquals(1, blockTagsAction.tags.size()); with(blockTagsAction.tags.get(0), new Action<HtmlTag.Block>() { @Override public void apply(@NonNull HtmlTag.Block block) { assertFalse(block.isClosed()); assertEquals(HtmlTag.NO_END, block.end()); } }); }