Skip to content

Commit 59718de

Browse files
authored
Merge pull request #485 from wordpress-mobile/issue/482-format-crash
Issue/482 format crash
2 parents 588b002 + 4c86652 commit 59718de

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [Unreleased]
4+
### Fixed
5+
- crash when HTML tags contained special regex characters ('$' or '\\')
6+
37
## [1.0-beta.9](https://github.com/wordpress-mobile/AztecEditor-Android/releases/tag/v1.0-beta.9) - 2017-09-25
48
### Fixed
59
- OOB crash when unmarshalling URL span

aztec/src/main/kotlin/org/wordpress/aztec/source/Format.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ internal object Format {
9595
sb = StringBuffer()
9696
if (m.find()) {
9797
val result = replaceAll(content.substring(m.start(), m.end()), "<br([^>]*)>", "<wp-temp-br$1>")
98-
m.appendReplacement(sb, replace(result, "[\\r\\n\\t]+", ""))
98+
m.appendReplacement(sb, Matcher.quoteReplacement(replace(result, "[\\r\\n\\t]+", "")))
9999
}
100100
m.appendTail(sb)
101101
content = sb.toString()
@@ -143,7 +143,7 @@ internal object Format {
143143
m = p.matcher(content)
144144
sb = StringBuffer()
145145
if (m.find()) {
146-
m.appendReplacement(sb, replace(content.substring(m.start(), m.end()), "[\\r\\n]+", ""))
146+
m.appendReplacement(sb, Matcher.quoteReplacement(replace(content.substring(m.start(), m.end()), "[\\r\\n]+", "")))
147147
}
148148
m.appendTail(sb)
149149
content = sb.toString()
@@ -198,7 +198,7 @@ internal object Format {
198198
m = p.matcher(html)
199199
sb = StringBuffer()
200200
while (m.find()) {
201-
m.appendReplacement(sb, replaceAll(html.substring(m.start(), m.end()), "[\\r\\n]+", ""))
201+
m.appendReplacement(sb, Matcher.quoteReplacement(replaceAll(html.substring(m.start(), m.end()), "[\\r\\n]+", "")))
202202
}
203203
m.appendTail(sb)
204204
html = sb.toString()
@@ -208,7 +208,7 @@ internal object Format {
208208
m = p.matcher(html)
209209
sb = StringBuffer()
210210
while (m.find()) {
211-
m.appendReplacement(sb, replaceAll(html.substring(m.start(), m.end()), "[\\r\\n]+", ""))
211+
m.appendReplacement(sb, Matcher.quoteReplacement(replaceAll(html.substring(m.start(), m.end()), "[\\r\\n]+", "")))
212212
}
213213
m.appendTail(sb)
214214
html = sb.toString()
@@ -231,21 +231,21 @@ internal object Format {
231231
sb = StringBuffer()
232232
while (m.find()) {
233233
// keep existing <br>
234-
m.appendReplacement(sb, replaceAll(html.substring(m.start(), m.end()), "<br([^>]*)>", "<wp-temp-br$1>"))
234+
m.appendReplacement(sb, Matcher.quoteReplacement(replaceAll(html.substring(m.start(), m.end()), "<br([^>]*)>", "<wp-temp-br$1>")))
235235

236236
// no line breaks inside HTML tags
237237
val p2 = Pattern.compile("<[a-zA-Z0-9]+( [^<>]+)?>")
238238
val content = html.substring(m.start(), m.end())
239239
val m2 = p2.matcher(content)
240240
val sb2 = StringBuffer()
241241
while (m2.find()) {
242-
m2.appendReplacement(sb2, replace(content.substring(m2.start(), m2.end()), "[\\r\\n\\t]+", " "))
242+
m2.appendReplacement(sb2, Matcher.quoteReplacement(replace(content.substring(m2.start(), m2.end()), "[\\r\\n\\t]+", " ")))
243243
}
244244
m2.appendTail(sb2)
245-
m.appendReplacement(sb, sb2.toString())
245+
m.appendReplacement(sb, Matcher.quoteReplacement(sb2.toString()))
246246

247247
// convert remaining line breaks to <br>
248-
m.appendReplacement(sb, replaceAll(html.substring(m.start(), m.end()), "\\s*\\n\\s*", "<wp-temp-br />"))
248+
m.appendReplacement(sb, Matcher.quoteReplacement(replaceAll(html.substring(m.start(), m.end()), "\\s*\\n\\s*", "<wp-temp-br />")))
249249
}
250250
m.appendTail(sb)
251251
html = sb.toString()

aztec/src/test/kotlin/org/wordpress/aztec/CalypsoFormattingTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,19 @@ class CalypsoFormattingTest : AndroidTestCase() {
7676
"<div class=\"fourth\"><u>Under</u>line</div>\n" +
7777
"<div class=\"fifth\"></div>\n</div>\n</div>"
7878

79+
private val HTML_MIXED_REGEX =
80+
"\n\n<span><i>Italic</i></span>\n\n<b>Bold</b><br>" +
81+
"\t<div class=\"\$\$\$first\">" +
82+
"<a href=\"https://github.com/wordpress-mobile/Word\\Press-Aztec-Android\">Link</a>" +
83+
" \t<div class=\"sec $8 ond\"></div></div>"
84+
85+
private val HTML_MIXED_REGEX_CALYPSO =
86+
"<span><i>Italic</i></span>\n\n<b>Bold</b>\n" +
87+
"<div class=\"\$\$\$first\">" +
88+
"<a href=\"https://github.com/wordpress-mobile/Word\\Press-Aztec-Android\">Link</a>\n" +
89+
"<div class=\"sec $8 ond\"></div>\n" +
90+
"</div>"
91+
7992
/**
8093
* Initialize variables.
8194
*/
@@ -125,4 +138,18 @@ class CalypsoFormattingTest : AndroidTestCase() {
125138
val output = Format.addSourceEditorFormatting(parser.toHtml(span), true)
126139
Assert.assertEquals(HTML_MIXED_WITH_NEWLINES_CALYPSO, output)
127140
}
141+
142+
/**
143+
* Test the conversion of HTML containing special regex characters
144+
*
145+
* @throws Exception
146+
*/
147+
@Test
148+
@Throws(Exception::class)
149+
fun formatRegexSpecialCharactersCalypso() {
150+
val input = Format.removeSourceEditorFormatting(HTML_MIXED_REGEX, true)
151+
val span = SpannableString(parser.fromHtml(input, context))
152+
val output = Format.addSourceEditorFormatting(parser.toHtml(span), true)
153+
Assert.assertEquals(HTML_MIXED_REGEX_CALYPSO, output)
154+
}
128155
}

0 commit comments

Comments
 (0)