mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-01 22:54:26 +02:00
escape special characters on decode/encode
This commit is contained in:
parent
306b8f9260
commit
aecdc77648
@ -229,7 +229,8 @@ import java.util.*;
|
|||||||
String value;
|
String value;
|
||||||
ResValueInt resValueInt=(ResValueInt) entryBlock.getResValue();
|
ResValueInt resValueInt=(ResValueInt) entryBlock.getResValue();
|
||||||
if(resValueInt.getValueType()== ValueType.STRING){
|
if(resValueInt.getValueType()== ValueType.STRING){
|
||||||
value=resValueInt.getValueAsString();
|
value=ValueDecoder.escapeSpecialCharacter(
|
||||||
|
resValueInt.getValueAsString());
|
||||||
}else {
|
}else {
|
||||||
value= ValueDecoder.decodeEntryValue(entryStore,
|
value= ValueDecoder.decodeEntryValue(entryStore,
|
||||||
entryBlock.getPackageBlock(),
|
entryBlock.getPackageBlock(),
|
||||||
|
@ -141,7 +141,8 @@ public class XMLFileEncoder {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(attributeBag.isEqualType(AttributeValueType.STRING)) {
|
if(attributeBag.isEqualType(AttributeValueType.STRING)) {
|
||||||
xmlAttribute.setValueAsString(valueText);
|
xmlAttribute.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(valueText));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,7 +156,8 @@ public class XMLFileEncoder {
|
|||||||
xmlAttribute.setValueType(encodeResult.valueType);
|
xmlAttribute.setValueType(encodeResult.valueType);
|
||||||
xmlAttribute.setRawValue(encodeResult.value);
|
xmlAttribute.setRawValue(encodeResult.value);
|
||||||
}else {
|
}else {
|
||||||
xmlAttribute.setValueAsString(valueText);
|
xmlAttribute.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(valueText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,10 +51,12 @@ class XMLValuesEncoderArray extends XMLValuesEncoderBag{
|
|||||||
bagItem.setTypeAndData(encodeResult.valueType,
|
bagItem.setTypeAndData(encodeResult.valueType,
|
||||||
encodeResult.value);
|
encodeResult.value);
|
||||||
}else {
|
}else {
|
||||||
bagItem.setValueAsString(valueText);
|
bagItem.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(valueText));
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
bagItem.setValueAsString(valueText);
|
bagItem.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(valueText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,8 @@ class XMLValuesEncoderCommon extends XMLValuesEncoder{
|
|||||||
if(encodeResult!=null){
|
if(encodeResult!=null){
|
||||||
entryBlock.setValueAsRaw(encodeResult.valueType, encodeResult.value);
|
entryBlock.setValueAsRaw(encodeResult.valueType, encodeResult.value);
|
||||||
}else {
|
}else {
|
||||||
entryBlock.setValueAsString(value);
|
entryBlock.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,8 @@ class XMLValuesEncoderPlurals extends XMLValuesEncoderBag{
|
|||||||
bagItem.setType(ValueType.NULL);
|
bagItem.setType(ValueType.NULL);
|
||||||
bagItem.setData(0);
|
bagItem.setData(0);
|
||||||
}else{
|
}else{
|
||||||
bagItem.setValueAsString(valueText);
|
bagItem.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(valueText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ class XMLValuesEncoderString extends XMLValuesEncoder{
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
void encodeStringValue(EntryBlock entryBlock, String value){
|
void encodeStringValue(EntryBlock entryBlock, String value){
|
||||||
entryBlock.setValueAsString(value);
|
entryBlock.setValueAsString(ValueDecoder.unEscapeSpecialCharacter(value));
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
void encodeNullValue(EntryBlock entryBlock){
|
void encodeNullValue(EntryBlock entryBlock){
|
||||||
@ -53,7 +53,7 @@ class XMLValuesEncoderString extends XMLValuesEncoder{
|
|||||||
if(value==null || ValueDecoder.isReference(value)){
|
if(value==null || ValueDecoder.isReference(value)){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
stringList.add(value);
|
stringList.add(ValueDecoder.unEscapeSpecialCharacter(value));
|
||||||
}
|
}
|
||||||
getMaterials().addTableStringPool(stringList);
|
getMaterials().addTableStringPool(stringList);
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,8 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{
|
|||||||
}
|
}
|
||||||
bagItem.setData(getMaterials().resolveReference(valueText));
|
bagItem.setData(getMaterials().resolveReference(valueText));
|
||||||
}else if(attributeBag.isEqualType(AttributeValueType.STRING)) {
|
}else if(attributeBag.isEqualType(AttributeValueType.STRING)) {
|
||||||
bagItem.setValueAsString(valueText);
|
bagItem.setValueAsString(ValueDecoder
|
||||||
|
.unEscapeSpecialCharacter(valueText));
|
||||||
}else if(EncodeUtil.isEmpty(valueText)) {
|
}else if(EncodeUtil.isEmpty(valueText)) {
|
||||||
bagItem.setTypeAndData(ValueType.NULL, 0);
|
bagItem.setTypeAndData(ValueType.NULL, 0);
|
||||||
}else{
|
}else{
|
||||||
@ -75,7 +76,7 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{
|
|||||||
bagItem.setTypeAndData(encodeResult.valueType,
|
bagItem.setTypeAndData(encodeResult.valueType,
|
||||||
encodeResult.value);
|
encodeResult.value);
|
||||||
}else {
|
}else {
|
||||||
bagItem.setValueAsString(valueText);
|
bagItem.setValueAsString(ValueDecoder.unEscapeSpecialCharacter(valueText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@ import java.util.Set;
|
|||||||
int raw=getRawValue();
|
int raw=getRawValue();
|
||||||
String value;
|
String value;
|
||||||
if(valueType==ValueType.STRING){
|
if(valueType==ValueType.STRING){
|
||||||
value = getValueAsString();
|
value = ValueDecoder.escapeSpecialCharacter(getValueAsString());
|
||||||
}else {
|
}else {
|
||||||
value = ValueDecoder.decode(entryStore,
|
value = ValueDecoder.decode(entryStore,
|
||||||
currentPackageId,
|
currentPackageId,
|
||||||
|
@ -20,6 +20,7 @@ import com.reandroid.lib.arsc.base.Block;
|
|||||||
import com.reandroid.lib.arsc.container.BlockList;
|
import com.reandroid.lib.arsc.container.BlockList;
|
||||||
import com.reandroid.lib.arsc.container.FixedBlockContainer;
|
import com.reandroid.lib.arsc.container.FixedBlockContainer;
|
||||||
import com.reandroid.lib.arsc.container.SingleBlockContainer;
|
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.header.HeaderBlock;
|
||||||
import com.reandroid.lib.arsc.io.BlockReader;
|
import com.reandroid.lib.arsc.io.BlockReader;
|
||||||
import com.reandroid.lib.arsc.item.ResXmlString;
|
import com.reandroid.lib.arsc.item.ResXmlString;
|
||||||
@ -759,7 +760,8 @@ import java.util.*;
|
|||||||
}
|
}
|
||||||
ResXmlText resXmlText = getResXmlText();
|
ResXmlText resXmlText = getResXmlText();
|
||||||
if(resXmlText!=null){
|
if(resXmlText!=null){
|
||||||
xmlElement.setTextContent(resXmlText.getText());
|
xmlElement.setTextContent(
|
||||||
|
ValueDecoder.escapeSpecialCharacter(resXmlText.getText()));
|
||||||
}
|
}
|
||||||
return xmlElement;
|
return xmlElement;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,34 @@ import java.util.regex.Pattern;
|
|||||||
|
|
||||||
public class ValueDecoder {
|
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){
|
public static EncodeResult encodeGuessAny(String txt){
|
||||||
if(txt==null){
|
if(txt==null){
|
||||||
return null;
|
return null;
|
||||||
@ -574,7 +602,7 @@ import java.util.regex.Pattern;
|
|||||||
if(tableString==null){
|
if(tableString==null){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return tableString.getHtml();
|
return escapeSpecialCharacter(tableString.getHtml());
|
||||||
}
|
}
|
||||||
private static String decodeString(EntryStore entryStore, int packageOrResourceId, int stringRef){
|
private static String decodeString(EntryStore entryStore, int packageOrResourceId, int stringRef){
|
||||||
if(entryStore==null||packageOrResourceId==0){
|
if(entryStore==null||packageOrResourceId==0){
|
||||||
@ -606,7 +634,7 @@ import java.util.regex.Pattern;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(tableString!=null){
|
if(tableString!=null){
|
||||||
return tableString.getHtml();
|
return escapeSpecialCharacter(tableString.getHtml());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -623,7 +651,7 @@ import java.util.regex.Pattern;
|
|||||||
if(tableString==null){
|
if(tableString==null){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return tableString.getHtml();
|
return escapeSpecialCharacter(tableString.getHtml());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String decodeHex(int rawVal){
|
private static String decodeHex(int rawVal){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user