New Features #1

Open
marvinelsen wants to merge 76 commits from develop into main
3 changed files with 106 additions and 99 deletions
Showing only changes of commit 40222f67ed - Show all commits

View File

@ -28,7 +28,7 @@ class DictionaryEntryCellFactory(private val resources: ResourceBundle, private
} }
} }
internal class EntryCell(private val resources: ResourceBundle, private val config: Config) : private class EntryCell(private val resources: ResourceBundle, private val config: Config) :
ListCell<DictionaryEntryFx?>() { ListCell<DictionaryEntryFx?>() {
private val labelHeadword = Label().apply { private val labelHeadword = Label().apply {
styleClass.add("headword") styleClass.add("headword")

View File

@ -50,7 +50,6 @@ private class SentenceCell(private val config: Config) : ListCell<SentenceFx?>()
) )
) )
graphic = root graphic = root
} }
} }

View File

@ -19,6 +19,7 @@ import javafx.scene.control.TabPane
import javafx.scene.input.ContextMenuEvent import javafx.scene.input.ContextMenuEvent
import javafx.scene.layout.FlowPane import javafx.scene.layout.FlowPane
import javafx.scene.web.WebView import javafx.scene.web.WebView
import kotlinx.html.DIV
import kotlinx.html.body import kotlinx.html.body
import kotlinx.html.div import kotlinx.html.div
import kotlinx.html.h1 import kotlinx.html.h1
@ -29,7 +30,7 @@ import kotlinx.html.span
import kotlinx.html.stream.createHTML import kotlinx.html.stream.createHTML
import java.util.ResourceBundle import java.util.ResourceBundle
@Suppress("UnusedPrivateMember") @Suppress("UnusedPrivateMember", "TooManyFunctions")
class DetailsController(private val model: Model, private val config: Config) { class DetailsController(private val model: Model, private val config: Config) {
@FXML @FXML
private lateinit var resources: ResourceBundle private lateinit var resources: ResourceBundle
@ -79,7 +80,6 @@ class DetailsController(private val model: Model, private val config: Config) {
@FXML @FXML
private lateinit var labelNoSentencesFound: Label private lateinit var labelNoSentencesFound: Label
@FXML @FXML
private fun initialize() { private fun initialize() {
initializeLabelHeadword() initializeLabelHeadword()
@ -227,101 +227,7 @@ class DetailsController(private val model: Model, private val config: Config) {
model.selectedEntry.addListener { _, _, newEntry -> model.selectedEntry.addListener { _, _, newEntry ->
if (newEntry == null) return@addListener if (newEntry == null) return@addListener
webViewDefinition.engine.loadContent( webViewDefinition.engine.loadContent(createDefinitionHtml(newEntry))
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" }
}
}
}
}
}
}
}
if (newEntry.moedictDefinitions.isNotEmpty()) {
div(classes = "moe-definition") {
h1 {
+"MOE"
}
newEntry.moedictDefinitions.groupBy {
it.type ?: ""
}.entries.forEach { (type, definitions) ->
if (type != "") {
span(classes = "type") {
+type
}
}
ol {
definitions.forEach { definition ->
li {
span(classes = "definition") {
+definition.definition
}
definition.examples.forEach { example ->
span(classes = "example") {
+example
}
}
definition.quotes.forEach { quote ->
span(classes = "quote") {
+quote
}
}
definition.synonyms?.let {
span(classes = "synonyms") {
+"似:${it.replace(",", "、")}"
}
}
definition.antonyms?.let {
span(classes = "antonyms") {
+"反:${it.replace(",", "、")}"
}
}
}
}
}
}
}
}
}
}
)
} }
} }
@ -336,6 +242,7 @@ class DetailsController(private val model: Model, private val config: Config) {
) )
} }
@Suppress("ReturnCount")
private fun lazyUpdateTabContent(selectedTabId: String?) { private fun lazyUpdateTabContent(selectedTabId: String?) {
when (selectedTabId) { when (selectedTabId) {
"tabWords" -> { "tabWords" -> {
@ -359,4 +266,105 @@ class DetailsController(private val model: Model, private val config: Config) {
else -> {} else -> {}
} }
} }
private fun createDefinitionHtml(entry: DictionaryEntryFx) = createHTML().html {
body {
if (entry.cedictDefinitions.isNotEmpty()) {
div(classes = "cedict-definition") {
h1 {
+"CC-CEDICT"
}
cedictDefinition(entry)
}
}
if (entry.crossStraitsDefinitions.isNotEmpty()) {
div(classes = "cross-straits-definition") {
h1 {
+"Cross-Straits"
}
crossStraitsDefinition(entry)
}
}
if (entry.moedictDefinitions.isNotEmpty()) {
div(classes = "moe-definition") {
h1 {
+"MOE"
}
moeDefinition(entry)
}
}
}
}
} }
private fun DIV.cedictDefinition(entry: DictionaryEntryFx) = ol {
for (definition in entry.cedictDefinitions) {
li {
+definition.joinToString(separator = "; ")
}
}
}
private fun DIV.crossStraitsDefinition(entry: DictionaryEntryFx) = ol {
entry.crossStraitsDefinitions.forEach { definition ->
li {
span(classes = "definition") {
+definition.definition
}
if (definition.examples.isNotEmpty()) {
span(classes = "example") {
+definition.examples.joinToString(
prefix = "如:",
separator = "",
postfix = ""
) { "$it" }
}
}
}
}
}
private fun DIV.moeDefinition(entry: DictionaryEntryFx) =
entry.moedictDefinitions.groupBy { it.type ?: "" }.entries.forEach { (type, definitions) ->
if (type != "") {
span(classes = "type") {
+type
}
}
ol {
definitions.forEach { definition ->
li {
span(classes = "definition") {
+definition.definition
}
definition.examples.forEach { example ->
span(classes = "example") {
+example
}
}
definition.quotes.forEach { quote ->
span(classes = "quote") {
+quote
}
}
definition.synonyms?.let {
span(classes = "synonyms") {
+"似:${it.replace(",", "、")}"
}
}
definition.antonyms?.let {
span(classes = "antonyms") {
+"反:${it.replace(",", "、")}"
}
}
}
}
}
}