Skip to content

Commit da4ee63

Browse files
committed
fix: tighten span tag parsing
1 parent 07ae073 commit da4ee63

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/data/StyledString.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@
1717
package brut.androlib.res.decoder.data;
1818

1919
import brut.androlib.res.xml.ResXmlEncoders;
20-
import com.google.common.base.Splitter;
2120
import com.google.common.collect.Iterators;
2221
import com.google.common.collect.PeekingIterator;
2322

23+
import java.util.LinkedHashMap;
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.logging.Logger;
27+
import java.util.regex.Pattern;
2728

2829
public class StyledString implements CharSequence {
2930
private static final Logger LOGGER = Logger.getLogger(StyledString.class.getName());
@@ -132,8 +133,8 @@ private void decodeIterate(PeekingIterator<Span> it) {
132133
}
133134

134135
public static class Span {
135-
private static final Splitter.MapSplitter ATTRIBUTES_SPLITTER =
136-
Splitter.on(';').omitEmptyStrings().withKeyValueSeparator(Splitter.on('=').limit(2));
136+
private static final Pattern ATTR_SPLIT_PATTERN = Pattern.compile(
137+
";(?=[\\p{L}_][\\p{L}\\p{N}_.-]*=)");
137138

138139
private final String mTag;
139140
private final int mFirstChar;
@@ -159,14 +160,24 @@ public int getLastChar() {
159160

160161
public String getName() {
161162
int separatorIdx = mTag.indexOf(';');
162-
return separatorIdx == -1 ? mTag : mTag.substring(0, separatorIdx);
163+
return separatorIdx != -1 ? mTag.substring(0, separatorIdx) : mTag;
163164
}
164165

165166
public Map<String, String> getAttributes() {
166167
int separatorIdx = mTag.indexOf(';');
167-
return separatorIdx != -1 ? ATTRIBUTES_SPLITTER.split(
168-
mTag.substring(separatorIdx + 1, mTag.endsWith(";") ? mTag.length() - 1 : mTag.length())
169-
) : null;
168+
if (separatorIdx == -1) {
169+
return null;
170+
}
171+
172+
String[] attrs = ATTR_SPLIT_PATTERN.split(mTag.substring(separatorIdx + 1));
173+
Map<String, String> map = new LinkedHashMap<>();
174+
175+
for (String attr : attrs) {
176+
int eqIdx = attr.indexOf('=');
177+
map.put(attr.substring(0, eqIdx), attr.substring(eqIdx + 1));
178+
}
179+
180+
return map;
170181
}
171182
}
172183
}

brut.apktool/apktool-lib/src/test/resources/testapp/res/values-mcc001/strings.xml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
<string name="test_string3">\@</string>
77
<string name="test_string4">\?</string>
88
<string name="test_string5">\#ff123456</string>
9-
<string name="test_string7">&amp;</string>
10-
<string name="test_string8">"'"</string>
11-
<string name="test_string9">\"</string>
12-
<string name="test_string10">\u0005</string>
13-
<string name="test_string11">" foo bar "</string>
14-
<string name="test_string12">"foo
9+
<string name="test_string6">&amp;</string>
10+
<string name="test_string7">"'"</string>
11+
<string name="test_string8">\"</string>
12+
<string name="test_string9">\u0005</string>
13+
<string name="test_string10">" foo bar "</string>
14+
<string name="test_string11">"foo
1515
bar"</string>
16-
<string name="test_string13">" foo"<b>bar <i> baz </i></b> <u>foo</u></string>
17-
<string name="test_string14">foo<sometag someattr1="someval1" someattr2="someval2">bar</sometag>baz</string>
16+
<string name="test_string12">" foo"<b>bar <i> baz </i></b> <u>foo</u></string>
17+
<string name="test_string13">foo<sometag someattr1="someval1" someattr2="someval2">bar</sometag>baz</string>
18+
<string name="test_string14">foo<span style="font-family:serif;font-size: 12px;">bar</span>baz</string>
19+
<string name="test_string15">foo<span href="https://test.com/1234#param=val" style="font-family: serif; font-size:12px;">bar</span>baz</string>
1820
<string name="test_string16">foo<b>bar<i>"b
1921
az"</i></b>foo</string>
2022
<string name="test_string17" formatted="false">%d of %d</string>

0 commit comments

Comments
 (0)