Skip to content

Commit 76c3c61

Browse files
leandroBorgesFerreiraLeandro Ferreira
andauthored
Adding txt export (Writeopia#403)
* Adding txt export * ktlint --------- Co-authored-by: Leandro Ferreira <[email protected]>
1 parent 5a5fcbf commit 76c3c61

File tree

11 files changed

+2936
-2811
lines changed

11 files changed

+2936
-2811
lines changed

application/core/resources/config/ktlint/baseline.xml

Lines changed: 2846 additions & 2804 deletions
Large diffs are not rendered by default.

application/core/resources/src/commonMain/composeResources/values-en/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
<string name="dark_theme">Dark</string>
5757
<string name="system_theme">System</string>
5858
<string name="export_markdown">Export as Markdown</string>
59+
<string name="export_txt">Export as TXT</string>
5960
<string name="import_file">Import file</string>
6061
<string name="sort_by_name">Sort by name</string>
6162
<string name="sort_by_creation">Sort by creation</string>

application/core/resources/src/commonMain/composeResources/values-pt/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
<string name="dark_theme">Escuro</string>
5757
<string name="system_theme">Sistema</string>
5858
<string name="export_markdown">Exportar como Markdown</string>
59+
<string name="export_txt">Exportar como TXT</string>
5960
<string name="import_file">Importar arquivo</string>
6061
<string name="sort_by_name">Ordenar por nome</string>
6162
<string name="sort_by_creation">Ordenar por data de criação</string>

application/core/resources/src/commonMain/composeResources/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
<string name="dark_theme">Dark</string>
5959
<string name="system_theme">System</string>
6060
<string name="export_markdown">Export as Markdown</string>
61+
<string name="export_txt">Export as TXT</string>
6162
<string name="import_file">Import file</string>
6263
<string name="sort_by_name">Sort by name</string>
6364
<string name="sort_by_creation">Sort by creation date</string>

application/core/resources/src/commonMain/kotlin/io/writeopia/resources/WrStrings.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import writeopia.application.core.resources.generated.resources.error_requesting
2727
import writeopia.application.core.resources.generated.resources.export
2828
import writeopia.application.core.resources.generated.resources.export_json
2929
import writeopia.application.core.resources.generated.resources.export_markdown
30+
import writeopia.application.core.resources.generated.resources.export_txt
3031
import writeopia.application.core.resources.generated.resources.favorite
3132
import writeopia.application.core.resources.generated.resources.favorites
3233
import writeopia.application.core.resources.generated.resources.folder
@@ -140,6 +141,9 @@ object WrStrings {
140141
@Composable
141142
fun exportMarkdown() = stringResource(Res.string.export_markdown)
142143

144+
@Composable
145+
fun exportAsTxt() = stringResource(Res.string.export_txt)
146+
143147
@Composable
144148
fun exportJson() = stringResource(Res.string.export_json)
145149

application/features/note_menu/src/commonMain/kotlin/io/writeopia/notemenu/ui/screen/DesktopNotesMenu.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ fun DesktopNotesMenu(
8181
exportAsMarkdownClick = {
8282
directoryChooserSave("")?.let(chooseNoteViewModel::directoryFilesAsMarkdown)
8383
},
84+
exportAsTxtClick = {
85+
directoryChooserSave("")?.let(chooseNoteViewModel::directoryFilesAsTxt)
86+
},
8487
importClick = {
8588
chooseNoteViewModel.loadFiles(fileChooserLoad(""))
8689
},

application/features/note_menu/src/commonMain/kotlin/io/writeopia/notemenu/ui/screen/actions/DesktopNoteActionsMenu.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ fun DesktopNoteActionsMenu(
3232
showExtraOptionsRequest: () -> Unit,
3333
hideExtraOptionsRequest: () -> Unit,
3434
exportAsMarkdownClick: () -> Unit,
35+
exportAsTxtClick: () -> Unit,
3536
importClick: () -> Unit,
3637
syncInProgressState: StateFlow<SyncState>,
3738
onSyncLocallySelected: () -> Unit,
@@ -67,6 +68,7 @@ fun DesktopNoteActionsMenu(
6768
showExtraOptionsRequest,
6869
hideExtraOptionsRequest,
6970
exportAsMarkdownClick,
71+
exportAsTxtClick,
7072
importClick
7173
)
7274
}
@@ -78,6 +80,7 @@ private fun MoreOptions(
7880
showExtraOptionsRequest: () -> Unit,
7981
hideExtraOptionsRequest: () -> Unit,
8082
exportAsMarkdownClick: () -> Unit,
83+
exportAsTxtClick: () -> Unit,
8184
importClick: () -> Unit,
8285
) {
8386
Box {
@@ -107,6 +110,20 @@ private fun MoreOptions(
107110
}
108111
)
109112

113+
DropdownMenuItem(
114+
leadingIcon = {
115+
Icon(
116+
imageVector = WrIcons.exportFile,
117+
contentDescription = "Export file",
118+
tint = iconTintColor
119+
)
120+
},
121+
onClick = exportAsTxtClick,
122+
text = {
123+
Text(WrStrings.exportAsTxt(), color = MaterialTheme.colorScheme.onBackground)
124+
}
125+
)
126+
110127
DropdownMenuItem(
111128
leadingIcon = {
112129
Icon(
@@ -152,5 +169,6 @@ private fun DesktopNoteActionsMenuPreview() {
152169
syncInProgressState = MutableStateFlow(SyncState.Idle),
153170
onSyncLocallySelected = {},
154171
onWriteLocallySelected = {},
172+
exportAsTxtClick = {}
155173
)
156174
}

application/features/note_menu/src/commonMain/kotlin/io/writeopia/notemenu/viewmodel/ChooseNoteKmpViewModel.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import io.writeopia.notemenu.ui.dto.NotesUi
2121
import io.writeopia.onboarding.OnboardingState
2222
import io.writeopia.sdk.export.DocumentToJson
2323
import io.writeopia.sdk.export.DocumentToMarkdown
24+
import io.writeopia.sdk.export.DocumentToTxt
2425
import io.writeopia.sdk.export.DocumentWriter
2526
import io.writeopia.sdk.import.json.WriteopiaJsonParser
2627
import io.writeopia.sdk.models.document.Document
@@ -63,6 +64,7 @@ internal class ChooseNoteKmpViewModel(
6364
private val notesNavigation: NotesNavigation = NotesNavigation.Root,
6465
private val previewParser: PreviewParser = PreviewParser(),
6566
private val documentToMarkdown: DocumentToMarkdown = DocumentToMarkdown,
67+
private val documentToTxt: DocumentToTxt = DocumentToTxt,
6668
private val documentToJson: DocumentToJson = DocumentToJson(),
6769
private val writeopiaJsonParser: WriteopiaJsonParser = WriteopiaJsonParser(),
6870
private val supportedImageFiles: Set<String> = setOf("jpg", "jpeg", "png"),
@@ -367,6 +369,11 @@ internal class ChooseNoteKmpViewModel(
367369
cancelEditMenu()
368370
}
369371

372+
override fun directoryFilesAsTxt(path: String) {
373+
directoryFilesAs(path, documentToTxt)
374+
cancelEditMenu()
375+
}
376+
370377
override fun loadFiles(filePaths: List<ExternalFile>) {
371378
val now = Clock.System.now()
372379

application/features/note_menu/src/commonMain/kotlin/io/writeopia/notemenu/viewmodel/ChooseNoteViewModel.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ interface ChooseNoteViewModel : FolderController {
5252

5353
fun directoryFilesAsMarkdown(path: String)
5454

55+
fun directoryFilesAsTxt(path: String)
56+
5557
fun loadFiles(filePaths: List<ExternalFile>)
5658

5759
fun onDocumentSelected(id: String, selected: Boolean)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.writeopia.sdk.export
2+
3+
import io.writeopia.sdk.export.files.KmpFileWriter
4+
import io.writeopia.sdk.export.files.name
5+
import io.writeopia.sdk.models.document.Document
6+
import io.writeopia.sdk.models.story.StoryStep
7+
import io.writeopia.sdk.models.story.StoryTypes
8+
import io.writeopia.sdk.utils.files.useKmp
9+
10+
object DocumentToTxt : DocumentWriter {
11+
12+
override fun writeDocuments(
13+
documents: List<Document>,
14+
path: String,
15+
writeConfigFile: Boolean,
16+
usePath: Boolean
17+
) {
18+
documents.forEach { document ->
19+
KmpFileWriter(
20+
if (usePath) {
21+
name(document, path, ".txt")
22+
} else {
23+
path.takeIf { it.contains(".txt") } ?: "$path.txt"
24+
}
25+
).useKmp { writer ->
26+
writeToWriter(
27+
content = document.content,
28+
kmpFileWriter = writer
29+
)
30+
}
31+
}
32+
}
33+
34+
override fun writeDocument(document: Document, path: String, writeConfigFile: Boolean) {}
35+
36+
private fun writeToWriter(
37+
content: Map<Int, StoryStep>,
38+
kmpFileWriter: KmpFileWriter,
39+
) {
40+
content.asSequence()
41+
.mapNotNull { (_, story) -> parseStep(story) }
42+
.forEach(kmpFileWriter::writeLine)
43+
}
44+
45+
private fun parseStep(storyStep: StoryStep): String? =
46+
when (storyStep.type.number) {
47+
StoryTypes.CHECK_ITEM.type.number -> storyStep.text?.let { "[] $it" }
48+
49+
StoryTypes.UNORDERED_LIST_ITEM.type.number -> storyStep.text?.let { "- $it" }
50+
51+
else -> storyStep.text
52+
}
53+
}

0 commit comments

Comments
 (0)