public Pair<Spannable, Boolean> render(@Nullable final Context context, @Nullable final String htmlText, @Nullable final Function<String, Drawable> imageGetter) {
        if (StringUtils.isBlank(htmlText)) {
            return new Pair<>(new SpannableStringBuilder(""), false);
        }
        final Context ctx = context == null ? CgeoApplication.getInstance() : context;
        try {
            final Function<String, Drawable> imageGetterToUse = imageGetter == null ? HtmlUtils.DUMMY_IMAGE_GETTER : imageGetter;
            final boolean isLightSkin = Settings.isLightSkin(ctx);
            final Pair<Spannable, Boolean> result = this.renderer.call(ctx, htmlText, isLightSkin, imageGetterToUse);
            if (result != null && result.first != null) {
                if (monochrome) {
                    HtmlUtils.makeMonochrome(result.first);
                }
                if (colorContrast) {
                    HtmlUtils.addColorContrast(result.first, ctx.getResources().getColor(R.color.colorBackground), CONTRAST_THRESHOLD);
                }

                return result;
            }
            return new Pair<>(new SpannableStringBuilder().append("Error:empty result"), true);
        } catch (RuntimeException re) {
            Log.w("Error rendering HTML", re);
            return new Pair<>(new SpannableStringBuilder().append("Error:").append(String.valueOf(re)), true);
        }
    }
Minimal contrast ratio. If description:background contrast ratio is less than this value
for some string, foreground color will be removed and gray background will be used
in order to highlight the string

@see <a href="https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html">W3 Minimum Contrast</a>
main/src/main/java/cgeo/geocaching/utils/html/HtmlStyle.java