@Nullable @Override public Object getSpans(@NonNull SpannableConfiguration configuration, @NonNull HtmlTag tag) { final Map<String, String> attributes = tag.attributes(); final String src = attributes.get("src"); if (TextUtils.isEmpty(src)) { return null; } final String destination = configuration.urlProcessor().process(src); // todo: replacement text is link... as we are not at block level // and cannot inspect the parent of this node... (img and a are both inlines) // // but we can look and see if we are inside a LinkSpan (will have to extend TagHandler // to obtain an instance SpannableBuilder for inspection) return configuration.factory().image( configuration.theme(), destination, configuration.asyncDrawableLoader(), configuration.imageSizeResolver(), imageSizeParser.parse(tag.attributes()), false ); } }
@Override public void visit(Image image) { final int length = builder.length(); visitChildren(image); // we must check if anything _was_ added, as we need at least one char to render if (length == builder.length()) { builder.append('\uFFFC'); } final Node parent = image.getParent(); final boolean link = parent != null && parent instanceof Link; final String destination = configuration.urlProcessor().process(image.getDestination()); setSpan( length, factory.image( theme, destination, configuration.asyncDrawableLoader(), configuration.imageSizeResolver(), null, link ) ); // todo, maybe, if image is not inside a link, we should make it clickable, so // user can open it in external viewer? }
@Override public void visit(CustomBlock customBlock) { if (!(customBlock instanceof JLatexMathBlock)) { super.visit(customBlock); return; } final String latex = ((JLatexMathBlock) customBlock).latex(); final int length = builder.length(); builder.append(latex); SpannableBuilder.setSpans( builder, configuration.factory().image( configuration.theme(), JLatexMathMedia.makeDestination(latex), configuration.asyncDrawableLoader(), configuration.imageSizeResolver(), new ImageSize(new ImageSize.Dimension(100, "%"), null), false ), length, builder.length() ); } };
assertEquals(configuration.linkResolver(), newConfiguration.linkResolver()); assertEquals(configuration.urlProcessor(), newConfiguration.urlProcessor()); assertEquals(configuration.imageSizeResolver(), newConfiguration.imageSizeResolver()); assertEquals(configuration.factory(), newConfiguration.factory()); assertEquals(configuration.softBreakAddsNewLine(), newConfiguration.softBreakAddsNewLine());