escape special characters on decode/encode

This commit is contained in:
REAndroid 2023-01-05 08:56:57 -05:00
parent 306b8f9260
commit aecdc77648
10 changed files with 54 additions and 16 deletions

View File

@ -229,7 +229,8 @@ import java.util.*;
String value;
ResValueInt resValueInt=(ResValueInt) entryBlock.getResValue();
if(resValueInt.getValueType()== ValueType.STRING){
value=resValueInt.getValueAsString();
value=ValueDecoder.escapeSpecialCharacter(
resValueInt.getValueAsString());
}else {
value= ValueDecoder.decodeEntryValue(entryStore,
entryBlock.getPackageBlock(),

View File

@ -141,7 +141,8 @@ public class XMLFileEncoder {
continue;
}
if(attributeBag.isEqualType(AttributeValueType.STRING)) {
xmlAttribute.setValueAsString(valueText);
xmlAttribute.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
continue;
}
}
@ -155,7 +156,8 @@ public class XMLFileEncoder {
xmlAttribute.setValueType(encodeResult.valueType);
xmlAttribute.setRawValue(encodeResult.value);
}else {
xmlAttribute.setValueAsString(valueText);
xmlAttribute.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
}
}
}

View File

@ -51,10 +51,12 @@ class XMLValuesEncoderArray extends XMLValuesEncoderBag{
bagItem.setTypeAndData(encodeResult.valueType,
encodeResult.value);
}else {
bagItem.setValueAsString(valueText);
bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
}
}else {
bagItem.setValueAsString(valueText);
bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
}
}
}

View File

@ -31,7 +31,8 @@ class XMLValuesEncoderCommon extends XMLValuesEncoder{
if(encodeResult!=null){
entryBlock.setValueAsRaw(encodeResult.valueType, encodeResult.value);
}else {
entryBlock.setValueAsString(value);
entryBlock.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(value));
}
}
}

View File

@ -52,7 +52,8 @@ class XMLValuesEncoderPlurals extends XMLValuesEncoderBag{
bagItem.setType(ValueType.NULL);
bagItem.setData(0);
}else{
bagItem.setValueAsString(valueText);
bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
}
}
}

View File

@ -34,7 +34,7 @@ class XMLValuesEncoderString extends XMLValuesEncoder{
}
@Override
void encodeStringValue(EntryBlock entryBlock, String value){
entryBlock.setValueAsString(value);
entryBlock.setValueAsString(ValueDecoder.unEscapeSpecialCharacter(value));
}
@Override
void encodeNullValue(EntryBlock entryBlock){
@ -53,7 +53,7 @@ class XMLValuesEncoderString extends XMLValuesEncoder{
if(value==null || ValueDecoder.isReference(value)){
continue;
}
stringList.add(value);
stringList.add(ValueDecoder.unEscapeSpecialCharacter(value));
}
getMaterials().addTableStringPool(stringList);
}

View File

@ -66,7 +66,8 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{
}
bagItem.setData(getMaterials().resolveReference(valueText));
}else if(attributeBag.isEqualType(AttributeValueType.STRING)) {
bagItem.setValueAsString(valueText);
bagItem.setValueAsString(ValueDecoder
.unEscapeSpecialCharacter(valueText));
}else if(EncodeUtil.isEmpty(valueText)) {
bagItem.setTypeAndData(ValueType.NULL, 0);
}else{
@ -75,7 +76,7 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{
bagItem.setTypeAndData(encodeResult.valueType,
encodeResult.value);
}else {
bagItem.setValueAsString(valueText);
bagItem.setValueAsString(ValueDecoder.unEscapeSpecialCharacter(valueText));
}
}
}

View File

@ -468,7 +468,7 @@ import java.util.Set;
int raw=getRawValue();
String value;
if(valueType==ValueType.STRING){
value = getValueAsString();
value = ValueDecoder.escapeSpecialCharacter(getValueAsString());
}else {
value = ValueDecoder.decode(entryStore,
currentPackageId,

View File

@ -20,6 +20,7 @@ import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.container.BlockList;
import com.reandroid.lib.arsc.container.FixedBlockContainer;
import com.reandroid.lib.arsc.container.SingleBlockContainer;
import com.reandroid.lib.arsc.decoder.ValueDecoder;
import com.reandroid.lib.arsc.header.HeaderBlock;
import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.ResXmlString;
@ -759,7 +760,8 @@ import java.util.*;
}
ResXmlText resXmlText = getResXmlText();
if(resXmlText!=null){
xmlElement.setTextContent(resXmlText.getText());
xmlElement.setTextContent(
ValueDecoder.escapeSpecialCharacter(resXmlText.getText()));
}
return xmlElement;
}

View File

@ -31,6 +31,34 @@ import java.util.regex.Pattern;
public class ValueDecoder {
public static String escapeSpecialCharacter(String text){
if(text==null || text.length()==0){
return text;
}
if(isSpecialCharacter(text.charAt(0))){
return '\\' +text;
}
return text;
}
public static String unEscapeSpecialCharacter(String text){
if(text==null || text.length()<2){
return text;
}
if(text.charAt(0)!='\\' || !isSpecialCharacter(text.charAt(1))){
return text;
}
return text.substring(1);
}
private static boolean isSpecialCharacter(char ch){
switch (ch){
case '@':
case '?':
case '#':
return true;
default:
return false;
}
}
public static EncodeResult encodeGuessAny(String txt){
if(txt==null){
return null;
@ -574,7 +602,7 @@ import java.util.regex.Pattern;
if(tableString==null){
return null;
}
return tableString.getHtml();
return escapeSpecialCharacter(tableString.getHtml());
}
private static String decodeString(EntryStore entryStore, int packageOrResourceId, int stringRef){
if(entryStore==null||packageOrResourceId==0){
@ -606,7 +634,7 @@ import java.util.regex.Pattern;
}
}
if(tableString!=null){
return tableString.getHtml();
return escapeSpecialCharacter(tableString.getHtml());
}
return null;
}
@ -623,7 +651,7 @@ import java.util.regex.Pattern;
if(tableString==null){
return null;
}
return tableString.getHtml();
return escapeSpecialCharacter(tableString.getHtml());
}
private static String decodeHex(int rawVal){