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()){ if(!stringItem.hasStyle()){
element.setTextContent(stringItem.get()); element.setTextContent(stringItem.get());
}else { }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){ if(styleItem==null){
return str; 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(){ public String get(){
return mCache; return mCache;

View File

@ -171,10 +171,14 @@ public class StyleItem extends IntegerArray implements JSONConvert<JSONObject> {
if(ref<=0){ if(ref<=0){
return null; return null;
} }
return new StyleSpanInfo( StyleSpanInfo spanInfo = new StyleSpanInfo(
getStringFromPool(ref), getStringFromPool(ref),
getFirstChar(i), getFirstChar(i),
getLastChar(i)); getLastChar(i));
if(!spanInfo.isValid()){
return null;
}
return spanInfo;
} }
@Override @Override
public int size() { public int size() {
@ -205,7 +209,7 @@ public class StyleItem extends IntegerArray implements JSONConvert<JSONObject> {
return null; return null;
} }
public String applyHtml(String str){ public String applyHtml(String str, boolean xml){
if(str==null){ if(str==null){
return null; return null;
} }
@ -232,16 +236,47 @@ public class StyleItem extends IntegerArray implements JSONConvert<JSONObject> {
if(isLast){ if(isLast){
builder.append(info.getEndTag()); builder.append(info.getEndTag());
}else { }else {
builder.append(info.getStartTag()); builder.append(info.getStartTag(xml));
} }
} }
} }
if(!lastAppend){ 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); builder.append(ch);
} }
} }
return builder.toString(); 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){ private boolean isEmpty(List<StyleSpanInfo> spanInfoList){
if(spanInfoList.size()==0){ if(spanInfoList.size()==0){
return true; return true;

View File

@ -27,6 +27,9 @@ public class StyleSpanInfo implements JSONConvert<JSONObject> {
this.mFirst = first; this.mFirst = first;
this.mLast = last; this.mLast = last;
} }
public boolean isValid(){
return mFirst < mLast;
}
public int getFirst() { public int getFirst() {
return mFirst; return mFirst;
} }
@ -46,7 +49,7 @@ public class StyleSpanInfo implements JSONConvert<JSONObject> {
this.mTag = tag; this.mTag = tag;
} }
public String getStartTag(){ public String getStartTag(boolean xml){
int i= mTag.indexOf(';'); int i= mTag.indexOf(';');
StringBuilder builder=new StringBuilder(); StringBuilder builder=new StringBuilder();
builder.append('<'); builder.append('<');
@ -55,11 +58,30 @@ public class StyleSpanInfo implements JSONConvert<JSONObject> {
}else { }else {
builder.append(mTag, 0, i); builder.append(mTag, 0, i);
builder.append(' '); 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('>'); builder.append('>');
return builder.toString(); 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(){ public String getEndTag(){
int i= mTag.indexOf(';'); int i= mTag.indexOf(';');

View File

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