quote attributes for styled string

This commit is contained in:
REAndroid 2023-01-19 16:21:55 -05:00
parent 9f49664f08
commit 4ffd13c793
5 changed files with 79 additions and 8 deletions

View File

@ -27,7 +27,7 @@ public class XmlHelper {
if(!stringItem.hasStyle()){
element.setTextContent(stringItem.get());
}else {
element.setSpannableText(stringItem.getHtml());
element.setSpannableText(stringItem.getXml());
}
}
}

View File

@ -90,7 +90,21 @@ public class StringItem extends BlockItem implements JSONConvert<JSONObject> {
if(styleItem==null){
return str;
}
return styleItem.applyHtml(str);
return styleItem.applyHtml(str, false);
}
public String getXml(){
String str=get();
if(str==null){
return null;
}
if(str.startsWith("*Plus taxes if applicable")){
String junk="";
}
StyleItem styleItem=getStyle();
if(styleItem==null){
return str;
}
return styleItem.applyHtml(str, true);
}
public String get(){
return mCache;

View File

@ -171,10 +171,14 @@ public class StyleItem extends IntegerArray implements JSONConvert<JSONObject> {
if(ref<=0){
return null;
}
return new StyleSpanInfo(
StyleSpanInfo spanInfo = new StyleSpanInfo(
getStringFromPool(ref),
getFirstChar(i),
getLastChar(i));
if(!spanInfo.isValid()){
return null;
}
return spanInfo;
}
@Override
public int size() {
@ -205,7 +209,7 @@ public class StyleItem extends IntegerArray implements JSONConvert<JSONObject> {
return null;
}
public String applyHtml(String str){
public String applyHtml(String str, boolean xml){
if(str==null){
return null;
}
@ -232,16 +236,47 @@ public class StyleItem extends IntegerArray implements JSONConvert<JSONObject> {
if(isLast){
builder.append(info.getEndTag());
}else {
builder.append(info.getStartTag());
builder.append(info.getStartTag(xml));
}
}
}
if(!lastAppend){
if(xml){
if(isWildXml(ch) && !isEntity(allChars, i)){
if(ch=='>'){
builder.append("&gt;");
}else if(ch=='<'){
builder.append("&lt;");
}else if(ch=='&'){
builder.append("&amp;");
}
continue;
}
}
builder.append(ch);
}
}
return builder.toString();
}
private boolean isWildXml(char ch){
switch (ch){
case '&':
case '<':
case '>':
return true;
default:
return false;
}
}
private boolean isEntity(char[] chars, int offset){
if((offset+4)>=chars.length){
return false;
}
return chars[offset]=='a'
&& chars[offset+1]=='m'
&& chars[offset+2]=='p'
&& chars[offset+3]==';';
}
private boolean isEmpty(List<StyleSpanInfo> spanInfoList){
if(spanInfoList.size()==0){
return true;

View File

@ -27,6 +27,9 @@ public class StyleSpanInfo implements JSONConvert<JSONObject> {
this.mFirst = first;
this.mLast = last;
}
public boolean isValid(){
return mFirst < mLast;
}
public int getFirst() {
return mFirst;
}
@ -46,7 +49,7 @@ public class StyleSpanInfo implements JSONConvert<JSONObject> {
this.mTag = tag;
}
public String getStartTag(){
public String getStartTag(boolean xml){
int i= mTag.indexOf(';');
StringBuilder builder=new StringBuilder();
builder.append('<');
@ -55,11 +58,30 @@ public class StyleSpanInfo implements JSONConvert<JSONObject> {
}else {
builder.append(mTag, 0, i);
builder.append(' ');
builder.append(mTag.substring(i+1));
String attrs = mTag.substring(i+1);
if(xml){
appendXmlAttrs(builder, attrs);
}else {
builder.append(attrs);
}
}
builder.append('>');
return builder.toString();
}
private void appendXmlAttrs(StringBuilder builder, String rawAttr){
String[] split=rawAttr.split("(\\s*;\\s*)");
for(int i=0;i<split.length; i++){
String attr=split[i];
if(i!=0){
builder.append(' ');
}
int index=attr.indexOf('=')+1;
builder.append(attr, 0, index);
builder.append('"');
builder.append(attr.substring(index));
builder.append('"');
}
}
public String getEndTag(){
int i= mTag.indexOf(';');

View File

@ -54,7 +54,7 @@ public abstract class XMLNode {
}
boolean canAdd(XMLNode xmlNode){
return !mChildNodes.contains(xmlNode);
return xmlNode!=null;
}
boolean contains(XMLNode xmlNode){
return mChildNodes.contains(xmlNode);