diff --git a/src/main/kotlin/com/marvinelsen/willow/domain/CrossStraitsDefinition.kt b/src/main/kotlin/com/marvinelsen/willow/domain/CrossStraitsDefinition.kt new file mode 100644 index 0000000..6daccaa --- /dev/null +++ b/src/main/kotlin/com/marvinelsen/willow/domain/CrossStraitsDefinition.kt @@ -0,0 +1,9 @@ +package com.marvinelsen.willow.domain + +import kotlinx.serialization.Serializable + +@Serializable +data class CrossStraitsDefinition( + val definition: String, + val examples: List, +) diff --git a/src/main/kotlin/com/marvinelsen/willow/domain/DictionaryEntry.kt b/src/main/kotlin/com/marvinelsen/willow/domain/DictionaryEntry.kt index 6667c39..d6ff31d 100644 --- a/src/main/kotlin/com/marvinelsen/willow/domain/DictionaryEntry.kt +++ b/src/main/kotlin/com/marvinelsen/willow/domain/DictionaryEntry.kt @@ -6,5 +6,6 @@ data class DictionaryEntry( val pinyinWithToneMarks: String, val pinyinWithToneNumbers: String, val zhuyin: String, - val definitions: List> + val cedictDefinitions: List>, + val crossStraitsDefinitions: List, ) diff --git a/src/main/kotlin/com/marvinelsen/willow/domain/SqliteDictionary.kt b/src/main/kotlin/com/marvinelsen/willow/domain/SqliteDictionary.kt index 1f20a11..b1e0201 100644 --- a/src/main/kotlin/com/marvinelsen/willow/domain/SqliteDictionary.kt +++ b/src/main/kotlin/com/marvinelsen/willow/domain/SqliteDictionary.kt @@ -27,8 +27,8 @@ class SqliteDictionary(private val connection: Connection) : Dictionary { private val searchSimplifiedPreparedStatement: PreparedStatement by lazy { connection.prepareStatement( """ - SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions - FROM cedict + SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions, cross_straits_definitions + FROM entry WHERE simplified GLOB ? ORDER BY character_count ASC """.trimIndent() @@ -38,8 +38,8 @@ class SqliteDictionary(private val connection: Connection) : Dictionary { private val searchTraditionalPreparedStatement: PreparedStatement by lazy { connection.prepareStatement( """ - SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions - FROM cedict + SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions, cross_straits_definitions + FROM entry WHERE traditional GLOB ? ORDER BY character_count ASC """.trimIndent() @@ -49,8 +49,8 @@ class SqliteDictionary(private val connection: Connection) : Dictionary { private val searchPinyinPreparedStatement: PreparedStatement by lazy { connection.prepareStatement( """ - SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions - FROM cedict + SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions, cross_straits_definitions + FROM entry WHERE searchable_pinyin GLOB ? OR searchable_pinyin_with_tone_numbers GLOB ? ORDER BY character_count ASC @@ -60,17 +60,17 @@ class SqliteDictionary(private val connection: Connection) : Dictionary { private val searchSegments = """ WITH cte(id, segment) AS (VALUES ?) - SELECT cedict.traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions - FROM cedict INNER JOIN cte - ON cte.segment = cedict.traditional OR cte.segment = cedict.simplified + SELECT entry.traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions, cross_straits_definitions + FROM entry INNER JOIN cte + ON cte.segment = entry.traditional OR cte.segment = entry.simplified ORDER BY cte.id """.trimIndent() private val findWordsContaining: PreparedStatement by lazy { connection.prepareStatement( """ - SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions - FROM cedict + SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions, cross_straits_definitions + FROM entry WHERE traditional LIKE ? ORDER BY character_count ASC """.trimIndent() @@ -79,9 +79,9 @@ class SqliteDictionary(private val connection: Connection) : Dictionary { private val findCharacters = """ WITH cte(id, character) AS (VALUES ?) - SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions - FROM cedict INNER JOIN cte - ON cte.character = cedict.traditional OR cte.character = cedict.simplified + SELECT traditional, simplified, pinyin_with_tone_marks, pinyin_with_tone_numbers, zhuyin, cedict_definitions, cross_straits_definitions + FROM entry INNER JOIN cte + ON cte.character = entry.traditional OR cte.character = entry.simplified ORDER BY cte.id """.trimIndent() @@ -167,7 +167,8 @@ private fun ResultSet.toDictionaryEntry() = DictionaryEntry( pinyinWithToneMarks = this.getString(3), pinyinWithToneNumbers = this.getString(4), zhuyin = this.getString(5), - definitions = Json.decodeFromString(this.getString(6)) + cedictDefinitions = Json.decodeFromString(this.getString(6)), + crossStraitsDefinitions = Json.decodeFromString(this.getString(7)), ) private fun ResultSet.toListOfDictionaryEntries() = buildList { diff --git a/src/main/kotlin/com/marvinelsen/willow/ui/DictionaryEntryFx.kt b/src/main/kotlin/com/marvinelsen/willow/ui/DictionaryEntryFx.kt index 9045536..b63512e 100644 --- a/src/main/kotlin/com/marvinelsen/willow/ui/DictionaryEntryFx.kt +++ b/src/main/kotlin/com/marvinelsen/willow/ui/DictionaryEntryFx.kt @@ -1,5 +1,6 @@ package com.marvinelsen.willow.ui +import com.marvinelsen.willow.domain.CrossStraitsDefinition import com.marvinelsen.willow.domain.DictionaryEntry import javafx.beans.property.SimpleStringProperty import javafx.beans.property.StringProperty @@ -12,7 +13,8 @@ data class DictionaryEntryFx( val pinyinWithToneMarksProperty: StringProperty, val pinyinWithToneNumbersProperty: StringProperty, val zhuyinProperty: StringProperty, - val definitions: ObservableList>, + val cedictDefinitions: ObservableList>, + val crossStraitsDefinitions: ObservableList, ) fun DictionaryEntry.toFx() = DictionaryEntryFx( @@ -21,7 +23,8 @@ fun DictionaryEntry.toFx() = DictionaryEntryFx( pinyinWithToneMarksProperty = SimpleStringProperty(this.pinyinWithToneMarks), pinyinWithToneNumbersProperty = SimpleStringProperty(this.pinyinWithToneNumbers), zhuyinProperty = SimpleStringProperty(this.zhuyin), - definitions = FXCollections.observableList(this.definitions) + cedictDefinitions = FXCollections.observableList(this.cedictDefinitions), + crossStraitsDefinitions = FXCollections.observableList(this.crossStraitsDefinitions) ) fun DictionaryEntryFx.toDomain() = DictionaryEntry( @@ -30,5 +33,6 @@ fun DictionaryEntryFx.toDomain() = DictionaryEntry( pinyinWithToneMarks = this.pinyinWithToneMarksProperty.value, pinyinWithToneNumbers = this.pinyinWithToneNumbersProperty.value, zhuyin = this.zhuyinProperty.value, - definitions = this.definitions.toList() + cedictDefinitions = this.cedictDefinitions.toList(), + crossStraitsDefinitions = this.crossStraitsDefinitions.toList() ) diff --git a/src/main/kotlin/com/marvinelsen/willow/ui/cells/EntryCellFactory.kt b/src/main/kotlin/com/marvinelsen/willow/ui/cells/EntryCellFactory.kt index a295788..d6e49fa 100644 --- a/src/main/kotlin/com/marvinelsen/willow/ui/cells/EntryCellFactory.kt +++ b/src/main/kotlin/com/marvinelsen/willow/ui/cells/EntryCellFactory.kt @@ -110,7 +110,7 @@ internal class EntryCell(private val resources: ResourceBundle, private val conf ) ) - val definition = entry.definitions.joinToString(separator = " / ") { it.joinToString(separator = "; ") } + val definition = entry.cedictDefinitions.joinToString(separator = " / ") { it.joinToString(separator = "; ") } labelDefinition.text = definition contextMenu = createContextMenuForEntry(entry, resources) diff --git a/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt b/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt index 0ae818f..28a0b9f 100644 --- a/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt +++ b/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt @@ -17,10 +17,12 @@ import javafx.scene.input.ContextMenuEvent import javafx.scene.layout.FlowPane import javafx.scene.web.WebView import kotlinx.html.body +import kotlinx.html.div import kotlinx.html.h1 import kotlinx.html.html import kotlinx.html.li import kotlinx.html.ol +import kotlinx.html.span import kotlinx.html.stream.createHTML import java.util.ResourceBundle @@ -186,22 +188,51 @@ class DetailsController(private val model: Model, private val config: Config) { model.selectedEntry.addListener { _, _, newEntry -> if (newEntry == null) return@addListener - webViewDefinition.engine.loadContent(newEntry.createCedictDefinitionHtml()) - } - } - - private fun DictionaryEntryFx.createCedictDefinitionHtml() = createHTML().html { - body { - h1 { - +"CC-CEDICT" - } - ol { - for (definition in this@createCedictDefinitionHtml.definitions) { - li { - +definition.joinToString(separator = "; ") + webViewDefinition.engine.loadContent( + createHTML().html { + body { + if (newEntry.cedictDefinitions.isNotEmpty()) { + div(classes = "cedict-definition") { + h1 { + +"CC-CEDICT" + } + ol { + for (definition in newEntry.cedictDefinitions) { + li { + +definition.joinToString(separator = "; ") + } + } + } + } + } + if (newEntry.crossStraitsDefinitions.isNotEmpty()) { + div(classes = "cross-straits-definition") { + h1 { + +"Cross-Straits" + } + ol { + newEntry.crossStraitsDefinitions.forEach { definition -> + li { + span(classes = "definition") { + +definition.definition + } + if (definition.examples.isNotEmpty()) { + span(classes = "example") { + +definition.examples.joinToString( + prefix = "如:", + separator = "、", + postfix = "。" + ) { "「$it」" } + } + } + } + } + } + } + } } } - } + ) } }