Skip to content

Commit 50b066e

Browse files
committed
calculate start and end offset of each note part
1 parent 8081ff4 commit 50b066e

File tree

3 files changed

+47
-47
lines changed

3 files changed

+47
-47
lines changed

app/src/androidTest/java/com/orgzly/android/ui/notes/NoteContentTest.kt

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.orgzly.android.ui.notes
22

3-
import com.orgzly.android.ui.notes.NoteContent.TableNoteContent
4-
import com.orgzly.android.ui.notes.NoteContent.TextNoteContent
53
import org.hamcrest.Matchers.emptyCollectionOf
64
import org.junit.Assert.assertEquals
75
import org.junit.Assert.assertThat
@@ -19,7 +17,7 @@ class NoteContentTest {
1917

2018
@Test
2119
fun emptyLinesShouldStayInSingleSection() {
22-
checkExpected("\n\n", listOf(TextNoteContent("\n\n")))
20+
checkExpected("\n\n", listOf(NoteContent("\n\n", 0, 1, NoteContent.TextType.TEXT)))
2321
}
2422

2523
@Test
@@ -28,36 +26,36 @@ class NoteContentTest {
2826
|
2927
3028
foo|bar""", listOf(
31-
TextNoteContent("foo\n"),
32-
TableNoteContent("|\n"),
33-
TextNoteContent("\nfoo|bar")
29+
NoteContent("foo\n", 0, 3, NoteContent.TextType.TEXT),
30+
NoteContent("|\n", 4, 5, NoteContent.TextType.TABLE),
31+
NoteContent("\nfoo|bar", 6, 13, NoteContent.TextType.TEXT)
3432
))
3533
}
3634

3735
@Test
3836
fun singleTable() {
3937
checkExpected("""|a|b|
4038
|c|d|
41-
""", listOf(TableNoteContent("""|a|b|
39+
""", listOf(NoteContent("""|a|b|
4240
|c|d|
43-
""")))
41+
""", 0, 11, NoteContent.TextType.TABLE)))
4442
}
4543

4644
@Test
4745
fun singleTableNoFinalNewline() {
4846
checkExpected("""|a|b|
49-
|c|d|""", listOf(TableNoteContent("""|a|b|
50-
|c|d|""")))
47+
|c|d|""", listOf(NoteContent("""|a|b|
48+
|c|d|""", 0, 10, NoteContent.TextType.TABLE)))
5149
}
5250

5351
@Test
5452
fun singleLineTextTableText() {
5553
checkExpected("""foo
5654
|
5755
bar""", listOf(
58-
TextNoteContent("foo\n"),
59-
TableNoteContent("|\n"),
60-
TextNoteContent("bar")
56+
NoteContent("foo\n", 0, 3, NoteContent.TextType.TEXT),
57+
NoteContent("|\n", 4, 5, NoteContent.TextType.TABLE),
58+
NoteContent("bar", 6, 8, NoteContent.TextType.TEXT)
6159
))
6260
}
6361

@@ -68,9 +66,9 @@ bar""", listOf(
6866
|
6967
bar
7068
""", listOf(
71-
TextNoteContent("\n"),
72-
TableNoteContent("|\n"),
73-
TextNoteContent("bar\n")
69+
NoteContent("\n", 0, 0, NoteContent.TextType.TEXT),
70+
NoteContent("|\n", 1, 2, NoteContent.TextType.TABLE),
71+
NoteContent("bar\n", 3, 6, NoteContent.TextType.TEXT)
7472
))
7573
}
7674

@@ -79,9 +77,9 @@ bar
7977
checkExpected("""|zoo|
8078
8179
|zog|""", listOf(
82-
TableNoteContent("|zoo|\n"),
83-
TextNoteContent("\n"),
84-
TableNoteContent("|zog|")
80+
NoteContent("|zoo|\n", 0, 5, NoteContent.TextType.TABLE),
81+
NoteContent("\n", 6, 6, NoteContent.TextType.TEXT),
82+
NoteContent("|zog|", 7, 11, NoteContent.TextType.TABLE)
8583
))
8684
}
8785

@@ -91,9 +89,9 @@ bar
9189
|
9290
9391
chops""", listOf(
94-
TextNoteContent("foo\n"),
95-
TableNoteContent("|\n"),
96-
TextNoteContent("\nchops")
92+
NoteContent("foo\n", 0, 3, NoteContent.TextType.TEXT),
93+
NoteContent("|\n", 4, 5, NoteContent.TextType.TABLE),
94+
NoteContent("\nchops", 6, 11, NoteContent.TextType.TEXT)
9795
))
9896
}
9997

@@ -109,11 +107,11 @@ text3c
109107
|table4|
110108
text5
111109
""", listOf(
112-
TextNoteContent("text1\n"),
113-
TableNoteContent("|table2a|\n|table2b|\n"),
114-
TextNoteContent("text3a\ntext3b\ntext3c\n"),
115-
TableNoteContent("|table4|\n"),
116-
TextNoteContent("text5\n")
110+
NoteContent("text1\n", 0, 5, NoteContent.TextType.TEXT),
111+
NoteContent("|table2a|\n|table2b|\n", 6, 25, NoteContent.TextType.TABLE),
112+
NoteContent("text3a\ntext3b\ntext3c\n", 26, 46, NoteContent.TextType.TEXT),
113+
NoteContent("|table4|\n", 47, 55, NoteContent.TextType.TABLE),
114+
NoteContent("text5\n", 56, 61, NoteContent.TextType.TEXT)
117115
))
118116
}
119117

@@ -150,5 +148,8 @@ text5
150148

151149
assertEquals(input, roundTripped)
152150

151+
actual.forEach {
152+
assertEquals(it.text, input.substring(it.startOffset, it.endOffset + 1))
153+
}
153154
}
154155
}

app/src/main/java/com/orgzly/android/ui/notes/NoteContent.kt

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,10 @@ package com.orgzly.android.ui.notes
33
/**
44
* Represents a subsection of note content: either text, or a table
55
*/
6-
sealed class NoteContent {
6+
data class NoteContent(val text: String, val startOffset: Int, val endOffset: Int, val textType: TextType) {
77

8-
abstract val text: String
9-
10-
data class TextNoteContent(override val text: String) : NoteContent() {
11-
}
12-
13-
data class TableNoteContent(override val text: String) : NoteContent() {
14-
15-
fun reformat() {
16-
// placeholder - but would fix all the spacing, missing cells, etc. Complicated
17-
}
8+
enum class TextType {
9+
TEXT, TABLE
1810
}
1911

2012

@@ -55,12 +47,14 @@ sealed class NoteContent {
5547
}
5648
currentIsTable && !previousIsTable -> {
5749
currentTable = it + "\n"
58-
list.add(TextNoteContent(currentText))
50+
val startOffset = getLastOffset(list)
51+
list.add(NoteContent(currentText, startOffset, startOffset + currentText.length - 1, TextType.TEXT))
5952
currentText = ""
6053
}
6154
!currentIsTable && previousIsTable -> {
6255
currentText = it + "\n"
63-
list.add(TableNoteContent(currentTable))
56+
val startOffset = getLastOffset(list)
57+
list.add(NoteContent(currentTable, startOffset, startOffset + currentTable.length - 1, TextType.TABLE))
6458
currentTable = ""
6559
}
6660
!currentIsTable && !previousIsTable -> {
@@ -71,18 +65,23 @@ sealed class NoteContent {
7165
}
7266

7367
if (linesForParsing.isNotEmpty()) {
68+
69+
val endOffsetAdjustment = if (missingLastNewline) 2 else 1
70+
7471
if (previousIsTable) {
75-
list.add(TableNoteContent(if (missingLastNewline) {
72+
list.add(NoteContent(if (missingLastNewline) {
7673
currentTable.dropLast(1)
77-
} else currentTable))
74+
} else currentTable, getLastOffset(list), getLastOffset(list) + currentTable.length - endOffsetAdjustment, TextType.TABLE))
7875
} else {
79-
list.add(TextNoteContent(if (missingLastNewline) {
76+
list.add(NoteContent(if (missingLastNewline) {
8077
currentText.dropLast(1)
81-
} else currentText))
78+
} else currentText, getLastOffset(list), getLastOffset(list) + currentText.length - endOffsetAdjustment, TextType.TEXT))
8279
}
8380
}
8481

8582
return list
8683
}
84+
85+
private fun getLastOffset(list: MutableList<NoteContent>) = if (list.isEmpty()) 0 else list.last().endOffset + 1
8786
}
8887
}

app/src/main/java/com/orgzly/android/ui/notes/NoteItemViewBinder.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,16 @@ class NoteItemViewBinder(private val context: Context, private val inBook: Boole
124124
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
125125

126126
alternatingTableAndTextContent.forEach { noteContent ->
127-
when (noteContent) {
128-
is NoteContent.TableNoteContent -> {
127+
when (noteContent.textType) {
128+
NoteContent.TextType.TABLE -> {
129129

130130
val noteContentSectionTableTextView = layoutInflater.inflate(R.layout.item_note_content_section_table, linearLayout, false)
131131

132132
noteContentSectionTableTextView.findViewById<TextView>(R.id.note_content_section_table_text).text = noteContent.text
133133

134134
linearLayout.addView(noteContentSectionTableTextView)
135135
}
136-
else -> {
136+
NoteContent.TextType.TEXT -> {
137137

138138
val layout = layoutInflater.inflate(R.layout.item_note_content_section_text, linearLayout, false)
139139

0 commit comments

Comments
 (0)