diff --git a/src/main/java/com/reandroid/lib/apk/XmlHelper.java b/src/main/java/com/reandroid/lib/apk/XmlHelper.java index 5b7d967..cd49e27 100644 --- a/src/main/java/com/reandroid/lib/apk/XmlHelper.java +++ b/src/main/java/com/reandroid/lib/apk/XmlHelper.java @@ -27,7 +27,7 @@ public class XmlHelper { if(!stringItem.hasStyle()){ element.setTextContent(stringItem.get()); }else { - element.setSpannableText(stringItem.getHtml()); + element.setSpannableText(stringItem.getXml()); } } } diff --git a/src/main/java/com/reandroid/lib/arsc/item/StringItem.java b/src/main/java/com/reandroid/lib/arsc/item/StringItem.java index 8793dab..1c74861 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/StringItem.java +++ b/src/main/java/com/reandroid/lib/arsc/item/StringItem.java @@ -90,7 +90,21 @@ public class StringItem extends BlockItem implements JSONConvert { 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; diff --git a/src/main/java/com/reandroid/lib/arsc/item/StyleItem.java b/src/main/java/com/reandroid/lib/arsc/item/StyleItem.java index 55a3981..bad1f76 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/StyleItem.java +++ b/src/main/java/com/reandroid/lib/arsc/item/StyleItem.java @@ -171,10 +171,14 @@ public class StyleItem extends IntegerArray implements JSONConvert { 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 { 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 { 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(">"); + }else if(ch=='<'){ + builder.append("<"); + }else if(ch=='&'){ + builder.append("&"); + } + 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 spanInfoList){ if(spanInfoList.size()==0){ return true; diff --git a/src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java b/src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java index 4516c92..4e4a9d3 100755 --- a/src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java +++ b/src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java @@ -27,6 +27,9 @@ public class StyleSpanInfo implements JSONConvert { 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 { 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 { }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