正在查看: St.John's v1.0.9 应用的 Html.java JAVA 源代码文件
本页面展示 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("<");
} else if (charAt2 == '>') {
sb.append(">");
} else if (charAt2 == '&') {
sb.append("&");
} 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(" ");
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++;
}
}
}