导航菜单

页面标题

页面副标题

St.John's v1.0.9 - Html.java 源代码

正在查看: St.John's v1.0.9 应用的 Html.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package com.chinalwb.are.android.inner;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.Layout;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AlignmentSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.ParagraphStyle;
import android.text.style.QuoteSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import androidx.core.view.ViewCompat;
import com.chinalwb.are.Util;
import com.chinalwb.are.spans.ARE_Span;
import com.chinalwb.are.spans.AreListSpan;
import com.chinalwb.are.spans.ListNumberSpan;
import com.fasterxml.jackson.core.base.GeneratorBase;
import org.ccil.cowan.tagsoup.HTMLSchema;
import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;

public class Html {
    public static final int FROM_HTML_MODE_COMPACT = 63;
    public static final int FROM_HTML_MODE_LEGACY = 0;
    public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
    public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
    public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
    public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
    public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
    public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
    public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
    public static final String OL = "ol";
    private static final int TO_HTML_PARAGRAPH_FLAG = 1;
    public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
    public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;
    public static final String UL = "ul";
    public static boolean escapeCJK = false;
    public static Context sContext = null;
    public static int sListNumber = -1;

    public interface ImageGetter {
        Drawable getDrawable(String str);
    }

    public interface TagHandler {
        void handleTag(boolean z, String str, Editable editable, XMLReader xMLReader);
    }

    private Html() {
    }

    @Deprecated
    public static Spanned fromHtml(String str) {
        return fromHtml(str, 0, null, null);
    }

    public static Spanned fromHtml(String str, int i) {
        return fromHtml(str, i, null, null);
    }

    private static class HtmlParser {
        private static final HTMLSchema schema = new HTMLSchema();

        private HtmlParser() {
        }
    }

    @Deprecated
    public static Spanned fromHtml(String str, ImageGetter imageGetter, TagHandler tagHandler) {
        return fromHtml(str, 0, imageGetter, tagHandler);
    }

    public static Spanned fromHtml(String str, int i, ImageGetter imageGetter, TagHandler tagHandler) {
        Parser parser = new Parser();
        try {
            parser.setProperty("http://www.ccil.org/~cowan/tagsoup/properties/schema", HtmlParser.schema);
            return new HtmlToSpannedConverter(str, imageGetter, tagHandler, parser, i).convert();
        } catch (SAXNotRecognizedException e) {
            throw new RuntimeException(e);
        } catch (SAXNotSupportedException e2) {
            throw new RuntimeException(e2);
        }
    }

    @Deprecated
    public static String toHtml(Spanned spanned) {
        return toHtml(spanned, 0);
    }

    public static String toHtml(Spanned spanned, int i) {
        StringBuilder sb = new StringBuilder();
        withinHtml(sb, spanned, i);
        return sb.toString();
    }

    public static String escapeHtml(CharSequence charSequence) {
        StringBuilder sb = new StringBuilder();
        withinStyle(sb, charSequence, 0, charSequence.length());
        return sb.toString();
    }

    private static void withinHtml(StringBuilder sb, Spanned spanned, int i) {
        if ((i & 1) == 0) {
            encodeTextAlignmentByDiv(sb, spanned, i);
        } else {
            withinDiv(sb, spanned, 0, spanned.length(), i);
        }
    }

    private static void encodeTextAlignmentByDiv(StringBuilder sb, Spanned spanned, int i) {
        int length = spanned.length();
        int i2 = 0;
        while (i2 < length) {
            int nextSpanTransition = spanned.nextSpanTransition(i2, length, ParagraphStyle.class);
            String str = " ";
            boolean z = false;
            for (ParagraphStyle paragraphStyle : (ParagraphStyle[]) spanned.getSpans(i2, nextSpanTransition, ParagraphStyle.class)) {
                if (paragraphStyle instanceof AlignmentSpan) {
                    Layout.Alignment alignment = ((AlignmentSpan) paragraphStyle).getAlignment();
                    if (alignment == Layout.Alignment.ALIGN_CENTER) {
                        str = "align=\"center\" " + str;
                    } else if (alignment == Layout.Alignment.ALIGN_OPPOSITE) {
                        str = "align=\"right\" " + str;
                    } else {
                        str = "align=\"left\" " + str;
                    }
                    z = true;
                }
            }
            if (z) {
                sb.append("<div ");
                sb.append(str);
                sb.append(">");
            }
            withinDiv(sb, spanned, i2, nextSpanTransition, i);
            if (z) {
                sb.append("</div>");
            }
            i2 = nextSpanTransition;
        }
    }

    private static void withinDiv(StringBuilder sb, Spanned spanned, int i, int i2, int i3) {
        while (i < i2) {
            int nextSpanTransition = spanned.nextSpanTransition(i, i2, QuoteSpan.class);
            QuoteSpan[] quoteSpanArr = (QuoteSpan[]) spanned.getSpans(i, nextSpanTransition, QuoteSpan.class);
            for (QuoteSpan quoteSpan : quoteSpanArr) {
                sb.append("<blockquote>");
            }
            withinBlockquote(sb, spanned, i, nextSpanTransition, i3);
            for (QuoteSpan quoteSpan2 : quoteSpanArr) {
                sb.append("</blockquote>\n");
            }
            i = nextSpanTransition;
        }
    }

    private static String getTextDirection(Spanned spanned, int i, int i2) {
        return "";
    }

    private static String getTextStyles(Spanned spanned, int i, int i2, boolean z, boolean z2) {
        String str = null;
        if (z2) {
            AlignmentSpan[] alignmentSpanArr = (AlignmentSpan[]) spanned.getSpans(i, i2, AlignmentSpan.class);
            for (int length = alignmentSpanArr.length - 1; length >= 0; length--) {
                Layout.Alignment alignment = alignmentSpanArr[length].getAlignment();
                if (alignment == Layout.Alignment.ALIGN_NORMAL) {
                    str = "text-align:start;";
                } else if (alignment == Layout.Alignment.ALIGN_CENTER) {
                    str = "text-align:center;";
                } else if (alignment == Layout.Alignment.ALIGN_OPPOSITE) {
                    str = "text-align:end;";
                }
            }
        }
        if (str == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder(" style=\"");
        if (str != null) {
            sb.append(str);
        }
        sb.append("\"");
        return sb.toString();
    }

    private static void withinBlockquote(StringBuilder sb, Spanned spanned, int i, int i2, int i3) {
        if ((i3 & 1) == 0) {
            withinBlockquoteConsecutive(sb, spanned, i, i2);
        } else {
            withinBlockquoteIndividual(sb, spanned, i, i2);
        }
    }

    private static void withinBlockquoteIndividual(StringBuilder sb, Spanned spanned, int i, int i2) {
        boolean z;
        boolean z2;
        String str;
        boolean checkToClosePreviousList;
        String str2 = "";
        boolean z3 = false;
        while (i <= i2) {
            int indexOf = TextUtils.indexOf((CharSequence) spanned, '\n', i, i2);
            if (indexOf < 0) {
                indexOf = i2;
            }
            if (indexOf == i) {
                if (z3) {
                    sb.append("</" + str2 + ">\n");
                    z3 = false;
                }
                sb.append("<br>\n");
            } else {
                ParagraphStyle[] paragraphStyleArr = (ParagraphStyle[]) spanned.getSpans(i, indexOf, ParagraphStyle.class);
                int length = paragraphStyleArr.length;
                int i3 = 0;
                while (true) {
                    z = true;
                    if (i3 >= length) {
                        z2 = false;
                        break;
                    }
                    ParagraphStyle paragraphStyle = paragraphStyleArr[i3];
                    spanned.getSpanFlags(paragraphStyle);
                    if (paragraphStyle instanceof AreListSpan) {
                        Util.log("paragraphStyle == " + paragraphStyle.toString());
                        if (paragraphStyle instanceof ListNumberSpan) {
                            str = OL;
                            checkToClosePreviousList = checkToClosePreviousList(sb, str2, OL);
                        } else {
                            str = UL;
                            checkToClosePreviousList = checkToClosePreviousList(sb, str2, UL);
                        }
                        if (checkToClosePreviousList) {
                            z3 = false;
                        }
                        str2 = str;
                        z2 = true;
                    } else {
                        i3++;
                    }
                }
                if (!z2 || z3) {
                    z = z3;
                } else {
                    sb.append("<" + str2);
                    sb.append(getTextStyles(spanned, i, indexOf, true, false));
                    sb.append(">\n");
                }
                if (z && !z2) {
                    sb.append("</" + str2 + ">\n");
                    z = false;
                }
                String str3 = z2 ? "li" : "p";
                sb.append("<");
                sb.append(str3);
                sb.append(getTextDirection(spanned, i, indexOf));
                sb.append(getTextStyles(spanned, i, indexOf, !z2, !z2));
                sb.append(">");
                withinParagraph(sb, spanned, i, indexOf);
                sb.append("</");
                sb.append(str3);
                sb.append(">\n");
                if (indexOf == i2 && z) {
                    sb.append("</" + str2 + ">\n");
                    z3 = false;
                } else {
                    z3 = z;
                }
            }
            i = indexOf + 1;
        }
    }

    private static boolean checkToClosePreviousList(StringBuilder sb, String str, String str2) {
        Util.log("src list type = " + str + ", target list type == " + str2);
        if (str.equals(str2) || TextUtils.isEmpty(str)) {
            return false;
        }
        sb.append("</" + str + ">");
        return true;
    }

    private static void withinBlockquoteConsecutive(StringBuilder sb, Spanned spanned, int i, int i2) {
        sb.append("<p");
        sb.append(getTextDirection(spanned, i, i2));
        sb.append(">");
        int i3 = i;
        while (i3 < i2) {
            int indexOf = TextUtils.indexOf((CharSequence) spanned, '\n', i3, i2);
            if (indexOf < 0) {
                indexOf = i2;
            }
            int i4 = 0;
            while (indexOf < i2 && spanned.charAt(indexOf) == '\n') {
                i4++;
                indexOf++;
            }
            withinParagraph(sb, spanned, i3, indexOf - i4);
            if (i4 == 1) {
                sb.append("<br>\n");
            } else {
                for (int i5 = 2; i5 < i4; i5++) {
                    sb.append("<br>");
                }
                if (indexOf != i2) {
                    sb.append("</p>\n");
                    sb.append("<p");
                    sb.append(getTextDirection(spanned, i, i2));
                    sb.append(">");
                }
            }
            i3 = indexOf;
        }
        sb.append("</p>\n");
    }

    private static void withinParagraph(StringBuilder sb, Spanned spanned, int i, int i2) {
        while (i < i2) {
            int nextSpanTransition = spanned.nextSpanTransition(i, i2, CharacterStyle.class);
            Object[] objArr = (CharacterStyle[]) spanned.getSpans(i, nextSpanTransition, CharacterStyle.class);
            for (int i3 = 0; i3 < objArr.length; i3++) {
                Object obj = objArr[i3];
                if (obj instanceof ARE_Span) {
                    sb.append(((ARE_Span) obj).getHtml());
                    i = nextSpanTransition;
                } else {
                    if (obj instanceof StyleSpan) {
                        int style = ((StyleSpan) obj).getStyle();
                        if ((style & 1) != 0) {
                            sb.append("<b>");
                        }
                        if ((style & 2) != 0) {
                            sb.append("<i>");
                        }
                    }
                    Object obj2 = objArr[i3];
                    if ((obj2 instanceof TypefaceSpan) && "monospace".equals(((TypefaceSpan) obj2).getFamily())) {
                        sb.append("<tt>");
                    }
                    if (objArr[i3] instanceof SuperscriptSpan) {
                        sb.append("<sup>");
                    }
                    if (objArr[i3] instanceof SubscriptSpan) {
                        sb.append("<sub>");
                    }
                    if (objArr[i3] instanceof UnderlineSpan) {
                        sb.append("<u>");
                    }
                    if (objArr[i3] instanceof StrikethroughSpan) {
                        sb.append("<span style=\"text-decoration:line-through;\">");
                    }
                    if (objArr[i3] instanceof URLSpan) {
                        sb.append("<a href=\"");
                        sb.append(((URLSpan) objArr[i3]).getURL());
                        sb.append("\">");
                    }
                    if (objArr[i3] instanceof ImageSpan) {
                        sb.append("<img src=\"");
                        sb.append(((ImageSpan) objArr[i3]).getSource());
                        sb.append("\" />");
                        i = nextSpanTransition;
                    }
                    Object obj3 = objArr[i3];
                    if (obj3 instanceof AbsoluteSizeSpan) {
                        AbsoluteSizeSpan absoluteSizeSpan = (AbsoluteSizeSpan) obj3;
                        float size = absoluteSizeSpan.getSize();
                        if (!absoluteSizeSpan.getDip()) {
                            size /= 1.5f;
                        }
                        sb.append(String.format("<span style=\"font-size:%.0fpx\";>", Float.valueOf(size)));
                    }
                    Object obj4 = objArr[i3];
                    if (obj4 instanceof RelativeSizeSpan) {
                        sb.append(String.format("<span style=\"font-size:%.2fem;\">", Float.valueOf(((RelativeSizeSpan) obj4).getSizeChange())));
                    }
                    Object obj5 = objArr[i3];
                    if (obj5 instanceof ForegroundColorSpan) {
                        sb.append(String.format("<span style=\"color:#%06X;\">", Integer.valueOf(((ForegroundColorSpan) obj5).getForegroundColor() & ViewCompat.MEASURED_SIZE_MASK)));
                    }
                    Object obj6 = objArr[i3];
                    if (obj6 instanceof BackgroundColorSpan) {
                        sb.append(String.format("<span style=\"background-color:#%06X;\">", Integer.valueOf(((BackgroundColorSpan) obj6).getBackgroundColor() & ViewCompat.MEASURED_SIZE_MASK)));
                    }
                }
            }
            withinStyle(sb, spanned, i, nextSpanTransition);
            for (int length = objArr.length - 1; length >= 0; length--) {
                if (objArr[length] instanceof BackgroundColorSpan) {
                    sb.append("</span>");
                }
                if (objArr[length] instanceof ForegroundColorSpan) {
                    sb.append("</span>");
                }
                if (objArr[length] instanceof RelativeSizeSpan) {
                    sb.append("</span>");
                }
                if (objArr[length] instanceof AbsoluteSizeSpan) {
                    sb.append("</span>");
                }
                if (objArr[length] instanceof URLSpan) {
                    sb.append("</a>");
                }
                if (objArr[length] instanceof StrikethroughSpan) {
                    sb.append("</span>");
                }
                if (objArr[length] instanceof UnderlineSpan) {
                    sb.append("</u>");
                }
                if (objArr[length] instanceof SubscriptSpan) {
                    sb.append("</sub>");
                }
                if (objArr[length] instanceof SuperscriptSpan) {
                    sb.append("</sup>");
                }
                Object obj7 = objArr[length];
                if ((obj7 instanceof TypefaceSpan) && ((TypefaceSpan) obj7).getFamily().equals("monospace")) {
                    sb.append("</tt>");
                }
                Object obj8 = objArr[length];
                if (obj8 instanceof StyleSpan) {
                    int style2 = ((StyleSpan) obj8).getStyle();
                    if ((style2 & 1) != 0) {
                        sb.append("</b>");
                    }
                    if ((style2 & 2) != 0) {
                        sb.append("</i>");
                    }
                }
            }
            i = nextSpanTransition;
        }
    }

    private static void withinStyle(StringBuilder sb, CharSequence charSequence, int i, int i2) {
        int i3;
        char charAt;
        while (i < i2) {
            char charAt2 = charSequence.charAt(i);
            if (charAt2 == '<') {
                sb.append("&lt;");
            } else if (charAt2 == '>') {
                sb.append("&gt;");
            } else if (charAt2 == '&') {
                sb.append("&amp;");
            } else if (charAt2 < 55296 || charAt2 > 57343) {
                if (charAt2 > '~' || charAt2 < ' ') {
                    if (escapeCJK) {
                        sb.append("&#");
                        sb.append((int) charAt2);
                        sb.append(";");
                    } else {
                        sb.append(charAt2);
                    }
                } else if (charAt2 == ' ') {
                    while (true) {
                        int i4 = i + 1;
                        if (i4 >= i2 || charSequence.charAt(i4) != ' ') {
                            break;
                        }
                        sb.append("&nbsp;");
                        i = i4;
                    }
                    sb.append(' ');
                } else {
                    sb.append(charAt2);
                }
            } else if (charAt2 < 56320 && (i3 = i + 1) < i2 && (charAt = charSequence.charAt(i3)) >= 56320 && charAt <= 57343) {
                int i5 = ((charAt2 - GeneratorBase.SURR1_FIRST) << 10) | 65536 | (charAt - GeneratorBase.SURR2_FIRST);
                sb.append("&#");
                sb.append(i5);
                sb.append(";");
                i = i3;
            }
            i++;
        }
    }
}