@Override public void apply(final String text) { markdownRenderer.render(MainActivity.this, themes.isLight(), uri(), text, new MarkdownRenderer.MarkdownReadyListener() { @Override public void onMarkdownReady(CharSequence markdown) { Markwon.setText(textView, markdown); gifProcessor.process(textView); Views.setVisible(progress, false); } }); } });
@Override public void run() { // as this call is async, we need to check again if we are cancelled if (!isCancelled()) { loaded.apply(text); task = null; } } });
@Override public void visit(ThematicBreak thematicBreak) { newLine(); final int length = builder.length(); builder.append('\u00a0'); // without space it won't render setSpan(length, factory.thematicBreak(theme)); if (hasNext(thematicBreak)) { newLine(); forceNewLine(); } }
@Override public void visit(Link link) { final int length = builder.length(); visitChildren(link); final String destination = configuration.urlProcessor().process(link.getDestination()); setSpan(length, factory.link(theme, destination, configuration.linkResolver())); }
@Override public void visit(Code code) { final int length = builder.length(); // NB, in order to provide a _padding_ feeling code is wrapped inside two unbreakable spaces // unfortunately we cannot use this for multiline code as we cannot control where a new line break will be inserted builder.append('\u00a0'); builder.append(code.getLiteral()); builder.append('\u00a0'); setSpan(length, factory.code(theme, false)); }
@Override public void visit(BlockQuote blockQuote) { newLine(); final int length = builder.length(); blockIndent += 1; visitChildren(blockQuote); setSpan(length, factory.blockQuote(theme)); blockIndent -= 1; if (hasNext(blockQuote)) { newLine(); forceNewLine(); } }
@Override public void visit(Heading heading) { newLine(); final int length = builder.length(); visitChildren(heading); setSpan(length, factory.heading(theme, heading.getLevel())); if (hasNext(heading)) { newLine(); // after heading we add another line anyway (no additional checks) forceNewLine(); } }
@Override public void visit(Emphasis emphasis) { final int length = builder.length(); visitChildren(emphasis); setSpan(length, factory.emphasis()); }
@Override public void visit(StrongEmphasis strongEmphasis) { final int length = builder.length(); visitChildren(strongEmphasis); setSpan(length, factory.strongEmphasis()); }
@Override public void visit(SoftLineBreak softLineBreak) { // @since 1.1.1 there is an option to treat soft break as a hard break (thus adding new line) if (configuration.softBreakAddsNewLine()) { newLine(); } else { builder.append(' '); } }
@Nullable @Override public Object getSpans(@NonNull SpannableConfiguration configuration, @NonNull HtmlTag tag) { return configuration.factory().superScript(configuration.theme()); } }
/** * @see #setMarkdown(TextView, SpannableConfiguration, String) * @since 1.0.0 */ public static void setMarkdown(@NonNull TextView view, @NonNull String markdown) { setMarkdown(view, SpannableConfiguration.create(view.getContext()), markdown); }
/** * Returns parsed markdown with default {@link SpannableConfiguration} obtained from {@link Context} * * @param context {@link Context} * @param markdown raw markdown * @return parsed markdown * @since 1.0.0 */ @NonNull public static CharSequence markdown(@NonNull Context context, @NonNull String markdown) { final SpannableConfiguration configuration = SpannableConfiguration.create(context); return markdown(configuration, markdown); }
private void forceNewLine() { builder.append('\n'); }
@Override public void run() { invalidateDrawable(who); } });