Skip to content

Commit 527bd7e

Browse files
committed
Refactor editor structure
1 parent b426344 commit 527bd7e

20 files changed

+946
-688
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"spans": [{"insert":"RichEditor","attributes":{"bold":true,"header":1}},{"insert":"\nAndroid ","attributes":{}},{"insert":"WYSIWYG ","attributes":{"bold":true,"italic":true}},{"insert":"Rich editor for ","attributes":{}},{"insert":"Jetpack compose.\n\n","attributes":{"bold":true,"underline":true}},{"insert":"Features","attributes":{"bold":true,"header":3}},{"insert":"\nThe editor offers the following ","attributes":{}},{"insert":"options:\n","attributes":{"bold":true,"italic":true,"underline":true}},{"insert":"\n","attributes":{}},{"insert":"Bold\n","attributes":{"bold":true}},{"insert":"Italic\n","attributes":{"italic":true}},{"insert":"Underline\n","attributes":{"underline":true}},{"insert":"Different ","attributes":{}},{"insert":"Headings\n\n","attributes":{"bold":true,"italic":true,"underline":true}},{"insert":"Bullet List:\n","attributes":{"bold":true}},{"insert":"Item 1","attributes":{"list":"bullet"}},{"insert":"\n","attributes":{}},{"insert":"Item 2","attributes":{"list":"bullet"}},{"insert":"\n","attributes":{}},{"insert":"Item 3","attributes":{"list":"bullet"}},{"insert":"\n","attributes":{}},{"insert":"Item 4\n","attributes":{"list":"bullet"}},{"insert":"\n","attributes":{}},{"insert":"Credits","attributes":{"bold":true,"header":3}},{"insert":"\n\n","attributes":{}},{"insert":"RichEditor ","attributes":{"bold":true}},{"insert":"for compose is developed and maintained by the ","attributes":{}},{"insert":"canopas team.\n\n","attributes":{"bold":true,"italic":true,"underline":true}},{"insert":"Thank You! 😊\n\n","attributes":{}}]
3+
}

app/src/main/assets/sample-data.json

-110
This file was deleted.

app/src/main/java/com/example/texteditor/MainActivity.kt

+17-11
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ import androidx.compose.ui.res.painterResource
3939
import androidx.compose.ui.tooling.preview.Preview
4040
import androidx.compose.ui.unit.dp
4141
import androidx.compose.ui.window.PopupProperties
42-
import com.canopas.editor.ui.data.RichEditorState
42+
import com.canopas.editor.ui.data.QuillEditorState
4343
import com.canopas.editor.ui.ui.RichEditor
4444
import com.canopas.editor.ui.utils.TextSpanStyle
45-
import com.example.texteditor.parser.JsonEditorParser
45+
import com.example.texteditor.parser.QuillJsonEditorParser
4646
import com.example.texteditor.ui.theme.TextEditorTheme
4747

4848
class MainActivity : ComponentActivity() {
@@ -66,21 +66,21 @@ fun Sample() {
6666
TextEditorTheme {
6767
val context = LocalContext.current
6868

69-
val state = remember {
69+
val quillState = remember {
7070
val input =
71-
context.assets.open("sample-data.json").bufferedReader().use { it.readText() }
72-
RichEditorState.Builder()
71+
context.assets.open("android-quill-sample.json").bufferedReader().use { it.readText() }
72+
QuillEditorState.Builder()
7373
.setInput(input)
74-
.adapter(JsonEditorParser())
74+
.adapter(QuillJsonEditorParser())
7575
.build()
7676
}
7777

7878
Column {
7979

80-
StyleContainer(state)
80+
StyleContainer(quillState)
8181

8282
RichEditor(
83-
state = state,
83+
state = quillState,
8484
modifier = Modifier
8585
.fillMaxWidth()
8686
.weight(1f)
@@ -94,7 +94,7 @@ fun Sample() {
9494

9595
@Composable
9696
fun StyleContainer(
97-
state: RichEditorState,
97+
state: QuillEditorState,
9898
) {
9999
Row(
100100
Modifier
@@ -123,6 +123,12 @@ fun StyleContainer(
123123
value = state,
124124
)
125125

126+
StyleButton(
127+
icon = R.drawable.baseline_format_list_bulleted_24,
128+
style = TextSpanStyle.BulletStyle,
129+
value = state,
130+
)
131+
126132
IconButton(
127133
modifier = Modifier
128134
.padding(2.dp)
@@ -144,7 +150,7 @@ fun StyleContainer(
144150

145151
@Composable
146152
fun TitleStyleButton(
147-
value: RichEditorState
153+
value: QuillEditorState
148154
) {
149155
var expanded by remember { mutableStateOf(false) }
150156

@@ -220,7 +226,7 @@ fun DropDownItem(
220226
fun StyleButton(
221227
@DrawableRes icon: Int,
222228
style: TextSpanStyle,
223-
value: RichEditorState,
229+
value: QuillEditorState,
224230
) {
225231
IconButton(
226232
modifier = Modifier

app/src/main/java/com/example/texteditor/parser/JsonEditorParser.kt

-23
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.example.texteditor.parser
2+
3+
import com.canopas.editor.ui.model.QuillSpan
4+
import com.canopas.editor.ui.model.Span
5+
import com.canopas.editor.ui.parser.QuillEditorAdapter
6+
import com.google.gson.Gson
7+
import com.google.gson.GsonBuilder
8+
import com.google.gson.reflect.TypeToken
9+
10+
class QuillJsonEditorParser : QuillEditorAdapter {
11+
12+
private val gson: Gson = GsonBuilder()
13+
.registerTypeAdapter(Span::class.java, QuillRichTextStateAdapter())
14+
.create()
15+
16+
override fun encode(input: String): QuillSpan {
17+
return gson.fromJson(input, object : TypeToken<QuillSpan>() {}.type)
18+
}
19+
20+
override fun decode(editorValue: QuillSpan): String {
21+
return gson.toJson(editorValue)
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.example.texteditor.parser
2+
3+
import android.util.Log
4+
import com.canopas.editor.ui.model.Attributes
5+
import com.canopas.editor.ui.model.Span
6+
import com.google.gson.JsonDeserializationContext
7+
import com.google.gson.JsonDeserializer
8+
import com.google.gson.JsonElement
9+
import com.google.gson.JsonObject
10+
import com.google.gson.JsonParseException
11+
import com.google.gson.JsonSerializationContext
12+
import com.google.gson.JsonSerializer
13+
import java.lang.reflect.Type
14+
15+
class QuillRichTextStateAdapter : JsonSerializer<Span>, JsonDeserializer<Span> {
16+
override fun serialize(
17+
src: Span?,
18+
typeOfSrc: Type?,
19+
context: JsonSerializationContext?
20+
): JsonElement {
21+
val jsonObject = JsonObject()
22+
jsonObject.add("insert", context?.serialize(src?.insert))
23+
jsonObject.add("attributes", context?.serialize(src?.attributes))
24+
return jsonObject
25+
}
26+
27+
override fun deserialize(
28+
json: JsonElement?,
29+
typeOfT: Type?,
30+
context: JsonDeserializationContext?
31+
): Span {
32+
try {
33+
val jsonObject = json?.asJsonObject ?: throw JsonParseException("Invalid JSON")
34+
val insert = jsonObject.get("insert")
35+
val attributes = jsonObject.get("attributes")
36+
return Span(
37+
insert = context?.deserialize<String>(insert, String::class.java),
38+
attributes = context?.deserialize<Attributes>(attributes, Attributes::class.java)
39+
)
40+
} catch (e: Exception) {
41+
Log.e("QuillRichTextStateAdapter", "deserialize: ", e)
42+
throw JsonParseException("Invalid JSON")
43+
}
44+
}
45+
}

app/src/main/java/com/example/texteditor/parser/RichTextStateAdapter.kt

-55
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:autoMirrored="true" android:height="24dp"
2+
android:tint="#000000" android:viewportHeight="24"
3+
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M4,10.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM4,4.5c-0.83,0 -1.5,0.67 -1.5,1.5S3.17,7.5 4,7.5 5.5,6.83 5.5,6 4.83,4.5 4,4.5zM4,16.5c-0.83,0 -1.5,0.68 -1.5,1.5s0.68,1.5 1.5,1.5 1.5,-0.68 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM7,19h14v-2L7,17v2zM7,13h14v-2L7,11v2zM7,5v2h14L21,5L7,5z"/>
5+
</vector>

build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
plugins {
3-
id 'com.android.application' version '8.0.2' apply false
4-
id 'com.android.library' version '8.0.2' apply false
3+
id 'com.android.application' version '8.2.2' apply false
4+
id 'com.android.library' version '8.2.2' apply false
55
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
66
id 'io.github.gradle-nexus.publish-plugin' version "1.3.0"
77
}

0 commit comments

Comments
 (0)