Skip to content

Commit b3b8092

Browse files
authored
Merge pull request #994 from wordpress-mobile/fix/simplify-contains-preformat-method
Simplify containsPreformat method
2 parents 4358762 + 64397bb commit b3b8092

File tree

4 files changed

+529
-497
lines changed

4 files changed

+529
-497
lines changed

aztec/src/main/kotlin/org/wordpress/aztec/formatting/BlockFormatter.kt

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,21 +1116,11 @@ class BlockFormatter(editor: AztecText,
11161116
val lineStart = (0 until i).sumOf { lines[it].length + 1 }
11171117
val lineEnd = lineStart + lines[i].length
11181118

1119-
if (lineStart >= lineEnd) {
1119+
if (lineStart > lineEnd) {
11201120
continue
11211121
}
11221122

1123-
/**
1124-
* lineStart >= selStart && selEnd >= lineEnd // single line, current entirely selected OR
1125-
* multiple lines (before and/or after), current entirely selected
1126-
* lineStart <= selEnd && selEnd <= lineEnd // single line, current partially or entirely selected OR
1127-
* multiple lines (after), current partially or entirely selected
1128-
* lineStart <= selStart && selStart <= lineEnd // single line, current partially or entirely selected OR
1129-
* multiple lines (before), current partially or entirely selected
1130-
*/
1131-
if ((lineStart >= selStart && selEnd >= lineEnd)
1132-
|| (selEnd in lineStart..lineEnd)
1133-
|| (selStart in lineStart..lineEnd)) {
1123+
if (lineStart <= selectionEnd && lineEnd >= selectionStart) {
11341124
list.add(i)
11351125
}
11361126
}
@@ -1149,12 +1139,15 @@ class BlockFormatter(editor: AztecText,
11491139
val start = (0 until index).sumOf { lines[it].length + 1 }
11501140
val end = start + lines[index].length
11511141

1152-
if (start >= end) {
1142+
if (start > end) {
11531143
return false
11541144
}
11551145

11561146
val spans = editableText.getSpans(start, end, AztecPreformatSpan::class.java)
1157-
return spans.isNotEmpty()
1147+
return spans.any {
1148+
val spanEnd = editableText.getSpanEnd(it)
1149+
spanEnd != start || editableText[spanEnd] != '\n'
1150+
}
11581151
}
11591152

11601153
private fun switchListType(listTypeToSwitchTo: ITextFormat, start: Int = selectionStart, end: Int = selectionEnd, attrs: AztecAttributes = AztecAttributes()) {

aztec/src/main/kotlin/org/wordpress/aztec/toolbar/AztecToolbar.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -725,8 +725,6 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
725725
headingMenu?.menu?.findItem(R.id.heading_4)?.isChecked == true -> AztecTextFormat.FORMAT_HEADING_4
726726
headingMenu?.menu?.findItem(R.id.heading_5)?.isChecked == true -> AztecTextFormat.FORMAT_HEADING_5
727727
headingMenu?.menu?.findItem(R.id.heading_6)?.isChecked == true -> AztecTextFormat.FORMAT_HEADING_6
728-
// TODO: Uncomment when Preformat is to be added back as a feature
729-
// else if (headingMenu?.menu?.findItem(R.id.preformat)?.isChecked!!) return AztecTextFormat.FORMAT_PREFORMAT
730728
else -> null
731729
}
732730

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

Lines changed: 120 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import org.wordpress.aztec.TestUtils.safeAppend
1515
import org.wordpress.aztec.TestUtils.safeLength
1616
import org.wordpress.aztec.source.SourceViewEditText
1717
import org.wordpress.aztec.toolbar.AztecToolbar
18+
import org.wordpress.aztec.toolbar.ToolbarAction
19+
import org.wordpress.aztec.toolbar.ToolbarItems
1820

1921
/**
2022
* Testing heading behaviour.
@@ -30,8 +32,7 @@ class HeadingTest {
3032
lateinit var menuHeading1: MenuItem
3133
lateinit var menuHeading2: MenuItem
3234
lateinit var menuParagraph: MenuItem
33-
// TODO: Uncomment when Preformat is to be added back as a feature
34-
// lateinit var menuPreformat: MenuItem
35+
lateinit var buttonPreformat: ToggleButton
3536

3637
/**
3738
* Initialize variables.
@@ -44,14 +45,29 @@ class HeadingTest {
4445
sourceText = SourceViewEditText(activity)
4546
sourceText.setCalypsoMode(false)
4647
toolbar = AztecToolbar(activity)
48+
toolbar.setToolbarItems(ToolbarItems.BasicLayout(
49+
ToolbarAction.HEADING,
50+
ToolbarAction.PREFORMAT,
51+
ToolbarAction.LIST,
52+
ToolbarAction.QUOTE,
53+
ToolbarAction.BOLD,
54+
ToolbarAction.ITALIC,
55+
ToolbarAction.LINK,
56+
ToolbarAction.UNDERLINE,
57+
ToolbarAction.STRIKETHROUGH,
58+
ToolbarAction.ALIGN_LEFT,
59+
ToolbarAction.ALIGN_CENTER,
60+
ToolbarAction.ALIGN_RIGHT,
61+
ToolbarAction.HORIZONTAL_RULE,
62+
ToolbarAction.HTML
63+
))
4764
toolbar.setEditor(editText, sourceText)
4865
buttonQuote = toolbar.findViewById<ToggleButton>(R.id.format_bar_button_quote)
4966
menuHeading = toolbar.getHeadingMenu() as PopupMenu
5067
menuHeading1 = menuHeading.menu.getItem(1)
5168
menuHeading2 = menuHeading.menu.getItem(2)
5269
menuParagraph = menuHeading.menu.getItem(0)
53-
// TODO: Uncomment when Preformat is to be added back as a feature
54-
// menuPreformat = menuHeading.menu.getItem(7)
70+
buttonPreformat = toolbar.findViewById<ToggleButton>(R.id.format_bar_button_pre)
5571
activity.setContentView(editText)
5672
}
5773

@@ -64,15 +80,14 @@ class HeadingTest {
6480
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
6581
}
6682

67-
// TODO: Uncomment when Preformat is to be added back as a feature
68-
// @Test
69-
// @Throws(Exception::class)
70-
// fun applyPreformatToSingleLine() {
71-
// safeAppend(editText, "Preformat")
72-
// toolbar.onMenuItemClick(menuPreformat)
73-
// Assert.assertEquals("<pre>Preformat</pre>", editText.toHtml())
74-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
75-
// }
83+
@Test
84+
@Throws(Exception::class)
85+
fun applyPreformatToSingleLine() {
86+
safeAppend(editText, "Preformat")
87+
buttonPreformat.performClick()
88+
Assert.assertEquals("<pre>Preformat</pre>", editText.toHtml())
89+
Assert.assertTrue(buttonPreformat.isChecked)
90+
}
7691

7792
@Test
7893
@Throws(Exception::class)
@@ -84,16 +99,15 @@ class HeadingTest {
8499
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
85100
}
86101

87-
// TODO: Uncomment when Preformat is to be added back as a feature
88-
// @Test
89-
// @Throws(Exception::class)
90-
// fun applyPreformatToPartiallySelectedText() {
91-
// safeAppend(editText, "Preformat")
92-
// editText.setSelection(1, editText.length() - 2)
93-
// toolbar.onMenuItemClick(menuPreformat)
94-
// Assert.assertEquals("<pre>Preformat</pre>", editText.toHtml())
95-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
96-
// }
102+
@Test
103+
@Throws(Exception::class)
104+
fun applyPreformatToPartiallySelectedText() {
105+
safeAppend(editText, "Preformat")
106+
editText.setSelection(1, editText.length() - 2)
107+
buttonPreformat.performClick()
108+
Assert.assertEquals("<pre>Preformat</pre>", editText.toHtml())
109+
Assert.assertTrue(buttonPreformat.isChecked)
110+
}
97111

98112
@Test
99113
@Throws(Exception::class)
@@ -107,18 +121,17 @@ class HeadingTest {
107121
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
108122
}
109123

110-
// TODO: Uncomment when Preformat is to be added back as a feature
111-
// @Test
112-
// @Throws(Exception::class)
113-
// fun applyPreformatToSelectedMultilineText() {
114-
// safeAppend(editText, "First line")
115-
// safeAppend(editText, "\n")
116-
// safeAppend(editText, "Second line")
117-
// editText.setSelection(3, editText.length() - 3)
118-
// toolbar.onMenuItemClick(menuPreformat)
119-
// Assert.assertEquals("<pre>First line<br>Second line</pre>", editText.toHtml())
120-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
121-
// }
124+
@Test
125+
@Throws(Exception::class)
126+
fun applyPreformatToSelectedMultilineText() {
127+
safeAppend(editText, "First line")
128+
safeAppend(editText, "\n")
129+
safeAppend(editText, "Second line")
130+
editText.setSelection(3, editText.length() - 3)
131+
buttonPreformat.performClick()
132+
Assert.assertEquals("<pre>First line<br>Second line</pre>", editText.toHtml())
133+
Assert.assertTrue(buttonPreformat.isChecked)
134+
}
122135

123136
@Test
124137
@Throws(Exception::class)
@@ -130,16 +143,15 @@ class HeadingTest {
130143
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
131144
}
132145

133-
// TODO: Uncomment when Preformat is to be added back as a feature
134-
// @Test
135-
// @Throws(Exception::class)
136-
// fun prependTextToPreformat() {
137-
// safeAppend(editText, "Preformat")
138-
// toolbar.onMenuItemClick(menuPreformat)
139-
// editText.text.insert(0, "inserted")
140-
// Assert.assertEquals("<pre>insertedPreformat</pre>", editText.toHtml())
141-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
142-
// }
146+
@Test
147+
@Throws(Exception::class)
148+
fun prependTextToPreformat() {
149+
safeAppend(editText, "Preformat")
150+
buttonPreformat.performClick()
151+
editText.text.insert(0, "inserted")
152+
Assert.assertEquals("<pre>insertedPreformat</pre>", editText.toHtml())
153+
Assert.assertTrue(buttonPreformat.isChecked)
154+
}
143155

144156
@Test
145157
@Throws(Exception::class)
@@ -248,16 +260,15 @@ class HeadingTest {
248260
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_2, toolbar.getSelectedHeadingMenuItem())
249261
}
250262

251-
// TODO: Uncomment when Preformat is to be added back as a feature
252-
// @Test
253-
// @Throws(Exception::class)
254-
// fun changeHeadingToPreformatOfSingleLine() {
255-
// editText.fromHtml("<h1 foo=\"bar\">Text</h1>")
256-
// toolbar.onMenuItemClick(menuHeading1)
257-
// toolbar.onMenuItemClick(menuPreformat)
258-
// Assert.assertEquals("<pre foo=\"bar\">Text</pre>", editText.toHtml())
259-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
260-
// }
263+
@Test
264+
@Throws(Exception::class)
265+
fun changeHeadingToPreformatOfSingleLine() {
266+
editText.fromHtml("<h1 foo=\"bar\">Text</h1>")
267+
toolbar.onMenuItemClick(menuHeading1)
268+
buttonPreformat.performClick()
269+
Assert.assertEquals("<pre foo=\"bar\">Text</pre>", editText.toHtml())
270+
Assert.assertTrue(buttonPreformat.isChecked)
271+
}
261272

262273
@Test
263274
@Throws(Exception::class)
@@ -269,19 +280,18 @@ class HeadingTest {
269280
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_2, toolbar.getSelectedHeadingMenuItem())
270281
}
271282

272-
// TODO: Uncomment when Preformat is to be added back as a feature
273-
// @Test
274-
// @Throws(Exception::class)
275-
// fun changeHeadingToParagraphToPreformatOfSelectedMultilineText() {
276-
// editText.fromHtml("<h1 foo=\"bar\">Heading 1</h1><pre>Preformat</pre>")
277-
// editText.setSelection(0, safeLength(editText))
278-
// toolbar.onMenuItemClick(menuParagraph)
279-
// Assert.assertEquals("Heading 1<br>Preformat", editText.toHtml())
280-
// Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
281-
// toolbar.onMenuItemClick(menuPreformat)
282-
// Assert.assertEquals("<pre>Heading 1<br>Preformat</pre>", editText.toHtml())
283-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
284-
// }
283+
@Test
284+
@Throws(Exception::class)
285+
fun changeHeadingToParagraphToPreformatOfSelectedMultilineText() {
286+
editText.fromHtml("<h1 foo=\"bar\">Heading 1</h1><pre>Preformat</pre>")
287+
editText.setSelection(0, safeLength(editText))
288+
toolbar.onMenuItemClick(menuParagraph)
289+
Assert.assertEquals("Heading 1<br>Preformat", editText.toHtml())
290+
Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
291+
buttonPreformat.performClick()
292+
Assert.assertEquals("<pre>Heading 1<br>Preformat</pre>", editText.toHtml())
293+
Assert.assertTrue(buttonPreformat.isChecked)
294+
}
285295

286296
@Test
287297
@Throws(Exception::class)
@@ -302,15 +312,14 @@ class HeadingTest {
302312
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
303313
}
304314

305-
// TODO: Uncomment when Preformat is to be added back as a feature
306-
// @Test
307-
// @Throws(Exception::class)
308-
// fun applyPreformatToTextInsideQuote() {
309-
// editText.fromHtml("<blockquote>Quote</blockquote>")
310-
// toolbar.onMenuItemClick(menuPreformat)
311-
// Assert.assertEquals("<blockquote><pre>Quote</pre></blockquote>", editText.toHtml())
312-
// Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
313-
// }
315+
@Test
316+
@Throws(Exception::class)
317+
fun applyPreformatToTextInsideQuote() {
318+
editText.fromHtml("<blockquote>Quote</blockquote>")
319+
buttonPreformat.performClick()
320+
Assert.assertEquals("<pre><blockquote>Quote</blockquote></pre>", editText.toHtml())
321+
Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
322+
}
314323

315324
@Test
316325
@Throws(Exception::class)
@@ -337,15 +346,14 @@ class HeadingTest {
337346
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
338347
}
339348

340-
// TODO: Uncomment when Preformat is to be added back as a feature
341-
// @Test
342-
// @Throws(Exception::class)
343-
// fun applyPreformatToQuote() {
344-
// editText.fromHtml("<blockquote>Quote</blockquote>")
345-
// toolbar.onMenuItemClick(menuPreformat)
346-
// Assert.assertEquals("<blockquote><pre>Quote</pre></blockquote>", editText.toHtml())
347-
// Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
348-
// }
349+
@Test
350+
@Throws(Exception::class)
351+
fun applyPreformatToQuote() {
352+
editText.fromHtml("<blockquote>Quote</blockquote>")
353+
buttonPreformat.performClick()
354+
Assert.assertEquals("<pre><blockquote>Quote</blockquote></pre>", editText.toHtml())
355+
Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
356+
}
349357

350358
@Test
351359
@Throws(Exception::class)
@@ -358,20 +366,19 @@ class HeadingTest {
358366
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
359367
}
360368

361-
// TODO: Uncomment when Preformat is to be added back as a feature
362-
// @Test
363-
// @Throws(Exception::class)
364-
// fun applyPreformatToTextSurroundedByLists() {
365-
// editText.fromHtml("<ol><li>Ordered</li></ol>Preformat<ol><li>Ordered</li></ol>")
366-
// val mark = editText.text.indexOf("format")
367-
// editText.setSelection(mark)
368-
// toolbar.onMenuItemClick(menuPreformat)
369-
// Assert.assertEquals("<ol><li>Ordered</li></ol><pre>Preformat</pre><ol><li>Ordered</li></ol>", editText.toHtml())
370-
//// TODO: Correct heading menu selection. This is incorrect. Preformat should be selected.
371-
//// https://github.com/wordpress-mobile/AztecEditor-Android/issues/317
372-
//// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
373-
// Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
374-
// }
369+
@Test
370+
@Throws(Exception::class)
371+
fun applyPreformatToTextSurroundedByLists() {
372+
editText.fromHtml("<ol><li>Ordered</li></ol>Preformat<ol><li>Ordered</li></ol>")
373+
val mark = editText.text.indexOf("format")
374+
editText.setSelection(mark)
375+
buttonPreformat.performClick()
376+
Assert.assertEquals("<ol><li>Ordered</li></ol><pre>Preformat</pre><ol><li>Ordered</li></ol>", editText.toHtml())
377+
// TODO: Correct heading menu selection. This is incorrect. Preformat should be selected.
378+
// https://github.com/wordpress-mobile/AztecEditor-Android/issues/317
379+
// Assert.assertTrue(buttonPreformat.isChecked)
380+
Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
381+
}
375382

376383
@Test
377384
@Throws(Exception::class)
@@ -384,17 +391,16 @@ class HeadingTest {
384391
Assert.assertEquals(AztecTextFormat.FORMAT_HEADING_1, toolbar.getSelectedHeadingMenuItem())
385392
}
386393

387-
// TODO: Uncomment when Preformat is to be added back as a feature
388-
// @Test
389-
// @Throws(Exception::class)
390-
// fun applyPreformatToTextSurroundedByQuotes() {
391-
// editText.fromHtml("<blockquote>Quote</blockquote>Preformat<blockquote>Quote</blockquote>")
392-
// val mark = editText.text.indexOf("format")
393-
// editText.setSelection(mark)
394-
// toolbar.onMenuItemClick(menuPreformat)
395-
// Assert.assertEquals("<blockquote>Quote</blockquote><pre>Preformat</pre><blockquote>Quote</blockquote>", editText.toHtml())
396-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
397-
// }
394+
@Test
395+
@Throws(Exception::class)
396+
fun applyPreformatToTextSurroundedByQuotes() {
397+
editText.fromHtml("<blockquote>Quote</blockquote>Preformat<blockquote>Quote</blockquote>")
398+
val mark = editText.text.indexOf("format")
399+
editText.setSelection(mark)
400+
buttonPreformat.performClick()
401+
Assert.assertEquals("<blockquote>Quote</blockquote><pre>Preformat</pre><blockquote>Quote</blockquote>", editText.toHtml())
402+
Assert.assertTrue(buttonPreformat.isChecked)
403+
}
398404

399405
@Test
400406
@Throws(Exception::class)
@@ -498,10 +504,9 @@ class HeadingTest {
498504
editText.setSelection(cursor)
499505
Assert.assertEquals(AztecTextFormat.FORMAT_PARAGRAPH, toolbar.getSelectedHeadingMenuItem())
500506

501-
// TODO: Uncomment when Preformat is to be added back as a feature
502-
// cursor = editText.text.indexOf("format")
503-
// editText.setSelection(cursor)
504-
// Assert.assertEquals(AztecTextFormat.FORMAT_PREFORMAT, toolbar.getSelectedHeadingMenuItem())
507+
cursor = editText.text.indexOf("format")
508+
editText.setSelection(cursor)
509+
Assert.assertTrue(buttonPreformat.isChecked)
505510
}
506511

507512
/**

0 commit comments

Comments
 (0)