(
Context context, @NonNull Document document,
@Nullable ImageGetterEx imageGetter, @Nullable Html.TagHandler tagHandler)
| 3445 | } |
| 3446 | |
| 3447 | static SpannableStringBuilder fromDocument( |
| 3448 | Context context, @NonNull Document document, |
| 3449 | @Nullable ImageGetterEx imageGetter, @Nullable Html.TagHandler tagHandler) { |
| 3450 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); |
| 3451 | boolean debug = prefs.getBoolean("debug", false); |
| 3452 | boolean monospaced_pre = prefs.getBoolean("monospaced_pre", false); |
| 3453 | |
| 3454 | final int colorPrimary = Helper.resolveColor(context, androidx.appcompat.R.attr.colorPrimary); |
| 3455 | final int colorAccent = Helper.resolveColor(context, androidx.appcompat.R.attr.colorAccent); |
| 3456 | final int colorBlockquote = Helper.resolveColor(context, R.attr.colorBlockquote, colorPrimary); |
| 3457 | final int colorSeparator = Helper.resolveColor(context, R.attr.colorSeparator); |
| 3458 | int bulletGap = context.getResources().getDimensionPixelSize(R.dimen.bullet_gap_size); |
| 3459 | int bulletRadius = context.getResources().getDimensionPixelSize(R.dimen.bullet_radius_size); |
| 3460 | int bulletIndent = context.getResources().getDimensionPixelSize(R.dimen.bullet_indent_size); |
| 3461 | int intentSize = context.getResources().getDimensionPixelSize(R.dimen.indent_size); |
| 3462 | int quoteGap = context.getResources().getDimensionPixelSize(R.dimen.quote_gap_size); |
| 3463 | int quoteStripe = context.getResources().getDimensionPixelSize(R.dimen.quote_stripe_width); |
| 3464 | int line_dash_length = context.getResources().getDimensionPixelSize(R.dimen.line_dash_length); |
| 3465 | |
| 3466 | int message_zoom = prefs.getInt("message_zoom", 100); |
| 3467 | float textSize = Helper.getTextSize(context, 0) * message_zoom / 100f; |
| 3468 | |
| 3469 | // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements |
| 3470 | NodeTraversor.traverse(new NodeVisitor() { |
| 3471 | private Element element; |
| 3472 | private int plain = 0; |
| 3473 | private List<TextNode> block = new ArrayList<>(); |
| 3474 | |
| 3475 | private final Pattern FOLD_WHITESPACE = Pattern.compile("[ \t\f\r\n]+"); |
| 3476 | |
| 3477 | // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements |
| 3478 | |
| 3479 | @Override |
| 3480 | public void head(Node node, int depth) { |
| 3481 | if (node instanceof TextNode) { |
| 3482 | if (plain == 0) |
| 3483 | block.add((TextNode) node); |
| 3484 | } else if (node instanceof Element) { |
| 3485 | element = (Element) node; |
| 3486 | if ("true".equals(element.attr("x-plain"))) |
| 3487 | plain++; |
| 3488 | if (element.isBlock() /* x-block is never false */ || |
| 3489 | "true".equals(element.attr("x-block"))) { |
| 3490 | normalizeText(block); |
| 3491 | block.clear(); |
| 3492 | } |
| 3493 | } |
| 3494 | } |
| 3495 | |
| 3496 | @Override |
| 3497 | public void tail(Node node, int depth) { |
| 3498 | if (node instanceof Element) { |
| 3499 | element = (Element) node; |
| 3500 | if ("true".equals(element.attr("x-plain"))) |
| 3501 | plain--; |
| 3502 | if (element.isBlock() /* x-block is never false */ || |
| 3503 | "true".equals(element.attr("x-block")) || |
| 3504 | "br".equals(element.tagName())) { |
no test coverage detected